From d1ae138ff9d5790d408eee3a677c53f774032cc7 Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Mon, 1 Jun 2026 15:34:40 +0200 Subject: [PATCH 01/52] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d275201..8849f4b 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -Infrabase is a lightweight build and deployment environment tailored for embedded systems development. +MICOFE is a micro‑container framework for edge computing that enables deploying SO3 capsules (lightweight containers) through the Portainer Manager/Agent architecture. +It is built using the Infrabase (IB) build system, also available on GitHub. -Github pages for the documentation will appear soon. +We sincerely thank the Swiss Hasler Foundation for supporting the core contributions to this project. -You can browse the [Sphinx documentation related to Infrabase](https://edgemtech.github.io/infrabase/index.html). From 4266bb6c76e8ab21f00824686178331c5cd5d720 Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Mon, 1 Jun 2026 17:14:24 +0200 Subject: [PATCH 02/52] Specialize documentation on MICOFE Refocus the documentation solely on MICOFE and drop the Infrabase / EDGEMTech material. - Move the MICOFE section (micofe, emiso, portainer, syscalls_alignment) to the doc source root and rework index.rst as a MICOFE landing page. - Consolidate all images, including the .drawio source, into doc/source/img/; update figure paths accordingly. - Remove Infrabase-specific chapters (introduction, user_guide, dev_flow, coding_conventions, build_system, rootfs, base_extension) and the Infrabase/EDGEMTech images; keep the glossary. - Rebrand conf.py (project, copyright, LaTeX/man targets) to MICOFE and drop the now-unused PlantUML extension. - Replace the GitLab CI (edgem-build image) with a GitHub Actions workflow that builds the docs and deploys to GitHub Pages; unignore .github so workflows are tracked. --- .github/workflows/docs.yml | 52 ++ .gitignore | 4 + doc/.gitlab-ci.yml | 13 - doc/source/base_extension/armbian.rst | 33 - doc/source/base_extension/base_extension.rst | 20 - doc/source/base_extension/buildroot.rst | 27 - doc/source/base_extension/debootstrap.rst | 34 - doc/source/base_extension/raspberrypiOS.rst | 28 - doc/source/base_extension/uboot.rst | 23 - doc/source/build_system/build_system.rst | 236 ------- doc/source/coding_conventions.rst | 650 ------------------ doc/source/conf.py | 12 +- doc/source/dev_flow.rst | 93 --- doc/source/{micofe => }/emiso.rst | 6 +- doc/source/img/EDGEMTech.png | Bin 26301 -> 0 bytes .../img/Infrabase-Build_System.drawio.png | Bin 30790 -> 0 bytes .../img/Infrabase-Folders_tmp.drawio.png | Bin 82085 -> 0 bytes .../img/Infrabase-IB_Architecture.drawio.png | Bin 101242 -> 0 bytes doc/source/img/Infrabase.drawio | 344 --------- .../pictures => img}/micofe-emiso-engine.png | Bin .../{micofe/pictures => img}/micofe-logs.png | Bin .../pictures => img}/micofe-overview.png | Bin .../{micofe/pictures => img}/micofe.drawio | 0 doc/source/index.rst | 41 +- doc/source/introduction.rst | 19 - doc/source/{micofe => }/micofe.rst | 0 doc/source/{micofe => }/portainer.rst | 0 doc/source/rootfs/linux_usr.rst | 37 - doc/source/rootfs/rootfs.rst | 28 - .../{micofe => }/syscalls_alignment.rst | 0 doc/source/user_guide.rst | 275 -------- 31 files changed, 73 insertions(+), 1902 deletions(-) create mode 100644 .github/workflows/docs.yml delete mode 100644 doc/.gitlab-ci.yml delete mode 100644 doc/source/base_extension/armbian.rst delete mode 100644 doc/source/base_extension/base_extension.rst delete mode 100644 doc/source/base_extension/buildroot.rst delete mode 100644 doc/source/base_extension/debootstrap.rst delete mode 100644 doc/source/base_extension/raspberrypiOS.rst delete mode 100644 doc/source/base_extension/uboot.rst delete mode 100644 doc/source/build_system/build_system.rst delete mode 100644 doc/source/coding_conventions.rst delete mode 100644 doc/source/dev_flow.rst rename doc/source/{micofe => }/emiso.rst (97%) delete mode 100644 doc/source/img/EDGEMTech.png delete mode 100644 doc/source/img/Infrabase-Build_System.drawio.png delete mode 100644 doc/source/img/Infrabase-Folders_tmp.drawio.png delete mode 100644 doc/source/img/Infrabase-IB_Architecture.drawio.png delete mode 100644 doc/source/img/Infrabase.drawio rename doc/source/{micofe/pictures => img}/micofe-emiso-engine.png (100%) rename doc/source/{micofe/pictures => img}/micofe-logs.png (100%) rename doc/source/{micofe/pictures => img}/micofe-overview.png (100%) rename doc/source/{micofe/pictures => img}/micofe.drawio (100%) delete mode 100644 doc/source/introduction.rst rename doc/source/{micofe => }/micofe.rst (100%) rename doc/source/{micofe => }/portainer.rst (100%) delete mode 100644 doc/source/rootfs/linux_usr.rst delete mode 100644 doc/source/rootfs/rootfs.rst rename doc/source/{micofe => }/syscalls_alignment.rst (100%) delete mode 100644 doc/source/user_guide.rst diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000..e281335 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,52 @@ +name: Documentation + +on: + push: + branches: + - main + workflow_dispatch: + +# Allow the workflow to deploy to GitHub Pages. +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment. +concurrency: + group: pages + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.12' + + - name: Install dependencies + run: pip install --no-cache-dir -r doc/requirements.txt + + - name: Build documentation + run: sphinx-build -b html doc/source/ public/ + + - name: Upload Pages artifact + uses: actions/upload-pages-artifact@v3 + with: + path: public + + deploy: + needs: build + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore index c546b06..9d289f2 100644 --- a/.gitignore +++ b/.gitignore @@ -66,3 +66,7 @@ filesystem/work #TaMPLate files for the man documentation !*.tmpl + +# GitHub Actions workflows +!.github +!.github/** diff --git a/doc/.gitlab-ci.yml b/doc/.gitlab-ci.yml deleted file mode 100644 index d736b77..0000000 --- a/doc/.gitlab-ci.yml +++ /dev/null @@ -1,13 +0,0 @@ -image: gitlab.edgemtech.ch:5050/overall/infrabase/infrabase/edgem-build:latest - -pages: - tags: - - sphinx - stage: deploy - script: - - sphinx-build -b html doc/source/ public/ - artifacts: - paths: - - public - only: - - main \ No newline at end of file diff --git a/doc/source/base_extension/armbian.rst b/doc/source/base_extension/armbian.rst deleted file mode 100644 index 94278e1..0000000 --- a/doc/source/base_extension/armbian.rst +++ /dev/null @@ -1,33 +0,0 @@ -.. _armbian: - -******************** -Armbian full system -******************** - -Introduction -============ -`Armbian `__ is a framework to quickly build a full system for msot ARM platform. It can produce kernel-only images or a ready-to-burn full image with rootfs and bootloader. - -Build a system -============== -The `Armbian `__ repo is the base tool to generate the images. Follow the steps in the link for more details about how to use it. - - -Usability in the EDGEMTech framework -==================================== -Armbian is powerfull but only generate full system images. - -Pros: - - - Uses config.txt to configure the system at boot time. - - APT compatible. - - Zero effort to flash. - -Cons: - - - No rootfs customization - - Needs the raspberry linux kernel. - - -In the end, it is nice to have it for quick tests, but becomes quickly limitating when we want to customize the environnement a bit. - diff --git a/doc/source/base_extension/base_extension.rst b/doc/source/base_extension/base_extension.rst deleted file mode 100644 index b1cb595..0000000 --- a/doc/source/base_extension/base_extension.rst +++ /dev/null @@ -1,20 +0,0 @@ - - -.. _base_extension: - -########################################## -Base environnement extension for Infrabase -########################################## - -.. toctree:: - :maxdepth: 5 - :hidden: - - armbian - debootstrap - raspberrypiOS - buildroot - uboot - -This section presents the different approaches available to deploy a functionnal system running the Infrabase Framework. - diff --git a/doc/source/base_extension/buildroot.rst b/doc/source/base_extension/buildroot.rst deleted file mode 100644 index 7e39727..0000000 --- a/doc/source/base_extension/buildroot.rst +++ /dev/null @@ -1,27 +0,0 @@ -.. _buildroot2: - -Buildroot -######### - -Introduction -************ -`Buildroot `__ is a framework to generate distroless linux system. - -Generating a rootfs -******************* -Buildroot can be used to only generate a rootfs and/or the kernel/bootloader. It allows to have custom environnement, using a separate kernel. - - -Usability in the Infrabase framework -************************************ -Buildroot is powerfull and well known, but it lacks the availability of APT to ease the developpement. - -Pros: - - - Very small (167M). - - Easy to customize. - -Cons: - - - No APT support. - diff --git a/doc/source/base_extension/debootstrap.rst b/doc/source/base_extension/debootstrap.rst deleted file mode 100644 index 258c04b..0000000 --- a/doc/source/base_extension/debootstrap.rst +++ /dev/null @@ -1,34 +0,0 @@ -.. _debootstrap: - -Debootstrap rootfs -################## - -Introduction -************ - -`Debootstrap `__ is a rootfs generator able to produce full distribution (Ubuntu or Debian based) rootfs. It can be used directly on the target or cross-compiled from a host computer. - -Generating a rootfs -******************* -The procedure showed on the linux-sunxi in the Introduction explain how to quickly setup deboostrap and how to use it. The result is a folder containing the cross-compiled rootfs. -In our repo, the directory agency/debootsrap_rootfs contains the script to generate an Ubuntu 20.04 focal distro for arm64. - - -Usability in the Infrabase framework -************************************ -Debootstrap is one of the simplest tool to generate an ARM based rootfs. - -Pros: - - - Generate a distro based rootfs in < 30-min - - Can generate on the host or the target - - chroot customization, so it is really quick to tweak the rootfs on the host - - Small (592M Debootstrap vs 2.3G Armbian) - -Cons: - - - Limited in the distros list - - Need some manual tweaks after the base creation to have a fully functional system. - - -This framework is really usefull to quickly bring up a full distro rootfs. Its ability to script its creation easily and to customize it in a chroot like manner is what make it stand out. \ No newline at end of file diff --git a/doc/source/base_extension/raspberrypiOS.rst b/doc/source/base_extension/raspberrypiOS.rst deleted file mode 100644 index 0468eab..0000000 --- a/doc/source/base_extension/raspberrypiOS.rst +++ /dev/null @@ -1,28 +0,0 @@ -.. _raspberrypiOS: - - -Raspberry Pi OS -############### - -Introduction -************ -The `Raspberry Pi OS `__ is a full system image containing the whole system to boot on the RPi4. It is based on Ubuntu and comes in many flavors (headless, 64bit, desktop, ...). - -Usability in the Infrabase framework -************************************ -The Raspberry Pi OS is usefull to quickly deploy a functionnal system on the board. Here is an overview of the pros and cons - -Pros: - - - Uses config.txt to configure the system at boot time. - - APT compatible. - - Zero effort to flash. - -Cons: - - - No rootfs customization - - Needs the raspberry linux kernel. - - -In the end, it is nice to have it for quick tests, but becomes quickly limitating when we want to customize the environnement a bit. - diff --git a/doc/source/base_extension/uboot.rst b/doc/source/base_extension/uboot.rst deleted file mode 100644 index f082694..0000000 --- a/doc/source/base_extension/uboot.rst +++ /dev/null @@ -1,23 +0,0 @@ -.. _uboot: - - -U-Boot modifications -#################### -In order to support the boot from the ITB while using the DTB prepared by the RPi bootloader, we needed to modify U-Boot. -The original could only boot from one or the other method. - -The RPi bootloader patches the DTB using the overlays specified in the config.txt file. When U-Boot takes the hand, the env variable ``fdt_addr`` is set to the address of the modified DTB. -The fix was to add a configuration ``CONFIG_USE_RPI4_DTB_WITH_FIT`` to be able to bypass the DTB retrieval in the FIT image (ITB). -We also need U-Boot to fill it with initrd information for Linux to be able to mount it. - -All the modifications are done in ``common/bootm.c``: - - * line 283: If we use the new config, U-Boot sets its internal ``fdt_addr`` and ``fdt_len`` not by reading the ITB and parsinbg the DTB, but by reading the ``fdtaddr`` variable. - * line 762: With the new configuration, it ignores the state check when configuring the DTB, it allow to configure it even without a DTB in the FIT image. - - -Further improvements -#################### -These modifications where implemented in a quick way to be able to use the custom DTB. However, it lacks some checks made by the classical path. -It is usable but still need some refining in how we handle the DTB loading. - diff --git a/doc/source/build_system/build_system.rst b/doc/source/build_system/build_system.rst deleted file mode 100644 index 827b312..0000000 --- a/doc/source/build_system/build_system.rst +++ /dev/null @@ -1,236 +0,0 @@ - -.. _build_system: - -Build System -############ - -This chapter gives an overview of the Infrabase build system. -The build commands are given in the :ref:`user guide chapter `. - -The ``Infrabase`` build system relies on various scripts and methods, but is mainly -driven by ``bitbake`` receipes. - -We call ``standard scripts`` those used so far as ``./build.sh``, ``./deploy.sh``, ``./mount.sh``, etc. - -The main concepts of *bitbake* are: ``layers``, ``configurations``, ``classes``, ``recipes`` and ``tasks``. - -A layer can be defined as a collection of *configurations*, *classes* and *recipes* associated to -a component. It describes the overall build process with the different tasks belonging to recipes. - -Classes are configuration-independent functionalities/tasks and can have hierarchies (a base class -can be inherited by other classes). - -Receipes contain rules to be executed for a specific application or component. - -Tasks are defined in classes or receipes and are the core functions managed by the build system. -Tasks are either (**bash**) shell script or **python** functions - -Configurations are everyhwere, but the ``local.conf`` file located in ``build/conf/`` directory contains the -general configuration. Typically, this file contains the definition of ``PLATFORM`` -Configurations contain definition of *bitbake* variables that can be used by all recipes of the build system. - - -Bitbake environment -******************* - -Infrabase build system relies on `Bitbake `_ which is the -underlying build system used by Yocto. The overall architecture is depicted on the figure below. - -.. figure:: /img/Infrabase-Build_System.drawio.png - :align: center - - Differences between Yocto and Infrabase in the build system architecture - -While Yocto is mainly distribution oriented (and Poky is the distribution reference on top of Yocto), Infrabase -enables the building of various distributions, for example based on **buildroot** or **debootstrap**. - -**Open-embedded** is constituted of various meta files which enhance the *bitbake* build system and it -has to be considered as part of the build system. - -Infrabase build system -********************** - -In *Infrabase*, *bitbake* and some small parts of *openembedded* are used to build -the initial environment and to reconciliate patches of components after some modifications of source code. - -After the initial clone of the repository, *bitbake* allows to build all components by fetching the -code from the original location and applying related patchsets. - -The updates of patches following some modifications of the repository are part of :ref:`the development flow `. - -We differ *bitbake* script from :term:`standard script`. During the development, the standard scripts -available at the root directory and subdirectory (like *rootfs/* or *linux/usr*) should be used. - -Build system directory organization -*********************************** - -All build system files (except the standard scripts) are located in the ``build/`` directory. - -.. warning:: - - Do not erase the ``build/`` directory. It is not automatically generated but - is stored *git*. - -Actually, *bitbake* creates a ``tmp/`` subdirectory within ``build/``. If a complete re-build is required, -you can delete *tmp/* at any time. - -.. figure:: /img/Infrabase-IB_Architecture.drawio.png - :align: center - - Build system directory organization as stored in git - -In *bitbake*, a layer corresponds to a ``meta`` directory entry. For example, the *meta/* directory is -a generic layer which is used by all other layers. - -We focus on the **meta-linux** layer as an example. - -Directory ``conf/`` -=================== - -This directory is general to the build system and defines the main configuration for *bitbake* (in *bitbake.conf*) -and for the project (in *local.conf*). - -Each new layer must be added in *bitbake.conf* in order to tell *bitbake* to consider the recipes describes in this layer. - -In ``local.conf``, most variables are specific to *infrabase*, like: - - - IB_PLATFORM - - IB_STORAGE - - IB_TOOLCHAIN - - *etc.* - -Directory ``meta-linux/classes`` -================================ - -It defines the generic tasks/functions that are used by the recipe, like ``do_configure`` and ``do_build`` (two -examples of tasks) - -Directory ``meta-linux/conf`` -============================= - -Each layer has a very similar file called ``layer.conf`` which tell *bitbake* further information -about the dependencies between layers and their priorities in the build process. Currently, -all layers are processed with the same priority (4). - -Directory ``recipes-*`` -======================= - -These are the recipes of the layer. In most cases, there is one recipe by layer (except for *rootfs*) which -describes how to build the target component associated to the layer. Of course, depending on the number -of releases/versions, there can be several recipes as well. - -Each recipe may have several subdirectories. Typically, a directory with the name of the component (*linux*) -which contains the recipe files and a ``files/`` directory which contains additional files like patches. - -The recipe ----------- - -The configuration and requirements of a recipe is given in a file with the ``.bb`` extension (for -example ``linux-5.10.bb`` in our case). - -Patchset --------- - -A *patchset* is a collection pf patches which are processed during the build, with the ``do_patch`` tasks. -In *Infrabase*, the list of patches to be applied is contained in a file with ``.inc`` extension within -the *files/* directory. And the list of *.inc* files to be considered in the recipe is described in the -recipe file (*linux-5.10.bb*). - -Directory ``tmp`` -================= - -*Bitbake* automatically creates a ``tmp/`` directory in *build/* for his management and project-related -files. The figure above shows the contents of this directory. - -.. figure:: /img/Infrabase-Folders_tmp.drawio.png - :align: center - - Directory tree of the *tmp/* directory in *build/* - -Once a task is executed successfully, a stamp file (0 byte) is created so that *bitbake* will not re-execute - -.. note:: - - Note that standard scripts remove the stamp files associated to the component to be re-built. - Only the *bsp* recipe does not delete the stamps for individual components except the one - corresponding to itself. - - -Infrabase Basic workflow -************************ - -The initial build can be achieved by meas of the ``./build.sh -a`` command. It will fetch, patch, prepare -the environment and build everything (kernel, rootfs, apps, etc.). - -In the build process, there is a particular task called ``do_attach_infrabase`` which perform a copy -of source code in the root environment of *infrabase*. Hence, the development can be done independently -of the ``tmp/`` directory managed by *bitbake*. - -Therefore, the development is done on the source code related to the branch while the original files -are not modified (in *tmp/work/*) directories. - -This will allow the developers to perform a *diff* (using the ``do_updiff`` task) which will generate -the patches for the differences. - -.. warning:: - - It has to be noted that the generated patches are issued from the difference between the local - files and the original **patched** files. This leads to an incremental patching process. - The *diff* process is always done against the directory which is stored in ``tmp/work//`` - - -Building a patchset -=================== - -Following a development sprint, patchsets have to be (re-)generated in order to keep track of the -code evolution. This is achieved by means of the ``do_updiff`` task. It has to be executed in the -``build`` directory. For example, if we do changes in linux, the patchset will be generated -with the following command: - -.. code-block:: bash - - ~/infrabase/build$ bitbake linux -c updiff - -As result, the patchset is generated in ``build/meta-linux/recipes-linux/linux/files`` directory with -the file ``000x-linux-5.10-r0-patches.inc`` and its associated directory called ``000x-linux-5.10-r0`` -in which the set of patches is located. - -The prefix is made of four digits and is incremented at each patchset generation. - -Based on these two elements, the patchset can be manually worked out. - -To include a patchset in a recipe, the recipe file has to include the following lines: - -.. code-block:: bash - - FILESPATH:prepend: := "${THISDIR}/files/0001-${PF}:" - - require files/0001-${PF}-patches.inc - -Each recipe can have one or several patchsets according to the patch organization, and -the first patchset should be called with prefix ``0001-`` - -Infrabase recipes -***************** - -General comments -================ - -If a task requires ``sudo`` to execute a command, it has to be configured so that no password is required. -To do this, the following entry in the file ``/etc/sudoers`` should be added: - -.. code-block:: bash - - ALL=(ALL) NOPASSWD: ALL - -Currently, the use of *fakeroot* commands, that could avoid setting no password with sudo, -does not allow to use ``losetup`` correctly. - - -.. warning:: - - Using ``sudo`` in a task involves to set the attribute ``network`` of this task to ``"1"``. For example: - *do_init_storage[network] = "1"* - - - diff --git a/doc/source/coding_conventions.rst b/doc/source/coding_conventions.rst deleted file mode 100644 index 8b91e04..0000000 --- a/doc/source/coding_conventions.rst +++ /dev/null @@ -1,650 +0,0 @@ -.. _coding_conventions: - -.. note:: - - This coding style document has been borrowed from the Linux coding style. - -Infrabase coding conventions -############################ - -Indentation -*********** - -Tabs are 8 characters, and thus indentations are also 8 characters. - -Rationale: The whole idea behind indentation is to clearly define where -a block of control starts and ends. Especially when you've been looking -at your screen for 20 straight hours, you'll find it a lot easier to see -how the indentation works if you have large indentations. - -Now, some people will claim that having 8-character indentations makes -the code move too far to the right, and makes it hard to read on a -80-character terminal screen. The answer to that is that if you need -more than 3 levels of indentation, you're screwed anyway, and should fix -your program. - -In short, 8-char indents make things easier to read, and have the added -benefit of warning you when you're nesting your functions too deep. -Heed that warning. - -The preferred way to ease multiple indentation levels in a switch statement is -to align the ``switch`` and its subordinate ``case`` labels in the same column -instead of ``double-indenting`` the ``case`` labels. E.g.: - -.. code-block:: c - - switch (suffix) { - case 'G': - case 'g': - mem <<= 30; - break; - case 'M': - case 'm': - mem <<= 20; - break; - case 'K': - case 'k': - mem <<= 10; - /* fall through */ - default: - break; - } - -Don't put multiple statements on a single line unless you have -something to hide: - -.. code-block:: c - - if (condition) do_this; - do_something_everytime; - -Don't put multiple assignments on a single line either. Coding style -is super simple. Avoid tricky expressions. - -Outside of comments, documentation and except in some files where it is required -like Kconfig Linux kernel, spaces are never used for indentation, -and the above example is deliberately broken. - -Get a decent editor and don't leave whitespace at the end of lines. - - -Breaking long lines and strings -******************************* - -Coding style is all about readability and maintainability using commonly -available tools. - -The limit on the length of lines should correspond to what a modern screen and -editor is reasonibly able to display before the reader has to scroll horizontally -(even if it is acceptable to scroll over a few characters). - -Statements too long will be broken into sensible chunks. -Descendants are always substantially shorter than the parent and -are placed substantially to the right. The same applies to function headers -with a long argument list. However, avoid to break user-visible strings such as -printk messages, because that breaks the ability to grep for them. - - -Placing Braces and Spaces -************************* - -The other issue that always comes up in C styling is the placement of -braces. Unlike the indent size, there are few technical reasons to -choose one placement strategy over the other, but the preferred way, as -shown to us by the prophets Kernighan and Ritchie, is to put the opening -brace last on the line, and put the closing brace first, thusly: - -.. code-block:: c - - if (x is true) { - we do y - } - -This applies to all non-function statement blocks (if, switch, for, -while, do). E.g.: - -.. code-block:: c - - switch (action) { - case KOBJ_ADD: - return "add"; - case KOBJ_REMOVE: - return "remove"; - case KOBJ_CHANGE: - return "change"; - default: - return NULL; - } - -However, there is one special case, namely functions: they may have the -opening brace at the beginning of the next line, thus: - -.. code-block:: c - - int function(int x) - { - body of function - } - -Note that the closing brace is empty on a line of its own, **except** in -the cases where it is followed by a continuation of the same statement, -ie a ``while`` in a do-statement or an ``else`` in an if-statement, like -this: - -.. code-block:: c - - do { - body of do-loop - } while (condition); - -and - -.. code-block:: c - - if (x == y) { - .. - } else if (x > y) { - ... - } else { - .... - } - -Rationale: K&R. - -Also, note that this brace-placement also minimizes the number of empty -(or almost empty) lines, without any loss of readability. - -Do not unnecessarily use braces where a single statement will do. - -.. code-block:: c - - if (condition) - action(); - -and - -.. code-block:: none - - if (condition) - do_this(); - else - do_that(); - -Also, prefer using braces when a loop contains more than a single simple statement: - -.. code-block:: c - - while (condition) { - if (test) - do_something(); - } - -Spaces -====== - -Use a space after (most) keywords. The notable exceptions are sizeof, typeof, alignof, -and __attribute__, which look somewhat like functions (and are usually used with parentheses in Linux, -although they are not required in the language, as in: ``sizeof info`` after -``struct fileinfo info;`` is declared). - -So use a space after these keywords:: - - if, switch, case, for, do, while - -but not with sizeof, typeof, alignof, or __attribute__. E.g., - -.. code-block:: c - - - s = sizeof(struct file); - -Do not add spaces around (inside) parenthesized expressions. This example is -**bad**: - -.. code-block:: c - - - s = sizeof( struct file ); - -When declaring pointer data or a function that returns a pointer type, the -preferred use of ``*`` is adjacent to the data name or function name and not -adjacent to the type name. Examples: - -.. code-block:: c - - - char *linux_banner; - unsigned long long memparse(char *ptr, char **retptr); - char *match_strdup(substring_t *s); - -Use one space around (on each side of) most binary and ternary operators, -such as any of these:: - - = + - < > * / % | & ^ <= >= == != ? : - -but no space after unary operators:: - - & * + - ~ ! sizeof typeof alignof __attribute__ defined - -no space before the postfix increment & decrement unary operators:: - - ++ -- - -no space after the prefix increment & decrement unary operators:: - - ++ -- - -and no space around the ``.`` and ``->`` structure member operators. - -Do not leave trailing whitespace at the ends of lines. Some editors with -``smart`` indentation will insert whitespace at the beginning of new lines as -appropriate, so you can start typing the next line of code right away. -However, some such editors do not remove the whitespace if you end up not -putting a line of code there, such as if you leave a blank line. As a result, -you end up with lines containing trailing whitespace. - -Git will warn you about patches that introduce trailing whitespace, and can -optionally strip the trailing whitespace for you; however, if applying a series -of patches, this may make later patches in the series fail by changing their -context lines. - - -Naming -****** - -C is a Spartan language, and so should your naming be. Unlike Modula-2 -and Pascal programmers, C programmers do not use cute names like -ThisVariableIsATemporaryCounter. A C programmer would call that -variable ``tmp``, which is much easier to write, and not the least more -difficult to understand. - -HOWEVER, while mixed-case names are frowned upon, descriptive names for -global variables are a must. To call a global function ``foo`` is a -shooting offense. - -GLOBAL variables (to be used only if you **really** need them) need to -have descriptive names, as do global functions. If you have a function -that counts the number of active users, you should call that -``count_active_users()`` or similar, you should **not** call it ``cntusr()``. - -Encoding the type of a function into the name (so-called Hungarian -notation) is brain damaged - the compiler knows the types anyway and can -check those, and it only confuses the programmer. No wonder MicroSoft -makes buggy programs. - -LOCAL variable names should be short, and to the point. If you have -some random integer loop counter, it should probably be called ``i``. -Calling it ``loop_counter`` is non-productive, if there is no chance of it -being mis-understood. Similarly, ``tmp`` can be just about any type of -variable that is used to hold a temporary value. - -If you are afraid to mix up your local variable names, you have another -problem, which is called the function-growth-hormone-imbalance syndrome. -See chapter 6 (Functions). - - -Typedefs -******** - -The definition of a type should be either to hide the platform-dependent -definition of a type or to define a struct and having a more readable -type rather than *struct sensor*. Put a ``_t`` as suffix of a type -definition. For example, ``sensor_t``. - -Regarding the platform-dependent definition, it helps to define clear integer types, -where the abstraction **helps** avoid confusion whether it is ``int`` or ``long``. -u8/u16/u32 are perfectly fine typedefs - -NEVER use a typedef to hide a pointer except for the pointer to a function. -For example: - -.. code-block:: c - - typedef (void)(*sigint_fn_t)(int sig) - -is a correct usage of typedef. - - -Functions -********* - -Functions should be short and sweet, and do just one thing. - -The maximum length of a function is inversely proportional to the -complexity and indentation level of that function. So, if you have a -conceptually simple function that is just one long (but simple) -case-statement, where you have to do lots of small things for a lot of -different cases, it's OK to have a longer function. - -Another measure of the function is the number of local variables. They -shouldn't exceed 5-10, or you're doing something wrong. Re-think the -function, and split it into smaller pieces. A human brain can -generally easily keep track of about 7 different things, anything more -and it gets confused. You know you're brilliant, but maybe you'd like -to understand what you did 2 weeks from now. - -In source files, separate functions with one blank line. If the function is -exported, the **EXPORT** macro for it should follow immediately after the -closing function brace line. E.g.: - -.. code-block:: c - - int system_is_up(void) - { - return system_state == SYSTEM_RUNNING; - } - EXPORT_SYMBOL(system_is_up); - -In function prototypes, include parameter names with their data types. -Although this is not required by the C language, it is preferred -because it is a simple way to add valuable information for the reader. - - -Centralized exiting of functions -******************************** - -Albeit deprecated by some people, the equivalent of the goto statement is -used frequently by compilers in form of the unconditional jump instruction. - -The goto statement comes in handy when a function exits from multiple -locations and some common work such as cleanup has to be done. If there is no -cleanup needed then just return directly. - -Choose label names which say what the goto does or why the goto exists. An -example of a good name could be ``out_free_buffer:`` if the goto frees ``buffer``. -Avoid using GW-BASIC names like ``err1:`` and ``err2:``, as you would have to -renumber them if you ever add or remove exit paths, and they make correctness -difficult to verify anyway. - -The rationale for using gotos is: - -- unconditional statements are easier to understand and follow -- nesting is reduced -- errors by not updating individual exit points when making - modifications are prevented -- saves the compiler work to optimize redundant code away ;) - -.. code-block:: c - - int fun(int a) - { - int result = 0; - char *buffer; - - buffer = kmalloc(SIZE, GFP_KERNEL); - if (!buffer) - return -ENOMEM; - - if (condition1) { - while (loop1) { - ... - } - result = 1; - goto out_free_buffer; - } - ... - out_free_buffer: - kfree(buffer); - return result; - } - -A common type of bug to be aware of is ``one err bugs`` which look like this: - -.. code-block:: c - - err: - kfree(foo->bar); - kfree(foo); - return ret; - -The bug in this code is that on some exit paths ``foo`` is NULL. Normally the -fix for this is to split it up into two error labels ``err_free_bar:`` and -``err_free_foo:``: - -.. code-block:: c - - err_free_bar: - kfree(foo->bar); - err_free_foo: - kfree(foo); - return ret; - -Ideally you should simulate errors to test all exit paths. - - -Commenting -********** - -Comments are good, but there is also a danger of over-commenting. NEVER -try to explain HOW your code works in a comment: it's much better to -write the code so that the **working** is obvious, and it's a waste of -time to explain badly written code. - -Generally, you want your comments to tell WHAT your code does, not HOW. -Also, try to avoid putting comments inside a function body: if the -function is so complex that you need to separately comment parts of it, -you should probably go back to chapter 6 for a while. You can make -small comments to note or warn about something particularly clever (or -ugly), but try to avoid excess. Instead, put the comments at the head -of the function, telling people what it does, and possibly WHY it does -it. - -The preferred style for long (multi-line) comments is: - -.. code-block:: c - - /* - * This is the preferred style for multi-line - * comments in the source code. Please use it consistently. - * - * Description: A column of asterisks on the left side, - * with beginning and ending almost-blank lines. - */ - -It's also important to comment data, whether they are basic types or derived -types. To this end, use just one data declaration per line (no commas for -multiple data declarations). This leaves you room for a small comment on each -item, explaining its use. - - -Macros, Enums and RTL -********************* - -Names of macros defining constants and labels in enums are capitalized. - -.. code-block:: c - - #define CONSTANT 0x12345 - -Enums are preferred when defining several related constants. - -CAPITALIZED macro names are appreciated but macros resembling functions -may be named in lower case. - -Generally, inline functions are preferable to macros resembling functions. - -Macros with multiple statements should be enclosed in a do - while block: - -.. code-block:: c - - #define macrofun(a, b, c) \ - do { \ - if (a == 5) \ - do_this(b, c); \ - } while (0) - -Things to avoid when using macros: - -1) macros that affect control flow: - -.. code-block:: c - - #define FOO(x) \ - do { \ - if (blah(x) < 0) \ - return -EBUGGERED; \ - } while (0) - -is a **very** bad idea. It looks like a function call but exits the ``calling`` -function; don't break the internal parsers of those who will read the code. - -2) macros that depend on having a local variable with a magic name: - -.. code-block:: c - - #define FOO(val) bar(index, val) - -might look like a good thing, but it's confusing as hell when one reads the -code and it's prone to breakage from seemingly innocent changes. - -3) macros with arguments that are used as l-values: FOO(x) = y; will -bite you if somebody e.g. turns FOO into an inline function. - -4) forgetting about precedence: macros defining constants using expressions -must enclose the expression in parentheses. Beware of similar issues with -macros using parameters. - -.. code-block:: c - - #define CONSTANT 0x4000 - #define CONSTEXP (CONSTANT | 3) - -5) namespace collisions when defining local variables in macros resembling -functions: - -.. code-block:: c - - #define FOO(x) \ - ({ \ - typeof(x) ret; \ - ret = calc_ret(x); \ - (ret); \ - }) - -ret is a common name for a local variable - __foo_ret is less likely -to collide with an existing variable. - -The cpp manual deals with macros exhaustively. The gcc internals manual also -covers RTL which is used frequently with assembly language in the kernel. - - -Printing logging messages -************************* - -Do mind the spelling of messages to make a good impression. Do not use crippled -words like ``dont``; use ``do not`` or ``don't`` instead. Make the messages -concise, clear, and unambiguous. - -Usually, messages do not have to be terminated with a period. - -Coming up with good debugging messages can be quite a challenge; and once -you have them, they can be a huge help for remote troubleshooting. However -debug message printing is handled differently than printing other non-debug -messages. - -Syslog-ng -========= - -Syslog-ng enables logging messages in various forms and configurations. -It can be used to log message on the console and/or in files typically -stored in ``/var/log`` directory. - -Function return values and names -******************************** - -Functions can return values of many different kinds, and one of the -most common is a value indicating whether the function succeeded or -failed. Such a value can be represented as an error-code integer -(-Exxx = failure, 0 = success) or a ``succeeded`` boolean (0 = failure, -non-zero = success). - -Mixing up these two sorts of representations is a fertile source of -difficult-to-find bugs. If the C language included a strong distinction -between integers and booleans then the compiler would find these mistakes -for us... but it doesn't. To help prevent such bugs, always follow this -convention:: - - If the name of a function is an action or an imperative command, - the function should return an error-code integer. If the name - is a predicate, the function should return a "succeeded" boolean. - -For example, ``add work`` is a command, and the add_work() function returns 0 -for success or -EBUSY for failure. In the same way, ``PCI device present`` is -a predicate, and the pci_dev_present() function returns 1 if it succeeds in -finding a matching device or 0 if it doesn't. - -Functions whose return value is the actual result of a computation, rather -than an indication of whether the computation succeeded, are not subject to -this rule. Generally they indicate failure by returning some out-of-range -result. Typical examples would be functions that return pointers; they use -NULL to report failure. - -Inline assembly -*************** - -In architecture-specific code, you may need to use inline assembly to interface -with CPU or platform functionality. Don't hesitate to do so when necessary. -However, don't use inline assembly gratuitously when C can do the job. You can -and should poke hardware from C when possible. - -Consider writing simple helper functions that wrap common bits of inline -assembly, rather than repeatedly writing them with slight variations. Remember -that inline assembly can use C parameters. - -Large, non-trivial assembly functions should go in .S files, with corresponding -C prototypes defined in C header files. The C prototypes for assembly -functions should use ``asmlinkage``. - -You may need to mark your asm statement as volatile, to prevent GCC from -removing it if GCC doesn't notice any side effects. You don't always need to -do so, though, and doing so unnecessarily can limit optimization. - -When writing a single inline assembly statement containing multiple -instructions, put each instruction on a separate line in a separate quoted -string, and end each string except the last with ``\n\t`` to properly indent -the next instruction in the assembly output: - -.. code-block:: c - - asm ("magic %reg1, #42\n\t" - "more_magic %reg2, %reg3" - : /* outputs */ : /* inputs */ : /* clobbers */); - - -Conditional Compilation -*********************** - -Using #if or #ifdef block should always have a comment on the #else or #endif -statement with the name of the condition, like this: - -.. code-block:: c - - #ifdef CONFIG_SOMETHING - - ... - - #else /* CONFIG_SOMETHING */ - - ... - - #endif /* !CONFIG_SOMETHING */ - -It will greatly help the reading of the code. - - -Function header -*************** - -To have a common function header, we also use Doxygen style: - -.. code-block:: c - - /** - * @brief - * - * @param - * @return - */ - -The Doxygen Documentation extension for VSCode allows to automatically generate such header, already pre-filled with some information. -To do this, type ``/**`` before a function, and type ``Enter``. diff --git a/doc/source/conf.py b/doc/source/conf.py index 56c2167..6b59b94 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -38,15 +38,11 @@ 'sphinx.ext.todo', 'sphinx.ext.ifconfig', 'sphinx.ext.viewcode', - 'sphinxcontrib.plantuml', 'rstFlatTable', 'sphinx.ext.extlinks', 'sphinx.ext.imgmath' ] -plantuml = 'java --add-exports java.desktop/com.sun.imageio.plugins.png=ALL-UNNAMED -jar %s -t' % os.path.join(os.path.dirname(__file__), "../utils", "plantuml.jar") -plantuml_output_format = 'svg' - # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] @@ -60,9 +56,9 @@ master_doc = 'index' # General information about the project. -project = u'Infrabase' +project = u'MICOFE' -copyright = u'2022-2025, EDGEMTech Ltd (Switzerland)' +copyright = u'2022-2025, REDS Institute (HEIG-VD)' # The version info for the project you're documenting, acts as replacement for @@ -209,7 +205,7 @@ def setup(app): # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). -latex_documents = [('index', 'Infrabase.tex', u'Infrabase Documentation', u'EDGEMTech Ltd', 'manual')] +latex_documents = [('index', 'MICOFE.tex', u'MICOFE Documentation', u'REDS Institute', 'manual')] # A dictionary that contains LaTeX snippets that override those Sphinx usually @@ -262,7 +258,7 @@ def setup(app): # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). -man_pages = [('index', 'doc', u'Infrabase Documentation', [u'EDGEMTech Ltd'], 1)] +man_pages = [('index', 'doc', u'MICOFE Documentation', [u'REDS Institute'], 1)] # -- Additional options -------------------------------------------------------- diff --git a/doc/source/dev_flow.rst b/doc/source/dev_flow.rst deleted file mode 100644 index 767ad05..0000000 --- a/doc/source/dev_flow.rst +++ /dev/null @@ -1,93 +0,0 @@ - -.. _dev_flow: - -Development flow -################# - -Here is an overview of the *development flow* used in the Infrabase project. - -* **Current**/**latest** version of the framework is available in the ``main`` - branch. -* The development activities are done in a specific branch. An issue is linked - with each development branches. -* Once the development of a new feature has completed, the developer create a ``merge - request (MR)``. The *changes* are reviewed and then merged into the ``main`` branch - by the *Infrabase maintainers*. - -The gitFlow_ figures shows this flow. - -Periodically, the *maintainers* publish a major release of the *Infrabase*. -For a new version, the following steps are performed: - -* The main new features has been re-tested -* The ``CHANGELOG`` file is updated with the new release information (release - number, description of the main add-on to the framework, ...) -* A ``tag`` with the version number is created - -.. _gitFlow: -.. uml:: - - master->>FeatureA: Create branch - master->>FeatureB: Create branch - FeatureA->>master: Merge new feature in master - FeatureB->>master: Merge new feature in master - - -Development -*********** - -For the development of new features or improvements, a new branch has to be created. -It should not be any development done directly in the ``main`` branch. Each new -*topic* has to have is own branch. Branches are not reused. - -An issue should be linked with each branch (an issue per branch). This issue should -provide: - -* A description of what is addressed -* (Optional) Information on the advancement of this topic, issues - found, explanation of the implementation, … - -The issue is automatically closed after -the development branch is merged of in the ``main`` branch. - -.. note:: - - Issue can be (should be) created to document problems, improvement found using - the framework without having to create a branch. - - The branch can be created when the *issue* is addressed - -Create new issue & branch -========================= - -To create a branch with an associated issue: - -1. Create a new issue. The doc from gitlab: `Create a new - issue `__ -2. Create the branch from the issue. The doc from gitlab: `Create a new - branch from an - issue `__ - - -Merge in the main branch -======================== - -Once the development of a specific topic has completed and been tested, it has to be -*integrated* in the ``main`` branch. It is done by creating a ``merge request (MR)``. - -By creating a ``merge request``, a developer asks *SOO maintainers* to: - -- Do a review of the modifications -- Performs the ``merge`` - -The creation of a ``merge request`` is simple: - -1. Form the issue page in gitlab, click ``Create merge request`` button -2. Validate the creation of the ``merge request`` in the new Windows - -`Merge request official doc `__. - -.. note:: - - Ideally, there is only one commit per changes. If, for some reasons, it is not - possible, please inform the *dev team* to lock this branch. diff --git a/doc/source/micofe/emiso.rst b/doc/source/emiso.rst similarity index 97% rename from doc/source/micofe/emiso.rst rename to doc/source/emiso.rst index ae30ec4..25de9f5 100644 --- a/doc/source/micofe/emiso.rst +++ b/doc/source/emiso.rst @@ -14,7 +14,7 @@ services in embedded systems, we propose to use a new model of container based o our SOO mobile entity concept which is based itself on the SO3 operating system. -.. figure:: pictures/micofe-overview.png +.. figure:: img/micofe-overview.png :name: _fig-Communication flow :alt: Communication flow :align: center @@ -68,7 +68,7 @@ Architecture The following picture depicts the architecture of the EMISO engine. -.. figure:: pictures/micofe-emiso-engine.png +.. figure:: img/micofe-emiso-engine.png :name: _fig-engine_architecture :alt: Engine Architecture :align: center @@ -162,7 +162,7 @@ file. The file path for these logs is as follows: The following image shows an overview of this log's mechanism. -.. figure:: pictures/micofe-logs.png +.. figure:: img/micofe-logs.png :name: _fig-emiso_engine_logs_flow :alt: EMISO engine logs flow :align: center diff --git a/doc/source/img/EDGEMTech.png b/doc/source/img/EDGEMTech.png deleted file mode 100644 index 6da455c71c75c1da48cea58f112ed6efb6144a6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26301 zcmYIQcRZEv`#+gkAtaGQLN-Sw>u_kvF*1|Av-h6aDWj}&Y{{NwZ!*ro359GvviEjy z9DYx!@9z(z9p0;7doB zlf?-{+}GW>u}y?&9dGC)t-OCd@IiGc>AJhKPPwk%u9&+`HT?$ra_kLhw9$W;DW3>$ zU!`JOCDOyzKTGkFDTR3_h$IPx*HzOFz zr<`$y#1cNB$vK)>sBr;kkR(x3Ie-T<3G8`pbcUm0H3CUIDsZT&`m z9$SQ~;cNe-&ff7Hi^^X6AU1Kw!)GemajI#@pMGsT{Gn^CIIfE!n&#Jw&Gx+Wvsw+@ zcC~{?$oAJ6KcS;<{m*0CO$n6#tRMKfD-4nCTVfXvZ`(?Lg_B!6dAtV?po@|CU(X_DVlk_hv`IwzHw%7_lKfR0kC1UtG%9iOb>SyYe(nVBA%0$kkpxnH{Wi49Gqli_8HSXdXEx?vPk z<0+EHWb603HPjBc!)Ef=Z?6ain<462+!xFBz<(C!&v_h*$d1vf9#+$pybccw!W8%R zJTf!S(wlA=#CPX23_E)CH?coKjTM}F%W0P+6|?yP;k*D zCA_7F<@)O!cPL=Fvzu&n9l{!B)Yu&h**xB#A#Q!V>V8tzB`DOgF|j+^B5I^QZ-%!E zg8x~poc|rQNZzHzhjMq2d}#Ox*yW=WY;nqg7;8KRvzY&~OC}UzqZVtW8Ym8nCHwPA zVwVrs%=hm#^{B63+)ahdzHyr;Zb~XyFz(4WZwXA9yMvooLW80lu@ihgU$5@r2A1s{Zkm2r`wDdR6X!MRV8`qj{y-0k1DOVM@t*7*a^v}Yt?wQJCzSlIKMa_cLnR7dd zk=;onXR(6l)c3I5oneGW%hXi57PSSH^P?U%(OrqF!I-K3fNWFWnD4XE(o7-ozUM_X z;$!#!EEafQ)LHy^S$CRf!>}*y`efe;&h(k#`k9$)!PtlKDZFwGhn|x(t87JUCdc#D zOz=u@o=m`9=Uv>kd|A(qUai542j>5&hZQXRSuJxIQ`}K`ci6lQQX5iOtI^vNm#B#n z;$sZcZo3)I^(wFKTmg6Q+m~Hi%?wn=`D4@o=l7q@+8eJ7h%E+Y?PjKhZQ}kc1d24( zix5AFvv+ljr#D+oN|2O`pkObi*g8+d`px&7t;f_IZ+}a`*W%Q}8)kMA-(%H7%5_dm z4dBhi|3QcJ9k$;sXS(QLHlBpC_>Ycl=hoTqmlvOY#k#3a{`5A!*W2^Qtz~VPs#1OT zx%GA4dq``;5ao^HCOXGaH&|TicNb?RJP+G@6R2h*Z!)Bpfmj6~{(mF0scip`}0jQZ;4| z?Pi$STq}(bUZ33;ZH2b?E+lyju@gTw2wV8pyw!Bx!&%R)LjW)Enb-H1f3c}~p@L?s8h+QnOT62_FOf3rV?=f!*Bp3MDk6`R7B2#sU*ok7YpeRmzYQRYMaEw zUYet~HkN(H;~@193CX;HzG)uW=Ago_s(g|tro6u7CP7?vRyu|%;>7)RiCvArBZ;|&un zi<0u-X~zR}BM;#vhCek%FGzY zX4Oz>ITrf(x|J_Xguf+1(Aii<7hmyD*+VIfhF|D26q3umIG0f>Rd3HG^^CQ4?()dg z?;VT@jad)1t3zz?kXiS3X)aW-qlIyy#Y9zugxAyO821qW|IltF-!Kz`9i&C)5MEn0 z%u-7ogmr*kB0bsR>%<{!zkk`sr~WhUPN!r3aqqfM+*Ghk(j<7#d~2w?l2WGIZl*c) zic-(w+eaY<7qa9E-|Fx^9b_0o^;2AtPoV>wH5(kKgnuPnm0HicE*x+9tLE_RQJB^D z5#Uc@^3ogCKtQTK5z78rgoU1eV_+g_?v`49;&Yze9CH~ms2Be9^OkAM(q#3_zH%DX zHv#_nYKLA{WX57`bdrr_CrRPOwr&tJ@w$6AA78x@f3+pPrZ{u)fs=yI{tw$3?Cjd* z8JUgPk4I|?%OX}e`q464)6n>YFIFV@+o|!^3IRXYXif^Gc50Z%z!mY``+yPE-FT6} zK=;?Bix5BPT-r0PbDArzezfEZ*eiFWev-ENzD5eq@1*A4$0q74Egpm!rO3MsL7g}A zI5X8{u_Au~GRYV+}OnG8NN3o&I>Jr!~Z_?MofJB+$i4pWfx6nTFU(>mZ>?q zZflj|zg-gK_?{>UGHb2-x>=vLY2wKPJxLdG=9k2OmKo5<4MEVp*4T!)T+$qy?c-1F z`Dv;a;6KhLx^h2qBSxpk`IM~clb%OI@)k!BCX@b>b0oROH!B@JvpATZDnTg%3*lz3I9CV`oba6|K{wBbMn0f)yde?+QeG}b65X7&VNsy1lK{TOxxR|cqOJ-`IYWC z5Je@Yi1+Fy^v9H4v~Ns-E9Ox^5U}|1;LjT`ymK{7($|unq7G5~_X6qU)?cZ7qc?l( zm%)L?OoByE36rfcU$Dme2Q_&z7JfM48`5_#P`wCo)g;X4j1!BRWb*UL!SGh4Ef=;{ zN^?~lpo)zL`YQme=qGC?C2d%bS&eB15|htJj0)8YK` zo{I0irNx_#iR_D~=}v?bAIFs04c`8@=_-HzwEhb1gWJs0+S?C8?NJTsC00kPUHYER zlGFWYzuKyk!El?6Q0MxIwH_mHb&v2$>bfy2#&Nrt$uinJtHTE7E;jONH*{lRz@6rOLu3dL-=FW$39T5N0XO^ zNG21#{;6kS9!ghyydkyL?Dv4*Q4-Q{4iLyg#@TPfwzzkVWvEAo?u`>`tjdINk$~2_ zGbj4e_?hf4KJcy^{y7ywA)a(~pX>F-p&On@oIXWZio94^e6_>YJf-kWf(x=Wa6gxy zJ4u%zl@eIZO=N4q!Fk~XA+4rJ2sCocK zEZd=sUxQfu1dTfuYa0}p@|a~C6k(V0-rZSNd$FmMn6X2QYexfkWplUJ80L*8J^?}<2HjF5(-}{TjEV~c(Pxn!EgLt>{D$K+sOX=GNp=vAG-i48Jk2D@RAWKTGJJZJaUaK zIA%Jx8Vkb6Qe~}&)_wOAg_!dk4*^;cYzpM>^iPqLRJzR682t&)>gH16cOE)SXPWpy zg{oy-9Ge)<$Y|D=!PFSpnH~uiPPp*@$^?bMZs|g?MT6ycws?_)N*vicfW&k-9GVurozNuw!k2X^aHFymIK148%TpXQt!l zyTog=O1v3iZ3CD0SANv5#F~B@P*U+!VWtoL96z7=mPe8e&_Wee2)DCz0bvKY!g`OPPH_bOh zO=Ec`nAS_u#B;R>FG2_X*HIevF=Ym`Xq8kvpGqu}H+Hx5iGBZJPfGY>q9-a))(x+T zR1q}1s#q$3vzW2DgjLKGe0VnJ6u?4a(}x+2W&?7Fcv$Xa_yiFC%?lMT*1e1P&Yrs( zQy16#Rme1!sXo0!_F35LC^BKc>ZX-ZGRxGb$$M+4AN8FfbZ`xQqm+9Wu-x0>JVoDI zY_of0$%m4Qn5xqqu`9K)>dVj^ zr?9cS!f;VY$UJyQB?4~QGn21vIf46FsNF$wqf=!JwZ?9io_=e8UR`3Jh?`m4EQoAA z*oMA%fR4v)Kdt@s>cB8XzwL(QQ9@s}hfL^bssTR_`kf!Y1yBX}*~jA7aKT&xuZf6v z#3%Up&7M6Acl(NQ^9!@q3z{*Ax=gVo`+3sNt*e^Z9Qa=iF(! z#n`v7t#}BeecH{^#Z!1%l@V%SORWRD3x#d_%v3h*9HntfW*PJR^f_T0BoCE(0%?su zUq0<@uOg2ODXe_>(gk;~G48#=mdwp#&s3s!PO!Q6<&)C0FV|df(&e~?4rirU9zM$& z`MitbOJ#=-$ut#S_$Hr;y5&KDSlYR`1iwvoqOzQRjybLEwE`@K(7F`83vM_WH?u#q z{n^WXqJ~W5f^FF_F#!6;cBhwXP{Y#l*<9X%D(;> z!}vLTJbG9yB7$46z50U)c_+HCt1-Fd>rih`LDyfhX7(^*g+*$toL`BCDFOLS+tk4I z%(ugA@fL9rh%N|TC_*9TFKD(EQ>T27>(BMQ;!x)mF(*cr6!5>jPXQ_T$}evl`v!90 zKZ{m9GijU=#iBmlp!@S^rSb-Q?q1U{6?=#MJn=7_X*#gBt4>cCd#(`28w+9!<4=O< z{fw)nUANJH#o6^odUSbJ)t87LkNf+1Y~cLu*LHs}>}=8oQ0C~*9l7tpGFf-7q>|>h)d3}4nnIiAH7k?d z`*YEOR@cZy(nh4~=zUdcH>V%$@9Jy+7`B%031M@AW{xeNZl{;$fUqqsU$VU4ZhEyP z9gcn?hvd*P1woIw!vq+Nk2rCjrBia%Y@$M2*GtpHS>!JqHbf6lEk3=NMlzLJn`=Z} zA@=yoUOO(^RyQgWC$nr{z)O}P;S3gLvVa8g-coh1n~Bo4;>DiXn)nJ+?nF&CDuucpH7LDD3!glp=x z3gr11rlC6?@c3EnI|gV56hYy6^jQ0_v9Y>XHjwA8q-5<@@L*3#Erm+ykAz?=e=ls+ zrhgT-Qu8o$p-MI4nv`qjmDr?9t5pt9X)eGdM=cc5mszt!g)i^0SSQZwR_FriciwU{ z27urJ#m8iywzsK-o}RiwwjVLOa^@I{2f-JR4dlV}#>pp%Akn;Vhf)@bUO&3i zm5xkBAKPC+@Nb=#Nl6TTOGL;zsV?mslIy60+721&j7bA?a8NS{l++t7Ro z)Dv53fJh^7fkLvJxA;Uj2;sDvX^f}PtQM2;wX~LJI#k{#0AOhB=In2W^F8@WP8mw} z6d(rbofc*Rm~I)drbD8qcTey6aPLdOS2dFz?@;Up<@~Kj@{ZG}U)gy>Da;LEMjPE8 z5pvdiVU5UWMe5YpL+I{ny=D2bNTA}G^5uy|BCf&~fMW+w0eUr=5ns#rmSR019P8%j ziT+Vtpvs*NR}yKR1G> zL(~9*a~kY_n=8=;F2n&n6BQeMBEWHOzR3KRb>D>}q?R>6 z=H`CILa0qAz*?41|MQpJJFK2;2fJC~;du?cGAo?5Ds-fHJ+cu$4V1IIKB{8-bGP*J zlG#BX^}e=7nBfZA&sW?({S#9;{i(nGKn#c8R(-C(^&!okC8eY5i`Y=0;mLe+Ox__jY+SWnTrUB(*zDNZ=UQjGdr-JF^JFh^@BHlZXQh0IiIN!slL6nkxDz$FJlt|1?ovk{#biYBkwj&SnA9_;u^nmv7B7!b zNa5ZyKFjZl&nl3vok7=@lpJi!X&Q&gm9)xyEW)xd!QIc#*xiJE&kqvp81x)0s2~Mh zsbZ(rc^rBo2HJEk@;Bqx0%5C76uzsVY0`U!IXkf0mATOY~IR*~>Z+r2d6^ zt8`<;10vXkKrhFI%sqvLJ0IBW_q-;k8p%)1ja_ZWEWcUF1YjpESJ_xU0lfYJ9h z^*;Qu9}+cMHoYfo6UYP5c2vlI=J(f;aO(-2T*D3RV37xQHILE|tL<&UZV_J_t6#G{?q zT~9rCn2o(IS!^!NjwAQ-z0DV?AjrEHiP$rdf({Hb6rEEfdDtfGv3)Nq2$S@lF@oCd zvPy`yk~o+ktWe;d<-7A0;_p)#@2)|kfAe%72ITt*T4pmrw+Qi5YfGEbB&!qams?(= zI3df~xx66EO}8|iF>4)(Ki4Ij)tC-IoJVTK)jfHfk>|^K67e#vxp0a{)FhuE-Yv0|#o}s=?R@;+_4S?@=R#RvF zm(}d=Z7=CZgZ&!Z7uOl<1pdeeilcGyPj-`FJZvl9Hi+*l(i}_Lsz6iBlYRQ=ugp(l zW=&Xt=zXH^Q21KlIn3f$Y&v2h?QH22AjvF4EI_%R6NWicpS)>)5pA_bMGlE8GxaxJ zpg%5|4iGd5WpbUU5#pGjduaMh{LglGCVdLQ7C%Ai`Bp=r6^1k2vIqRT-s=10?;LJk zKOMu~QdR-74`O+s)XDrK07*}%`@tKYTc^K)-%;i_zupVnF=`GPRY!_{cn<&dS;6Z( zj`hyx8s^Vi>W1OxPI220-pm}%K?vZS{Vr1VkvINq%9e+1XM2Qgd0d3c}pg zd|z)Y?vxbMIQ>cTZh&+_5a!c_Qbh)1cFWm*u)o@5(mR;NQP{8MsEG~)NPNSsL&G$; zAv$F`Kq4n}z#6TRuCNetLGv?Jz4$~ZmmYc8vk zv8e00Qvc`dpsPq0lW5K7I$|EP=B)ebuX#!Ezp-DNEM-CBqugkG-o;~;h&J}z1b?It zZGxN2lEAmj3@N;-dc!$BLAjLXzNfWju>Y>cjs+gt*+0J?qm#JNV}C(#*uMIRC%s)< z$wnr-9BG8v9PaO05v1JWUE7^}TtSMD_h!k9iIbA%3T8AOh}rzr|FQbhoy5*q);|YS zZNWMpKH{&D=mlI&#y4-FKE2jquFPZh4DmkY`S;9>`CbZk_YeMNu_ta?Gknh2UXht-HuJ&CK9MqdSE`bG?2kRVH$-T7w~^^Jj=4EH`|3+VmcD}=rE`tj9T&+%XocPgLtiF$QdD!V z(?T?jiM*zZAm-R#Ma#cwrxXQFgvZg%yxB93G;L|-bNk^=_s+oG9C0Am@^*6jO@-0= zGm=+RKw8g&0{Am9(XeB5!a&*HHQ{_PA0QnsZHs=9aqj&D8unxlXIY&s*S2vA^&P{- zpt5gmP5_PF{zdL_)VoDh5?`kcOcwXwFf?RV;yP{pOsBwYlhT`lG@=jN#C8yMh?zHE z=+p|npRmB%zft|EK}1)pi6`Vibc>?|_0007Zenhs*i_|#Ty<7K`dP*krdt_NSd=U3 z$lcf$_gbvI%>A$fsL_3?u|UCQqS+Qz4QT(?U?86CxrLvky1nozK=pO}*??+U>nNK` zL3`O7pcyC_x?r%hv0xNoT)av?wuBiu#Wi%JQ75+gu}KGmG^q`HCJ&g*mh{?JGBdM283HfE2kS z3V#v}^%Zqdj1;{Blvr_*(8gtp)v_a?_gn%n=2TqL7n@FM9tkfXtV{H6RDT~l-}96b zd&TE-ou3cVA8xqv$skeY^h=Y-=@-93=+o<@2(9w>mcObW{DU!m0~HLJ<$$C%?B^}} zA=TKyd;=tq1mxtVY!QWrzY6~pa>8AIMwc-W?h(Qb1!gWvLnURHq~rrIZzyKHvxcm& zTl-BA@R_6eliF#K$*9^Ze&-MU0x&`}CeeOp%xTiIC%kbLSX64Ndsa~A-t@U&>O@Vu zVTI(^0}`?g%z@A_mUmdjVv%}btx7a6UIBZ7gKaeGVK*|a)oRcGShTr!Pft*NTFuaX zU4@evxfkrOwcg$!NAjbxb2&R2$jd zc!73koudq@`sh?l0%F8s6)g{>fWoKNzNd|J3nF?WXYlRHx`_x%NYf=lfZFw6q=l-H zbu{Ylf-&1>D-s=~kTW)Qk{qAI*_(uqd>?~L-W6GM1jGH<80gGM&TfkHK=otACEF-k z(@*CjK(<$ndYa?EJd&SxVY`Kft9SDMfJajMXIwY)AC+`lw!BD%p6#VCMq-z|cagX1 zWfncl2WG8TSpyYKW+*Omkha}EL{aLyp3S_E`&BhUdxJ<+(l`U;Vk_86Uyr|W@}%Qf zA&*lDSQI<~-g^hS0Ks?xdXqwE;(^e{xBJT|E_CXW5-*q(=>oZO^1YYIEbPV4?zjM! z@BJDih;xTL4t~Qx@%Qm!Bv==qPq)^;9E8~kzgc+^9Y8sQnkGGL>R~+nHZ%A!0;V8L zU;^0d(yW58DxATLB&UEJPC2>Q-1H-~xEDEK zLHbuR6=su2r&u1s@|r4eaEIf!UBg&5QKN+?)2*o?Z0a0VI&~43AxnKRdRl^nm<{gp z%na{lIQ0DdE(4-~Z~=(Q9c>YKWF2UD1~oLk>Gx|O`~p@rZv80~t84W%-QQGw2#k6V zA&s8{?L(k`DWc8ba#K6;Q6Ntv$R&p(ghBuHO42RaE5t~J5q32aq{~u+GtHp;R@{@n zjUQDcP!|TSynQ?=(Q++@=Q5;SBUYU8>BsjR zB*E+b0}P25r70$$w|X)X%iXf7Ku(>Cg3E1HAd$ApfBBna!TPpFs)f`K^MIXEZ5`I`+UXm^v{m6 z8_uCX6&n-Z9&mWt8|PB5*0xaKC+xdF)n#x8jj5DMWE1UPHrK8uAN4?GeU^w84~CDd z`FKs@ciOE4Ji1f|LF&4%3&90cQ^w1^v&~((Gov``d4_>up_Me5oafORV2? z0;-bH7jtC7U2^QX8KTQ}MLpdm3g(6cIxB7kK{uK73{ZL=BCy;wO|PqFU7ns}Q_qce zy;s>>e4AO$T*vW}VTVLh8>Oy#+M*rYQ_iRV9cO_=m-o(5iT#hZdfiH*>Z&RCMtCxU zM@$;+rd>W`1Hj_`e@@x@AT$&KD-6hWm#Fm<#!MOtX~#1CF51CoXU(y`*B<7r#fOz6+aa|>=dvsE}D#)ukzF7LG2QM*;Lq;ekh7n}HNxvAt1_iyOHHi!b z-0PSKdCN*i{P(xqR{L%%nkq!A7g1Ds;%Ov%lO_X0Lwk~ATzhSMY z6+RwbKe(uT`|tT8z8BJ{eD9u{-dC#sQx3%1FM{V+5M~`OLJYIe3&0%K zolhko$T9z6X;&6(1EdZ8p8UO`*kLt5KlY<4XKWQs#_(A|C&wIFaZ7?XznQmU=oRtK(}Y=s#Yz*ph`or z9@y+}s}DqPW+e~rJ~QZJQ+KEf#)Rz=Ua$$?fJ(^%xfX&4Yu5+z$g zq#nfXCufL{RWOU*#Ds7@;kn$H@GaZS8^Fb@{6!5=k8H#W9XVtV z=&6@%ydV3(ws(fr-k0|^3C0LB{O=_35j3J~0GyQ^!z_}|5L6V9rr!vLv>LBJjQ)4r z_;)nw93p7SNSOej`Wsez9=w@YUVKcBfulS&Q~opr{wh)xB8R#BSsGFSXgrDn;+7C0 zaD9G`7%@nW`Q-NN4PNA*bi8sAOs0Zpy<(Z%SHQ?pJ>2EPw{Qp7rSK!7933ra1LZ&S z4ZSQv7f)lBE;*ySq2UE~RurAjy#%u`3qz=A1^t$gG^JGPdMKz^WvY-~}P$9jFFu2<6rin&o_5N2TNZ8n83 ziyWf|Tl54=1?;x`du0`PHl5Mz#N1Fzu#rt20g$txW)c$QAZXB8URoFc!o7cw zTR)6I1~ZzyBql;?wFkrHrB97B3Dhe#-thg0m-mHQL|l~5WYaE-xIDXQ#$}}js6h4+ z^M|&(t(8IYz7Q2%kB~=yb!tQ)hav7DMaFHZ>$Nxmtm-jybMfgc^#TpJSNkHr)!dNkL0OR_5cY#^JbMe4r_K#0&6&AoK%-u`5785{M?Jtah zf`M)M=>cL2@HRLVWU0Tb?1m`4(PKdlmEw>C0?g(N-9=spLPXM35V^oC&dv~Di&>GT zT>N|iqd>Ddky-sU(=r(cwiTT1DXpfuYAJ~$xb?_shXpGSz$6Dbn z7oK2Dc+wZr+#FtELd(bYHrqa1;D0VmB_E-4iNOq-F{RdZhN$QrwID(c-)P#W-ue8) z?kyDU8d6@}AoDN!y}Bxgi5x8pLm9-@jb?(M`^1Vvoes-B1be$WZ{MwxrE$W?hqg%I32F-XS8!p5q7Q^<*uh$c@dJzuXpdmzLe4 z6L9z2Zp28Q6Vq!-j7Bf(qn=)Y{IioA(KHn#vux_!KxBjmV}iLmNs#p$`NHT_3Sq*U z6kvpg{cj+9bx97B3=f8@Y{FzrSoU@9ks>>p@SiQnyny+T#xy`*0{%Tl-gp?zAkCgM zBmsz0k9gYsA)1dYvVrDR#hTJHL5|-;;V&kp#Qv>pCm&%&gWGmtFcTaCtLH~Po(sl& z&v305i4_G3E;G}MkGZdbHV?t zIxvx=V?at zT)`taomq4gpKw42%>_*kG&icV7g5iB&bqX{l1Q^zmn)byq}x(iBeQ3ly90yND5o7s2;VVX;lAj zYsCnf3gguFVF7U`DUVpD2h-#2hPJUxweN~rrjFQL^j;r}QSMx%!Y>|E9$H<;Z7Y*_ zP0X!K@>ENEB3mj#bw+e{41V&E1mmtiMXfgDn@ zO{`9Y+&%l}O#I?Ou?+^eYvM)j!E$5%|As;8Aqat39yDcPwv5HT#XCOX zbL)qHUk&7u!z4bvX_hkD_t1A4h)8+lCr z#${4uzhuC%P_l6;A;S&T|d`Hy=Crr z;@t+5!6hsHtzu}HR7bfS?K?GgOnB(UUD;VbT{^^WIcv)U13KM_HT#qJgpwxN{8dqn zsN>E)L+AkG-zesi-(gF;7?-|L#qU_cNE2E!c) z{I)6kbrduabPzVbIb!5y*#{v3Ad$Y+K@@noFLPukVAK>$**~WJTjs<|>=w*cd(Se) zj*~cNa7Sw+c9xDN;-Jb@(dF(e+c?J`U^RQRL7NkHnrXk18)pzuHawCou`v$4Zm@^= zE#<&n;LKSWaKT%JBB*ozs-P!=JOQVDbZ$Ph!-!e7xMy%sNe)4;-NDP61bVf_+c*vx zb(s@>PX^wjM%AobtT~vn_e_=Iw=mb_BF40=5))9=qdW%nY=eSM6rfDCzEg=Fi z)yx;!mS-DIK!3c6M`lza;XLo<@2d>70xm|b;jSbwX>0vyBL*2Px_q;$_Jd2y<})74 z0o|}^pCs$Cl9_A=t4$6Do2S1hy(M{TC#?oZMV%#atBTX%e8VG0@v<%$rv1YZ8Xqp( z-Vg5+zT&v1%nxQeo)e34%BVgl{?Gm8lLKmK$$$QuyGOuO^S+FMoQdBa>_d@_F=h}*%+U5V2tWyZG;$EvC;VAKdu_eB3E8DRG{6fwdMoG z#+YW-5bZN)@IJGiJ@3${!wW|y%Ry!gR|hl0E7k(p3XHL1?!=1^Be2_R8v8FixnyL` z0<{Ih8E$45omb90v`s>rs?>awKN#&4QM|OA|izwxwUhANL0zCfpyk z`-Z=&-s>zhER?R$0t@H0ue;xJNC+}wk;5D!G*P#exibX$G8&HsdzI&_A7W8@^HC!ByT$~%gAUt|Lz9>G znQfsA2Af4?=H64EHHEiT~mNggKm$;XWu4)7yhImS;Z#QYrCi;s9zg9 zG|}U0y~|N$ya8X#j31;xHFAt=qdi8f;}wVaYj17M3cp24@1!r`MK6Qig~iV10JmE> zQlPDP*4AC>%?~b8Wt8>0;+38=N9mnQ^&D_k;#(cIZ&X`uPt7~|#p-CaAL)duP15f> z#v+Tb!6(@auOgK+zaJ`E4m5BL+-06M=V!7oD8du+zg6>zv>D|*Yx;R#!MBfT?q|O7HLnF2$X^v6$Yy%wpLn%_oSC?1&2QBi z8WfP5LRG&)^5^cI5QE)2)yqcKxEwe@pcj$c4A-u!UJ(hkXY$(iQEZ0E=-)-VHrI?l?`;$7ybD&c(u*pXIRha2 z`+Yx#%iXKh($V(!hJH9P(fjrcjZK=Fi)bQcchYxoY(Hqh4=#ZQ{DJ85F}EYP$bym- z`GsIzYAX}G<51-+8dh)hjHMkif6kZt$8y;}thax$B%+u-WGtF1mbsJe%C9foo z5rWEZ1EJ@!5>Ly(bdhVYf5^#QoamC{!4MFPTnxUECL1^&Tf3pWs=U{!8q0r?8oUzy zc08C$d=BCqXoDa%YSTnPubiC0h0{qIhKWnaWTQTtd*dHBN2awK&tk-br=z{2fN-N2 zNK=vaF=;D@d0(_HbG;j@{Nk7B(r}^V@m0BZAv78JU7dVh2~M;+C9~GIb~1{hH0*K(vvTQAXQp9%r&)PgoFA_#rBuo zZKgM~d7G8=uv{ALH1PD&6=Mxff=fh+V|@2c!^NI6JqVs|ehF3Pi?r@ey!>`whD7*h zUj3M^mV+Dx&A2)6sWPzK;fJ>Wq7J8lWQoaT_A*Zp2K3|wh4yo`VZwL8r-p?_SI9IX z4#V&oDf&QbC`W~>ygUalE9)2WZA%IW3xJ&}j*-gON%=fENTKWn8s4cHhu+y`&MkYv zxL)EI5IdLfUYO&Z8QQ9}B(aSIvjast2KElUtGwvbkJV2s+=Bhn8EK7p0Z>?J)cpxm!YZC$hP>{q zY`&r11m)Kq<^h4Wf#+`(KFK|;JmPmPQ^%q(j%Vu zSZR&!_bdV_JIS@mI-;^Y-0$&gqq?S+bxET!cy6NPZ)*#dp&&H>Z@FuoMki{eevk3p zIg`$Tml?2Dd7*;kz(mANEh4r^N(i^+SjiHlH;M{;>Ih6{U6VsoXRr>Bm}3^W6&1{L zek7i>7QO)=?k{`>u0e5%cs#by4hzIyGx>subp{I4Zd*>v$rBVE)!N(PUWnSpQ7eqX};P)diXCQ|%3IUp_t zijMCcYI3X$*>?W&ZnDy1Q}%OzKJWqK#Vo)enr%<5D(TfthVdq=R=jg=S<)PJ!m})b z?|TZM|0um71C#1y2VC0LJ*XA8K3T>W7D5{LTx<;HhS$7j0+rs#O#oko0eh15e}bsP z&tAATMW#iqBys-q`<*4Nsnu?pdCk>&=ZE~~>>WI3{?Iu^FmXSk%HHa_H79AlZH)k0 zql_+xIEeUtnK8;ulc~^Du&DBII9wY?67b-*Hid1ala=i=?Z!i&m&dOayQ6&txW)qu z*WFL?4Vtsopzx6^pjX^-@Q@>3k9Wpk$}-(UQt@9+)zo1LDw*2sqhTlRyIZ-~>qDP4 zi4Wa-2|lU^Cn@%dWrlNUUOO3&v@PJw&()L|TSW-2*_=ZY^3f~E)7Xy~-mSv?LpDVj z4A3^WI$itEZU$PmEnm@le_a$LdmXUcJG}fY(Gy^6orzBn&!V#kn7GGwX?%{62$7nhUH z%m4J+D*0-0S&dO^zp;9lcws982n5sx=^lRwpe%$z1HYRkyw&@XC-+U6kno#)Rch_~ zA?7E8iSVA)UICoZtKGX(PYV;;88ub9>QnQV=%v|TpB`$a#CJWPup19oce;V|p$7$W zv3GguaP&ZYiP8nLh$s)kv4x@fARA+M4`A=8Pg2xS408Lij8!v=** zG=ZI?g^wQ6iC}t=G5tkz9%?9Ek7jGe;c1o{f7Xmh$4bIPrZ7!5fqS;x^lOW+d=4R?`Xu;X;S=HExxkeU8gIMK5l)mY$NI7i$6%4pY z=A(!=;{|6)U-G6T3E-7TJ?qjF3nb(LXTE}iD|Yz5$a*CLj3Qxm&fVsP1#=>#a*DiB zr81p7<{+2SNxg^w?r8^{isV+u!xD{yg({e$+-tQ0&U!9Nkxdk;ggvUE&Mw1oWddFCgJ(%UBfhn2a=S1KAazkBnbqFtUi%+=BW}1W}A0O*B+V4UDzdLEsUUQDL zD%-O5Ibx;-fo^+e=!e|OhcWA}_J(9$dd0$IR@g@3KskCSPnef5BE3D!N%(598=n;h z^Gp8qt6%d4b*8}+U{7ngM|CG@BVoK40mAA_punHNLAZe5=bx#j@aL^oX7XMV4)YV1 zf_&P_F7Arg3}50}XFh-_v~(#wh(qOeO^7A>z60WUFJgP@IYTi~Yao*?152_nnVx-n z{iTV|`MEVrfML*H7I{C+cX(Y@ux?U|80i)u%QmBT1E`(p6>!KuNR&lIkj((4GSMbS zlBR5l3DbP)Josg`OP_#wz=f@oZt_N|gM^&?M`!xN$0@RB=g;vaUQO$-co}ngl z@O<2lW^Z*-FOG^K^~vwh)vA1@Xg`N%YmORwTMs~Fz$cN>-f5$}`TB^BhV<_9rd!B~ zW~{SgmfSa&pi=9p!woyPVs2DJ#E4};t+f90oaloD^84JV6q*KtW=HQY_0@47IeX>_ zNsYgTUjdR`BQ~bfd}Gp#p++|!5;##=1^Mn*==JoUp17!4AI#YY5S_qqb#u5gx?lNb znUl4uZkm7`=+)$*9n-7z{4$C3?Eaw+CqY@TtflBO_!qL`K%V&mL!QQATz~`cy{4Ca1!ApLzD)$&5HcPGn^yvk?8> z_x=3-yzzd$?)7@^=i~W&9(oFGXPegnx2~H|O>V)TAYMn~+5X|qv6}x||23ZVM7ZI_ z@^@Zqm%2&I40Lu$S`hh#^Wc&j~9V*X4otOUl@ z`hJaP3f~K$5W$ngK{erk##g(3t#}=qDGlGw;KDCXWai{SqTl4)?!t|D9*3~Tl(3bb zwiag0z{RfDt3v2B15#}TOdKpoXS=KrOEL1=v}csc;QuA;!kNe!DcvpsCes)Qwobjc9{sBi7W zrET)_cJ%j^8G`APHHt!UnY32W#}mS%h_A#oRdQ?wKmFNnz45HMDI6}8Rp-`Y@&sG% zntsEK*S~8h1@_>6U?4Tt23sC%j&;_VPA#TkdMRQQ)7g)6h2(a0_JU#!g+F_AvRAvt zX6!5w{r18X4|okb20C6B!hA5y9Dt$o8JA5lW6j2Y=OK1x*#Z1uv%3lbyZj40O8kWP z_{f8t$rU)V*HKWz;h!{_R(myhZ?G+__2sY9)a`~{3$W_w$K6hU&{RBEUF`J=TWYCD zezm-_@Sx%6EI(xnfFA8QzV)xGP2{uJCUK{5xBT6@r}=$a*4ca$^;#lYdlAtD$frD! z?I=nfT^BSHrT+M7^0gtce(RLUZJed6*`952;|3;w?6}$5{!?(yI0!Tk$3LSiEf|1F zku-gLdyh4$;mr8Y_LSlV>BT`Dv|YT)GLhliW}YIXGm^!2Yb(w&x2ozNLv2iGPMU&I z7h3N$dhJ8co`39VYlr9Fl^!zzoN~d**9wYp4fx!lAiW`6ek3(vbW7iaBcT;=={1i=pbZvhT6 z9mD|3yu6_eDH;StNXBvEjIva`tN2GE8XsX>pQm&TW!|f;Gk6k^mpaP;@;Qv}H8Q2s zrh{s;nJYE|hZi83z{w-K0@5xS-;Z%_%nI~S{%=976&Oi7w%v29OTZq$g9$ex61mso ztQSA|JUXy<=ddpb{IY=6Xvy!^`G`Sg=*cb=(JhQ^cd^mJ4RJW^*meg*@V^LjtU@gMKH@6g>-9p!PrUVUl@*s9}^DeO~5XXt1856IIWi zMZzTbXYUGLpwL&P%#rYve?J+QXsG8onG5jezaU%6j#fM4R?tnIw#qTK1xF>25&`PC zj}jE5<&CqKNZaF|mRo#-8oe@fpbWL1&%~;I|8;mIsKe_8*EVLJ#D7;9O*DS7ld1k7 z&DTYb5Nzz5y0)?d_ll3M!|S~bU7uv=tclYD!MC2hcSrelov!?b=Cjm?%tc!5=2||n z>})+%Wpk6PzMAU(=U^9ZE;^aYaQt&(+LM9m_~R5+51THdl37Xrjz6#-e;XbN_rbp` znfMtWGIA+%-(86RZRv2yx<-LV#y=lSZt~(;`e}-iCDNH6k=k-lG@$Z=D_kBUdO|i9 zx(SkUw^7{;-C#@2<?wk*Nb|5C(UYhw9;2Z}u`t?p!Q8 zCy+@R}ae-hr~Tema&jBws#S%)ooL2I|d zWr~j=M`7m|AClks)P^6Gcg(qYR~bf4BBokZ&F`=Rg8}3Yjk~M7tDQp1fI|^h0n|AP zse%&=kblNp3!EtHVLl5%;ZZk`qNyX4*++P`rMN>?bc9WzO=?NVRiC1XGH)6bOVSw8 z-|=u6cFYTE(Tyf*@j^7MwJI&Gi%K3UEgvU_1gGk&I~&5(X+s?;f_sm&#b7q6Cb5R^ zlCKdu4LFW%QR$smSkQj-$QNp|K%yU^($Kj>kUCmbmv@P#iex-^%uzO`xWIah4*0U@ zBwmYH-}hLj@g}foJzJS8KD5u|Zkxg9Z^-F13`}Xuvs-Vz`ok;Q_G}5iOm^-H{UEic z?mPO51+yPhDGbXXu6`9SEP2F9QiWay~_LP#cZV;M$$yItr1# zC&t3%(`7#m5}zNhafvd%)en$7*J|8MXV~8&f;3vk|6Hh>Uw#Sa#36?*t(<9Ghu(p? zgwzqYG}sMqvQrOa+y=s51sz7*?s4M?Jy{lu2?ua_4u>yNpkne}SS4yB`$3l4 zQ-HBtvpX93TnxE6Xy7`$6Ji33{H?g==^@^w7-!hq_~nTodRZo61=6NRtnMp%{66xs zqf-ok8fS}&r(Pm`<3V(O-*j?qe&Vk+y3!}Wy``IHI**&E3hch}f@(&?zCUOv>Qocs z9G4LAXG;eu3cOsfsHx3$fgZH8O4#1IMA_(FbTuSF>wK}wY+~C3ne7Gsp-Qk>_Iw6u zmUx;M{yE-)JAf)pdt`snIoo~Uu;sK*?1jFw^@Wfj$MZsOKR#{w@oJo8f0>OUS(ByA zUTx3#i~8_H1{v`Ch&u15TCRX;#XZIksk{m-2g)Ts4SuaPV1xh#f^d>1M4D3pRv$W7AX(l-W$%4x2NqBb3QEVq$rs? zCfBPSSVb)^0D$S(2F%uqQI^q*#6c98E$^-F|(%%_Yh`0`zH+o5RIl|Q4N!?RUobOdJHxn zG>*Ck9oo+akVx?scw7loUSPKvm7594B(Tbeq48&#VHCgT(kcReAvF3F;rj{0`RBjx z>Kl?%Pk)rdHqF@~oh|i6NTscoKr9pT7Ow%FB?v}e$}Eo=V6xuoFqNRou@JV;;IrtSyss~1Qio|tGQ?^_zg`p_c3 zpp6v{i{D&W1S7xRck!Q&x?&KLovN?yYQU67$S&Rt$LarX2uYRRC_$Fz%+fcr#jIHs z`msFcF_UfL(RmeQJe!ts3Eue@Qp7(6EWgtU`EUd}JFGDvA&jwz6drDfh=TY4sduSZ zGd1O^i)K(JmpKNEH7GRr{&c0VrvAx9youFgN+j`O%9(tt4a=FNw3Pm5&Iv@ekmFTh zuMVbf#notd5mE8&fO6=>Ps70L-tDbc8R{StXUkrQxSujrkz+4rOcJ#%!<^dmmx#S{ZiV(#g_4?@X`S5*2NSSfZ2~8AA!8yIt_<0Im9XuI= zhz*Dhbhjg(C9((f6Y4{}B826*Ic=H_xa%_7OtPy{bcE=I=3XwOVKQA*zCE1g5|CL~ zey`3;T;RYLoUUYv^aVK_Qjv-nK8H_Cl?Rz}E2YHpZ1@-R!`Y_3b&{#_-mOOeA)NLi zGr;+(o~wUXM8lwno30Pjjd-qzcEE6?zd~L#Q$Q0(nhodt`0q1IOb`7cG>8bt6S(#9 z@4|$fAsCFGe>Z);1Q9dBFKsp6kXM2F(}u5N^LL_ahEYu1&rza}Bb6(hXDzr94wVN? z`#NRWwW6Xmtf}9q`OIU6+gyyum_o zeoLV=o2Q6~jPb4hsX%(QXnolCcdE)nItx}F;_afH&~qCsiFayf|BURgrRM9ozc_yd!+noA+kM!lQv?x{aMJF^PORU{2(SlsC-$=P``@%Ki8aw z4=U~o14q0MdM_*rI7??pXHA`a+JrIX5pAxE7#m-eMdG%hL|u-=k^SdKY)^nTH|E%D zSrss)`QN?IUw8u<=8@X|Z5UIl;E8%*dFHd(m4$e$Isn*T9c%>y zY(T2<ls(tch^v|N9z9L?16zmMS%_K^lU9BnzpKSUfA8NCi@G|J3*1 zvr7StC6o(h$?K@z%dDwcHQK70pWY!j`d z%QQ(oaCa1hWU0`lON-;2T4wrvnDb#Wv;cs(Mp@D59&!mZ0Oiq+)H3bkL_xYes!!9@ zWiQxbqjn*$(5OJqJxvu!C79=AvNLsTUGag|qZ{LV4t*Z_Fw?zgb_$&<$LapQd;`+U zM`=7>gU{;510zxdkGmJjZn#NN9-PG{faz~aWnfGHdc5wP^;8hOS_p#597V@^P!yV; zH0vB!TP>f`2t4avW4BxjXO#ld`(a$#Kbc3t2WPEo>*^fEEEnY2;B5uw5zjNUnLNJ{ zffjh_s=WDYEi*C*FgP!fW(StfNK3HpXO+UiBnSqRCw$t1;rp|{SpBT2H2({yHvN|f z8!8Nh z_g?l0JpC20Fa4I8_FPrrSN`rJeK?Po!tPM{e((yMB{GGcL@mOgv|i(R!hk&MP?V2G87B^lp8@-Bi_AWSCNxFby^ExFIR`lFW}X?G>w*y~Fb097-aDObR}# zLEQT;O)Ht3e>M?UkV1nWGN2Q(=X4k^?3)N zJd8LG2^-KiIIU_#4`X*$s`t)HoY=o^wHkrpWx$>>hFTx{b(_-^5}xI7qP|GgUqkiy zNeFMLX`UGYWw&{dg)E^=1f!RcY-_>?f4BJuM20wgSZcCb!V0y$C|XTWkGTsxMik!O zEU)!6U7Y3};hghvOZ0O*Z3(bLn*`0;|(>r{yf zmT|E5@qjBh1Yjxtn>?wo!ke9riBra!D-@JO>#NVuN4eBN9uf!1OiYl+ZDqX#Pa|yg zMpq@=Iqcnc%)m{N7zLxbiF~Z7{+SqpjMzR)I$B)>E~#62ehNr1T6}TL%63ZfYt@?^ z*TdN`Z;V!TN$x2cxrf&&dO0qPl$MKUA2_dFpnpEeVfdZD#^kw|8mv^39V-*I0Leo2 z-a`BrCFB=e@q4EtKQ#yei76_NyD`C(#YbIU3CM;EE#{9iu%t9jGg$wL=Y9|ZcYDIQ zrJb%wB~@alLD5t_2R`&(wrCgaS2GI*(U*Om#sQDTul%>h#plvZuY8T{_?pTDD$iSj zj+wvRiOhv%IoHZa;qhaRmM2>?O7{1nh#ccI_)b5qT5&VF9P<9gcm!kUbZydN8da8D zb>Nb<*<_(vg+!P&GEvt=pK`EMW5g{-yI}XJPkyZvFsAn@d+@f45VN7@ir6cUQ5f3p zTU_)m?n8H?F2Px5d7~6kDOwdP;&J-{C^F$95GvYdzhC2P2T^4<)`m}49hqz6eh;)A zC+oxw`|2~jHD-e^;NoM*Xd0evqF3z|Hu3YPiM$uzgW=cLZbU@e;-LWy^YIqQ_19#7 zSkC?>AS`iRU)~@EJL;1~{bssF?O-@yG-#WtQ1FxuX0KEciykZUxZ$a3)$ak@-Sh1I^X!hTq7Y&-LT3`@-%2MV*WWw&bRw)b#$v&3O3YzC?NJzU%0}fs%f>t#Dk;tGNYF zR?@ECt?gsua84Hg+bZqbdOIH6+q-&aOKI-8wM%L0`osqQeJd9JRLJ!`-NfI>(4f27 zw@%0TWtU7Ht-!SQQ)cBu$c-qY)$+B=N09K_1c3{Kf@`BY-~Uh;%h zX;IZ;naCY3jc(VylxOYcpne`h9}nX41cHGl?^pmM^s$0ojKlWO86=BGp0w_)lqdOm z%^p!z^;gHgWXBw&`aYV}Aw{=W{(?LMKG+VQfQ13+?Y9_e_0z-QUsHR4Wra9af7kf2Y zy;SpASS%-C*4)VV# zGI3qR%==+MB0U>Qnnz5B?5^|dBbCx<+hJp?Nu-ab_}#MR>gKboCBf*ADT1d>VJuUR z@*e@8TJBJ@@RPH0%}{cuJ^)2C=f_va zSqsVY7Q9uw(wM9#U5TQ(0M6}6ME))Qq!EbwyMF*osVAj`pj8TQFPb$Jh{vubA z&y*af=dS4_X8^FadYtBczek)dJ>QEMe$i!y_|HpWPT;gF%~!#iZ(q*?nQ|CS-g)xU ze9^g%lr{oOv6xejS#pub!1LuAsvgF<-$yMwx<_>IxUdC)y)es*cqX6MK9$%Tm@jt3 zJP5~YC55YU9T_fz;RcN^;hv5gRAF=@ZWI8&Yq^=F4r>D+)5y*L0{dmLPFbLaU%*J6h1V6%t+a-T~S5(;m6VY#Sxmxll(!n>5M?9 z1rY1i)ly(=`cWuy;BdU7fN<}+)Iab>!#;s<6uf#Y&4!&2%knBAu8RH%%BmuG5e+=v zr~|IqbkzKp7~~5+X*^F=-V5FItNWNZ9@KS6t#J-cHSZH;N^=cr$cc?r&ky4w^p90& z@yrX#`!qQ5tAf|iA^p+h*}a{!_NgKL^AGpbEM(UH4WTgbk@}Q6yryNe>sJgbNdupesTw*D{gxYxKRUa&yQnQ#zYj^hh@3xbV z{=7|0(l{S>hP^<2jT*2dB z@zDSEC$R(!>?aNLr{JENiuP0-&t?tNNSFBLVl^V2)($d(%eE8>l-exjAKKngRv`=0 zxz|T4$a|JhYRRbY4le%6&L+iqA{zXoOJgQm%4V&&ORmhpU3)ZlIMn)Ee%w1&)qHp2 zf~69^Qj^zEu=+`g&LhTQyt+@HNx?3E_dwNXrD5pQ0#)$5T-Q~{=W{X9rD2x`)?I%v zaL-xfhW0z~!vnc7%GL0jUhMN}nzIFLX3fs+cR$b?{d)?)mPai^qu>9$MJQ0~8_HXY zPH;qweY>UIQ*@C&LaUoGYD#?gfnH;_-IujGzcuOsh)lc~k1ntc@U)xtJtZ@G?Sd%q z+fn1bl#G>3in1hPs-U~r6HD~=pUsaju>H`{FW&Qh#N-a@JL5i;e15GYcNW$qoXcC| zvi_gz(=DOUPichnQPiMJW%FvGxq8{T&+0oSq#_+!nDy$Mj{)CPm!_}HP1mId6vk#~ zi!|M29v&vi%#g@tv0ls2S!;&o~kfRa1V!CUwxuh zi7Yk4w(0IY;QRfaBD*v-XJ^^D3sFY(f5=_;Lus|ZjM}LlYf)lSz44y&?$PP+#2DB_ zT^x8OTYQP@)@Yyv7ABujnd;2>Nl`y7H$I-YdufQv+6||4nk_v``Vu`8yQvukMMPf| z=ynx7IvF^phBdj^l~u@Y`@=NAA@cIT`;e8hH=LJ}=8^@^Q1Bu_-x7hmZRcx?G!LCs zxW+dUH@GT&N)6^O=AE;2CM{-{g?>Hnc}WPE;G#`Xm{UpZ8&KUC&McqW7C) zYoXtKyv%0p^-uSfM53&cSpS}>tkJmlK&@_{0VQ!6%&|~U_8tXrN4j@!OJs@R<#sR+ z1FY_F%(xlcnDHeF{YfE&Z-29!ZH)~2=?4Hhda`T#NSD;I8ql4*cB_1Sxo;4ze|$d8 zTzNUpCXYU|-(N?xeX$=s9*naKH=9enOv{b7nKy(53Al?(5BOMRF(6T96g}9e>lup# zd*A|woyf0XxNw##Ytwj2bFb7WKC6Py<$!!r^<6!4Z8c__OvHuoGr(#BXghc2nl#N& zqGFP3%51KGwJjq)kBY`qA4IKu=mDUuU9q#ctR1A;F!Mj2Nn5v|EU6osI#WiQ z8Uc>i+wq|lKZlwgi=F+jDI|Vr;(0*#ca@x>$Ww7aMJaCz9>eMvxUF^PX6beN=>G%o CLwnu; diff --git a/doc/source/img/Infrabase-Build_System.drawio.png b/doc/source/img/Infrabase-Build_System.drawio.png deleted file mode 100644 index e0794f81fa91a7a302a1f1246f45e9cf5ed4ebde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30790 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 diff --git a/doc/source/img/Infrabase-IB_Architecture.drawio.png b/doc/source/img/Infrabase-IB_Architecture.drawio.png deleted file mode 100644 index ee81a1a84a20c6dd0126a8b32a9c03437b9851eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101242 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 diff --git a/doc/source/img/Infrabase.drawio b/doc/source/img/Infrabase.drawio deleted file mode 100644 index 29d8196..0000000 --- a/doc/source/img/Infrabase.drawio +++ /dev/null @@ -1,344 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/doc/source/micofe/pictures/micofe-emiso-engine.png b/doc/source/img/micofe-emiso-engine.png similarity index 100% rename from doc/source/micofe/pictures/micofe-emiso-engine.png rename to doc/source/img/micofe-emiso-engine.png diff --git a/doc/source/micofe/pictures/micofe-logs.png b/doc/source/img/micofe-logs.png similarity index 100% rename from doc/source/micofe/pictures/micofe-logs.png rename to doc/source/img/micofe-logs.png diff --git a/doc/source/micofe/pictures/micofe-overview.png b/doc/source/img/micofe-overview.png similarity index 100% rename from doc/source/micofe/pictures/micofe-overview.png rename to doc/source/img/micofe-overview.png diff --git a/doc/source/micofe/pictures/micofe.drawio b/doc/source/img/micofe.drawio similarity index 100% rename from doc/source/micofe/pictures/micofe.drawio rename to doc/source/img/micofe.drawio diff --git a/doc/source/index.rst b/doc/source/index.rst index f8230d7..43f6b84 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -1,23 +1,11 @@ .. doc Documentation master file. -.. image:: img/EDGEMTech.png - :align: center - :scale: 30% - :target: https://edgemtech.com - .. toctree:: :maxdepth: 5 :numbered: :hidden: - introduction - rootfs/rootfs - User guide - build_system/build_system - dev_flow - base_extension/base_extension - micofe/micofe - Coding conventions + micofe glossary | @@ -25,28 +13,19 @@ .. rst-class:: center -EDGEMTech Infrabase Devtools & Environment -########################################## - -.. rst-class:: left - -Setup and environment -********************* - -- :ref:`User Guide ` +MICOFE - Micro-Container for Edge Computing +########################################### .. rst-class:: left -Coding conventions and development flow -*************************************** +MICOFE provides a highly secure, virtualized approach to deploy and manage +micro-services in embedded systems, combining the SOO mobile entity concept +with the ARM TrustZone technology. -- :ref:`Our coding conventions ` -- :ref:`Our development flow ` +- :ref:`MICOFE overview ` +- :ref:`EMISO engine ` +- :ref:`Portainer (Container Orchestration User Interface) ` +- :ref:`Alignment of syscalls ` To edit the documentation and to use the correct underlying policy, you can read `this documentation style guide `_. - - - - - diff --git a/doc/source/introduction.rst b/doc/source/introduction.rst deleted file mode 100644 index 94505d1..0000000 --- a/doc/source/introduction.rst +++ /dev/null @@ -1,19 +0,0 @@ -.. _introduction: - -Introduction -============ - -``Infrabase`` provides the developer with a base environment to deal with embedded software to be deployed on -different hardware and emulated boards. - -``Infrabase`` harnesses the power of BitBake's highly modular, recipe-driven architecture while seamlessly integrating prebuilt packages into the BitBake ecosystem. This approach is grounded in years of hands-on experience with R&D projects and embedded Linux development, where the typical software stack includes: - -- A bootloader like U-Boot -- The Linux kernel -- The root filesystem -- A set of user-space applications - - - - - diff --git a/doc/source/micofe/micofe.rst b/doc/source/micofe.rst similarity index 100% rename from doc/source/micofe/micofe.rst rename to doc/source/micofe.rst diff --git a/doc/source/micofe/portainer.rst b/doc/source/portainer.rst similarity index 100% rename from doc/source/micofe/portainer.rst rename to doc/source/portainer.rst diff --git a/doc/source/rootfs/linux_usr.rst b/doc/source/rootfs/linux_usr.rst deleted file mode 100644 index 9f92e19..0000000 --- a/doc/source/rootfs/linux_usr.rst +++ /dev/null @@ -1,37 +0,0 @@ - -.. _linux_usr: - - -Linux user applications (usr) -***************************** - -In addition to the contents defined in the *rootfs*, additional applications can be built and deployed in the -``linux/usr/`` directory. Such applications are specific to the agency and do not belong to any external packages. - -Deployment in the rootfs -======================== - -All applications and files which need to be deployed in the rootfs must be first installed -in the ``usr/build/deploy`` directory. To do so, the current approach is to edit -the ``usr-linux`` recipe adding the *install* command, for example: - -.. code:: bash - - usr_do_install_file_root "${IB_TARGET}/build/lib/lv_port_linux/lvglsim" - -This command will copy the file ``lvglsim`` to the ``usr/build/deploy`` directory. - - -Development of modules and deployment -===================================== - -Kernel modules can also be compiled in the ``usr/module/`` directory according to the platform as defined -in ``build/conf/local.conf`` file. - -The modules are automatically deployed in the ``root/`` home directory of the target ``rootfs``. -The ``insmod`` application can then be used from the *shell* in order to load the module -into the kernel. - -A module can be helpful for testing purposes, for example to test kernel functionalities. - - diff --git a/doc/source/rootfs/rootfs.rst b/doc/source/rootfs/rootfs.rst deleted file mode 100644 index aa2d5c2..0000000 --- a/doc/source/rootfs/rootfs.rst +++ /dev/null @@ -1,28 +0,0 @@ - -.. _rootfs: - -User applications and rootfs -############################ - -.. toctree:: - :maxdepth: 5 - :hidden: - - linux_usr - -In the Linux environment, there are actually two ``rootfs`` (*root filesystem*). - -The first one is known as ``initrd`` and contains a minimal *rootfs* which is stored in *RAM*. It is -basically used to load firmware, basic drivers and to prepare switching to the secondary *rootfs* -generally stored in a separate partition of the SD-card. - -The second one is the main (secondary) *rootfs* which contains everything required at the user space level. - -The *rootfs* is built by means of ``buildroot`` which can be easily customised according to needs. - -In addtion, user space applications can also be compiled and deployed separately. -These :ref:`applications ` are stored in the ``linux/usr/`` directory. - - - - diff --git a/doc/source/micofe/syscalls_alignment.rst b/doc/source/syscalls_alignment.rst similarity index 100% rename from doc/source/micofe/syscalls_alignment.rst rename to doc/source/syscalls_alignment.rst diff --git a/doc/source/user_guide.rst b/doc/source/user_guide.rst deleted file mode 100644 index e4aa9b2..0000000 --- a/doc/source/user_guide.rst +++ /dev/null @@ -1,275 +0,0 @@ -.. _user_guide: - -User Guide -########## - -The installation should work in any Ubuntu/Kubuntu installation superior -to ``20.04``. It is assumed that you are running an x86_64 version. - -The following description is used to build the different target boards -including the emulated environment based upon QEMU. - -According to the board and requirements of your configuration, all components -are not necessary such as OPTEE-OS or even U-boot if you use x86 boards. - -Pre-requisites -************** - -Shell -===== - -The build system requires the **bash** shell. - -.. warning:: - - With Ubuntu 22.04, the default shell is now ``dash`` which does not - have the same syntax as *bash*. Please have a look at - `this procedure `_ - to replace *dash* by *bash* - -Packages -======== - -The following packages need to be installed: - -.. code:: bash - - sudo apt install make cmake gcc-arm-none-eabi libc-dev \ - bison flex bash patch mount device-tree-compiler \ - dosfstools u-boot-tools net-tools \ - bridge-utils iptables dnsmasq libssl-dev \ - util-linux e2fsprogs - -Since the documentation relies on `Sphinx `_, -the python environment is required as well as some additional extensions: - -.. code:: bash - - sudo apt install python3 - pip install sphinxcontrib-openapi sphinxcontrib-plantuml - -If OPTEE-OS is required, the following python packages are required: - -.. code:: bash - - pip3 install pycryptodome - sudo apt install python3-pyelftools - - -Toolchain -========= - -The AArch-32 (ARM 32-bit) toolchain can be installed with the following commands: - -.. code-block:: shell - - $ sudo mkdir -p /opt/toolchains && cd /opt/toolchains - # Download and extract arm-none-linux-gnueabihf toolchain (gcc v9.2.1). - $ sudo wget https://developer.arm.com/-/media/Files/downloads/gnu-a/9.2-2019.12/binrel/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf.tar.xz - $ sudo tar xf gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf.tar.xz - $ sudo rm gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf.tar.xz - $ sudo mv gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf arm-none-linux-gnueabihf_9.2.1 - $ sudo echo 'export PATH="${PATH}:/opt/toolchains/arm-none-linux-gnueabihf_9.2.1/bin"' | sudo tee -a /etc/profile.d/02-toolchains.sh - -For the 64-bit version (virt64 & RPi4), we are using the `aarch64-none-linux-gnu toolchain version 12.1.rel1 `_, -which is the official ARM toolchain. - -The AARCH-64 (ARM 64-bit) used with SO3/avz is ``aarch64-none-elf-gcc``. It can be -installed with the following commands: - -.. code-block:: shell - - $ sudo mkdir -p /opt/toolchains && cd /opt/toolchains - # Download and extract arm-none-linux-gnueabihf toolchain (gcc v12.3.1). - $ sudo wget https://developer.arm.com/-/media/Files/downloads/gnu/12.3.rel1/binrel/arm-gnu-toolchain-12.3.rel1-x86_64-aarch64-none-elf.tar.xz - $ sudo tar xf arm-gnu-toolchain-12.3.rel1-x86_64-aarch64-none-elf.tar.xz - $ sudo rm arm-gnu-toolchain-12.3.rel1-x86_64-aarch64-none-elf.tar.xz - $ sudo mv arm-gnu-toolchain-12.3.rel1-x86_64-aarch64-none-elf/ aarch64-none-elf_12.3 - $ sudo echo 'export PATH="${PATH}:/opt/toolchains/aarch64-none-elf_12.3/bin"' | sudo tee -a /etc/profile.d/02-toolchains.sh - - -Configuration options -********************* - -The main configuration of the project resides in the ``build/conf/local.conf`` file. - -There is pre-defined values for all variables. - -Platforms -========= - -The ``IB_PLATFORM`` variable defines the target platform (also known as "machine"). - -The following values are possible target platforms: - -+----------------+-------------------------------+ -| Name | Platform | -+================+===============================+ -| *virt32* | QEMU 32-bit emulated platform | -+----------------+-------------------------------+ -| *virt64* | QEMU 64-bit emulated platform | -+----------------+-------------------------------+ -| *rpi4* | Raspberry Pi 4 in 32-bit mode | -+----------------+-------------------------------+ -| *rpi4_64* | Raspberry Pi 4 in 64-bit mode | -+----------------+-------------------------------+ -| *bbb* | BeagleBone Black platform | -+----------------+-------------------------------+ -| *x86* | x86 PC platform | -+----------------+-------------------------------+ -| *x86_qemu* | x86 PC emulated platform | -+----------------+-------------------------------+ -| *imx8_colibri* | x86 PC emulated platform | -+----------------+-------------------------------+ - -Execution of *bitbake* task -*************************** - -Tasks can be executed manually or automatically depending of the dependency scheme as -defined for a specific recipe. - -For manual execution, the task can be executed with the following command, -from the ``build/`` directory: - -.. code-block:: bash - - bitbake ** -c ** - -where ** is the name **without** the ``do_`` prefix. For example, the *do_patch* task is -executed as follows: - -.. code-block:: bash - - bitbake linux -c patch - -Complete building -***************** - -The build system relies on *bitbake* and requires to set some environment variables. -It can be achieved with the following script: - -.. code-block:: bash - - $ source env.sh - -However, the :term:`standard script` executes this command before invoking *bitbake* commands. - -The building of all components is achieved with: - -.. code-block:: bash - - $ ./build.sh -a - -The script ``build.sh`` has different options to build component individually. - -Options are: - -* ``-a`` Build all from scratch -* ``-f`` Create and prepare the filesystem -* ``-l`` Build Linux from scratch -* ``-r`` Build rootfs from scratch -* ``-b`` Build U-boot from scratch -* ``-u`` Build usr apps -* ``-q`` Build QEMU with custom patches (framebuffer enabled) - -QEMU -**** - -The installation of *QEMU* depends on the necessity to have the emulated framebuffer or not. -Currently, the QEMU machine is ``virt`` and is referred as **virt32** for 32-bit and **virt64** -for 64-bit versions in *Infrabase*. - -For the standard installation, QEMU can be installed via the standard ``apt-get`` command. -There are two possible versions of QEMU according to the architecture (32-/64-bit) - -.. code-block:: shell - - $ sudo apt-get install qemu-system-arm (for 32-bit version) - $ sudo apt-get install qemu-system-aarch64 (for 64-bit version) - -In the case of the patched version (with framebuffer enabled), QEMU can be built using the build system with -the following command: - -.. code-block:: bash - - $ ./build.sh -q - -The script will invoke the build task of the QEMU recipe. - - -The following configurations are available: - -+-----------------------+-------------------------------------+ -| Name | Platform | -+=======================+=====================================+ -| *vexpress_defconfig* | Basic QEMU/vExpress 32-bit platform | -+-----------------------+-------------------------------------+ -| *virt64_defconfig* | QEMU/virt 64-bit platform | -+-----------------------+-------------------------------------+ -| *rpi_4_32b_defconfig* | Raspberry Pi 4 in 32-bit mode | -+-----------------------+-------------------------------------+ -| *rpi4_64_defconfig* | Raspberry Pi 4 in 64-bit mode | -+-----------------------+-------------------------------------+ - -(The last one is a custom configuration and is to be used as replacemenent -of rpi_4_defconfig) - - -Root filesystem (*rootfs*) -************************** - -Main root filesystem (**rootfs**) -================================= - -The main root filesystem (*rootfs*) contains all application and configuration files -required by the distribution. It actually refers to user space activities. - -To mount the rootfs, the following command can be executed: - -.. code-block:: bash - - $ ./mount.sh rootfs - -The mounting point is the directory ``fs/``. - -And to unmount: - -.. code-block:: bash - - $ ./umount.sh rootfs - -Initial ramfs (initrd) filesystem -================================= - - -The initial rootfs filesystem, aka *ramfs* (or *initrd*) is loaded in RAM during the kernel -boot. It aims at starting user space applications dedicated to initialization; firmware loading -and mounting specific storage can be achieved at this moment. - -To mount the ramfs, the following command can be executed: - -.. code-block:: bash - - $ ./mount.sh ramfs - -The mounting point is the directory ``fs/``. - -And to unmount: - -.. code-block:: bash - - $ ./umount.sh ramfs - -User space applications -*********************** - -Custom user applications as well as kernel modules are located in -``linux/usr``. - -The build system for user applications relies on *Cmake*. - - - -.. _ARM_toolchain: https://developer.arm.com/-/media/Files/downloads/gnu/12.2.rel1/binrel/arm-gnu-toolchain-12.2.rel1-x86_64-aarch64-none-linux-gnu.tar.xz?rev=6750d007ffbf4134b30ea58ea5bf5223&hash=6C7D2A7C9BD409C42077F203DF120385AEEBB3F5 - - From 7be8693d207a3685b34147f63425b7aec4206288 Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Mon, 1 Jun 2026 19:01:02 +0200 Subject: [PATCH 03/52] Update documentation --- doc/source/micofe.rst | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 doc/source/micofe.rst diff --git a/doc/source/micofe.rst b/doc/source/micofe.rst deleted file mode 100644 index e568ac0..0000000 --- a/doc/source/micofe.rst +++ /dev/null @@ -1,16 +0,0 @@ -.. _micofe: - -MICOFE -###### - -.. toctree:: - :maxdepth: 5 - :hidden: - - emiso - portainer - syscalls_alignment - -MICOFE project will reuse :ref:`EMISO ` to exploit manage micro-services. -:ref:`Portainer ` is used as *Container Orchestration User Interface* -(COUI). From fbe33aac6e47b6de5d494b34cb5a825bcc70974b Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Mon, 1 Jun 2026 19:05:48 +0200 Subject: [PATCH 04/52] Update documentation --- doc/source/architecture.rst | 36 ++++ doc/source/conf.py | 8 +- doc/source/cpp.rst | 135 +++++++++++++ doc/source/demonstrator.rst | 178 ++++++++++++++++++ doc/source/glossary.rst | 161 +++++++++++++++- .../img/REDS_HEIG-VD_logotype_rouge-rvb.png | Bin 0 -> 145929 bytes doc/source/img/micofe-architecture.png | Bin 0 -> 91488 bytes doc/source/img/micofe-framebuffer-flow.png | Bin 0 -> 147170 bytes doc/source/img/micofe-framebuffer-map.png | Bin 0 -> 96290 bytes .../img/micofe-multicapsule-composition.png | Bin 0 -> 260344 bytes doc/source/img/micofe-portability-matrix.png | Bin 0 -> 277135 bytes .../img/micofe-showcase-architecture.png | Bin 0 -> 75905 bytes doc/source/index.rst | 35 ++-- doc/source/introduction.rst | 31 +++ doc/source/lvgl.rst | 99 ++++++++++ doc/source/syscalls_alignment.rst | 62 ++++++ env.sh | 40 ++++ 17 files changed, 763 insertions(+), 22 deletions(-) create mode 100644 doc/source/architecture.rst create mode 100644 doc/source/cpp.rst create mode 100644 doc/source/demonstrator.rst create mode 100644 doc/source/img/REDS_HEIG-VD_logotype_rouge-rvb.png create mode 100644 doc/source/img/micofe-architecture.png create mode 100644 doc/source/img/micofe-framebuffer-flow.png create mode 100644 doc/source/img/micofe-framebuffer-map.png create mode 100644 doc/source/img/micofe-multicapsule-composition.png create mode 100644 doc/source/img/micofe-portability-matrix.png create mode 100644 doc/source/img/micofe-showcase-architecture.png create mode 100644 doc/source/introduction.rst create mode 100644 doc/source/lvgl.rst create mode 100755 env.sh diff --git a/doc/source/architecture.rst b/doc/source/architecture.rst new file mode 100644 index 0000000..9b02b3a --- /dev/null +++ b/doc/source/architecture.rst @@ -0,0 +1,36 @@ +.. _architecture: + +Architecture +############ + +The overall approach combines the *SOO* mobile entity concept with the *SO3* +operating system, running on top of the *Agency Virtualizer (AVZ)* hypervisor. +Micro-services are deployed as **SO3 capsules** — strongly isolated containers +that run alongside a full Linux environment (the *agency domain*). + +.. figure:: img/micofe-architecture.png + :name: _fig-architecture + :alt: General architecture of the edge environment + :width: 720px + :align: center + + General architecture of the edge environment + +The dashed *MICOFE* rectangle in the figure above highlights the components +developed as part of the project. With the exception of Rust support — which +could not be delivered due to time and budget constraints — all other components +were implemented, tested, and validated. + +The main building blocks are: + +* The :ref:`EMISO ` engine, running in the agency domain user space, which + manages the lifecycle of the SO3 capsules. +* :ref:`Portainer `, used as the *Container Orchestration User Interface* + (COUI), running on the host PC. +* The :ref:`MUSL libc ` runtime and the SO3 syscall layer, which allow + standard applications to run unmodified inside capsules. +* The :ref:`C++ ` user-space runtime, built on top of the MUSL-aligned C + runtime. +* The :ref:`capsule / LVGL integration `, which gives graphical capsules + access to the display through a backend/frontend driver pair and the AVZ + hypervisor. diff --git a/doc/source/conf.py b/doc/source/conf.py index 6b59b94..0d1de00 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -58,7 +58,7 @@ # General information about the project. project = u'MICOFE' -copyright = u'2022-2025, REDS Institute (HEIG-VD)' +copyright = u'2022-2026, REDS Institute (HEIG-VD)' # The version info for the project you're documenting, acts as replacement for @@ -121,7 +121,6 @@ try: import sphinx_rtd_theme html_theme = 'sphinx_rtd_theme' - html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] def setup(app): # app.add_stylesheet('style.css') app.add_css_file('style.css') @@ -142,6 +141,9 @@ def setup(app): html_static_path = ['_static'] html_css_files = ['theme_overrides.css'] +# Logo shown at the top of the sidebar (REDS Institute - HEIG-VD). +html_logo = 'img/REDS_HEIG-VD_logotype_rouge-rvb.png' + # -- Options for HTMLHelp output ------------------------------------------ # If not None, a 'Last updated on:' timestamp is inserted at every page # bottom, using the given strftime format. @@ -231,7 +233,7 @@ def setup(app): # The name of an image file (relative to this directory) to place at the top of # the title page. -#latex_logo = None +latex_logo = 'img/REDS_HEIG-VD_logotype_rouge-rvb.png' # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. diff --git a/doc/source/cpp.rst b/doc/source/cpp.rst new file mode 100644 index 0000000..fbf0314 --- /dev/null +++ b/doc/source/cpp.rst @@ -0,0 +1,135 @@ +.. _cpp: + +Integration of C++ in SO3 user space +##################################### + +C++ support in SO3 user space is built as a direct extension of the C runtime +foundation described in :ref:`MUSL libc support `. Once the kernel +interface and startup environment are sufficiently aligned with MUSL expectations, +most of the mechanisms required by C++ applications become accessible as well, +because the C++ runtime ultimately depends on the same process startup model, +memory management primitives, thread support, and error-handling conventions. + +This means that the *syscall* adaptation effort undertaken for MUSL is reused +almost entirely by C++ workloads. In practice, the project did not implement an +independent C++ execution environment; instead, it enabled C++ by making the +underlying C/POSIX runtime robust enough to support the additional language +services expected by a C++ compiler and its runtime libraries. + +Main runtime requirements +************************* + +Compared with plain C applications, C++ introduces several additional runtime +requirements that must be handled correctly by the loader, the linker, and the +low-level runtime support. The most visible difference is that a C++ program is +not limited to calling a single entry point and using flat procedural code: it +may rely on object construction before ``main``, destruction after program +termination, compiler-generated helper routines, and richer type-system services. + +* **Constructor and destructor sections.** Sections such as ``.ctors``, ``.dtors``, + or their modern equivalents contain initialization and finalization routines + associated with global and static objects. They must be discovered and executed + in the correct order during program startup and shutdown; otherwise, C++ objects + may remain uninitialized or be destroyed incorrectly, which would make even + simple applications unreliable. + +* **Compiler support routines.** Low-level runtime libraries such as ``libgcc`` + provide helper functions for integer arithmetic, stack unwinding metadata, + object-layout support, and other compiler-emitted constructs — even when + exceptions are disabled. In an embedded environment, these dependencies must be + understood and provided explicitly rather than assumed to exist implicitly as + they would on a desktop Linux system. + +* **Runtime Type Information (RTTI).** RTTI provides services such as + ``dynamic_cast`` and ``typeid``, which are useful when software components use + inheritance and polymorphism. In resource-constrained embedded systems, RTTI is + often made optional, but the platform must still be able to support it correctly + when developers decide that the application architecture benefits from it. + +* **Thread-local and synchronization services.** These must behave correctly, + especially when higher-level C++ abstractions are implemented internally on top + of *pthread* or *libc* primitives. This links C++ support back to the MUSL + compatibility effort: if thread creation, TLS setup, memory allocation, or + synchronization behavior are not sufficiently aligned with Linux/MUSL + expectations, C++ applications will fail in ways that are often difficult to + diagnose. + +Compiler and runtime integration +******************************** + +The project toolchain was extended so that, in addition to the C compiler and +MUSL-based runtime, it also produces the C++ compiler components and the +associated low-level support libraries. In practice, this includes the compiler +driver for C++ compilation as well as the ``libgcc`` support routines required by +generated code. The objective is not merely to compile isolated C++ files, but to +make standard cross-compilation workflows available for complete SO3 user-space +applications. + +This integration has consequences both at build time and at runtime. At build +time, the toolchain must expose the expected compiler front-end, headers, startup +objects, and libraries. At runtime, the generated binaries must remain compatible +with the startup sequence, memory layout, and system-call behavior provided by +SO3. The success of the C++ integration therefore depends not only on enabling a +compiler flag, but on ensuring consistency between the compiler, the runtime +libraries, and the operating system environment. + +In embedded systems, the exact feature set exposed to C++ applications must be +chosen carefully. Some advanced runtime services can increase code size, memory +usage, and startup complexity. For that reason, the project follows a pragmatic +approach in which the baseline C++ environment remains compatible with embedded +constraints while still enabling application-level abstractions that are valuable +for maintainability and software structuring. For example, RTTI can be enabled +when needed but is not mandatory for all applications, and exception handling may +be restricted or disabled depending on the target profile. + +Expected benefits for applications +********************************** + +Adding C++ support is important because many embedded graphical and middleware +applications benefit from stronger abstraction mechanisms than plain C alone. +Classes, namespaces, templates, and stronger type modelling help organize +medium-size and large codebases, especially when multiple services, UI components, +and communication layers must coexist in the same application. + +Within MICOFE, C++ support is particularly relevant for user-space capsules that +package richer application logic on top of the MUSL runtime. It prepares the +ground for demonstrators and future products in which reusable software components, +object-oriented UI wrappers, hardware abstraction layers, and board-independent +service modules can be expressed in a more maintainable way than in plain C. + +Better language-level structuring also improves software quality by making +interfaces clearer, reducing duplication, and easing the separation between +platform-specific code and portable application logic. In a project aiming at +capsule portability across multiple boards, that separation is especially valuable. + +Current scope and limitations +***************************** + +The current work demonstrates that the SO3 user space can host a functional C++ +toolchain and execute applications that rely on the same runtime substrate as C +programs. However, this should not be interpreted as full desktop-class C++ +support. The intended scope remains embedded software, with a controlled subset of +runtime features chosen according to platform constraints. + +In particular, advanced features that depend on broader OS services, dynamic +loading, or very large standard-library subsystems may require additional work. +The project therefore positions C++ support as an incremental but important +milestone: enough to support real embedded applications and reusable software +components, while leaving room for future expansion if broader standard-library +coverage becomes necessary. + +Position within the project +*************************** + +From the perspective of the overall MICOFE architecture, C++ integration is a +direct consequence of the *libc* and *syscall* compatibility effort. Once a stable +runtime, startup sequence, and build chain are available, C++ becomes a natural +extension rather than a disconnected feature. This confirms that the project has +not only improved low-level compatibility, but has also moved SO3 closer to a +practical application platform for modern embedded development. + +More broadly, enabling higher-level language support on top of the validated MUSL +environment shows that the platform can host application development workflows that +are closer to current industrial practices — a key element for adoption, because +developers are more likely to use a platform that supports structured application +development rather than only low-level experimentation. diff --git a/doc/source/demonstrator.rst b/doc/source/demonstrator.rst new file mode 100644 index 0000000..ab2daff --- /dev/null +++ b/doc/source/demonstrator.rst @@ -0,0 +1,178 @@ +.. _demonstrator: + +Demonstrator and showcase +######################### + +This chapter presents a lightweight demonstrator designed to showcase the value of +MICOFE capsules for graphical applications (LVGL) running on SO3 alongside a +Linux-based "critical" environment. The goal is not to benchmark performance but to +illustrate isolation, composability (multiple capsules on the same target), and +portability (the same capsule across heterogeneous Arm platforms). + +Two complementary demonstration scenarios are implemented: + +* **Scenario 1 — Multi-capsule composition on a single target:** multiple SO3 + capsules, each running a distinct LVGL application, execute on the same hardware + while Linux continues to run the "critical" user interface and services. +* **Scenario 2 — Portability across heterogeneous platforms:** the same capsule + image runs unmodified on different Arm targets (e.g., Raspberry Pi 4, Toradex + Verdin iMX8MP) and on an emulated platform (QEMU/virt64), demonstrating a + consistent UI across boards. + +Demonstrator principles +*********************** + +The demonstrator is intentionally built on top of the core deliverables described +in the previous chapters: a SO3 user space able to run standard applications with +MUSL (without patching MUSL), and the kernel-side syscall compatibility required by +typical LVGL-based UIs. The showcase therefore focuses on the end-to-end +experience: building a capsule, launching it next to Linux, and validating that the +UI behaves consistently across targets. + +.. figure:: img/micofe-showcase-architecture.png + :name: _fig-showcase-architecture + :alt: Showcase architecture (Linux "critical UI" + multiple SO3 capsules) + :width: 620px + :align: center + + Showcase architecture (Linux "critical UI" + multiple SO3 capsules) + +Demonstrator setup and prerequisites +************************************ + +This section summarizes the environment used to run the showcase and the artifacts +required to reproduce it. + +* **Targets:** Raspberry Pi 4 (Arm64), Toradex Verdin iMX8MP (Arm64), and + QEMU/virt64 for emulation-based runs. +* **Host environment:** a Linux development machine with the SO3 build environment + and the capsule build tooling. +* **Software stack:** Linux used as the "critical" environment; SO3 as the capsule + OS; MUSL as the system libc inside capsules; LVGL applications as the showcased + workloads. +* **Artifacts:** one or more capsule images that embed (1) the SO3 user space, + (2) an LVGL application, and (3) its configuration assets (themes, fonts, input + mapping, etc.). + +Scenario 1 — Multi-capsule composition next to a Linux "critical UI" +******************************************************************** + +This scenario demonstrates how MICOFE can support the deployment of graphical +applications that interact with a Linux-based critical environment, while keeping +those applications isolated inside SO3 capsules. The key message is composability: +multiple independent UI capsules can coexist on the same target, with Linux +retaining control over the critical interface and any safety- or security-sensitive +services. + +#. **Prepare capsules:** build at least two capsules, each embedding a different + LVGL application (e.g., "Dashboard" and "Settings"). +#. **Boot the platform:** start Linux as the base environment and bring up the + critical UI (or a representative placeholder UI) on the main display. +#. **Launch capsules:** start the SO3 capsules from Linux using the MICOFE + runtime/launcher. +#. **Validate isolation:** intentionally stop or restart one capsule and verify + that the Linux critical UI and the other capsule keep running. +#. **Validate interaction contract:** verify that the capsules only access shared + resources through explicit, controlled interfaces (e.g., a device, a service + endpoint, or a pre-defined IPC mechanism), rather than ad-hoc shared state. + +**Success criteria.** The scenario is considered successful when: + +* Each capsule UI starts reliably and renders correctly using LVGL. +* A failure (crash/kill) of one capsule does not affect Linux or other capsules. +* The capsule's behavior matches expectations for a MUSL-based environment (no MUSL + patching required, and missing syscalls fail cleanly with ``ENOSYS`` where + applicable). +* Startup/shutdown cycles are repeatable without leaving the system in an + inconsistent state (e.g., resources released, no deadlocks in basic futex-based + synchronization). + +.. figure:: img/micofe-multicapsule-composition.png + :name: _fig-multicapsule-composition + :alt: Multi-capsule UI composition on one target + :width: 460px + :align: center + + Multi-capsule UI composition on one target + +Scenario 2 — Capsule portability across boards and emulation +************************************************************ + +This scenario demonstrates platform heterogeneity: the same capsule image can be +deployed across different Arm64 systems (and in QEMU) while providing a consistent +UI. The intent is to show that the capsule encapsulates its user space (MUSL + +application) and that the kernel interface exposed by SO3 remains sufficiently +stable across targets. + +#. **Select a reference capsule:** choose one LVGL capsule (e.g., "Dashboard") as + the portability baseline. +#. **Run on Raspberry Pi 4:** deploy the capsule and confirm correct rendering and + input handling. +#. **Run on Verdin iMX8MP:** deploy the exact same capsule image and confirm + identical functional behavior (layout, fonts, navigation). +#. **Run on QEMU/virt64:** boot an emulated target and run the capsule to validate + developer-friendly workflows (CI, regression tests, headless automation where + applicable). +#. **Compare outputs:** record a small set of checks (startup logs, a few + screenshots, and basic UI interactions) and verify equivalence across the three + environments. + +.. figure:: img/micofe-portability-matrix.png + :name: _fig-portability-matrix + :alt: Portability matrix (same capsule across targets) + :width: 560px + :align: center + + Portability matrix (same capsule across targets) + +Discussion, limitations, and next steps +*************************************** + +Together, the two scenarios provide an end-user-oriented validation of the +project's technical choices. Scenario 1 makes the isolation and composition +benefits tangible (multiple independent UIs running in parallel next to Linux), +while Scenario 2 demonstrates that capsules are a practical distribution format +across heterogeneous targets. + +Observed/expected limitations +============================= + +Based on the current SO3 syscall surface and MUSL alignment (see +:ref:`MUSL libc support `), the demonstrator intentionally stays within a +"baseline application" envelope: + +* Not all Linux flags/options are supported for every syscall (e.g., reduced + ``mmap`` flags; limited ``clone`` flag set; reduced ``futex`` operations). The + showcase therefore avoids advanced behaviors that rely on those options. +* Unimplemented syscalls return ``ENOSYS``; the demonstrator is designed so such + cases are either not triggered or are easy to diagnose in logs. +* The demonstrator focuses on functionality and integration rather than on + performance or real-time guarantees. + +Next steps +========== + +Building on the current demonstrator and the MUSL-based runtime, several extensions +are natural candidates for future work. The two most prominent are native Rust +support on top of SO3 and broader GPU coverage for graphical capsules. + +* **Rust support.** Completing Rust support so that capsules can host applications + written in both C++ and Rust on top of the same MUSL-aligned runtime. This will + require a dedicated Rust toolchain targeting SO3, including a stable mapping + between Rust's standard library expectations and the existing syscall surface, as + well as packaging guidelines for Rust-based capsules. In the medium term, Rust + support will make it easier to explore memory-safe system components and + higher-level services inside capsules. +* **Broader GPU coverage.** The current demonstrator focuses on a specific class of + GPUs and display pipelines. A natural evolution is to extend the GPU abstraction + layer so that LVGL-based capsules can be reused across a wider range of SoCs and + boards without reworking the application logic. This involves separating + board-specific display integration (framebuffer, composition, input routing) from + the capsule-visible interfaces, and validating the approach on additional GPU + families and display controllers. +* **Transversal improvements.** Hardening the Linux-capsule interaction contract by + documenting and implementing a small, well-defined set of services for + configuration, monitoring, and logging, usable consistently across capsules and + targets. Another is to industrialize the current demonstrator into a reusable + reference platform, with scripted deployment, regression tests, and example + capsules that can serve as templates for future industrial or academic projects. diff --git a/doc/source/glossary.rst b/doc/source/glossary.rst index ebeae80..79b544f 100644 --- a/doc/source/glossary.rst +++ b/doc/source/glossary.rst @@ -3,11 +3,162 @@ Glossary ######## .. glossary:: + :sorted: MICOFE - Micro-Container for Edge Computing + Micro-Container for Edge Computing. The project that provides a lightweight, + strongly isolated micro-container environment for edge computing, built on + :term:`SO3` and Arm64 virtualization. - Standard script - A script which is out of the scope of bitbake. - - \ No newline at end of file + SO3 + A lightweight operating system supporting key Linux-like features such as + user/kernel separation, memory paging, and multithreading. It is the + operating system running inside the :term:`capsule`. + + SOO + The virtualization framework, developed at the :term:`REDS` Institute, that + introduced the :term:`mobile entity` concept on which the SO3 capsules are + based. + + AVZ + Agency Virtualizer — the hypervisor on top of which the :term:`agency domain` + (Linux) and the SO3 :term:`capsule` run. It manages the :term:`IPA`-to-:term:`PA` + address translation stage. + + Agency domain + The full Linux environment running next to the capsules. It hosts the + :term:`EMISO` engine and the "critical" user interface and services. + + Capsule + A strongly isolated :term:`SO3`-based container used to deploy a micro-service + or application alongside Linux. A capsule is derived from the :term:`SOO` + :term:`mobile entity` concept and is, in Docker terms, the equivalent of a + running container. + + Mobile Entity + Also abbreviated *ME*. The :term:`SOO` virtualization concept of a self-contained, + migratable execution unit on which SO3 capsules are based. + + EMISO + The engine, running in the :term:`agency domain` user space, that manages the + lifecycle of the SO3 capsules (creation, start/stop, pause/unpause, logs). It + exposes a subset of the Docker APIs. + + Portainer + *Portainer CE* (Community Edition), an open-source container management tool + used in the MICOFE framework as the :term:`COUI`. It runs on the host PC and + talks to the :term:`EMISO` engine through a RESTful API. + + COUI + Container Orchestration User Interface — the role played by :term:`Portainer` + in the MICOFE framework. + + Docker + The de-facto container platform whose APIs and concepts (image, container, + logs) are partially mirrored by :term:`EMISO` to manage SO3 capsules. + + MUSL + An implementation of the standard C/POSIX library designed for correctness, + static linking, and use in embedded systems. Used as the :term:`libc` for SO3 + user-space applications. + + libc + The standard C library providing the C/POSIX runtime to user-space + applications. In MICOFE, the libc is :term:`MUSL`. + + libgcc + The low-level GCC support library providing compiler helper routines (integer + arithmetic, stack unwinding metadata, object-layout support) required by + generated code, including :term:`C++ ` workloads. + + LVGL + *Light and Versatile Graphics Library* — a library for creating graphical user + interfaces on embedded devices, used as the graphical application class for + capsules. + + RTTI + Runtime Type Information — C++ services such as ``dynamic_cast`` and ``typeid``. + Optional in resource-constrained embedded systems. + + ABI + Application Binary Interface — the low-level convention (register usage, calling + convention, syscall numbering) that binaries must follow. SO3 uses the + Linux-style syscall ABI expected by :term:`MUSL`. + + syscall + System call — the interface through which a user-space application requests a + service from the kernel. SO3 implements a subset of the Linux syscalls expected + by :term:`MUSL`. + + ENOSYS + The error code returned by SO3 when an application invokes a syscall that is not + implemented, which makes missing functionality easy to diagnose in logs. + + futex + *Fast userspace mutex* — the Linux syscall used by :term:`MUSL` for thread + synchronization. SO3 implements the ``FUTEX_WAIT`` and ``FUTEX_WAKE`` operations. + + pthread + The POSIX threads API. Its :term:`MUSL` implementation relies on Linux syscalls + such as ``clone``, :term:`futex`, and ``exit``/``exit_group``. + + TLS + Thread-Local Storage — per-thread storage used to hold thread-specific data + (including the pthread context). On AArch64 it is held in ``tpidr_el0``. + + toolchain + The cross-compilation tool suite (compiler, linker, runtime libraries, and + :term:`sysroot`) built from source to produce binaries for ARM32 and ARM64 SO3 + targets. + + sysroot + The directory tree containing the target headers and libraries against which the + :term:`toolchain` compiles and links applications. + + binutils + The GNU binary utilities (assembler, linker, and related tools) that are part of + the :term:`toolchain`. + + Hypercall + A call from a guest (Linux or a capsule) to the :term:`AVZ` hypervisor, used for + example to share the :term:`framebuffer` address or to switch capsule focus. + + Framebuffer + The memory region representing the whole screen content. In MICOFE its + :term:`IPA` is remapped by :term:`AVZ` so that only the focused :term:`capsule` + is shown on the display. + + VA + Virtual Address — the address space seen by a user-space application, translated + to an :term:`IPA` by the first MMU stage. + + IPA + Intermediate Physical Address — the address space produced by the first MMU + translation stage, sitting between the virtual (:term:`VA`) and physical + (:term:`PA`) address spaces. Managed by Linux and the capsules. + + PA + Physical Address — the real hardware memory address, produced by the second MMU + translation stage managed by :term:`AVZ`. + + itb file + The *image tree blob* used as a SO3 :term:`capsule` image. EMISO stores these + images in the ``/root/capsule/`` folder. + + Snapshot + A saved state of an injected :term:`capsule`. Creating a capsule snapshots the + injected capsule; pausing a capsule snapshots its current state before shutting + it down. + + VLOGS + The backend/frontend driver mechanism used to forward log messages from a SO3 + :term:`capsule` to the Linux kernel, where they are stored per capsule under + ``/var/log/soo/``. + + TrustZone + The ARM hardware security technology leveraged, together with virtualization, to + provide a highly secure execution environment for the capsules. + + REDS + The *Reconfigurable & Embedded Digital Systems* institute of HEIG-VD, where the + :term:`SOO` framework and this project were developed. diff --git a/doc/source/img/REDS_HEIG-VD_logotype_rouge-rvb.png b/doc/source/img/REDS_HEIG-VD_logotype_rouge-rvb.png new file mode 100644 index 0000000000000000000000000000000000000000..22420948bacd109698e4e999b8b15dd8218938e8 GIT binary patch literal 145929 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%0DL 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≪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 literal 0 HcmV?d00001 diff --git a/doc/source/img/micofe-architecture.png b/doc/source/img/micofe-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..b0856d3f5678177b7c167c028c34451f940ee96f GIT binary patch literal 91488 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 literal 0 HcmV?d00001 diff --git a/doc/source/img/micofe-framebuffer-map.png b/doc/source/img/micofe-framebuffer-map.png new file mode 100644 index 0000000000000000000000000000000000000000..3566d8ad50c170342c1e0fad58815d83055af549 GIT binary patch literal 96290 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 sDx49sQIyX9#MHVrRFuS>zRZZHs1*;j4U6M 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 literal 0 HcmV?d00001 diff --git a/doc/source/img/micofe-multicapsule-composition.png b/doc/source/img/micofe-multicapsule-composition.png new file mode 100644 index 0000000000000000000000000000000000000000..8067bbdb60e3f8a55ff2fa1d3d214fc4777793bb GIT binary patch literal 260344 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
|C0z$;z3_y^1UjI9bU=K19hT!R~ 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 z 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 literal 0 HcmV?d00001 diff --git a/doc/source/index.rst b/doc/source/index.rst index 43f6b84..4302080 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -1,16 +1,13 @@ .. doc Documentation master file. -.. toctree:: - :maxdepth: 5 - :numbered: - :hidden: - - micofe - glossary +.. image:: img/REDS_HEIG-VD_logotype_rouge-rvb.png + :align: center + :width: 320px + :alt: REDS Institute - HEIG-VD + :target: https://reds.heig-vd.ch | - .. rst-class:: center MICOFE - Micro-Container for Edge Computing @@ -19,13 +16,23 @@ MICOFE - Micro-Container for Edge Computing .. rst-class:: left MICOFE provides a highly secure, virtualized approach to deploy and manage -micro-services in embedded systems, combining the SOO mobile entity concept -with the ARM TrustZone technology. +micro-services in embedded systems, combining the SOO mobile entity concept and +the SO3 operating system with Arm64 virtualization. -- :ref:`MICOFE overview ` -- :ref:`EMISO engine ` -- :ref:`Portainer (Container Orchestration User Interface) ` -- :ref:`Alignment of syscalls ` +.. toctree:: + :maxdepth: 2 + :numbered: + introduction + architecture + emiso + portainer + syscalls_alignment + cpp + lvgl + demonstrator + glossary + +| To edit the documentation and to use the correct underlying policy, you can read `this documentation style guide `_. diff --git a/doc/source/introduction.rst b/doc/source/introduction.rst new file mode 100644 index 0000000..b2f255c --- /dev/null +++ b/doc/source/introduction.rst @@ -0,0 +1,31 @@ +.. _introduction: + +Introduction +############ + +``MICOFE`` (*Micro-Container for Edge Computing*) aims to provide a lightweight +micro-container environment based on Arm64 virtualization and the *SO3* operating +system. SO3 is a lightweight OS that supports key Linux-like features such as +user/kernel separation, memory paging, and multithreading. + +This environment is well suited to provide developers with a strongly isolated +execution environment where full-featured applications can run alongside Linux. + +MICOFE targeted several objectives, including: + +* Full support for the :ref:`MUSL libc library ` +* :ref:`C++ ` and Rust support +* Support for :ref:`LVGL-based graphical applications ` + +All objectives were achieved except Rust support, which could not be completed +due to time constraints. + +Acknowledgements +**************** + +We sincerely appreciate the *Hasler Foundation* for making this ambitious project +possible and for helping us secure new projects with industrial partners. + +We also extend our heartfelt thanks to Clément Dieperink, Jean-Pierre Miceli, and +Prof. Daniel Rossier from the *REDS Institute* of *HEIG-VD* for their invaluable +contributions to this project. diff --git a/doc/source/lvgl.rst b/doc/source/lvgl.rst new file mode 100644 index 0000000..4ed6701 --- /dev/null +++ b/doc/source/lvgl.rst @@ -0,0 +1,99 @@ +.. _lvgl: + +Capsules and LVGL integration +############################# + +*LVGL* is a library that enables the creation of graphical applications for +embedded devices and is already compatible with a standalone SO3 environment. +From the perspective of MICOFE, LVGL is important because it offers a realistic +application class for capsules: graphical workloads that are richer than +command-line examples and that make the benefits of isolation, portability, and +composition immediately visible. + +Sharing the framebuffer +*********************** + +To support LVGL on capsules, the goal is to use Linux to drive the screen and add +a link between the capsule and Linux to seamlessly give access to the display, +like it is already done with UART for the terminal. + +However, as the framebuffer represents the whole screen, it is much larger, +meaning that the current mechanism to share data between Linux and capsules is not +efficient as it only allows a small amount of memory pages to be shared. For +example, a screen of 1024x600 pixels with 16 bits per pixel uses 1'228'800 bytes, +or 300 memory pages, but AVZ only allows up to 32 pages to be shared. + +Also, the application running on the capsule uses ``mmap`` at initialization to +get an address to the framebuffer and then does not interact with the kernel when +a new frame is available, meaning that the transmission should occur without the +kernel. + +Finally, multiple capsules can run in parallel with their own graphical +application, but only one should be shown on screen. + +Two-stage MMU address mapping +***************************** + +To achieve this, the implementation takes benefit of the two stages of MMU, which +gives the physical (PA), intermediate physical (IPA) and virtual (VA) address +spaces. The address translation goes from VA to IPA, managed by Linux and the +capsules, and then from IPA to PA, managed by the hypervisor AVZ. + +To avoid allocating multiple framebuffers and making copies between them, only two +buffers are allocated: the one used by the screen driver in Linux and a *fake* one. +A fixed IPA is used for the framebuffer seen by the capsules. Depending on the +focused capsule, their respective IPA are either mapped to the actual framebuffer +or the fake one. + +.. figure:: img/micofe-framebuffer-map.png + :name: _fig-framebuffer-map + :alt: Framebuffer IPA and PA address map + :width: 680px + :align: center + + Framebuffer IPA and PA address map + +Only the page tables of IPA to PA need to be changed to switch the shown capsules. +At any time, the framebuffer must only be mapped to one capsule to avoid glitches +on the screen. However, the fake buffer is shared between all hidden capsules, but +this is not considered a problem as it is only used to write data and never read. + +Backend / frontend drivers +************************** + +Like UART, a backend (on Linux) and frontend (on capsules) driver are implemented +to share the required information, like the screen size. + +A user-space application on Linux is used to get the framebuffer address using +``mmap``, which is then given to the backend driver via a *sysfs* file and +transmitted to AVZ with a hypercall. The application then refreshes the screen to +ensure that images are shown correctly at 30 frames per second. A hypercall is also +added to switch focus to another capsule, which is called when switching the +terminal focus with two ``CTRL+A``, ensuring the same capsule is focused on +terminal and screen at the same time. + +The frontend driver exposes the virtual framebuffer device to the LVGL application, +so it can use the standard API. The framebuffer IPA is retrieved with a hypercall. + +.. figure:: img/micofe-framebuffer-flow.png + :name: _fig-framebuffer-flow + :alt: Flow and interaction for framebuffer on capsules + :width: 720px + :align: center + + Flow and interaction for framebuffer on capsules + +The first point is referencing mapping the HDMI port, GPU, and other addresses +required to access the display. + +Input forwarding +**************** + +To allow user interaction with the LVGL application, the input of the keyboard, +mouse, and touchscreen must also be forwarded to the application. This is achieved +with a backend and frontend driver using the existing sharing process, as the +transmitted data sizes are small enough. + +A user-space application is used to get events from all ``/dev/input`` files, +which are forwarded to the backend driver, then to the frontend and finally to the +LVGL application via device files. diff --git a/doc/source/syscalls_alignment.rst b/doc/source/syscalls_alignment.rst index 1d8230e..dceb03d 100644 --- a/doc/source/syscalls_alignment.rst +++ b/doc/source/syscalls_alignment.rst @@ -226,3 +226,65 @@ In fine, all syscall available in SO3 are now listed in ``syscall.tbl``. Here is * Time, ``nanosleep, gettimeofday[_time32], clock_gettime[32]`` * Network, ``socket, connect, bind, ...`` + +Toolchain +********* + +To make the MUSL-based environment usable in practice, the project also required a +complete cross-compilation toolchain able to produce binaries for both ARM32 and +ARM64 SO3 targets. The toolchain is therefore not a secondary convenience component +but a core project deliverable, because it turns the kernel and *libc* compatibility +work described in the previous sections into a reproducible application development +workflow. + +From a project perspective, the role of the toolchain is twofold. First, it provides +developers with a stable way to build applications that match the exact ABI, startup +conventions, and library behavior expected by SO3. Second, it ensures that validation +results are meaningful, because the binaries used during development, testing, and +demonstration are all produced by the same controlled environment. + +Build from source +================= + +The toolchain is built fully from source. This choice improves reproducibility, +avoids dependence on host-distribution packaging choices, and ensures that the exact +versions of *binutils*, compiler runtime components, headers, and MUSL integration +logic are controlled by the project. It also makes it possible to regenerate +identical environments for development machines, CI runners, and future maintenance +activities. + +Building the full toolchain from source is particularly important in an embedded +context. Small differences in compiler version, linker behavior, or runtime support +libraries can lead to subtle differences in binary layout, relocation handling, stack +initialization, or generated code patterns. By controlling the complete chain, the +project reduces the risk of hard-to-diagnose mismatches between the generated binaries +and the SO3 runtime environment. + +A dedicated automated build script was developed to orchestrate the complete +generation process. The script downloads or references the required sources, +configures the build for the selected target architecture, applies the expected +project configuration, and produces the final compiler, linker, runtime support +libraries, and associated *sysroot* in a deterministic way. This automation +significantly reduces setup time for developers and removes a large class of manual +integration errors. + +The generated toolchain does more than compile plain C programs. It also provides the +basis required to build :ref:`C++ applications `, package capsule workloads, and +assemble the demonstrator applications. In that sense, it is the practical bridge +between low-level kernel/libc compatibility and high-level application delivery. + +CI integration and maintainability +================================== + +The toolchain work also required integration into the continuous integration +pipeline. The repository CI/CD workflow was extended so that toolchain builds can be +generated, validated, and versioned automatically. This makes regressions easier to +detect when changes are introduced in the kernel *syscall* layer, in the build +scripts, or in the runtime libraries, because the impact can be observed immediately +at build time rather than much later during manual testing. + +In summary, the toolchain deliverable provides the operational foundation required to +exploit the MUSL integration work. It standardizes builds, improves reproducibility, +enables CI-based validation, reduces platform drift, and makes application development +for SO3 capsules practical for both internal developers and future adopters of the +platform. diff --git a/env.sh b/env.sh new file mode 100755 index 0000000..2b2e5b7 --- /dev/null +++ b/env.sh @@ -0,0 +1,40 @@ +#!/bin/sh +export IB_ROOT_DIR=$PWD +export BUILDDIR="$PWD/build" +export BBPATH=$BUILDDIR +PATH=$PATH:$PWD/scripts:$BUILDDIR/bitbake/bin + +# Specify auxiliary layers for the -x component opt +export IB_AUX_LAYERS="meta-usr meta-torizon meta-so3 meta-qemu meta-atf" + +# TODO: It would be nice to test for the presence of such and +# such compiler in meta-bsp +if ! test -z $IB_TOOLCHAIN_PATH +then + PATH="$PATH:$IB_TOOLCHAIN_PATH" +fi + +# Avoid setting uid/gid of the regular user +# when sourced again by the root user in deploy.sh +if test -z "$IB_UNPRIVILEDGED_USER_ID" +then + IB_UNPRIVILEDGED_USER_ID=`id -u` +fi + +if test -z "$IB_UNPRIVILEDGED_GROUP_ID" +then + IB_UNPRIVILEDGED_GROUP_ID=`id -g` +fi + +# If not set - set default list of preserved variables +# that are passed to bitbake +if test -z "$BB_ENV_PASSTHROUGH_ADDITIONS" +then + BB_ENV_PASSTHROUGH_ADDITIONS='IB_TOOLCHAIN_PATH IB_UNPRIVILEDGED_USER_ID IB_UNPRIVILEDGED_GROUP_ID IB_ROOT_DIR' + export BB_ENV_PASSTHROUGH_ADDITIONS +fi + +export PATH +export IB_UNPRIVILEDGED_USER_ID +export IB_UNPRIVILEDGED_GROUP_ID + From c1f85e0061f8b42d8ad50e73a4ff3e3d2f3b072d Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Mon, 1 Jun 2026 19:13:14 +0200 Subject: [PATCH 05/52] Fix GitHub Pages Sphinx build and link docs from README - doc/requirements.txt listed sphinxcontrib-pdfembed, which does not exist on PyPI (404), causing the Pages workflow's pip install to fail. Slim the file to the only packages the Sphinx config imports (sphinx, sphinx-rtd-theme). - Add a Documentation section to README.md linking to the GitHub Pages site. --- README.md | 9 ++++++++- doc/requirements.txt | 9 --------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 8849f4b..9f9e9a1 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,12 @@ +# MICOFE + MICOFE is a micro‑container framework for edge computing that enables deploying SO3 capsules (lightweight containers) through the Portainer Manager/Agent architecture. It is built using the Infrabase (IB) build system, also available on GitHub. -We sincerely thank the Swiss Hasler Foundation for supporting the core contributions to this project. +## Documentation + +The full project documentation is published via GitHub Pages: +**https://smartobjectoriented.github.io/micofe/** + +We sincerely thank the Swiss Hasler Foundation for supporting the core contributions to this project. diff --git a/doc/requirements.txt b/doc/requirements.txt index 4e9d9a2..cbf1e36 100644 --- a/doc/requirements.txt +++ b/doc/requirements.txt @@ -1,11 +1,2 @@ sphinx sphinx-rtd-theme -sphinx-toolbox -sphinx-gallery -sphinx-autodoc-typehints -sphinxcontrib-napoleon -sphinxcontrib-httpdomain -sphinxcontrib-bibtex -sphinxcontrib-pdfembed - - From 658c48b1c6d228d68281f33805b9c112ca9a71e2 Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Mon, 1 Jun 2026 19:16:25 +0200 Subject: [PATCH 06/52] Add Hasler Foundation logo to Acknowledgements Extracted from the project technical report and shown above the acknowledgement text on the Introduction page. --- doc/source/img/hasler-foundation.png | Bin 0 -> 40622 bytes doc/source/introduction.rst | 8 ++++++++ 2 files changed, 8 insertions(+) create mode 100644 doc/source/img/hasler-foundation.png diff --git a/doc/source/img/hasler-foundation.png b/doc/source/img/hasler-foundation.png new file mode 100644 index 0000000000000000000000000000000000000000..7d300c4e3224072331146156fe8d97927d142c34 GIT binary patch literal 40622 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 e7c{m~^8Wz;V9b(ENdxBq0000 Date: Mon, 1 Jun 2026 19:19:34 +0200 Subject: [PATCH 07/52] Bump Pages workflow actions to Node 24 versions Silences the Node.js 20 deprecation warnings: - actions/checkout v4 -> v6 - actions/setup-python v5 -> v6 - actions/upload-pages-artifact v3 -> v5 - actions/deploy-pages v4 -> v5 --- .github/workflows/docs.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index e281335..8811b44 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -22,10 +22,10 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Set up Python - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: '3.12' @@ -36,7 +36,7 @@ jobs: run: sphinx-build -b html doc/source/ public/ - name: Upload Pages artifact - uses: actions/upload-pages-artifact@v3 + uses: actions/upload-pages-artifact@v5 with: path: public @@ -49,4 +49,4 @@ jobs: steps: - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v4 + uses: actions/deploy-pages@v5 From 34fbc4039508f5003dc2595518f103ede436b896 Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Mon, 1 Jun 2026 19:21:32 +0200 Subject: [PATCH 08/52] Minor change in README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9f9e9a1..f81716c 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ It is built using the Infrabase (IB) build system, also available on GitHub. ## Documentation -The full project documentation is published via GitHub Pages: +The full project documentation is available here: **https://smartobjectoriented.github.io/micofe/** From fff800fc52c6eb639e69e5cc035af22ac61b651d Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Mon, 1 Jun 2026 19:28:16 +0200 Subject: [PATCH 09/52] Centralize all doc figures into micofe.drawio Add one page per report figure (architecture, framebuffer-map, framebuffer-flow, showcase-architecture, multicapsule-composition, portability-matrix), embedded as images, alongside the existing editable EMISO diagrams (Overview, emiso-engine, logs). 9 pages total. --- doc/source/img/micofe.drawio | 68 +++++++++++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/doc/source/img/micofe.drawio b/doc/source/img/micofe.drawio index 4bd5ede..43b5bc0 100644 --- a/doc/source/img/micofe.drawio +++ b/doc/source/img/micofe.drawio @@ -1,4 +1,4 @@ - + @@ -191,4 +191,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From e316ccb6585f35cb7e5c049a16497ee27a5f17a2 Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Mon, 1 Jun 2026 20:10:00 +0200 Subject: [PATCH 10/52] Update draw.io --- doc/source/img/micofe.drawio | 740 ++++++++++++++++++++++++++++++++++- 1 file changed, 721 insertions(+), 19 deletions(-) diff --git a/doc/source/img/micofe.drawio b/doc/source/img/micofe.drawio index 43b5bc0..a61a5b5 100644 --- a/doc/source/img/micofe.drawio +++ b/doc/source/img/micofe.drawio @@ -1,4 +1,4 @@ - + @@ -192,67 +192,769 @@ - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 19c1f6ba8d4b0caad244447fadfe97bb42f5fe1f Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Mon, 22 Jun 2026 20:44:17 +0200 Subject: [PATCH 11/52] Migrate build system to Infrabase aligned with SO3 6.2.0 Replace MICOFE's standalone build tree with the current Infrabase build system as carried by SO3 (branch 255: build-system migration + new logo), pulling in the latest SO3/AVZ evolutions while preserving MICOFE's capsule + virtualized-framebuffer feature. Foundation (socle): - env.sh, scripts/* (build.sh 2-mode -a/-x interface, unprivileged bitbake with setup_sudo/sudo_session, new ci-local.sh/updiff.sh/bitbake wrapper), meta/classes (sha256 attach guard, pristine-snapshot do_diffcompose), new meta-toolchain (musl-toolchain), auto-generated bblayers + auto.conf. - local.conf: virt64 default = AVZ (virt64_avz_soo_defconfig, CONFIG_SOO=y) + Linux agency (virt64_soo_defconfig, ITS virt64_avz) + SO3 capsule (virt64_capsule_defconfig, ITS virt64_capsule), EXTRA_OVERRIDES :lvgl:soo. Recipe layers: - meta-so3: avz/so3 6.1.0 -> 6.2.0, fetched from github (SRCREV 60f6da75c) with the MICOFE-specific patch infrastructure wired for `-c updiff`. - meta-uboot: portable git-style patch set (e1c_boot two-ITB + FIT crypto) + uboot 2024.07 for verdin. - meta-atf: OP-TEE support (optee recipe, fiptool, ATF imx8mp+avz patch). - meta-qemu / meta-filesystem: refreshed from upstream. - meta-linux: kernel + SOO agency patches; re-grafted MICOFE vfbdev/vinput BACKEND drivers (Linux-side virtualized framebuffer + input). - meta-usr: EMISO engine + re-grafted fb_mapper/input_forwarding userspace; kept the MICOFE lvgl/kmscube graphics suite. - meta-bsp: SO3 capsule build + rpi DTBs + verdin boot blobs. - meta-rootfs: fb_mapper/input_forwarding systemd services + mount overlays; enabled BR2_PACKAGE_JSONCPP/LIBHTTPSERVER (EMISO REST deps) in buildroot. Build files adopted from Infrabase (EDGEMTech) carry a MICOFE/REDS HEIG-VD adaptation copyright line alongside the original. Validated: `bitbake -p` parses cleanly (20 recipes); `build.sh -x so3` and `-x avz` build OK. --- .gitignore | 4 + build/.gitignore | 4 + build/conf/bblayers.conf | 6 +- build/conf/local.conf | 327 +- build/meta-atf/classes/atf.bbclass | 56 +- build/meta-atf/conf/layer.conf | 3 + build/meta-atf/recipes-atf/atf/atf_1.5.bb | 44 +- .../atf/files/0001-atf-imx8mp-avz.patch | 49 + build/meta-atf/recipes-atf/optee/optee_1.5.bb | 57 + build/meta-bsp/classes/bsp.bbclass | 70 +- build/meta-bsp/conf/layer.conf | 3 + .../recipes-bsp/bsp/files/bsp_arm_common.inc | 44 +- .../recipes-bsp/bsp/files/bsp_rpi4.inc | 4 +- .../recipes-bsp/bsp/files/bsp_rpi4_64.inc | 2 + .../bsp/files/bsp_verdin-imx8mp.inc | 376 +- .../recipes-bsp/bsp/files/bsp_virt32.inc | 2 + .../recipes-bsp/bsp/files/bsp_virt64.inc | 140 +- .../recipes-bsp/bsp/files/bsp_x86-qemu.inc | 2 + .../imx8_colibri/mx8qxc0-ahab-container.img | Bin 0 -> 72712 bytes .../meta-bsp/recipes-bsp/bsp/rpi4/config.txt | 2 +- .../bsp/verdin-imx8mp/boot.scr.txt | 16 + .../bsp/verdin-imx8mp/boot_avz.scr.txt | 16 + .../lpddr4_pmu_train_1d_dmem_202006.bin | Bin 0 -> 1660 bytes .../lpddr4_pmu_train_1d_imem_202006.bin | Bin 0 -> 32364 bytes .../lpddr4_pmu_train_2d_dmem_202006.bin | Bin 0 -> 1404 bytes .../lpddr4_pmu_train_2d_imem_202006.bin | Bin 0 -> 25456 bytes .../bsp/x86/boot/grub/i386-pc/modinfo.sh | 2 + .../recipes-bsp/capsule/bsp-capsules_1.0.0.bb | 7 +- .../recipes-bsp/linux/bsp-linux_1.0.bb | 92 +- .../recipes-bsp/linux/files/uEnv_rpi4_64.txt | 2 +- .../recipes-bsp/linux/files/uEnv_virt64.txt | 12 +- .../meta-bsp/recipes-bsp/so3/bsp-so3_1.0.0.bb | 35 +- .../so3/files/uEnv_rpi4_64_avz.txt | 9 + .../recipes-bsp/so3/files/uEnv_virt64_avz.txt | 9 + .../classes/filesystem.bbclass | 179 +- .../classes/fs_arm_common.bbclass | 120 +- build/meta-filesystem/classes/fs_rpi4.bbclass | 2 + .../classes/fs_rpi4_64.bbclass | 2 + .../classes/fs_verdin-imx8mp.bbclass | 55 +- .../meta-filesystem/classes/fs_virt32.bbclass | 2 + .../meta-filesystem/classes/fs_virt64.bbclass | 2 + .../meta-filesystem/classes/fs_x86-pc.bbclass | 21 +- .../classes/fs_x86-qemu.bbclass | 25 +- build/meta-filesystem/conf/layer.conf | 3 + .../generic/filesystem_1.0.0.bb | 2 + build/meta-linux/classes/linux.bbclass | 2 + build/meta-linux/conf/layer.conf | 3 + .../files/0001-linux-6.12-r0-patches.inc | 5 +- .../0002-virt64_guest.dts.patch | 85 +- .../0003-virt64_defconfig.patch | 20 +- .../0001-linux-6.12-r0/0021-Makefile.patch | 10 + .../0001-linux-6.12-r0/0022-virt64.dts.patch | 392 + .../0023-virt64_guest.dts.patch | 428 + .../0053-virt64_defconfig.patch | 9031 ++++++++++++++++ .../files/0001-linux-6.12-rpi4-r0-patches.inc | 27 +- .../0001-bcm2711-rpi-4-b.dts.patch | 16 + .../0002-bcm270x.dtsi.patch | 206 + .../0003-bcm270x-rpi.dtsi.patch | 160 + .../0004-bcm2711.dtsi.patch | 1164 ++ .../0005-bcm2711-rpi-4-b.dts.patch | 374 +- .../0006-bcm2711-rpi.dtsi.patch | 204 + .../0007-bcm271x-rpi-bt.dtsi.patch | 29 + .../0008-bcm2835-rpi.dtsi.patch | 93 + .../0009-bcm283x.dtsi.patch | 536 + ...0010-bcm283x-rpi-cam1-regulator.dtsi.patch | 13 + .../0011-bcm283x-rpi-csi1-2lane.dtsi.patch | 7 + .../0012-bcm283x-rpi-i2c0mux_0_44.dtsi.patch | 7 + ...0013-bcm283x-rpi-usb-peripheral.dtsi.patch | 10 + .../0014-rpi4_64_defconfig.patch | 4 +- .../0015-Makefile.patch | 12 + .../0016-rpi4_64_nomodules_defconfig.patch | 5424 ++++++++++ .../0001-bcm2711-rpi-4-b.dts.patch | 16 + .../0002-bcm270x.dtsi.patch | 206 + .../0003-bcm270x-rpi.dtsi.patch | 160 + .../0004-bcm2711.dtsi.patch | 1164 ++ .../0005-bcm2711-rpi-4-b.dts.patch | 415 + .../0006-bcm2711-rpi.dtsi.patch | 204 + .../0007-bcm271x-rpi-bt.dtsi.patch | 29 + .../0008-bcm2835-rpi.dtsi.patch | 93 + .../0009-bcm283x.dtsi.patch | 536 + ...0010-bcm283x-rpi-cam1-regulator.dtsi.patch | 13 + .../0011-bcm283x-rpi-csi1-2lane.dtsi.patch | 7 + .../0012-bcm283x-rpi-i2c0mux_0_44.dtsi.patch | 7 + ...0013-bcm283x-rpi-usb-peripheral.dtsi.patch | 10 + .../0014-rpi4_64_defconfig.patch | 9570 +++++++++++++++++ .../0015-rpi4_64_nomodules_defconfig.patch | 0 .../0016-Makefile.patch | 0 ...017-rpi4_64_nomodules_soo_defconfig.patch} | 781 +- .../recipes-linux/linux/linux_6.12-rpi4.bb | 8 +- .../recipes-linux/linux/linux_6.12.bb | 2 + .../soo/files/0001-linux-6.12-r0-patches.inc | 13 +- .../0001-virt64_guest.dts.patch | 12 +- .../0002-virt64_soo_defconfig.patch | 15 +- .../0001-linux-6.12-r0/0018-Kconfig.patch | 13 +- .../0001-linux-6.12-r0/0019-Makefile.patch | 4 +- .../0001-linux-6.12-r0/0032-vuart.c.patch | 4 +- .../0001-linux-6.12-r0/0056-sysfs.h.patch | 10 +- .../files/0001-linux-6.12-r0/0062-soo.h.patch | 36 +- .../0001-linux-6.12-r0/0074-console.c.patch | 8 +- .../0001-linux-6.12-r0/0082-evtchn.c.patch | 109 +- .../0001-linux-6.12-r0/0088-sysfs.c.patch | 37 +- .../0001-linux-6.12-r0/0090-vbstorage.c.patch | 12 +- .../0096-vbus_vbstore.c.patch | 10 +- .../0001-linux-6.12-r0/0128-Makefile.patch | 4 - ...129-vfbdev.c.patch => 0128-vfbdev.c.patch} | 0 ...130-vfbdev.h.patch => 0129-vfbdev.h.patch} | 0 ...132-vinput.c.patch => 0130-vinput.c.patch} | 0 .../0001-linux-6.12-r0/0131-Makefile.patch | 5 - ...133-vinput.h.patch => 0131-vinput.h.patch} | 0 .../files/0001-linux-6.12-rpi4-r0-patches.inc | 82 +- .../0003-entry.S.patch | 6 +- .../0001-linux-6.12-rpi4-r0/0004-irq.c.patch | 4 +- .../0001-linux-6.12-rpi4-r0/0005-smp.c.patch | 16 +- .../0006-.clang-format.patch | 767 ++ .../0008-Kconfig.patch | 9 - .../0010-.gitattributes.patch | 8 + .../0001-linux-6.12-rpi4-r0/0010-fixdep.patch | Bin 17268 -> 0 bytes .../0001-linux-6.12-rpi4-r0/0011-conf.patch | Bin 142570 -> 0 bytes .../0012-lexer.lex.c.patch | 4043 ------- ...tty_flip.h.patch => 0012-tty_flip.h.patch} | 4 +- .../{0007-main.c.patch => 0013-main.c.patch} | 4 +- .../0013-parser.tab.c.patch | 2228 ---- .../0014-Kconfig.patch | 9 + .../0014-parser.tab.h.patch | 136 - .../0015-.mailmap.patch | 738 ++ ...009-Makefile.patch => 0016-Makefile.patch} | 8 +- ...{0015-Kconfig.patch => 0018-Kconfig.patch} | 17 +- .../0018-Makefile.patch | 4 - ...016-Makefile.patch => 0019-Makefile.patch} | 8 +- .../0020-Makefile.patch | 5 - ...vdevback.c.patch => 0020-vdevback.c.patch} | 4 +- .../0021-Makefile.patch | 4 + .../0022-Makefile.patch | 5 - ...019-vdummy.c.patch => 0022-vdummy.c.patch} | 4 +- .../0023-Makefile.patch | 5 + ...c.patch => 0024-rpisense-joystick.c.patch} | 4 +- ...h.patch => 0025-rpisense-joystick.h.patch} | 4 +- .../0026-Makefile.patch | 5 - ...5-vsensej.c.patch => 0026-vsensej.c.patch} | 4 +- .../0027-Makefile.patch | 5 + ...-led.c.patch => 0028-rpisense-led.c.patch} | 4 +- ...-led.h.patch => 0029-rpisense-led.h.patch} | 4 +- .../0030-Makefile.patch | 5 - ...enseled.c.patch => 0030-vsenseled.c.patch} | 4 +- .../0031-Makefile.patch | 5 + ...{0031-vuart.c.patch => 0032-vuart.c.patch} | 6 +- .../{0032-avz.h.patch => 0033-avz.h.patch} | 4 +- .../{0033-asf.h.patch => 0034-asf.h.patch} | 4 +- ...4-avzcons.h.patch => 0035-avzcons.h.patch} | 4 +- ...5-capsule.h.patch => 0036-capsule.h.patch} | 4 +- ...{0036-debug.h.patch => 0037-debug.h.patch} | 4 +- ...037-vdummy.h.patch => 0038-vdummy.h.patch} | 4 +- .../0039-vsensej.h.patch | 4 +- .../0040-vsenseled.h.patch | 4 +- .../0041-vuart.h.patch | 4 +- .../0042-device_access.h.patch | 4 +- .../0001-linux-6.12-rpi4-r0/0043-err.h.patch | 4 +- .../0044-errno-base.h.patch | 4 +- .../0045-errno.h.patch | 4 +- .../0046-evtchn.h.patch | 4 +- .../0047-gnttab.h.patch | 4 +- .../0048-guest_api.h.patch | 4 +- .../0049-hypervisor.h.patch | 4 +- .../0050-paging.h.patch | 4 +- .../0001-linux-6.12-rpi4-r0/0051-ring.h.patch | 4 +- .../0052-roxml.h.patch | 4 +- .../0053-simulation.h.patch | 4 +- .../0001-linux-6.12-rpi4-r0/0054-soo.h.patch | 4 +- .../0055-strtod.h.patch | 4 +- .../0056-sysfs.h.patch | 14 +- .../0057-types.h.patch | 4 +- .../0001-linux-6.12-rpi4-r0/0058-asf.h.patch | 4 +- .../0059-console.h.patch | 4 +- .../0060-debug.h.patch | 4 +- .../0061-injector.h.patch | 4 +- .../0001-linux-6.12-rpi4-r0/0062-soo.h.patch | 41 +- .../0063-vbstore.h.patch | 4 +- .../0001-linux-6.12-rpi4-r0/0064-vbus.h.patch | 4 +- .../0065-vdevback.h.patch | 4 +- .../0066-Kconfig.patch | 4 +- .../0067-Makefile.patch | 4 +- .../0068-paging.c.patch | 20 +- .../0001-linux-6.12-rpi4-r0/0069-asf.c.patch | 4 +- .../0070-asf_priv.h.patch | 4 +- .../0071-asf_test.c.patch | 4 +- .../0072-Makefile.patch | 4 +- .../0073-capsule.c.patch | 18 +- .../0074-console.c.patch | 22 +- .../0075-lprintk.c.patch | 4 +- .../0076-Makefile.patch | 4 +- .../0001-linux-6.12-rpi4-r0/0077-core.c.patch | 4 +- .../0078-debug.c.patch | 4 +- .../0079-Kconfig.patch | 4 +- .../0080-Makefile.patch | 4 +- .../0081-meminfo.c.patch | 4 +- .../0082-evtchn.c.patch | 112 +- .../0083-gnttab.c.patch | 4 +- .../0084-hypervisor.c.patch | 34 +- .../0085-Makefile.patch | 4 +- .../0086-setup.c.patch | 4 +- .../0087-soo_guest_activity.c.patch | 4 +- .../0088-sysfs.c.patch | 41 +- .../0089-Makefile.patch | 4 +- .../0090-vbstorage.c.patch | 16 +- .../0091-vbstore.c.patch | 159 +- .../0092-Makefile.patch | 4 +- .../0093-vbus_backend.c.patch | 4 +- .../0001-linux-6.12-rpi4-r0/0094-vbus.c.patch | 4 +- .../0095-vbus_client.c.patch | 4 +- .../0096-vbus_vbstore.c.patch | 187 +- .../0097-ctype.c.patch | 4 +- .../0098-config.h.patch | 4 +- .../0099-Makefile.patch | 4 +- .../0100-roxml_buff.c.patch | 4 +- .../0101-roxml_buff.h.patch | 4 +- .../0102-roxml_commit.c.patch | 4 +- .../0103-roxml_content.c.patch | 4 +- .../0104-roxml_core.c.patch | 4 +- .../0105-roxml_core.h.patch | 4 +- .../0106-roxml_defines.h.patch | 4 +- .../0107-roxml_edit.c.patch | 4 +- .../0108-roxml_file.c.patch | 4 +- .../0109-roxml_file.h.patch | 4 +- .../0110-roxml_internal.h.patch | 4 +- .../0111-roxml_mem.c.patch | 4 +- .../0112-roxml_mem.h.patch | 4 +- .../0113-roxml_nav.c.patch | 4 +- .../0114-roxml_parser.c.patch | 4 +- .../0115-roxml_parser.h.patch | 4 +- .../0116-roxml_tune.h.patch | 4 +- .../0117-roxml_types.h.patch | 4 +- .../0118-roxml_utils.h.patch | 4 +- .../0119-roxml_win32_native.h.patch | 4 +- .../0120-roxml_xpath.c.patch | 4 +- .../0121-roxml_xpath.h.patch | 4 +- .../0122-Makefile.patch | 4 +- .../0123-strtod.c.patch | 4 +- .../0124-Makefile.patch | 4 +- .../0125-Makefile.patch | 9 +- ...{0021-vlogs.c.patch => 0126-vlogs.c.patch} | 4 +- ...{0038-vlogs.h.patch => 0127-vlogs.h.patch} | 4 +- .../0128-Makefile.patch | 5 - ...126-vfbdev.c.patch => 0128-vfbdev.c.patch} | 0 ...127-vfbdev.h.patch => 0129-vfbdev.h.patch} | 0 ...129-vinput.c.patch => 0130-vinput.c.patch} | 0 ...130-vinput.h.patch => 0131-vinput.h.patch} | 0 ...s.patch => 0132-bcm2711-rpi-4-b.dts.patch} | 0 .../recipes-linux/soo/linux_6.12%.bbappend | 2 + build/meta-qemu/classes/qemu.bbclass | 19 +- build/meta-qemu/conf/layer.conf | 3 + .../qemu/files/0001-qemu-8.2.2-r0-patches.inc | 5 +- .../0001-qemu-8.2.2-r0/0001-virt.c.patch | 144 +- .../0001-qemu-8.2.2-r0/0002-virt.h.patch | 7 +- .../meta-qemu/recipes-qemu/qemu/qemu_8.2.2.bb | 25 +- build/meta-rootfs/classes/rootfs.bbclass | 168 +- build/meta-rootfs/conf/layer.conf | 3 + .../buildroot/buildroot_2024.11.bb | 43 +- .../0001-buildroot-2024.11-r0-patches.inc | 23 +- .../0001-rpi4_64_defconfig.patch} | 8 +- ...nfig.patch => 0003-virt64_defconfig.patch} | 312 +- .../0004-auto-getty.mk.patch} | 4 +- .../0005-Config.in.patch} | 4 +- .../0006-auto-getty.patch} | 4 +- .../0007-autogetty.patch | 5 + .../0008-auto-root-login.patch | 6 + .../0009-S91auto-getty.patch} | 4 +- .../0010-Config.in.patch | 23 + .../0011-.br2-external.in.init.patch | 8 + .../0012-.br2-external.in.jpeg.patch | 8 + .../0013-.br2-external.in.linux.patch | 8 + .../0014-.br2-external.in.menus.patch | 8 + .../0015-.br2-external.in.openssl.patch | 8 + .../0016-.br2-external.in.paths.patch | 8 + .../0017-.br2-external.in.skeleton.patch | 8 + .../0018-.br2-external.in.toolchains.patch | 8 + .../0019-.br2-external.mk.patch | 13 + .../0020-.depend.patch | 16 + .../0021-Config.in.patch | 8 + ...isk.001.include_sys_syscalls_h.patch.patch | 15 + .../0023-sfdisk.mk.patch | 52 + .../0002-buildroot-2024.11-r0-patches.inc | 10 - .../0015-autogetty.patch | 5 - .../0016-auto-root-login.patch | 6 - .../0018-Config.in.patch | 12 - .../0003-buildroot-2024.11-r0-patches.inc | 3 - .../0001-rpi4_64_defconfig.patch | 43 - .../linux/files/board/common/post_build.sh | 2 + .../linux/files/board/common/post_image.sh | 2 + .../rootfs_overlay/etc/default/dropbear | 2 + .../rootfs_overlay/etc/network/interfaces | 13 +- .../board/common/rootfs_overlay/etc/profile | 14 + .../rootfs_overlay/etc/soo/remove_logs.sh | 2 + .../common/rootfs_overlay/etc/syslog-ng.conf | 2 + .../linux/files/board/rpi4/post_image.sh | 3 + .../rootfs_overlay/etc/bluetooth/input.conf | 3 + .../rootfs_overlay/etc/bluetooth/main.conf | 5 + .../rootfs_overlay/etc/bluetooth/network.conf | 2 + .../etc/bluetooth/proximity.conf | 4 + .../rpi4/rootfs_overlay/root/btmanager.sh | 2 + .../rpi4/rootfs_overlay/root/otherapps.sh | 2 + .../board/rpi4/rootfs_overlay/root/soo_env.sh | 1 + .../rpi4/rootfs_overlay/root/wifimanager.sh | 3 + .../linux/files/board/rpi4_64/post_image.sh | 3 + .../rootfs_overlay/etc/bluetooth/input.conf | 3 + .../rootfs_overlay/etc/bluetooth/main.conf | 5 + .../rootfs_overlay/etc/bluetooth/network.conf | 2 + .../etc/bluetooth/proximity.conf | 4 + .../rpi4_64/rootfs_overlay/root/btmanager.sh | 2 + .../rpi4_64/rootfs_overlay/root/otherapps.sh | 2 + .../rpi4_64/rootfs_overlay/root/soo_env.sh | 1 + .../rootfs_overlay/root/wifimanager.sh | 3 + .../linux/files/board/virt32/post_image.sh | 3 + .../linux/files/board/virt64/post_image.sh | 3 + .../board/virt64/rootfs_overlay/etc/inittab | 43 +- .../linux/files/board/x86-qemu/post_build.sh | 2 + .../linux/files/board/x86-qemu/post_image.sh | 3 + .../recipes-rootfs/linux/rootfs-linux_1.0.bb | 70 +- .../recipes-rootfs/so3/rootfs-so3_1.0.bb | 7 +- build/meta-so3/classes/avz.bbclass | 2 + build/meta-so3/classes/so3.bbclass | 2 + build/meta-so3/conf/layer.conf | 3 + build/meta-so3/recipes-so3/avz/avz_6.1.0.bb | 55 - build/meta-so3/recipes-so3/avz/avz_6.2.0.bb | 69 + .../avz/files/0001-avz-6.2.0-r0-patches.inc | 6 + .../so3/files/0001-so3-6.2.0-r0-patches.inc | 6 + build/meta-so3/recipes-so3/so3/so3_6.1.0.bb | 40 - build/meta-so3/recipes-so3/so3/so3_6.2.0.bb | 85 + build/meta-toolchain/conf/layer.conf | 12 + .../recipes-toolchain/musl/files/config.mak | 44 + .../musl/musl-toolchain_1.0.bb | 66 + build/meta-uboot/classes/uboot.bbclass | 2 + build/meta-uboot/conf/layer.conf | 3 + .../files/0001-uboot-2022.04-r0-patches.inc | 88 +- .../0001-lowlevel_init.S.patch | 4 +- .../0002-am335x-osd335x-common.dtsi.patch | 4 +- .../0003-hardware_am33xx.h.patch | 4 +- .../0001-uboot-2022.04-r0/0004-board.c.patch | 4 +- .../0005-hwinit-common.c.patch | 4 +- .../0001-uboot-2022.04-r0/0006-bootm.c.patch | 4 +- .../0007-image-board.c.patch | 4 +- .../0008-e1c_boot.c.patch | 215 + .../0008-setexpr.c.patch | 11 - .../0001-uboot-2022.04-r0/0009-Kconfig.patch | 32 +- .../0001-uboot-2022.04-r0/0010-Makefile.patch | 10 + .../0011-setexpr.c.patch | 11 + .../0001-uboot-2022.04-r0/0012-Kconfig.patch | 17 + ....patch => 0013-am335x_evm_defconfig.patch} | 4 +- ....patch => 0014-am57xx_evm_defconfig.patch} | 4 +- ...g.patch => 0015-rpi_4_32b_defconfig.patch} | 4 +- ...fig.patch => 0016-rpi4_64_defconfig.patch} | 11 +- .../0016-virt64_defconfig.patch | 1376 --- ...h => 0017-rpi4_64_rpi_dtb_defconfig.patch} | 4 +- ...nfig.patch => 0018-virt32_defconfig.patch} | 4 +- .../0019-virt64_defconfig.patch | 2750 +++++ .../0001-uboot-2022.04-r0/0020-config.h.patch | 10 + ...5x_evm.h.patch => 0021-am335x_evm.h.patch} | 4 +- ...qemu-arm.h.patch => 0022-qemu-arm.h.patch} | 4 +- .../{0019-rpi.h.patch => 0023-rpi.h.patch} | 4 +- .../0001-uboot-2022.04-r0/0024-bootm.c.patch | 4 - ...n.h.patch => 0024-ti_armv7_common.h.patch} | 4 +- .../0025-fdt_region.c.patch | 4 - ...n.h.patch => 0025-ti_omap5_common.h.patch} | 4 +- .../0001-uboot-2022.04-r0/0026-image.c.patch | 4 - .../{0022-mmc.h.patch => 0026-mmc.h.patch} | 4 +- ...023-Makefile.patch => 0027-Makefile.patch} | 4 +- .../0027-image-cipher.c.patch | 4 - .../0001-uboot-2022.04-r0/0028-bootm.c.patch | 4 + .../0028-image-fit.c.patch | 4 - .../0029-fdt_region.c.patch | 4 + .../0029-image-fit-sig.c.patch | 4 - .../0030-image-host.c.patch | 4 - .../0001-uboot-2022.04-r0/0030-image.c.patch | 4 + .../0031-image-cipher.c.patch | 4 + .../0032-image-fit.c.patch | 4 + .../0033-image-fit-sig.c.patch | 4 + .../0034-image-host.c.patch | 4 + .../0001-uboot-2022.04-r0/0035-hash.c.patch | 4 + .../0036-embedded.c.patch | 4 + .../0037-aes-decrypt.c.patch | 4 + .../0038-aes-encrypt.c.patch | 4 + .../0001-uboot-2022.04-r0/0039-crc16.c.patch | 4 + .../0001-uboot-2022.04-r0/0040-crc32.c.patch | 4 + .../0001-uboot-2022.04-r0/0041-crc8.c.patch | 4 + .../0042-ecdsa-libcrypto.c.patch | 4 + .../0001-uboot-2022.04-r0/0043-fdtdec.c.patch | 4 + .../0044-fdtdec_common.c.patch | 4 + .../0045-fdt-libcrypto.c.patch | 4 + .../0046-hash-checksum.c.patch | 4 + .../0001-uboot-2022.04-r0/0047-md5.c.patch | 4 + .../0001-uboot-2022.04-r0/0048-rc4.c.patch | 4 + .../0049-rsa-mod-exp.c.patch | 4 + .../0050-rsa-sign.c.patch | 4 + .../0051-rsa-verify.c.patch | 4 + .../0001-uboot-2022.04-r0/0052-sha1.c.patch | 4 + .../0001-uboot-2022.04-r0/0053-sha256.c.patch | 4 + .../0001-uboot-2022.04-r0/0054-sha512.c.patch | 4 + .../files/0001-uboot-2024.07-r0-patches.inc | 47 + .../0001-imx8mp-toradex-smarc-dev.dts.patch | 254 + ...imx8mp-toradex-smarc-dev-u-boot.dtsi.patch | 83 + .../0003-imx8mp-toradex-smarc.dtsi.patch | 1277 +++ .../0001-uboot-2024.07-r0/0004-Kconfig.patch | 23 + .../0001-uboot-2024.07-r0/0005-soc.c.patch | 10 + .../0006-apalis_imx6.c.patch | 61 + .../0007-colibri_imx6.c.patch | 61 + .../0008-tdx-cfg-block.c.patch | 258 + .../0009-tdx-cfg-block.h.patch | 35 + .../0010-tdx-common.c.patch | 20 + .../0011-imximage.cfg.patch | 9 + .../0001-uboot-2024.07-r0/0012-Kconfig.patch | 42 + .../0013-lpddr4_timing.c.patch | 1906 ++++ .../0014-lpddr4_timing.h.patch | 12 + .../0015-MAINTAINERS.patch | 13 + .../0001-uboot-2024.07-r0/0016-Makefile.patch | 12 + .../0017-smarc-imx8mp.c.patch | 88 + .../0018-smarc-imx8mp.env.patch | 23 + .../0001-uboot-2024.07-r0/0019-spl.c.patch | 133 + .../0020-lpddr4_timing.c.patch | 65 + .../0021-verdin-imx8mm.c.patch | 57 + .../0022-apalis_imx6_defconfig.patch | 11 + .../0023-colibri_imx6_defconfig.patch | 11 + .../0024-toradex-smarc-imx8mp_defconfig.patch | 187 + .../0025-verdin-imx8mm_defconfig.patch | 20 + .../0026-verdin-imx8mp_defconfig.patch | 28 + .../0027-index.rst.patch | 7 + .../0028-smarc-imx8mp.rst.patch | 119 + .../0029-imx8mm-verdin.dtsi.patch | 11 + .../0030-imx8mp-verdin.dtsi.patch | 11 + .../0031-toradex-smarc-imx8mp.h.patch | 31 + .../0032-verdin-imx8mm.h.patch | 15 + .../0033-image-board.c.patch | 36 + .../0034-verdin-imx8mp.h.patch | 27 + .../0035-verdin-imx8mp_defconfig.patch | 11 + .../0036-imx8mp-u-boot.dtsi.patch | 38 + .../0037-verdin-imx8mp.c.patch | 13 + .../0001-uboot-2024.07-r0/0038-soc.c.patch | 11 + .../0001-uboot-2024.07-r0/0070-Kconfig.patch | 19 + .../0001-uboot-2024.07-r0/0071-Makefile.patch | 10 + .../0072-verdin-imx8mp_defconfig.patch | 7 + .../0073-e1c_boot.c.patch | 215 + .../recipes-uboot/uboot/uboot_2022.04.bb | 70 +- .../recipes-uboot/uboot/uboot_2024.07.bb | 134 + build/meta-usr/classes/usr.bbclass | 61 +- build/meta-usr/conf/layer.conf | 3 + .../recipes-usr/linux/usr-linux_1.0.bb | 50 +- .../recipes-usr/linux/usr-linux_1.0.bbappend | 42 + .../so3/files/0001-usr-so3-1.0-r0-patches.inc | 9 +- .../0001-usr-so3-1.0-r0/0014-slv_fb.c.patch | 2 +- build/meta-usr/recipes-usr/so3/usr-so3_1.0.bb | 64 +- .../files/0001-usr-linux-1.0-r0-patches.inc | 7 +- .../0016-CMakeLists.txt.patch | 5 +- .../0020-capsule.cpp.patch | 3 +- .../0049-restoreme.c.patch | 3 +- .../recipes-usr/soo/usr-linux_1.0.bbappend | 4 +- build/meta/classes/base.bbclass | 37 +- build/meta/classes/logging.bbclass | 7 + build/meta/classes/patch.bbclass | 450 +- build/meta/classes/utils.bbclass | 158 +- build/meta/conf/bitbake.conf | 1 + build/meta/conf/layer.conf | 4 + env.sh | 134 +- scripts/bitbake | 53 + scripts/build.sh | 135 +- scripts/ci-local.sh | 109 + scripts/common/bblayers.sh | 85 + scripts/common/setup_env.sh | 105 + scripts/common/setup_sudo.sh | 84 + scripts/common/sudo_session.sh | 65 + scripts/deploy.sh | 90 +- scripts/diffdir.sh | 3 + scripts/init_storage.sh | 21 +- scripts/mount.sh | 20 +- scripts/qemu-ifdown.sh | 3 + scripts/qemu-ifup.sh | 1 + scripts/st.sh | 147 +- scripts/stg.sh | 144 +- scripts/umount.sh | 20 +- scripts/updiff.sh | 7 + 477 files changed, 45547 insertions(+), 11296 deletions(-) create mode 100644 build/.gitignore create mode 100644 build/meta-atf/recipes-atf/atf/files/0001-atf-imx8mp-avz.patch create mode 100644 build/meta-atf/recipes-atf/optee/optee_1.5.bb create mode 100644 build/meta-bsp/recipes-bsp/bsp/imx8_colibri/mx8qxc0-ahab-container.img create mode 100644 build/meta-bsp/recipes-bsp/bsp/verdin-imx8mp/boot.scr.txt create mode 100644 build/meta-bsp/recipes-bsp/bsp/verdin-imx8mp/boot_avz.scr.txt create mode 100644 build/meta-bsp/recipes-bsp/bsp/verdin-imx8mp/lpddr4_pmu_train_1d_dmem_202006.bin create mode 100644 build/meta-bsp/recipes-bsp/bsp/verdin-imx8mp/lpddr4_pmu_train_1d_imem_202006.bin create mode 100644 build/meta-bsp/recipes-bsp/bsp/verdin-imx8mp/lpddr4_pmu_train_2d_dmem_202006.bin create mode 100644 build/meta-bsp/recipes-bsp/bsp/verdin-imx8mp/lpddr4_pmu_train_2d_imem_202006.bin create mode 100644 build/meta-bsp/recipes-bsp/so3/files/uEnv_rpi4_64_avz.txt create mode 100644 build/meta-bsp/recipes-bsp/so3/files/uEnv_virt64_avz.txt create mode 100644 build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0021-Makefile.patch create mode 100644 build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0022-virt64.dts.patch create mode 100644 build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0023-virt64_guest.dts.patch create mode 100644 build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0053-virt64_defconfig.patch create mode 100644 build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0001-bcm2711-rpi-4-b.dts.patch create mode 100644 build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0002-bcm270x.dtsi.patch create mode 100644 build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0003-bcm270x-rpi.dtsi.patch create mode 100644 build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0004-bcm2711.dtsi.patch create mode 100644 build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0006-bcm2711-rpi.dtsi.patch create mode 100644 build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0007-bcm271x-rpi-bt.dtsi.patch create mode 100644 build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0008-bcm2835-rpi.dtsi.patch create mode 100644 build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0009-bcm283x.dtsi.patch create mode 100644 build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0010-bcm283x-rpi-cam1-regulator.dtsi.patch create mode 100644 build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0011-bcm283x-rpi-csi1-2lane.dtsi.patch create mode 100644 build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0012-bcm283x-rpi-i2c0mux_0_44.dtsi.patch create mode 100644 build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0013-bcm283x-rpi-usb-peripheral.dtsi.patch create mode 100644 build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0015-Makefile.patch create mode 100644 build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0016-rpi4_64_nomodules_defconfig.patch create mode 100644 build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0001-bcm2711-rpi-4-b.dts.patch create mode 100644 build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0002-bcm270x.dtsi.patch create mode 100644 build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0003-bcm270x-rpi.dtsi.patch create mode 100644 build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0004-bcm2711.dtsi.patch create mode 100644 build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0005-bcm2711-rpi-4-b.dts.patch create mode 100644 build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0006-bcm2711-rpi.dtsi.patch create mode 100644 build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0007-bcm271x-rpi-bt.dtsi.patch create mode 100644 build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0008-bcm2835-rpi.dtsi.patch create mode 100644 build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0009-bcm283x.dtsi.patch create mode 100644 build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0010-bcm283x-rpi-cam1-regulator.dtsi.patch create mode 100644 build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0011-bcm283x-rpi-csi1-2lane.dtsi.patch create mode 100644 build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0012-bcm283x-rpi-i2c0mux_0_44.dtsi.patch create mode 100644 build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0013-bcm283x-rpi-usb-peripheral.dtsi.patch create mode 100644 build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0014-rpi4_64_defconfig.patch rename build/meta-linux/recipes-linux/linux/files/{0001-linux-6.12-rpi4-r0 => 0002-linux-6.12-rpi4-r0}/0015-rpi4_64_nomodules_defconfig.patch (100%) rename build/meta-linux/recipes-linux/linux/files/{0001-linux-6.12-rpi4-r0 => 0002-linux-6.12-rpi4-r0}/0016-Makefile.patch (100%) rename build/meta-linux/recipes-linux/{soo/files/0001-linux-6.12-rpi4-r0/0002-rpi4_64_nomodules_soo_defconfig.patch => linux/files/0002-linux-6.12-rpi4-r0/0017-rpi4_64_nomodules_soo_defconfig.patch} (85%) delete mode 100644 build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0128-Makefile.patch rename build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/{0129-vfbdev.c.patch => 0128-vfbdev.c.patch} (100%) rename build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/{0130-vfbdev.h.patch => 0129-vfbdev.h.patch} (100%) rename build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/{0132-vinput.c.patch => 0130-vinput.c.patch} (100%) delete mode 100644 build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0131-Makefile.patch rename build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/{0133-vinput.h.patch => 0131-vinput.h.patch} (100%) create mode 100644 build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0006-.clang-format.patch delete mode 100644 build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0008-Kconfig.patch create mode 100644 build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0010-.gitattributes.patch delete mode 100644 build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0010-fixdep.patch delete mode 100644 build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0011-conf.patch delete mode 100644 build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0012-lexer.lex.c.patch rename build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/{0006-tty_flip.h.patch => 0012-tty_flip.h.patch} (73%) rename build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/{0007-main.c.patch => 0013-main.c.patch} (71%) delete mode 100644 build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0013-parser.tab.c.patch create mode 100644 build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0014-Kconfig.patch delete mode 100644 build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0014-parser.tab.h.patch create mode 100644 build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0015-.mailmap.patch rename build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/{0009-Makefile.patch => 0016-Makefile.patch} (67%) rename build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/{0015-Kconfig.patch => 0018-Kconfig.patch} (66%) delete mode 100644 build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0018-Makefile.patch rename build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/{1016-Makefile.patch => 0019-Makefile.patch} (52%) delete mode 100644 build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0020-Makefile.patch rename build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/{0017-vdevback.c.patch => 0020-vdevback.c.patch} (97%) create mode 100644 build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0021-Makefile.patch delete mode 100644 build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0022-Makefile.patch rename build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/{0019-vdummy.c.patch => 0022-vdummy.c.patch} (95%) create mode 100644 build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0023-Makefile.patch rename build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/{0023-rpisense-joystick.c.patch => 0024-rpisense-joystick.c.patch} (94%) rename build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/{0024-rpisense-joystick.h.patch => 0025-rpisense-joystick.h.patch} (84%) delete mode 100644 build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0026-Makefile.patch rename build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/{0025-vsensej.c.patch => 0026-vsensej.c.patch} (96%) create mode 100644 build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0027-Makefile.patch rename build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/{0027-rpisense-led.c.patch => 0028-rpisense-led.c.patch} (96%) rename build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/{0028-rpisense-led.h.patch => 0029-rpisense-led.h.patch} (81%) delete mode 100644 build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0030-Makefile.patch rename build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/{0029-vsenseled.c.patch => 0030-vsenseled.c.patch} (95%) create mode 100644 build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0031-Makefile.patch rename build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/{0031-vuart.c.patch => 0032-vuart.c.patch} (96%) rename build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/{0032-avz.h.patch => 0033-avz.h.patch} (97%) rename build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/{0033-asf.h.patch => 0034-asf.h.patch} (91%) rename build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/{0034-avzcons.h.patch => 0035-avzcons.h.patch} (80%) rename build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/{0035-capsule.h.patch => 0036-capsule.h.patch} (87%) rename build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/{0036-debug.h.patch => 0037-debug.h.patch} (82%) rename build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/{0037-vdummy.h.patch => 0038-vdummy.h.patch} (87%) rename build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/{0021-vlogs.c.patch => 0126-vlogs.c.patch} (95%) rename build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/{0038-vlogs.h.patch => 0127-vlogs.h.patch} (86%) delete mode 100644 build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0128-Makefile.patch rename build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/{0126-vfbdev.c.patch => 0128-vfbdev.c.patch} (100%) rename build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/{0127-vfbdev.h.patch => 0129-vfbdev.h.patch} (100%) rename build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/{0129-vinput.c.patch => 0130-vinput.c.patch} (100%) rename build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/{0130-vinput.h.patch => 0131-vinput.h.patch} (100%) rename build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/{1001-bcm2711-rpi-4-b.dts.patch => 0132-bcm2711-rpi-4-b.dts.patch} (100%) rename build/meta-rootfs/recipes-rootfs/buildroot/files/{0002-buildroot-2024.11-r0/0019-rpi4_64_defconfig.patch => 0001-buildroot-2024.11-r0/0001-rpi4_64_defconfig.patch} (99%) rename build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/{0004-virt64_defconfig.patch => 0003-virt64_defconfig.patch} (95%) rename build/meta-rootfs/recipes-rootfs/buildroot/files/{0002-buildroot-2024.11-r0/0012-auto-getty.mk.patch => 0001-buildroot-2024.11-r0/0004-auto-getty.mk.patch} (81%) rename build/meta-rootfs/recipes-rootfs/buildroot/files/{0002-buildroot-2024.11-r0/0013-Config.in.patch => 0001-buildroot-2024.11-r0/0005-Config.in.patch} (71%) rename build/meta-rootfs/recipes-rootfs/buildroot/files/{0002-buildroot-2024.11-r0/0014-auto-getty.patch => 0001-buildroot-2024.11-r0/0006-auto-getty.patch} (79%) create mode 100644 build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0007-autogetty.patch create mode 100644 build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0008-auto-root-login.patch rename build/meta-rootfs/recipes-rootfs/buildroot/files/{0002-buildroot-2024.11-r0/0017-S91auto-getty.patch => 0001-buildroot-2024.11-r0/0009-S91auto-getty.patch} (69%) create mode 100644 build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0010-Config.in.patch create mode 100644 build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0011-.br2-external.in.init.patch create mode 100644 build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0012-.br2-external.in.jpeg.patch create mode 100644 build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0013-.br2-external.in.linux.patch create mode 100644 build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0014-.br2-external.in.menus.patch create mode 100644 build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0015-.br2-external.in.openssl.patch create mode 100644 build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0016-.br2-external.in.paths.patch create mode 100644 build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0017-.br2-external.in.skeleton.patch create mode 100644 build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0018-.br2-external.in.toolchains.patch create mode 100644 build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0019-.br2-external.mk.patch create mode 100644 build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0020-.depend.patch create mode 100644 build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0021-Config.in.patch create mode 100644 build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0022-sfdisk.001.include_sys_syscalls_h.patch.patch create mode 100644 build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0023-sfdisk.mk.patch delete mode 100644 build/meta-rootfs/recipes-rootfs/buildroot/files/0002-buildroot-2024.11-r0-patches.inc delete mode 100644 build/meta-rootfs/recipes-rootfs/buildroot/files/0002-buildroot-2024.11-r0/0015-autogetty.patch delete mode 100644 build/meta-rootfs/recipes-rootfs/buildroot/files/0002-buildroot-2024.11-r0/0016-auto-root-login.patch delete mode 100644 build/meta-rootfs/recipes-rootfs/buildroot/files/0002-buildroot-2024.11-r0/0018-Config.in.patch delete mode 100644 build/meta-rootfs/recipes-rootfs/buildroot/files/0003-buildroot-2024.11-r0-patches.inc delete mode 100644 build/meta-rootfs/recipes-rootfs/buildroot/files/0003-buildroot-2024.11-r0/0001-rpi4_64_defconfig.patch create mode 100644 build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/default/dropbear delete mode 100644 build/meta-so3/recipes-so3/avz/avz_6.1.0.bb create mode 100644 build/meta-so3/recipes-so3/avz/avz_6.2.0.bb create mode 100644 build/meta-so3/recipes-so3/avz/files/0001-avz-6.2.0-r0-patches.inc create mode 100644 build/meta-so3/recipes-so3/so3/files/0001-so3-6.2.0-r0-patches.inc delete mode 100644 build/meta-so3/recipes-so3/so3/so3_6.1.0.bb create mode 100644 build/meta-so3/recipes-so3/so3/so3_6.2.0.bb create mode 100644 build/meta-toolchain/conf/layer.conf create mode 100644 build/meta-toolchain/recipes-toolchain/musl/files/config.mak create mode 100644 build/meta-toolchain/recipes-toolchain/musl/musl-toolchain_1.0.bb create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0008-e1c_boot.c.patch delete mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0008-setexpr.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0010-Makefile.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0011-setexpr.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0012-Kconfig.patch rename build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/{0010-am335x_evm_defconfig.patch => 0013-am335x_evm_defconfig.patch} (93%) rename build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/{0011-am57xx_evm_defconfig.patch => 0014-am57xx_evm_defconfig.patch} (91%) rename build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/{0012-rpi_4_32b_defconfig.patch => 0015-rpi_4_32b_defconfig.patch} (99%) rename build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/{0013-rpi4_64_defconfig.patch => 0016-rpi4_64_defconfig.patch} (99%) delete mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0016-virt64_defconfig.patch rename build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/{0014-rpi4_64_rpi_dtb_defconfig.patch => 0017-rpi4_64_rpi_dtb_defconfig.patch} (99%) rename build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/{0015-virt32_defconfig.patch => 0018-virt32_defconfig.patch} (99%) create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0019-virt64_defconfig.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0020-config.h.patch rename build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/{0017-am335x_evm.h.patch => 0021-am335x_evm.h.patch} (96%) rename build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/{0018-qemu-arm.h.patch => 0022-qemu-arm.h.patch} (67%) rename build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/{0019-rpi.h.patch => 0023-rpi.h.patch} (82%) delete mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0024-bootm.c.patch rename build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/{0020-ti_armv7_common.h.patch => 0024-ti_armv7_common.h.patch} (99%) delete mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0025-fdt_region.c.patch rename build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/{0021-ti_omap5_common.h.patch => 0025-ti_omap5_common.h.patch} (78%) delete mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0026-image.c.patch rename build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/{0022-mmc.h.patch => 0026-mmc.h.patch} (94%) rename build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/{0023-Makefile.patch => 0027-Makefile.patch} (56%) delete mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0027-image-cipher.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0028-bootm.c.patch delete mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0028-image-fit.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0029-fdt_region.c.patch delete mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0029-image-fit-sig.c.patch delete mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0030-image-host.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0030-image.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0031-image-cipher.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0032-image-fit.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0033-image-fit-sig.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0034-image-host.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0035-hash.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0036-embedded.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0037-aes-decrypt.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0038-aes-encrypt.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0039-crc16.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0040-crc32.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0041-crc8.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0042-ecdsa-libcrypto.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0043-fdtdec.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0044-fdtdec_common.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0045-fdt-libcrypto.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0046-hash-checksum.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0047-md5.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0048-rc4.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0049-rsa-mod-exp.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0050-rsa-sign.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0051-rsa-verify.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0052-sha1.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0053-sha256.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0054-sha512.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0-patches.inc create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0001-imx8mp-toradex-smarc-dev.dts.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0002-imx8mp-toradex-smarc-dev-u-boot.dtsi.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0003-imx8mp-toradex-smarc.dtsi.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0004-Kconfig.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0005-soc.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0006-apalis_imx6.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0007-colibri_imx6.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0008-tdx-cfg-block.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0009-tdx-cfg-block.h.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0010-tdx-common.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0011-imximage.cfg.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0012-Kconfig.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0013-lpddr4_timing.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0014-lpddr4_timing.h.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0015-MAINTAINERS.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0016-Makefile.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0017-smarc-imx8mp.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0018-smarc-imx8mp.env.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0019-spl.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0020-lpddr4_timing.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0021-verdin-imx8mm.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0022-apalis_imx6_defconfig.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0023-colibri_imx6_defconfig.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0024-toradex-smarc-imx8mp_defconfig.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0025-verdin-imx8mm_defconfig.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0026-verdin-imx8mp_defconfig.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0027-index.rst.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0028-smarc-imx8mp.rst.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0029-imx8mm-verdin.dtsi.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0030-imx8mp-verdin.dtsi.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0031-toradex-smarc-imx8mp.h.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0032-verdin-imx8mm.h.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0033-image-board.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0034-verdin-imx8mp.h.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0035-verdin-imx8mp_defconfig.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0036-imx8mp-u-boot.dtsi.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0037-verdin-imx8mp.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0038-soc.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0070-Kconfig.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0071-Makefile.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0072-verdin-imx8mp_defconfig.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0073-e1c_boot.c.patch create mode 100644 build/meta-uboot/recipes-uboot/uboot/uboot_2024.07.bb create mode 100644 build/meta-usr/recipes-usr/linux/usr-linux_1.0.bbappend create mode 100755 scripts/bitbake create mode 100755 scripts/ci-local.sh create mode 100644 scripts/common/setup_env.sh create mode 100755 scripts/common/setup_sudo.sh create mode 100644 scripts/common/sudo_session.sh create mode 100755 scripts/updiff.sh diff --git a/.gitignore b/.gitignore index 9d289f2..422e95d 100644 --- a/.gitignore +++ b/.gitignore @@ -70,3 +70,7 @@ filesystem/work # GitHub Actions workflows !.github !.github/** + +# do_attach_infrabase manifests (build artifacts) +*.attach.sha256 +*.back/ diff --git a/build/.gitignore b/build/.gitignore new file mode 100644 index 0000000..d52b37f --- /dev/null +++ b/build/.gitignore @@ -0,0 +1,4 @@ +tmp +# Generated by bblayers.sh:regen_boot_chain, loaded after local.conf +conf/auto.conf + diff --git a/build/conf/bblayers.conf b/build/conf/bblayers.conf index 045f91d..5bfd4a2 100644 --- a/build/conf/bblayers.conf +++ b/build/conf/bblayers.conf @@ -1,5 +1,6 @@ - -# All layers managed by Infrabase +# Auto-generated by scripts/build.sh — regenerated by +# scripts/common/bblayers.sh:regen_bblayers(). Hand edits will be +# overwritten on the next build.sh invocation. BBPATH := "${TOPDIR}" BBFILES ?= "" @@ -14,4 +15,5 @@ BBLAYERS = " \ ${TOPDIR}/meta-bsp \ ${TOPDIR}/meta-so3 \ ${TOPDIR}/meta-atf \ + ${TOPDIR}/meta-toolchain \ " diff --git a/build/conf/local.conf b/build/conf/local.conf index 29a5e75..8c75ba4 100644 --- a/build/conf/local.conf +++ b/build/conf/local.conf @@ -1,140 +1,221 @@ # Infrabase - Main configuration +# +# MICOFE virt64 default: AVZ (CONFIG_SOO=y) + Linux agency + SO3 capsule, +# with the virtualized framebuffer / LVGL stack (EXTRA_OVERRIDES :lvgl:soo). +# See doc/source/{architecture,lvgl,emiso}.rst. Adjust the virt64 selections +# below to build the plain (non-SOO) contexts. BB_NUMBER_THREADS = "20" # Main target physical/emulated hardware - # IB_PLATFORM ?= "virt32" -# IB_PLATFORM ?= "virt64" -# IB_PLATFORM ?= "rpi4" -IB_PLATFORM ?= "rpi4_64" - -# IB_PLATFORM ?= "x86-qemu" - -# Linux General Configuration - -# Available configurations -IB_CONFIG:linux:x86-pc ?= "x86_defconfig" -IB_CONFIG:linux:x86-qemu ?= "x86_qemu_defconfig" - -# QEMU/virt64 configuration - -# This configuration is used to start Linux alone, or on top AVZ -# IB_CONFIG:linux:virt64 ?= "virt64_defconfig" -# IB_CONFIG:linux:rpi4_64 ?= "rpi4_64_defconfig" -# IB_CONFIG:linux:rpi4_64 ?= "rpi4_64_nomodules_defconfig" -IB_CONFIG:linux:rpi4_64 ?= "rpi4_64_nomodules_soo_defconfig" - -# Configuration to start Linux as agency to support SO3 capsules -IB_CONFIG:linux:virt64 ?= "virt64_soo_defconfig" - -PREFERRED_VERSION_linux:virt32 = "6.12" -PREFERRED_VERSION_linux:virt64 = "6.12" -PREFERRED_VERSION_linux:rpi4_64 = "6.12-rpi4" -PREFERRED_VERSION_linux:x86-qemu = "6.12" - -# Preferred version for rootfs - -# When the rootfs is fully built and user apps are deployed in it +IB_PLATFORM ?= "virt64" +# IB_PLATFORM ?= "rpi4_64" +# IB_PLATFORM ?= "verdin-imx8mp" + +# ============================================================================ +# LINUX +# ============================================================================ +# Like SO3, Linux builds in several contexts on the current IB_PLATFORM, +# selected by the CONFIG and the ITS below, not by the platform: +# +# alone Linux alone (or directly on AVZ). ITS = virt64 +# guest Linux as a guest on the AVZ hypervisor. ITS = virt64_avz +# agency Linux as the agency that hosts SO3 capsules +# (config virt64_soo_defconfig). + +# --- Versions --- +PREFERRED_VERSION_linux:virt32 = "6.12" +PREFERRED_VERSION_linux:virt64 = "6.12" +PREFERRED_VERSION_linux:rpi4_64 = "6.12-rpi4" +PREFERRED_VERSION_linux:verdin-imx8mp = "6.6-verdin" +PREFERRED_VERSION_linux = "${PREFERRED_VERSION_linux:${IB_PLATFORM}}" -PREFERRED_VERSION_rootfs-linux:virt64 = "1.0" +# --- Configs (kernel defconfig) --- +# IB_CONFIG:linux:virt64 ?= "virt64_defconfig" +IB_CONFIG:linux:virt64 ?= "virt64_soo_defconfig" +# IB_CONFIG:linux:rpi4_64 ?= "rpi4_64_defconfig" +IB_CONFIG:linux:rpi4_64 ?= "rpi4_64_nomodules_defconfig" +IB_CONFIG:linux:verdin-imx8mp ?= "verdin_imx8mp_defconfig" + +# --- ITS (boot-image selection) --- +# Linux alone: +# IB_TARGET_ITS:linux:virt64 ?= "virt64" +# Linux as agency/guest on AVZ (MICOFE default — hosts the SO3 capsules): +IB_TARGET_ITS:linux:virt64 ?= "virt64_avz" + + +# ============================================================================ +# Component versions (per platform) +# ============================================================================ +# rootfs (built once the user apps are deployed into it) +PREFERRED_VERSION_rootfs-linux:virt64 = "1.0" PREFERRED_VERSION_rootfs-linux:rpi4_64 = "1.0" -PREFERRED_VERSION_rootfs-linux:x86-qemu = "1.0" -PREFERRED_VERSION_buildroot:virt64 = "2024.11" +PREFERRED_VERSION_buildroot:virt64 = "2024.11" PREFERRED_VERSION_buildroot:rpi4_64 = "2024.11" -# Main ITS configuration -IB_TARGET_ITS:linux:virt64 ?= "virt64" -# IB_TARGET_ITS:linux:rpi4_64 ?= "rpi4" - -# This version to have only Linux standalone booting on RPi4 -# IB_TARGET_ITS:linux:rpi4_64 ?= "rpi4_64_linux" - -# Required to boot Linux on AVZ -IB_TARGET_ITS:linux:rpi4_64 ?= "rpi4_64_avz" - -# ITS used to run Linux on AVZ -IB_TARGET_ITS:linux:virt64 ?= "virt64_avz" - -# Preferred version for bsp - -# To deploy from the host to the target via ssh/scp -PREFERRED_VERSION_bsp-linux:x86-qemu = "1.0" -PREFERRED_VERSION_bsp-linux:virt64 = "1.0" +# bsp (deployed from the host to the target via ssh/scp) +PREFERRED_VERSION_bsp-linux:virt64 = "1.0" PREFERRED_VERSION_bsp-linux:rpi4_64 = "1.0" -# U-boot bootloader -PREFERRED_VERSION_uboot:virt64 = "2022.04" -PREFERRED_VERSION_uboot:rpi4_64 = "2022.04" +# U-Boot bootloader +PREFERRED_VERSION_uboot:virt64 = "2022.04" +PREFERRED_VERSION_uboot:rpi4_64 = "2022.04" +PREFERRED_VERSION_uboot:verdin-imx8mp = "2024.07" -PREFERRED_VERSION_usr-linux:x86-qemu = "1.0" -PREFERRED_VERSION_usr-linux:virt64 = "1.0" +# user-space apps +PREFERRED_VERSION_usr-linux:virt64 = "1.0" PREFERRED_VERSION_usr-linux:rpi4_64 = "1.0" -PREFERRED_VERSION_linux = "${PREFERRED_VERSION_linux:${IB_PLATFORM}}" - -# *************** SO3 *************** - -# Using the most recent version -PREFERRED_VERSION_so3:virt64 = "6.1.0" -PREFERRED_VERSION_so3:rpi4_64 = "6.1.0" - -# Configuration for SO3 - -# IB_PLATFORM:so3 ?= "virt64" -# IB_PLATFORM:so3 ?= "virt32" -# IB_PLATFORM:so3 ?= "rpi4" -# IB_PLATFORM:so3 ?= "rpi4_64" - -# IB_CONFIG:so3:virt64 ?= "virt64_defconfig" -IB_CONFIG:so3:virt64 ?= "virt64_capsule_defconfig" -# IB_CONFIG:so3:rpi4_64 ?= "rpi4_64_defconfig" -IB_CONFIG:so3:rpi4_64 ?= "virt64_capsule_defconfig" - -# Main ITS configuration - -# virt64 - -# IB_TARGET_ITS:so3:virt64 ?= "virt64_so3" - -# This ITS is used to use SO3 as capsule +# ============================================================================ +# SO3 +# ============================================================================ +# SO3 builds in one of three contexts, all on the current IB_PLATFORM (there is +# intentionally NO IB_PLATFORM:so3 override — a divergent one used to silently +# build SO3 for the wrong arch). What selects the context is the CONFIG and the +# ITS below, not the platform: +# +# standalone SO3 alone, bare metal at EL1. ITS = virt64_so3 +# guest SO3 as a guest on the AVZ hypervisor. ITS = virt64_avz +# Two-ITB boot: the AVZ ITB (virt64_avz.its = hypervisor + +# avz_dt) and the SO3 guest ITB (auto-derived virt64_so3_guest.its) +# are loaded together by U-Boot's e1c-boot command. Requires the +# AVZ config + version from the AVZ section below. +# Build: select the ITS here, then `build.sh -x avz`, then deploy +# bsp-so3 (do_itb mkimage's both ITBs; usr-so3 fills the guest +# rootfs.fat). +# capsule SO3 as a migratable capsule. ITS = virt64_capsule + +# --- Versions --- +PREFERRED_VERSION_so3:virt32 = "6.2.0" +PREFERRED_VERSION_so3:virt64 = "6.2.0" +PREFERRED_VERSION_so3:rpi4_64 = "6.2.0" + +# --- Configs (kernel defconfig) --- +# standalone and guest share the plain defconfig; capsule has its own. +# IB_CONFIG:so3:virt64 ?= "virt64_defconfig" +IB_CONFIG:so3:virt64 ?= "virt64_capsule_defconfig" +# IB_CONFIG:so3:virt64 ?= "virt64_lvperf_defconfig" +# IB_CONFIG:so3:virt64 ?= "virt64_fb_defconfig" +IB_CONFIG:so3:virt32 ?= "virt32_fb_defconfig" +IB_CONFIG:so3:rpi4_64 ?= "rpi4_64_defconfig" + +# --- ITS (boot-image selection) --- +# virt64: pick exactly ONE of standalone / guest / capsule. +# standalone (EL1, bare metal): +# IB_TARGET_ITS:so3:virt64 = "virt64_so3" +# guest on AVZ (auto-derives virt64_so3_guest): +# IB_TARGET_ITS:so3:virt64 = "virt64_avz" +# capsule (MICOFE default): IB_TARGET_ITS:so3:virt64 = "virt64_capsule" - -# rpi4 - -# IB_TARGET_ITS:so3:rpi4_64 ?= "rpi4_64_so3" -IB_TARGET_ITS:so3:rpi4_64 ?= "rpi4_64_capsule" - -# This ITS enables running SO3 on top of AVZ -#IB_TARGET_ITS:so3:virt64 = "virt64_avz_guest" - -# *************** AVZ *************** -# AVZ hypervisor General Configuration -PREFERRED_VERSION_avz:virt64 = "6.1.0" - -# Configuration for AVZ -# IB_CONFIG:avz:virt64 ?= "virt64_avz_defconfig" -IB_CONFIG:avz:virt64 ?= "virt64_avz_soo_defconfig" -IB_CONFIG:avz:rpi4_64 ?= "rpi4_64_avz_soo_defconfig" +IB_TARGET_ITS:so3:virt32 ?= "virt32_so3" +# rpi4_64 standalone: +IB_TARGET_ITS:so3:rpi4_64 ?= "rpi4_64_so3" +# rpi4_64 guest on AVZ (two-ITB): +# IB_TARGET_ITS:so3:rpi4_64 ?= "rpi4_64_avz" + + +# ============================================================================ +# AVZ +# ============================================================================ +# AVZ hypervisor — used by the SO3 "guest" context above (and by capsules). +# The AVZ ITB itself is selected through IB_TARGET_ITS:so3 = "_avz" in +# the SO3 section; here we set only the hypervisor version and build config. + +# --- Versions --- +PREFERRED_VERSION_avz:virt64 = "6.2.0" +PREFERRED_VERSION_avz:verdin-imx8mp = "6.2.0" + +# --- Configs --- +# IB_CONFIG:avz:virt64 ?= "virt64_avz_defconfig" +IB_CONFIG:avz:verdin-imx8mp ?= "verdin-imx8mp_avz_defconfig" +IB_CONFIG:avz:virt64 ?= "virt64_avz_soo_defconfig" + +# *************** Boot chain *************** +# +# IB_BOOT_CHAIN selects how the platform firmware is brought up. It is set +# here as the SO3 default; a capsule layer may override it (edgem1 model: +# the e1c capsule sets it to "full"). Hence "?=" (weak) so the override +# wins. Values: +# "" bare U-Boot (virt64_defconfig), no ATF. SO3 standalone (EL1) +# and SO3-on-AVZ without ATF — st.sh enables QEMU EL2 +# (virtualization=on) when the avz ITS is selected. SO3 default. +# "uboot" bare U-Boot, qemu_arm64_defconfig (EL1, position-independent): +# the bare-Linux variant (kept for edgem1 alignment). +# "atf+uboot" ATF in flash0.img (BL1 + FIP[BL2+BL31+U-Boot]), no OP-TEE. +# "full" ATF + OP-TEE (BL32) + U-Boot in flash0.img — secure world. +# The flash0.img assembly lives in meta-bsp/.../bsp_virt64.inc +# (__do_platform_boot_chain); st.sh picks ATF vs bare from its presence. +IB_BOOT_CHAIN = "" + +# ATF / OP-TEE platform identifiers for QEMU virt (used when IB_BOOT_CHAIN +# is "atf+uboot" or "full"). Mirrors edgem1's virt64 settings. +IB_ATF_PLAT:virt64 = "qemu" +IB_OPTEE_PLAT:virt64 = "vexpress-qemu_armv8a" +IB_ATF_EXTRA_OPTS:virt64 = "${@bb.utils.contains('IB_BOOT_CHAIN', 'full', 'SPD=opteed ', '', d)}LOG_LEVEL=40" + +# *************** Verdin iMX8MP (SO3 guest on AVZ) *************** +# SO3 runs as an AVZ guest on the Toradex Verdin iMX8MP. The firmware chain is +# always ATF (EL3) + OP-TEE + U-Boot (the imx-boot/flash.bin), independent of +# Torizon and the e1c capsules. Select the board with IB_PLATFORM="verdin-imx8mp". +# AVZ + bundled u-boot + the imx8mp ATF/OP-TEE settings mirror edgem1's verdin +# build; the SO3 guest replaces the Linux guest. Two-ITB boot like virt64: the +# AVZ ITB (verdin_imx8mp_avz.its) and the SO3 guest ITB +# (verdin_imx8mp_so3_guest.its), loaded by U-Boot's e1c-boot command. +# SO3 as an AVZ guest (default). For SO3 standalone (bare-metal, no AVZ) select +# the standalone config + ITS, and build U-Boot with the EL1 switch so it hands +# SO3 off at EL1 (SO3 standalone is EL1-native; AVZ instead needs EL2): +# IB_CONFIG:so3:verdin-imx8mp ?= "verdin-imx8mp_defconfig" +# IB_TARGET_ITS:so3:verdin-imx8mp ?= "verdin_imx8mp_so3" +# IB_UBOOT_SWITCH_EL1 = "1" +IB_CONFIG:so3:verdin-imx8mp ?= "verdin-imx8mp_avz_defconfig" +IB_TARGET_ITS:so3:verdin-imx8mp ?= "verdin_imx8mp_avz" +# NOTE: the virt64 SO3 ITS is set once, in the SO3 section above — do not +# re-assign IB_TARGET_ITS:so3:virt64 here (a stray "= virt64_avz" used to live +# at this spot and silently overrode the SO3 section). + +# imx-boot's U-Boot hands the OS off at EL2 by default (AVZ). Set to "1" for the +# standalone variant so U-Boot switches to EL1 first (CONFIG_ARMV8_SWITCH_TO_EL1). +IB_UBOOT_SWITCH_EL1 ?= "0" + +PREFERRED_VERSION_avz:verdin-imx8mp = "6.2.0" +IB_CONFIG:avz:verdin-imx8mp ?= "verdin-imx8mp_avz_defconfig" + +# Verdin U-Boot 2024.07 assembles imx-boot/flash.bin (SPL + ATF + OP-TEE + U-Boot). +PREFERRED_VERSION_uboot:verdin-imx8mp = "2024.07" +# NXP lpddr4 DDR training firmware (vendored capsule-free, one flat directory). +IB_IMX_FIRMWARE_PATH = "${IB_DIR}/build/meta-bsp/recipes-bsp/bsp/verdin-imx8mp" + +IB_PLAT_CPU:verdin-imx8mp = "aarch64" +IB_TOOLCHAIN:verdin-imx8mp = "aarch64-none-linux-gnu" + +IB_ATF_PLAT:verdin-imx8mp = "imx8mp" +IB_ATF_EXTRA_OPTS:verdin-imx8mp = "IMX_BOOT_UART_BASE=0x30880000 SPD=opteed BL32_BASE=0xbe000000 BL32_SIZE=0x2000000 DEBUG=0 LOG_LEVEL=20" +IB_OPTEE_PLAT:verdin-imx8mp = "imx-mx8mpevk" +IB_OPTEE_EXTRA_OPTS:verdin-imx8mp = "CFG_TZDRAM_START=0xbe000000 CFG_DDR_SIZE=0x80000000 CFG_TEE_CORE_LOG_LEVEL=3 CFG_UART_BASE=0x30880000" # Type of deployment (soft for virtual storage, hard for target hardware) -IB_STORAGE:virt64 ?= "soft" -IB_STORAGE:rpi4_64 ?= "hard" -# IB_STORAGE ?= "remote" +IB_STORAGE_MODE:virt64 ?= "soft" +# IB_STORAGE_MODE:verdin-imx8mp ?= "hard" -# When deployed locally (for example on the PC where the build system is running) -# IB_STORAGE ?= "local" +IB_STORAGE_MODE:virt32 ?= "soft" +IB_STORAGE_MODE:rpi4_64 ?= "hard" -# Possible hardware device for deployment -# !! BE VERY CAREFUL WITH THIS VARIABLE !! +# Verdin: deploy the imx-boot + SO3 ITB via a TEZI image set (see bsp_verdin-imx8mp.inc) +IB_STORAGE_MODE:verdin-imx8mp ?= "http" +# IB_STORAGE_MODE ?= "remote" + +# Physical device used when IB_STORAGE_MODE = "hard" IB_STORAGE_DEVICE:rpi4 = "mmcblk0" -# IB_STORAGE_DEVICE:rpi4_64 = "mmcblk0" -IB_STORAGE_DEVICE:rpi4_64 = "sda" -# IB_STORAGE_DEVICE:rpi4_64 = "sdc" +IB_STORAGE_DEVICE:rpi4_64 = "mmcblk0" +IB_STORAGE_DEVICE:verdin-imx8mp = "sda" + +# HTTP deploy path: TEZI files are placed here for TEZI network auto-install +IB_HTTP_DEPLOY_PATH:verdin-imx8mp = "/var/www/html/verdin-imx8mp-prod" # Size of the rootfs partition IB_ROOTFS_SIZE ?= "2G" @@ -143,11 +224,8 @@ IB_ROOTFS_SIZE ?= "2G" IB_ROOTFS_PARTITION:virt32 = "p2" IB_ROOTFS_PARTITION:virt64 = "p2" -IB_ROOTFS_PARTITION:rpi4 = "p2" IB_ROOTFS_PARTITION:rpi4_64 = "p2" -IB_ROOTFS_PARTITION:x86-qemu = "p1" - IB_ROOTFS_PATH:linux = "${IB_DIR}/linux/rootfs" IB_ROOTFS_PATH:so3 = "${IB_DIR}/so3/rootfs" @@ -157,17 +235,23 @@ IB_ROOTFS_METHOD ?= "buildroot" # CPU core and toolchain according to the platform IB_PLAT_CPU:virt32 = "arm" -IB_PLAT_CPU:rpi4 = "arm" IB_PLAT_CPU:virt64 = "aarch64" IB_PLAT_CPU:rpi4_64 = "aarch64" -IB_PLAT_CPU:x86-qemu = "x86" - IB_TOOLCHAIN:arm = "arm-linux-gnueabihf" IB_TOOLCHAIN:virt64 = "aarch64-none-linux-gnu" IB_TOOLCHAIN:rpi4_64 = "aarch64-none-linux-gnu" +# SO3 user-space MUSL cross toolchain, built by the musl-toolchain +# recipe (meta-toolchain) into the bitbake-managed build/tmp area. +# IB_MUSL_TARGET (selected per IB_PLAT_CPU below) names the +# sub-directory, e.g. ${IB_MUSL_TOOLCHAIN_DIR}/aarch64-linux-musl/bin. +# Only the toolchain for the configured arch is built. +IB_MUSL_TOOLCHAIN_DIR = "${TMPDIR}/toolchains" +IB_MUSL_TARGET:aarch64 = "aarch64-linux-musl" +IB_MUSL_TARGET:arm = "arm-linux-musleabihf" + # Debug options # IB_USR_BUILD_TYPE = "Release" IB_USR_BUILD_TYPE = "Debug" @@ -180,6 +264,9 @@ BB_NO_NETWORK_SANDBOX = "1" BB_WARN_ONLY = "true" # EXTRA_OVERRIDES enables fine-grained customization for the various IB recipes. -EXTRA_OVERRIDES .= ":soo" +# EXTRA_OVERRIDES .= ":soo" +# :lvgl activates the lvgl bbappend which FETCHES lvgl (release/v9.3) into +# usr/lib/lvgl at build time # EXTRA_OVERRIDES .= ":lvgl" -# EXTRA_OVERRIDES .= ":lvgl:soo" +EXTRA_OVERRIDES .= ":lvgl:soo" + diff --git a/build/meta-atf/classes/atf.bbclass b/build/meta-atf/classes/atf.bbclass index e6e2593..7879d12 100644 --- a/build/meta-atf/classes/atf.bbclass +++ b/build/meta-atf/classes/atf.bbclass @@ -1,13 +1,63 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD -# Class for building U-boot in infrabase +# Class for building ATF/OP-TEE in infrabase IB_ATF_PATH = "${IB_DIR}/atf" +IB_OPTEE_PATH = "${IB_DIR}/atf/optee" + +# Platform-specific extra options for ATF build (e.g. IMX_BOOT_UART_BASE for imx8mp) +IB_ATF_EXTRA_OPTS ?= "" + +# OP-TEE platform identifier (e.g. vexpress-qemu_armv8a) +IB_OPTEE_PLAT ?= "" + +# Platform-specific extra options for OP-TEE build (e.g. CFG_TZDRAM_START) +IB_OPTEE_EXTRA_OPTS ?= "" + +# Detect IB_ATF_EXTRA_OPTS changes between invocations and force a clean +# rebuild when they differ — make's per-file dependency tracking does NOT +# pick up changes to compile-time flags like SPD= , so otherwise BL2 keeps +# the OP-TEE-loading code (or vice versa) when switching between +# IB_BOOT_CHAIN=full and IB_BOOT_CHAIN=atf+uboot. + +__ib_atf_clean_if_opts_changed () { + _marker="${IB_TARGET}/build/.ib-atf-extra-opts" + _prev="" + if [ -f "${_marker}" ]; then + _prev="$(cat "${_marker}")" + fi + if [ "${_prev}" != "${IB_ATF_EXTRA_OPTS}" ]; then + echo "IB_ATF_EXTRA_OPTS changed (was '${_prev}', now '${IB_ATF_EXTRA_OPTS}') — running make realclean" + make CROSS_COMPILE=${IB_TOOLCHAIN}- PLAT=${IB_ATF_PLAT} realclean || true + mkdir -p "${IB_TARGET}/build" + printf '%s' "${IB_ATF_EXTRA_OPTS}" > "${_marker}" + fi +} do_build_bl31 () { echo "Building ARM Trusted Firmware with ${CORES} cores..." cd ${IB_TARGET} - make CROSS_COMPILE=${IB_TOOLCHAIN}- PLAT=${IB_ATF_PLAT} IMX_BOOT_UART_BASE=0x30880000 bl31 -j${CORES} + __ib_atf_clean_if_opts_changed + make CROSS_COMPILE=${IB_TOOLCHAIN}- PLAT=${IB_ATF_PLAT} ${IB_ATF_EXTRA_OPTS} bl31 -j${CORES} +} + +do_build_all_fiptool () { + + echo "Building ARM Trusted Firmware (all stages + fiptool) with ${CORES} cores..." + cd ${IB_TARGET} + __ib_atf_clean_if_opts_changed + make CROSS_COMPILE=${IB_TOOLCHAIN}- PLAT=${IB_ATF_PLAT} ${IB_ATF_EXTRA_OPTS} all fiptool -j${CORES} +} + +do_build_optee () { + + echo "Building OP-TEE OS with ${CORES} cores..." + cd ${IB_TARGET} + make CROSS_COMPILE64=${IB_TOOLCHAIN}- \ + PLATFORM=${IB_OPTEE_PLAT} CFG_ARM64_core=y CFG_USER_TA_TARGETS=ta_arm64 \ + ${IB_OPTEE_EXTRA_OPTS} -j${CORES} } -EXPORT_FUNCTIONS do_build_bl31 +EXPORT_FUNCTIONS do_build_bl31 do_build_all_fiptool do_build_optee diff --git a/build/meta-atf/conf/layer.conf b/build/meta-atf/conf/layer.conf index 7506aa8..8cc9f4f 100644 --- a/build/meta-atf/conf/layer.conf +++ b/build/meta-atf/conf/layer.conf @@ -1,3 +1,6 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + BBPATH .= ":${LAYERDIR}" BBFILES += "${LAYERDIR}/recipes-*/*/*.bb ${LAYERDIR}/recipes-*/*/*.bbappend" diff --git a/build/meta-atf/recipes-atf/atf/atf_1.5.bb b/build/meta-atf/recipes-atf/atf/atf_1.5.bb index 92b6681..bc90686 100644 --- a/build/meta-atf/recipes-atf/atf/atf_1.5.bb +++ b/build/meta-atf/recipes-atf/atf/atf_1.5.bb @@ -1,3 +1,5 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD SUMMARY = "ATF firmware" DESCRIPTION = "ARM Trusted Firmware (ATF)" @@ -10,12 +12,29 @@ inherit atf PR = "r0" PV = "1.5" + +SRC_URI = "git://git.trustedfirmware.org/TF-A/trusted-firmware-a.git;nobranch=1;protocol=https" +SRC_URI += "file://0001-atf-imx8mp-avz.patch" + +FILESPATH:prepend = "${THISDIR}/files:" + SRCREV = "78b1610e31d9a5dbd16553b8a2ac99000a7379f7" -SRC_URI = "git://git.trustedfirmware.org/TF-A/trusted-firmware-a.git;branch=master;protocol=https" +# do_patch uses the standard OE patch flow (applies to ${S} via SRC_URI). +# The patch uses git-style a/ b/ labels and applies cleanly with +# the default -p1 strip level. do_attach_infrabase later copies ${S} into +# ${IB_TARGET} (= ${IB_ATF_PATH}) so the local working tree gets the patch. # To force the task to be re-executed do_build[nostamp] = "1" + +# OP-TEE must be built before ATF — but only in "full" mode, where +# bsp_virt64.inc:__do_platform_boot_chain later bundles OP-TEE into the +# FIP via fiptool. In "atf+uboot" mode the FIP carries BL31+U-Boot +# only (no --tos-fw), and "uboot" mode never reaches this recipe. So +# gating on IB_BOOT_CHAIN=="full" avoids unnecessary OP-TEE builds. + +do_build[depends] = "${@bb.utils.contains('IB_BOOT_CHAIN', 'full', 'optee:do_build', '', d)}" do_configure[noexec] = "1" # Where the working directory will be placed in infrabase root dir @@ -23,12 +42,29 @@ IB_TARGET = "${IB_ATF_PATH}" do_build () { - # Currently, only imx8mp-verdin is supported. - if [ "${IB_PLATFORM}" = "verdin-imx8mp" ]; then - do_build_bl31 + BL31="${IB_ATF_PATH}/build/imx8mp/release/bl31.bin" + HASH_FILE="${BL31}.sha256" + OLD_HASH="$(cat $HASH_FILE 2>/dev/null || true)" + NEW_HASH="$(sha256sum $BL31 2>/dev/null | cut -d' ' -f1 || true)" + if [ -f "$BL31" ] && [ -n "$NEW_HASH" ] && [ "$OLD_HASH" = "$NEW_HASH" ]; then + echo "ATF bl31.bin is up to date, skipping rebuild" + else + do_build_bl31 + sha256sum "$BL31" | cut -d' ' -f1 > "$HASH_FILE" + fi + elif [ "${IB_PLATFORM}" = "virt64" ]; then + do_build_all_fiptool + mkdir -p ${IB_DIR}/filesystem + cp ${IB_ATF_PATH}/build/qemu/release/bl1.bin ${IB_DIR}/filesystem/ + cp ${IB_ATF_PATH}/build/qemu/release/bl31.bin ${IB_DIR}/filesystem/ fi } addtask do_build +do_clean[nostamp] = "1" +do_clean () { + rm -rf ${IB_ATF_PATH}/build/${IB_ATF_PLAT} +} +addtask do_clean \ No newline at end of file diff --git a/build/meta-atf/recipes-atf/atf/files/0001-atf-imx8mp-avz.patch b/build/meta-atf/recipes-atf/atf/files/0001-atf-imx8mp-avz.patch new file mode 100644 index 0000000..3dae636 --- /dev/null +++ b/build/meta-atf/recipes-atf/atf/files/0001-atf-imx8mp-avz.patch @@ -0,0 +1,49 @@ +ATF imx8mp adjustments for AVZ on EDGE-M1 +========================================== + +Two changes needed to run AVZ over OP-TEE on Verdin iMX8MP: + + - plat/imx/imx8m/imx8mp/imx8mp_bl31_setup.c + Configure TZC380 region 0 as SP_S_RW so OP-TEE's + CFG_TZASC_REGION0_SECURE startup check passes. SPL enables TZASC + via GPR10 but leaves region 0 NS-accessible; OP-TEE adds proper + NS DRAM carve-outs after BL31 runs. + + - plat/imx/imx8m/imx8m_psci_common.c + Relax imx_validate_ns_entrypoint to accept any DRAM address. AVZ's + secondary_startup lives below PLAT_NS_IMAGE_OFFSET, so the + stock check rejects it and PSCI_CPU_ON returns INVALID_PARAMS. + +Signed-off-by: EDGEMTech +--- +--- a/plat/imx/imx8m/imx8mp/imx8mp_bl31_setup.c ++++ b/plat/imx/imx8m/imx8mp/imx8mp_bl31_setup.c +@@ -252,6 +252,15 @@ + plat_gic_init(); + + imx_gpc_init(); ++ ++ /* Configure TZASC region 0 as secure-only so OP-TEE passes its startup ++ * security check (CFG_TZASC_REGION0_SECURE). SPL enables TZASC via GPR10 ++ * but leaves region 0 NS-accessible; OP-TEE adds proper NS DRAM regions ++ * after this. */ ++ tzc380_init(IMX_TZASC_BASE); ++ tzc380_configure_region(0, 0x00000000, ++ TZC_ATTR_REGION_SIZE(TZC_REGION_SIZE_4G) | ++ TZC_ATTR_REGION_EN_MASK | TZC_ATTR_SP_S_RW); + } + + entry_point_info_t *bl31_plat_get_next_image_ep_info(unsigned int type) +--- a/plat/imx/imx8m/imx8m_psci_common.c ++++ b/plat/imx/imx8m/imx8m_psci_common.c +@@ -31,8 +31,8 @@ + + int imx_validate_ns_entrypoint(uintptr_t ns_entrypoint) + { +- /* The non-secure entrypoint should be in RAM space */ +- if (ns_entrypoint < PLAT_NS_IMAGE_OFFSET) ++ /* Accept any address in DRAM; AVZ secondary_startup lives below PLAT_NS_IMAGE_OFFSET */ ++ if (ns_entrypoint < IMX_DRAM_BASE) + return PSCI_E_INVALID_PARAMS; + + return PSCI_E_SUCCESS; diff --git a/build/meta-atf/recipes-atf/optee/optee_1.5.bb b/build/meta-atf/recipes-atf/optee/optee_1.5.bb new file mode 100644 index 0000000..6448b0d --- /dev/null +++ b/build/meta-atf/recipes-atf/optee/optee_1.5.bb @@ -0,0 +1,57 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + +SUMMARY = "OPTEE-OS firmware" +DESCRIPTION = "Open Trusted Execution Environment OS" + +LICENSE = "GPLv2" + +inherit atf + +# Version and revision +PR = "r0" +PV = "1.5" + +SRC_URI = "git://github.com/OP-TEE/optee_os.git;nobranch=1;protocol=https" + +SRCREV = "cf2504f5f89ef97c7ed7b04b3c0f639f0b014fbb" + +# Make sure atf is attached before attaching optee, since optee is +# a sub-directory of atf + +do_attach_infrabase[depends] = "atf:do_attach_infrabase" + +# To force the task to be re-executed +do_build[nostamp] = "1" +do_configure[noexec] = "1" + +# Where the working directory will be placed in infrabase root dir +IB_TARGET = "${IB_OPTEE_PATH}" + +do_build () { + + if [ "${IB_PLATFORM}" = "verdin-imx8mp" ]; then + TEE_ELF="${IB_OPTEE_PATH}/out/arm-plat-imx/core/tee.elf" + HASH_FILE="${TEE_ELF}.sha256" + OLD_HASH="$(cat $HASH_FILE 2>/dev/null || true)" + NEW_HASH="$(sha256sum $TEE_ELF 2>/dev/null | cut -d' ' -f1 || true)" + if [ -f "$TEE_ELF" ] && [ -n "$NEW_HASH" ] && [ "$OLD_HASH" = "$NEW_HASH" ]; then + echo "OP-TEE tee.elf is up to date, skipping rebuild" + else + do_build_optee + sha256sum "$TEE_ELF" | cut -d' ' -f1 > "$HASH_FILE" + fi + elif [ "${IB_PLATFORM}" = "virt64" ]; then + do_build_optee + mkdir -p ${IB_DIR}/filesystem + cp ${IB_OPTEE_PATH}/out/arm-plat-vexpress/core/tee-pager_v2.bin ${IB_DIR}/filesystem/ + fi +} + +addtask do_build + +do_clean[nostamp] = "1" +do_clean () { + rm -rf ${IB_OPTEE_PATH}/out +} +addtask do_clean diff --git a/build/meta-bsp/classes/bsp.bbclass b/build/meta-bsp/classes/bsp.bbclass index 54ab3bd..7e5178a 100644 --- a/build/meta-bsp/classes/bsp.bbclass +++ b/build/meta-bsp/classes/bsp.bbclass @@ -1,32 +1,90 @@ -# Copyright (c) 2023-2025 EDGEMTech Ltd +# Copyright (c) 2023-2026 EDGEMTech Ltd +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD # Class for BSP - Main recipe # The link to the firmwares of all boards IB_BSP_PATH = "${IB_DIR}/build/meta-bsp/recipes-bsp/bsp" +# Standard tree locations for the boot-chain components. atf.bbclass sets +# the same values, but BSP recipes that don't `inherit atf` still need +# these to assemble flash0.img / flash.bin in do_deploy_boot_chain. + +IB_ATF_PATH = "${IB_DIR}/atf" +IB_OPTEE_PATH = "${IB_DIR}/atf/optee" + # Path to the ITB files IB_ITB_PATH:so3 = "${IB_DIR}/so3/target" IB_ITB_PATH:linux = "${IB_DIR}/linux/target" - + # This is the uEnv.txt file related to U-boot depending on the BSP IB_UENV = "${FILE_DIRNAME}/files/uEnv_${IB_PLATFORM}.txt" inherit logging inherit filesystem +# Platform boot chain — produces the bootloader-side artefacts (flash0.img +# + FIP for virt64) AND the AVZ ITB. Lives at the BSP class level so it is +# shared across every BSP recipe (bsp-linux, bsp-so3) and stays +# capsule-agnostic. AVZ is part of the boot chain by design — the +# hypervisor runs underneath every capsule, and its ITB is identical +# regardless of which capsule sits on top. +# +# Per-platform bootloader assembly lives in bsp_.inc as +# __do_platform_boot_chain(d). The AVZ ITB build is generic: mkimage on +# ${IB_DIR}/linux/target/${IB_PLATFORM}_avz.its. + +# Boot-chain dependencies gate on IB_BOOT_CHAIN: +# "uboot" → only u-boot (no ATF, OP-TEE, AVZ pulled in) +# "atf+uboot" → ATF + u-boot, no OP-TEE, no AVZ +# "full" → ATF + OP-TEE + u-boot + AVZ (capsule builds) +# +# Deps are wired into BOTH do_build (so `build.sh -a` actually compiles +# every source artefact) AND do_deploy_boot_chain (so a standalone +# `deploy.sh -a` without a prior build still pulls them through sstate). + +do_deploy_boot_chain[nostamp] = "1" +do_deploy_boot_chain[depends] = "uboot:do_build" + +python () { + chain = d.getVar('IB_BOOT_CHAIN') or "" + extra = [] + if chain in ("atf+uboot", "full"): + extra.append("atf:do_build") + if chain == "full": + extra += ["optee:do_build", "avz:do_build"] + if extra: + deps = ' ' + ' '.join(extra) + d.appendVarFlag('do_deploy_boot_chain', 'depends', deps) + d.appendVarFlag('do_build', 'depends', deps) +} + +python do_deploy_boot_chain () { + plat = d.getVar('IB_PLATFORM') or '?' + chain = d.getVar('IB_BOOT_CHAIN') or '?' + bb.plain(f"Deploy boot chain for platform {plat} (chain={chain})") + + try: + __do_platform_boot_chain(d) + except NameError: + bb.note(f"No __do_platform_boot_chain defined for {plat} — skipping") + + # The AVZ ITB is produced by per-platform do_itb + # (bsp_.inc) which is wired `before do_build`, so they + # exist by the time do_deploy_boot_chain runs. +} +addtask do_deploy_boot_chain before do_deploy + def __do_deploy_boot(d): - if d.getVar('IB_STORAGE') != "remote": + if d.getVar('IB_STORAGE_MODE') not in ("remote", "http"): bb.warn("Now mounting") __do_fs_mount(d) __do_platform_deploy(d) - if d.getVar('IB_STORAGE') != "remote": + if d.getVar('IB_STORAGE_MODE') not in ("remote", "http"): __do_fs_umount(d) - - utils_restore_user_ownership(d) diff --git a/build/meta-bsp/conf/layer.conf b/build/meta-bsp/conf/layer.conf index a97103b..b333c69 100644 --- a/build/meta-bsp/conf/layer.conf +++ b/build/meta-bsp/conf/layer.conf @@ -1,3 +1,6 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + BBPATH .= ":${LAYERDIR}" BBFILES += "${LAYERDIR}/recipes-*/*/*.bb ${LAYERDIR}/recipes-*/*/*.bbappend" diff --git a/build/meta-bsp/recipes-bsp/bsp/files/bsp_arm_common.inc b/build/meta-bsp/recipes-bsp/bsp/files/bsp_arm_common.inc index 138ced3..d7c1a48 100644 --- a/build/meta-bsp/recipes-bsp/bsp/files/bsp_arm_common.inc +++ b/build/meta-bsp/recipes-bsp/bsp/files/bsp_arm_common.inc @@ -1,24 +1,54 @@ - -# Deployment of ITB for all ARM platforms +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + +# Deployment of ITB for all ARM platforms (FAT boot partition p1). +# +# Two deployment shapes, selected by the chosen ITS: +# * AVZ two-ITB boot (IB_TARGET_ITS ends in "_avz"): stage the AVZ ITB +# (_avz.itb) AND the SO3 guest ITB (_guest.itb) plus the +# uEnv__avz.txt that loads both and jumps via U-Boot's e1c-boot +# command (AVZ FIT in x0, guest ITB in x1). The guest ITB is derived +# from IB_TARGET_ITS: _so3_guest.itb. +# * Single-ITB bootm (any other ITS): the standalone SO3 / Linux image. def __deploy_arm_common(d): import os import subprocess + p1 = d.getVar('IB_FILESYSTEM_PATH') + "/p1" + itb_dir = d.getVar('IB_ITB_PATH') + plat = d.getVar('IB_PLATFORM') + its = d.getVar('IB_TARGET_ITS') or "" IB_UENV = d.getVar("IB_UENV") - filesys_path = d.getVar('IB_FILESYSTEM_PATH') + "/p1" - itb_path = d.getVar('IB_ITB_PATH') + "/" + d.getVar('IB_TARGET_ITS') + ".itb" + + if its.endswith("_avz"): + # Two-ITB AVZ boot. + avz_itb = f"{itb_dir}/{its}.itb" + guest_itb = f"{itb_dir}/{its[:-len('_avz')]}_so3_guest.itb" + avz_uenv = os.path.join(os.path.dirname(IB_UENV), f"uEnv_{plat}_avz.txt") + + for f in (avz_itb, guest_itb, avz_uenv): + if not os.path.isfile(f): + bb.fatal(f + " is missing ...") + + subprocess.run(['cp', avz_uenv, p1 + "/uEnv.txt"], check=True) + subprocess.run(['cp', avz_itb, f"{p1}/{plat}_avz.itb"], check=True) + subprocess.run(['cp', guest_itb, f"{p1}/{plat}_guest.itb"], check=True) + return + + # Single-ITB bootm. + itb_path = f"{itb_dir}/{its}.itb" if not os.path.isfile(IB_UENV): - bb.fatal(uenv_path + " is missing ...") + bb.fatal(IB_UENV + " is missing ...") - subprocess.run(['cp', IB_UENV, filesys_path + "/uEnv.txt"]) + subprocess.run(['cp', IB_UENV, p1 + "/uEnv.txt"]) if not os.path.isfile(itb_path): bb.fatal(itb_path + " is missing ...") # The target ITB loaded by U-boot has the name of the target platform - subprocess.run(['cp', itb_path, filesys_path + "/" + d.getVar('IB_PLATFORM') + ".itb"]) + subprocess.run(['cp', itb_path, p1 + "/" + plat + ".itb"]) do_build_firmware () { diff --git a/build/meta-bsp/recipes-bsp/bsp/files/bsp_rpi4.inc b/build/meta-bsp/recipes-bsp/bsp/files/bsp_rpi4.inc index 022b298..0ff5221 100644 --- a/build/meta-bsp/recipes-bsp/bsp/files/bsp_rpi4.inc +++ b/build/meta-bsp/recipes-bsp/bsp/files/bsp_rpi4.inc @@ -1,3 +1,5 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD # Deployment on RPi4 (32-bit) platform @@ -19,4 +21,4 @@ def __do_platform_deploy(d): cmd = f"cp -${u_boot_path}/u-boot.bin ${dst_dir}/p1/kernel7.img" result = subprocess.run(cmd, shell=True, check=True) - \ No newline at end of file + diff --git a/build/meta-bsp/recipes-bsp/bsp/files/bsp_rpi4_64.inc b/build/meta-bsp/recipes-bsp/bsp/files/bsp_rpi4_64.inc index 8773116..c01e457 100644 --- a/build/meta-bsp/recipes-bsp/bsp/files/bsp_rpi4_64.inc +++ b/build/meta-bsp/recipes-bsp/bsp/files/bsp_rpi4_64.inc @@ -1,3 +1,5 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD # Deployment on RPi4_64 (64-bit) platform diff --git a/build/meta-bsp/recipes-bsp/bsp/files/bsp_verdin-imx8mp.inc b/build/meta-bsp/recipes-bsp/bsp/files/bsp_verdin-imx8mp.inc index d0554e9..058d381 100644 --- a/build/meta-bsp/recipes-bsp/bsp/files/bsp_verdin-imx8mp.inc +++ b/build/meta-bsp/recipes-bsp/bsp/files/bsp_verdin-imx8mp.inc @@ -1,257 +1,177 @@ - -# Recipe to deploy on the specific Toradex Verdin iMX8 MP board - -def modify_image_json(input_file, output_file, files_to_add=None): +# Copyright (c) 2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD +# +# Toradex Verdin iMX8MP platform glue for SO3-as-an-AVZ-guest, kept independent +# of Torizon and the e1c capsules (edgem1 keeps the verdin BSP in meta-e1c; this +# is the capsule-free equivalent). +# +# Boot image: do_itb (bsp-so3) mkimage's two ITBs — the AVZ ITB +# (verdin_imx8mp_avz.its = AVZ + avz_dt) and the SO3 guest ITB +# (verdin_imx8mp_so3_guest.its = guest + dtb + rootfs.fat). The firmware +# imx-boot (flash.bin = SPL + ATF(BL31) + OP-TEE + U-Boot) is built by the +# uboot recipe. +# +# Deploy: assemble a Toradex TEZI image set (the official base image provides +# image.json + the partition layout; we replace imx-boot with our flash.bin and +# add a boot.scr that loads both ITBs and jumps via the e1c-boot U-Boot command). +# For SO3 standalone (non-AVZ ITS) a single ITB is staged and bootm'd instead. +# No capsule / OSTree rootfs — SO3's rootfs rides inside the guest ITB. + +# Path to the SO3 boot scripts and the U-Boot bootcmd that sources them. +# boot.scr.txt single-ITB bootm (SO3 standalone) +# boot_avz.scr.txt two-ITB AVZ boot (AVZ ITB + SO3 guest ITB via e1c-boot) +IB_VERDIN_BOOTSCR = "${IB_DIR}/build/meta-bsp/recipes-bsp/bsp/verdin-imx8mp/boot.scr.txt" +IB_VERDIN_BOOTSCR_AVZ = "${IB_DIR}/build/meta-bsp/recipes-bsp/bsp/verdin-imx8mp/boot_avz.scr.txt" +IB_VERDIN_BOOTCMD = "mmc dev 2; ext4load mmc 2:1 0x48200000 /boot.scr; source 0x48200000" + +# Official Toradex TEZI image used as the deploy base (provides image.json + +# the eMMC partition layout). scarthgap-7.x.y release 36, verdin-imx8mp. +IB_TORIZON_TEZI_URL = "https://tezi.toradex.com/artifactory/torizoncore-oe-prod-frankfurt/scarthgap-7.x.y/release/36/verdin-imx8mp/torizon/torizon-docker-evaluation/teziimage/TDX1ba81320635b006931a43b5700e5492aTDX" +IB_TORIZON_TEZI_VERSION = "7.6.0+build.36" +IB_TORIZON_TEZI_FILES = "image.json imx-boot u-boot-initial-env-sd" +IB_TORIZON_TEZI_CACHE = "${IB_DIR}/build/tmp/torizon-tezi" + + +def __do_platform_boot_chain(d): + """imx-boot (flash.bin) is built by the uboot recipe and staged by the + deploy step below — nothing to assemble here (unlike the QEMU flash0.img).""" + bb.note("verdin: boot chain (imx-boot) is built by the uboot recipe") + + +# Trim the Toradex image.json to auto-install our files onto the boot/rootfs +# partition (no capsule, no OSTree rootfs tarball). +def modify_image_json(input_file, output_file, files_to_add): import json - import sys - """ - Modify image.json to add filelist and set autoinstall to true - - Args: - input_file: Path to input image.json - output_file: Path to output image.json - files_to_add: List of files to add to filelist (default: verdin-imx8mp.itb, boot.scr) - """ - if files_to_add is None: - files_to_add = ["verdin-imx8mp.itb", "boot.scr"] - - # Read the original JSON + with open(input_file, 'r') as f: data = json.load(f) - # Set autoinstall to true data['autoinstall'] = True - # Navigate to the partition content and add filelist + # Drop Torizon-only metadata that references files we don't ship. + for field in ('prepare_script', 'wrapup_script', 'marketing', 'icon'): + data.pop(field, None) + for blockdev in data.get('blockdevs', []): - if blockdev.get('name') == 'emmc': - for partition in blockdev.get('partitions', []): - content = partition.get('content', {}) - if content.get('label') == 'otaroot': - # Add filelist to content - content['filelist'] = files_to_add - print(f"Added filelist: {files_to_add}") - - # Write the modified JSON + if blockdev.get('name') != 'emmc': + continue + for partition in blockdev.get('partitions', []): + content = partition.get('content', {}) + if content.get('label') == 'otaroot': + # rootfs is embedded in the ITB initramfs — no tarball. + content.pop('filename', None) + content.pop('uncompressed_size', None) + content['filelist'] = files_to_add + break + with open(output_file, 'w') as f: json.dump(data, f, indent=4) - print(f"Modified JSON written to: {output_file}") - -def parse_overlays_file(overlays_file): - import re - """Parse overlays.txt and extract overlay file names""" - with open(overlays_file, 'r') as f: - content = f.read().strip() - - # Extract the overlay names from fdt_overlays=overlay1.dtbo overlay2.dtbo - match = re.search(r'fdt_overlays\s*=\s*(.+)', content) - if not match: - print("Error: No fdt_overlays line found in overlays.txt") - return [] - overlays = match.group(1).strip().split() - return overlays - - -def generate_overlay_entries(overlays, overlays_path, base_load_addr=0x52200000): - """Generate ITS entries for each overlay""" - entries = [] - - for idx, overlay in enumerate(overlays): - overlay_name = overlay.replace('.dtbo', '').replace('_overlay', '') - entry = f''' - fdt-{idx} {{ - description = "{overlay_name} overlay"; - data = /incbin/("{overlays_path}/{overlay}"); - type = "flat_dt"; - arch = "arm64"; - compression = "none"; - load = <{hex(base_load_addr)}>; - }};''' - entries.append(entry) +def __fetch_torizon_tezi_image(d, dest_dir): + """Download the Toradex TEZI base files for this platform into dest_dir, + caching under IB_TORIZON_TEZI_CACHE// (re-fetch only if missing or + size-mismatched).""" + import os + import subprocess + import urllib.request - return '\n'.join(entries) + base_url = d.getVar("IB_TORIZON_TEZI_URL") + version = d.getVar("IB_TORIZON_TEZI_VERSION") or "unversioned" + files = (d.getVar("IB_TORIZON_TEZI_FILES") or "").split() + cache_root = d.getVar("IB_TORIZON_TEZI_CACHE") + if not base_url or not files or not cache_root: + bb.fatal("verdin: IB_TORIZON_TEZI_URL/FILES/CACHE must be set to fetch the TEZI base image") -def generate_fdt_list(overlays): - """Generate the FDT list for configuration section""" - fdt_refs = ['fdt_linux'] + [f'fdt-{idx}' for idx in range(len(overlays))] - return ', '.join(f'"{ref}"' for ref in fdt_refs) + cache_dir = os.path.join(cache_root, version) + os.makedirs(cache_dir, exist_ok=True) + os.makedirs(dest_dir, exist_ok=True) + for fname in files: + url = f"{base_url}/{fname}" + cached = os.path.join(cache_dir, fname) -def process_its_template(template_file, output_file, overlays_file, overlays_path): - import sys - import re - from pathlib import Path + remote_size = None + try: + req = urllib.request.Request(url, method="HEAD") + with urllib.request.urlopen(req, timeout=30) as resp: + cl = resp.headers.get("Content-Length") + remote_size = int(cl) if cl else None + except Exception as e: + bb.warn(f"HEAD {url} failed: {e} (will attempt download anyway)") - # Parse overlays - overlays = parse_overlays_file(overlays_file) + if not (os.path.isfile(cached) and (remote_size is None or os.path.getsize(cached) == remote_size)): + bb.note(f"Fetching {url} -> {cached}") + subprocess.run(["curl", "-fSL", "--retry", "3", "-o", cached, url], check=True) - if not overlays: - print("Warning: No overlays found, generating ITS without overlays") - else: - print(f"Found {len(overlays)} overlays: {', '.join(overlays)}") - - # Read template - with open(template_file, 'r') as f: - template_content = f.read() - - # Generate overlay entries - overlay_entries = generate_overlay_entries(overlays, overlays_path) - - # Replace placeholder with overlay entries - modified_content = re.sub( - r'/\* FDT_OVERLAYS_PLACEHOLDER_START \*/.*?/\* FDT_OVERLAYS_PLACEHOLDER_END \*/', - f'/* FDT_OVERLAYS_PLACEHOLDER_START */{overlay_entries}\n\t\t/* FDT_OVERLAYS_PLACEHOLDER_END */', - template_content, - flags=re.DOTALL - ) - - # Update FDT configuration - if overlays: - fdt_list = generate_fdt_list(overlays) - # Replace the simple fdt line with the expanded list - modified_content = re.sub( - r'(\s+)fdt = "fdt_linux";', - f'\\1fdt = {fdt_list};', - modified_content - ) - - # Write output - with open(output_file, 'w') as f: - f.write(modified_content) + subprocess.run(["cp", cached, os.path.join(dest_dir, fname)], check=True) - print(f"Generated ITS file: {output_file}") - print(f"Overlays included: {len(overlays)}") - -def do_itb_verdin_imx8mp(d): - """Generate ITB with overlays""" - import subprocess +def __do_platform_deploy(d): + """Stage a flashable TEZI image: our imx-boot (flash.bin) + boot.scr + the + AVZ+SO3 ITB, with image.json patched to auto-install them.""" import os + import subprocess - IB_PLATFORM = d.getVar("IB_PLATFORM") - IB_ITB_PATH = d.getVar("IB_ITB_PATH") - IB_TARGET_ITS = d.getVar("IB_TARGET_ITS") or f"{IB_PLATFORM}_torizon" - IB_TORIZON_DIR_PATH = d.getVar("IB_TORIZON_DIR_PATH") - - # Get the base directory for deploy images - DEPLOY_DIR_IMAGE = f"{IB_TORIZON_DIR_PATH}/build/deploy/images/{IB_PLATFORM}" - - # Paths for overlays - overlays_path = f"{DEPLOY_DIR_IMAGE}/overlays" - overlays_txt_path = f"{DEPLOY_DIR_IMAGE}/overlays.txt" - - its_template = f"{IB_ITB_PATH}/{IB_TARGET_ITS}.its" - its_output = f"{IB_ITB_PATH}/{IB_TARGET_ITS}_generated.its" - itb_output = f"{IB_ITB_PATH}/{IB_TARGET_ITS}.itb" - - # Check if template exists - if not os.path.isfile(its_template): - bb.fatal(f"No corresponding ITS found for platform {IB_PLATFORM}_torizon at {its_template}") - - # Check if overlays.txt exists - if os.path.isfile(overlays_txt_path): - # Process the template with overlays - process_its_template(its_template, its_output, overlays_txt_path, overlays_path) - its_to_use = its_output + IB_ITB_PATH = d.getVar('IB_ITB_PATH') + IB_UBOOT_PATH = d.getVar('IB_UBOOT_PATH') + IB_TARGET_ITS = d.getVar('IB_TARGET_ITS') + IB_STORAGE_MODE = d.getVar('IB_STORAGE_MODE') or "" + WORKDIR = d.getVar('WORKDIR') + + itb = f"{IB_ITB_PATH}/{IB_TARGET_ITS}.itb" + flashbin = f"{IB_UBOOT_PATH}/flash.bin" + if not os.path.isfile(itb): + bb.fatal(f"verdin: ITB not found at {itb} (run do_itb first)") + if not os.path.isfile(flashbin): + bb.fatal(f"verdin: imx-boot (flash.bin) not found at {flashbin} (build uboot first)") + + staging = os.path.join(WORKDIR, "tezi-staging") + os.makedirs(staging, exist_ok=True) + + # Base TEZI image (image.json + the stock imx-boot/env we overwrite). + __fetch_torizon_tezi_image(d, staging) + + # Our firmware, boot script and ITB(s). + # * AVZ two-ITB boot (ITS ends in "_avz"): stage the AVZ ITB as + # boot_avz.itb and the SO3 guest ITB (derived _so3_guest) + # as boot_guest.itb; boot_avz.scr.txt loads both and jumps via e1c-boot. + # * Single-ITB bootm (any other ITS): stage it as boot.itb. + subprocess.run(['cp', flashbin, f"{staging}/imx-boot"], check=True) + + if IB_TARGET_ITS.endswith("_avz"): + guest_itb = f"{IB_ITB_PATH}/{IB_TARGET_ITS[:-len('_avz')]}_so3_guest.itb" + if not os.path.isfile(guest_itb): + bb.fatal(f"verdin: guest ITB not found at {guest_itb} (run do_itb first)") + subprocess.run(['cp', itb, f"{staging}/boot_avz.itb"], check=True) + subprocess.run(['cp', guest_itb, f"{staging}/boot_guest.itb"], check=True) + bootscr_src = d.getVar('IB_VERDIN_BOOTSCR_AVZ') + files_to_add = ["boot.scr", "boot_avz.itb", "boot_guest.itb"] else: - bb.warn(f"No overlays.txt found at {overlays_txt_path}, building ITB without overlays") - its_to_use = its_template + subprocess.run(['cp', itb, f"{staging}/boot.itb"], check=True) + bootscr_src = d.getVar('IB_VERDIN_BOOTSCR') + files_to_add = ["boot.scr", "boot.itb"] - # Build the ITB - try: - subprocess.run( - ["mkimage", "-f", its_to_use, itb_output], - check=True, - capture_output=True, - text=True - ) - except subprocess.CalledProcessError as e: - bb.fatal(f"Failed to create ITB: {e.stderr}") + subprocess.run(['mkimage', '-A', 'arm64', '-T', 'script', '-C', 'none', + '-d', bootscr_src, f"{staging}/boot.scr"], check=True) + # U-Boot env: bootcmd sources boot.scr (text format, as TEZI imports it). + with open(f"{staging}/u-boot-initial-env-sd", "w") as f: + f.write(f"bootcmd={d.getVar('IB_VERDIN_BOOTCMD')}\nbootdelay=1\n") + modify_image_json(f"{staging}/image.json", f"{staging}/image.json", + files_to_add=files_to_add) -def __do_platform_deploy(d): + if IB_STORAGE_MODE == "http": + final_dest = d.getVar('IB_HTTP_DEPLOY_PATH') + else: + final_dest = os.path.join(d.getVar('IB_FILESYSTEM_PATH'), "work", "verdin-tezi") + if not final_dest: + bb.fatal("verdin: no deploy destination (set IB_HTTP_DEPLOY_PATH or use the default)") - import os - import subprocess + utils_sudo(["mkdir", "-p", final_dest], check=True) + utils_sudo(["rsync", "-a", "--delete", f"{staging}/", f"{final_dest}/"], check=True) - IB_UBOOT_PATH = d.getVar("IB_UBOOT_PATH") - IB_DIR = d.getVar("IB_DIR") - IB_PLATFORM = d.getVar("IB_PLATFORM") - IB_ITB_PATH = d.getVar("IB_ITB_PATH") - IB_BSP_PATH = d.getVar("IB_BSP_PATH") - IB_FILESYSTEM_PATH = d.getVar("IB_FILESYSTEM_PATH") - IB_TORIZON_DIR_PATH = d.getVar("IB_TORIZON_DIR_PATH") - DEPLOY_DIR_IMAGE = f"{IB_TORIZON_DIR_PATH}/build/deploy/images/{IB_PLATFORM}" - - torizon_rootfs_ar_path = __torizon_rootfs_archive_path(d) - tezi_img_name = f"torizon-docker-{IB_PLATFORM}-Tezi" - tezi_ar_name = f"torizon-docker-{IB_PLATFORM}-Tezi.tar" - tezi_ar_path = f"{DEPLOY_DIR_IMAGE}/{tezi_ar_name}" - itb_path = f"{IB_ITB_PATH}/{IB_PLATFORM}.itb" - boot_edgem_scr_txt_path = f"{IB_BSP_PATH}/{IB_PLATFORM}/boot.edgem.scr.txt" - bootcmd_txt_path = f"{IB_BSP_PATH}/{IB_PLATFORM}/bootcmd.txt" - deploy_path = f"{IB_FILESYSTEM_PATH}/work/usb" - - #if not os.path.exists(deploy_path): - # subprocess.run(["mkdir", "-p", deploy_path]) - - cmd = (f"tar -tf {torizon_rootfs_ar_path} | grep ^\./ostree/boot.1.1 | " - f"grep -o /[a-f0-9]*/$ | sed 's/\///g\'") - - res = subprocess.run(cmd, shell=True, capture_output=True, text=True) - deployment_id = res.stdout.strip() - - if not os.path.isfile(itb_path): - bb.fatal(itb_path + " is missing ...") - - # Read our custom bootcmd line to be appended to the initial env later - with open(bootcmd_txt_path) as bootcmd_txt_file: - bootcmd_txt_content = bootcmd_txt_file.read() - bootcmd_txt_file.close() - - # Copy the TEZI ready image tar to the deploy folder - tezi_ar_deployed_path = f"{deploy_path}/{tezi_ar_name}" - tezi_deployed_path = f"{deploy_path}/{tezi_img_name}" - subprocess.run(["cp", tezi_ar_path, deploy_path]) - - # Extract the tar into a known folder - if not os.path.exists(tezi_deployed_path): - subprocess.run(["mkdir", "-p", tezi_deployed_path]) - subprocess.run(["tar", "-p", "-xf", tezi_ar_deployed_path, "-C", tezi_deployed_path, "--strip-components=1"]) - - # Copy the custom ITB - subprocess.run(["cp", itb_path, tezi_deployed_path]) - - # Copy u-boot's flash.bin to the deploy path as imx-boot - flash_bin_path = f"{IB_UBOOT_PATH}/flash.bin" - imx_boot_path = f"{tezi_deployed_path}/imx-boot" - subprocess.run(["cp", flash_bin_path, imx_boot_path]) - - # Directly convert the text based boot.scr into the deploy partition - subprocess.run(["mkimage", "-A", "arm64", "-T", "script", "-C", "none", "-d", boot_edgem_scr_txt_path, f"{tezi_deployed_path}/boot.edgem.scr"]) - - # Add our custom bootcmd at the end of the initial env to be imported by TEZI - try: - with open(f"{tezi_deployed_path}/u-boot-initial-env-sd", "a+") as dest_init_env_file: - dest_init_env_file.write(bootcmd_txt_content) - except Exception as e: - __do_fs_umount(d) - bb.fatal(f"An error has occurred: {e}") - - # Modify the image.json to enable autoinstall and add our custom files - image_json_path = f"{tezi_deployed_path}/image.json" - itb_file = f"{IB_PLATFORM}.itb" - files_to_add = [itb_file, "boot.edgem.scr"] - modify_image_json(image_json_path, image_json_path, files_to_add) - - # Finally, remove the base archive - subprocess.run(["rm", tezi_ar_deployed_path]) - - -python do_itb() { - do_itb_verdin_imx8mp(d) -} \ No newline at end of file + bb.plain("verdin: TEZI image staged at %s (imx-boot + boot.scr + ITB(s) for %s)" + % (final_dest, IB_TARGET_ITS)) diff --git a/build/meta-bsp/recipes-bsp/bsp/files/bsp_virt32.inc b/build/meta-bsp/recipes-bsp/bsp/files/bsp_virt32.inc index 744b537..0dbc161 100644 --- a/build/meta-bsp/recipes-bsp/bsp/files/bsp_virt32.inc +++ b/build/meta-bsp/recipes-bsp/bsp/files/bsp_virt32.inc @@ -1,3 +1,5 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD require bsp_arm_common.inc diff --git a/build/meta-bsp/recipes-bsp/bsp/files/bsp_virt64.inc b/build/meta-bsp/recipes-bsp/bsp/files/bsp_virt64.inc index 3a750ce..76a2ecd 100644 --- a/build/meta-bsp/recipes-bsp/bsp/files/bsp_virt64.inc +++ b/build/meta-bsp/recipes-bsp/bsp/files/bsp_virt64.inc @@ -1,63 +1,87 @@ -require bsp_arm_common.inc - -do_itb () { - if [ ! -f ${IB_ITB_PATH}/${IB_TARGET_ITS}.its ]; then - bbfatal "${IB_DIR} No corresponding ITS found for platform ${IB_PLATFORM} ${IB_ITB_PATH}/${IB_TARGET_ITS}.its" - else - mkimage -f ${IB_ITB_PATH}/${IB_TARGET_ITS}.its ${IB_ITB_PATH}/${IB_TARGET_ITS}.itb - fi -} +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD +# +# virt64 (QEMU armv8) platform glue. The ITB and uEnv.txt are copied onto +# the boot partition (p1) by __deploy_arm_common (bsp_arm_common.inc). +# __do_platform_boot_chain assembles the optional ATF/OP-TEE firmware +# (flash0.img) — generic, shared across products (so3 + edgem1); the +# capsule/OSTree specifics stay in the e1c layer. +require bsp_arm_common.inc def __do_platform_deploy(d): + # Both shapes (two-ITB AVZ boot when the ITS ends in "_avz", single-ITB + # bootm otherwise) are handled generically by __deploy_arm_common. + __deploy_arm_common(d) + + +def __do_platform_boot_chain(d): + """Assemble the virt64 QEMU boot firmware in ${IB_DIR}/filesystem/. + + Selected by IB_BOOT_CHAIN (see local.conf): + "" / "uboot" bare U-Boot — no flash0.img. The QEMU launcher boots + U-Boot directly (st.sh: -kernel u-boot, EL1 standalone + or EL2/virtualization=on for the avz ITS). Any stale + flash0.img is removed so the launcher picks the bare + path. + "atf+uboot" flash0.img = BL1 @ 0 + FIP @ 256K, FIP = BL2 + BL31 + + U-Boot (no OP-TEE). ATF gives EL3 -> EL2. + "full" flash0.img = BL1 + FIP[BL2 + BL31 + OP-TEE(3-part) + + U-Boot] — secure world (S-EL1 OP-TEE). + Invoked from bsp.bbclass:do_deploy_boot_chain (which has already pulled + in atf/optee builds when the chain requires them).""" + import os import subprocess - - print("Platorm " + d.getVar('IB_PLATFORM')) - - ovrs = (d.getVar('OVERRIDES') or '').replace(' ', '').split(':') - - # Are we in Torizon recipes? - if 'torizon' not in ovrs: - - __deploy_arm_common(d) - - else: - - IB_UBOOT_PATH = d.getVar("IB_UBOOT_PATH") - IB_PLATFORM = d.getVar("IB_PLATFORM") - IB_ITB_PATH = d.getVar("IB_ITB_PATH") - IB_FILESYSTEM_PATH = d.getVar("IB_FILESYSTEM_PATH") - IB_UENV = d.getVar("IB_UENV") - - torizon_rootfs_ar_path = __torizon_rootfs_archive_path(d) - filesys_path = f"{IB_FILESYSTEM_PATH}/p1" - itb_path = f"{IB_ITB_PATH}/{IB_PLATFORM}.itb" - - cmd = (f"tar -tf {torizon_rootfs_ar_path} | grep ^\./ostree/boot.1.1 | " - f"grep -o /[a-f0-9]*/$ | sed 's/\///g\'") - - res = subprocess.run(cmd, shell=True, capture_output=True, text=True) - deployment_id = res.stdout.strip() - - if not os.path.isfile(IB_UENV): - bb.fatal(IB_UENV + " is missing ...") - - # Read the uEnv file perform the substitution - with open(IB_UENV) as uenv_file: - uenv_content = uenv_file.read() - uenv_file.close() - - uenv_content = uenv_content.replace("${OSTREE_DEPLOYMENT_ID}", deployment_id) - - if not os.path.isfile(itb_path): - bb.fatal(itb_path + " is missing ...") - - try: - with open(f"{filesys_path}/uEnv.txt", "w") as dest_uenv_file: - dest_uenv_file.write(uenv_content) - - except Exception as e: - __do_fs_umount(d) - bb.fatal(f"An error has occurred: {e}") - subprocess.run(["cp", itb_path, filesys_path]) + chain = d.getVar('IB_BOOT_CHAIN') or "" + uboot_path = d.getVar('IB_UBOOT_PATH') + fs_dir = os.path.join(d.getVar('IB_DIR'), "filesystem") + os.makedirs(fs_dir, exist_ok=True) + + flash_path = os.path.join(fs_dir, "flash0.img") + + # U-Boot is needed in every mode (as -kernel/-bios payload, and as the + # FIP's BL33 in the ATF chains). + subprocess.run(['cp', f"{uboot_path}/u-boot.bin", + os.path.join(fs_dir, "u-boot.bin")], check=True) + + if chain in ("", "uboot"): + # Bare U-Boot: drop any stale flash0.img from a prior ATF deploy. + if os.path.exists(flash_path): + os.remove(flash_path) + return + + # ATF chains: build flash0.img. "atf+uboot" and "full" differ only by + # whether the FIP carries the OP-TEE (BL32) entries. + atf_path = d.getVar('IB_ATF_PATH') + atf_release = f"{atf_path}/build/qemu/release" + subprocess.run(['cp', f"{atf_release}/bl31.bin", + os.path.join(fs_dir, "bl31.bin")], check=True) + + fip_args = [ + '--tb-fw', f'{atf_release}/bl2.bin', + '--soc-fw', f'{atf_release}/bl31.bin', + '--nt-fw', f'{uboot_path}/u-boot.bin', + ] + + if chain == "full": + optee_core = f"{d.getVar('IB_OPTEE_PATH')}/out/arm-plat-vexpress/core" + for src, name in [ + (f"{optee_core}/tee-header_v2.bin", "tee-header_v2.bin"), + (f"{optee_core}/tee-pager_v2.bin", "tee-pager_v2.bin"), + (f"{optee_core}/tee-pageable_v2.bin", "tee-pageable_v2.bin"), + ]: + subprocess.run(['cp', src, os.path.join(fs_dir, name)], check=True) + fip_args += [ + '--tos-fw', f'{optee_core}/tee-header_v2.bin', + '--tos-fw-extra1', f'{optee_core}/tee-pager_v2.bin', + '--tos-fw-extra2', f'{optee_core}/tee-pageable_v2.bin', + ] + + fiptool = f"{atf_path}/tools/fiptool/fiptool" + fip_path = os.path.join(fs_dir, "fip.bin") + subprocess.run([fiptool, 'create'] + fip_args + [fip_path], check=True) + + subprocess.run(['dd', 'if=/dev/zero', f'of={flash_path}', 'bs=1M', 'count=64'], check=True) + subprocess.run(['dd', f'if={atf_release}/bl1.bin', f'of={flash_path}', 'conv=notrunc'], check=True) + subprocess.run(['dd', f'if={fip_path}', f'of={flash_path}', 'bs=1k', 'seek=256', 'conv=notrunc'], check=True) diff --git a/build/meta-bsp/recipes-bsp/bsp/files/bsp_x86-qemu.inc b/build/meta-bsp/recipes-bsp/bsp/files/bsp_x86-qemu.inc index 70db929..0bd6d48 100644 --- a/build/meta-bsp/recipes-bsp/bsp/files/bsp_x86-qemu.inc +++ b/build/meta-bsp/recipes-bsp/bsp/files/bsp_x86-qemu.inc @@ -1,3 +1,5 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD # Deployment on a QEMU/x86 PC compatible platform diff --git a/build/meta-bsp/recipes-bsp/bsp/imx8_colibri/mx8qxc0-ahab-container.img b/build/meta-bsp/recipes-bsp/bsp/imx8_colibri/mx8qxc0-ahab-container.img new file mode 100644 index 0000000000000000000000000000000000000000..73d28d4df499e53ceb7aece9138375f17c4c7454 GIT binary patch literal 72712 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 z�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 literal 0 HcmV?d00001 diff --git a/build/meta-bsp/recipes-bsp/bsp/rpi4/config.txt b/build/meta-bsp/recipes-bsp/bsp/rpi4/config.txt index 4161991..c69ea6e 100644 --- a/build/meta-bsp/recipes-bsp/bsp/rpi4/config.txt +++ b/build/meta-bsp/recipes-bsp/bsp/rpi4/config.txt @@ -58,7 +58,7 @@ dtparam=audio=on [pi4] # Enable DRM VC4 V3D driver on top of the dispmanx display stack -dtoverlay=vc4-kms-v3d +dtoverlay=vc4-fkms-v3d max_framebuffers=2 [all] diff --git a/build/meta-bsp/recipes-bsp/bsp/verdin-imx8mp/boot.scr.txt b/build/meta-bsp/recipes-bsp/bsp/verdin-imx8mp/boot.scr.txt new file mode 100644 index 0000000..02dedef --- /dev/null +++ b/build/meta-bsp/recipes-bsp/bsp/verdin-imx8mp/boot.scr.txt @@ -0,0 +1,16 @@ +# U-Boot boot script for SO3-on-AVZ on the Toradex Verdin iMX8MP. +# +# Loads the single AVZ+SO3 FIT image and boots it. bootm parses the FIT and +# copies each sub-image to its load address (AVZ -> 0x40080000, SO3 guest -> +# 0x48000000, dtbs, rootfs.fat), then enters AVZ which in turn starts the SO3 +# guest. The ITB is loaded high (0x90000000) so it never overlaps the +# 0x40080000-0x50c00000 sub-image range during extraction. + +echo "=== SO3 on AVZ (Verdin iMX8MP) ===" + +env set itb_addr 0x90000000 + +# The deploy stages the selected ITB (AVZ+SO3 guest *or* SO3 standalone) under +# the fixed name boot.itb, so this script is the same for both variants. +ext4load mmc 2:1 ${itb_addr} /boot.itb +bootm ${itb_addr} diff --git a/build/meta-bsp/recipes-bsp/bsp/verdin-imx8mp/boot_avz.scr.txt b/build/meta-bsp/recipes-bsp/bsp/verdin-imx8mp/boot_avz.scr.txt new file mode 100644 index 0000000..1538616 --- /dev/null +++ b/build/meta-bsp/recipes-bsp/bsp/verdin-imx8mp/boot_avz.scr.txt @@ -0,0 +1,16 @@ +# U-Boot boot script for SO3-on-AVZ on the Toradex Verdin iMX8MP (two-ITB). +# +# Loads the AVZ ITB and the SO3 guest ITB to staging addresses (above the +# 0x40080000-0x50c00000 sub-image extraction range), then jumps via the +# e1c-boot U-Boot command which passes the AVZ FIT in x0 and the guest ITB +# in x1. AVZ extracts its sub-images (AVZ -> 0x40080000, avz_dt) and its +# loadAgency() loads the SO3 guest (-> 0x48000000, dtb, rootfs.fat) from x1. + +echo "=== SO3 on AVZ (Verdin iMX8MP, two-ITB) ===" + +env set avz_addr 0x60000000 +env set guest_addr 0x90000000 + +ext4load mmc 2:1 ${avz_addr} /boot_avz.itb +ext4load mmc 2:1 ${guest_addr} /boot_guest.itb +e1c-boot ${avz_addr} ${guest_addr} diff --git a/build/meta-bsp/recipes-bsp/bsp/verdin-imx8mp/lpddr4_pmu_train_1d_dmem_202006.bin b/build/meta-bsp/recipes-bsp/bsp/verdin-imx8mp/lpddr4_pmu_train_1d_dmem_202006.bin new file mode 100644 index 0000000000000000000000000000000000000000..72be947b85a68e4179e16296645c27d7ca1975cb GIT binary patch literal 1660 zcmeHDy-EW?5T03=^N2CIJ3}}m=oLXzSP6lkZ{QOsq=*OCs;}T1T#1halz`s z^N|-X$BLrC(5Y+-e|cGXF~Kxk@~$#Yp$e(~AzO9L;+m=CD!s4k@m}-K_rk{)z>Cqb>zO3?^vQF|Z#8(3rdCW|0PB&Od{d-?)e Ldxoi@So=gjG?R?K literal 0 HcmV?d00001 diff --git a/build/meta-bsp/recipes-bsp/bsp/verdin-imx8mp/lpddr4_pmu_train_1d_imem_202006.bin b/build/meta-bsp/recipes-bsp/bsp/verdin-imx8mp/lpddr4_pmu_train_1d_imem_202006.bin new file mode 100644 index 0000000000000000000000000000000000000000..9ebb7a00f236e3876949a0c761c806f020b020dc GIT binary patch literal 32364 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

lLyk|A?r)dofA+WD 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

_j77kd|c_6t@ zDJ6}Et%1p2pY`kP`UsP~B}#RijW+gpMtBHQr<8cgv9vOpoDrna;U}7$2dN7`b-Ni>aT{PSX>>Gb9Qga5#@W%xf1sr&oG}s} zoCqC)F7hShuzSHdeVe0O_o~#3y|(jRW+d7-679pRFeBCWCDzhVM+@7cw5KJpHg^FF zeb)Wt8n+>QL%#U;s9|8sanLt1dFRRU%*a^Ow*e~$N9B>Zapp+O(}~4JceyFff55-s zhWwzv;`qSv!esC@G0!o~uQS6obVCEAN~|PTJC5Gh^eXs%9;r&6^GH-WVI$*lUxh?` z5~KL(EfEr#fpc$$M5ILLA`L?rNgJhUb&>Ij@G-taO{tAU61y!Z3vy_6aV(!SZG^>O zBhG(`oUxovZnfExq$x{$>k7#R+9J&2w0{;Z(9)^fosjPo33L-`^edVcx}&-}iy>4` z;JzZyx~4_A52=nPpUq#c&HecV>xUH2J(10kX=n~h!)S<`waGNKPDyP?YO|7Ztdb&s zg)uiiLEV!UrPN&KOOOOwH<>R_b%m$DMhF}8co>G9GuwvBoL%}y6b@hg`@%(5@E9b`)tY$>&DWt)<(kMR5tTb8#$N&-jm*)Q0=0+Tj;Gs@^?1q;D(s0Wd!%plF6yH zTlkqxRpQ34H;y%AXmAfr%{`9?Rw$}-)MI=X4eIzP#);Zt7ctRJ*wPQB=VcSQAILE& zas~*mU4qIvjV2mtn1h5F>2!(1PDhhUKvKueW?-_+Ey*FSW$1p(oFqj=H{p)nyrNgK zNXh!?l%jgx7%S%%t)p_PeGfQxoq~!M82-7kwZk)Z4ex#jMn{K7>wJB&L|oLmDH|3C%fHjQ z@N?mP!a;xVV^dcBqTqj;i^AC@C*7Z7Pg{aS8qU3g^7fhuGn`L#4|X)fYSahg7(-f;N|8uqjvVb|i^m-DEv1}H@`gcQTMX}H@o z19hB3h-Dd(MsPpEoT(h|hV!=}bw=E9v4rMY)Q)1)~ZmRv`#Ky#pt2noGJ z4hku0jUjYxzi&9x*;hP>6PoO|h2}uJSCEqI<|@|W;g^@wacpLTUxOOhLX8=7hPpDU zhnPaGop`>^P}T@y2ftEVR!nn=fB5S+U-crrWvQ`mU1Xz zYaypZU7b^=R)h4tlDyELLL)Cng#pw7v>|89}UZCrpc#9w!HyD3Ir#T0_> zys)d29GPZ203H75_$0Vr7d(P{XlJ@^#`oyBYOAp<%Y~2HYD^=@i|aZ~1^JP#Uf?qn zsU?$aacJv5uvr-^N2u%ze&q}>M|9R1l83X*gmQF|Nr~T5EM)3FTvso}d*gmwPB~;} zN-5K_pT^D200!ds*Y7Oz_uwvg$aino8DM6{&V0Znxno|~L2(n}h$#0{%P74^!b02k z>~a3kcBxbxJMfP2QgVBY>Sa3lnC(f4o*cw>H*~eLrPeIst_aSE&4IP_WqkWfVk6!8 z(xm%vOU^1y_F1FF(Ao=v9u_>tJPta#qI|6z)QFjNB0pa{&ev<>!&+Nt0PEvHDj@OgndBeu$nAckxlf2c1CxGtb+lg}!uJN$ZUY zT^@*ap*QRvZQ$5n{7I`t+mwE)2?h;YRUv|PoD`IPj|?}b~Q zrWT2@kkCv@`2Dsr*abMHy<}XLcr!E~$@pJ1I4ANw6D!zT$%>RDJRCIpzjO|=VktLc zM+s}!tyTLL^(`@@cfGXT7V%Sa+0bO4(z>O#I%@wojn$KkJ7L%HMQOjhC#W5SOX0CU zS*u8rs+Hr!a>NV0X{|S;NZf&rPFO%g)mzG`bhtNi`)noDB5L54rrOBfvYw`39A)M9$sf!RkWd}jH&~rxV(W9w!zg5!xOUl>#J>PM~cV8-Q z@ArJKD89Q=an0ZJ)hj-4Dz4^xz9ow9j#S*k-}B8@d=pb~Q@-cBP4V5DiYrun)FM;y zG(~No&#>f}l+aI9yv8yMEKD@?vWbpFKFtZ=ImKtiT1n@6Tg&5qc+^u-qpV4cQJ0d& zqSQrK=pn_g`;@q*QDZo(qE~Sv1ftezm&@T zu;Tllt9+Uge*StXw<-R?RIbABT(74X4F%)Y_3o3*>NRBpHe3shrNpb?dxsYq4-ax+SI7{Xj|S&A0*AJovebj%RSrMsVo zt6{W97Z6I*nH1@;=+ zq-#R&rJ@fE5G6O43W*$DUr*Li>agqwd-VQ+O*i&%H`aA!Y)57UfP; z{Ax}2QA{<$ZdSq`R_aniC}pKR$wW-mvVAEVBR#41?#;S9(i|C=XTEP7UV9pM3hz7+ z^1%ljm263UJ*&8f4%sxPfpAU6Ta*(iu~w~7wMnKmf|M7f`+{P~u7878-1tt1qsL-8 z9N$m7Q|WOrh#oi)vqK5 zscv*p!ppZ9TipMoPqN|du8RnBWlIV^ZSt#ll-7Xn{A zOxA)!qxJLNtYx%^L&-iTLzMg7=p~PP1L;w@F&dD46rE9GP%GWEiI$^S!=LUow!$vV zZL0pxc>LB3*&(MJvNajqo&ECY-)Fys-+%74b$h+#(ly+}MSBmSIDLYNir{ zwz#s3kpHGl3s8qf`cA*MVbr$iHenA1r=bixUIt^jo>IzSB|ZB3A$Acg_RQR7?WSH6 z9hLO!4e9mJ_D}0!Ce}mw_tt|C>j65%>+3=Lz4h=VM`$l$>QL-anbCjZ90lzDehwu7ew+QI0iG9V_ z68@c07yf=b3FZ>iWGD+3F}QMm@F|L5!0rDfKr`6l$1yIpe#_GF)&R7>Cv0`VuWBPj z2}>|>)Gz6eHuBxtA>6RciJOdcWEy$s6jEbgi?3C38$fwz9L=LYYKz2H)6Tl{{t9=Zk!dq!LEdmJ%Cg}R8^Q&rP&%D^<>Wt{2sj>2T$Oldx}BRg#v9lNHN zbUz@^cZS*jUM3Y)+WTCUc3?_k4N~61|5`=1Nr?thj5R~=;=q<}$g9(hX&Fgg%n~7o zxg7RB-a#I~n*n}E2pQZ*w zgtOM-NW+O@>#v8Y?R_wGpv@#dDRMG-k-U)(>i~X1C;i0AMv8(sqgR%5d%{lwkG3b6 zC64$@S`QTK^hjm0re~}?e@r+l=9x(}1VHm8S4xE8yL^vYtFQfvXNXqH9iwU}uatO) zKL{nFu6CEwzdgZXW#;Ki4g@=4Zs0Cnf+kicy^&EAY3O}S!7b9UEE{to`z5YtJ&`u! z6^#MooFUGqwiWLrDf*jJhKVxhI@a3Z+Um{sZC*b6M|X=geU2t=+1lKa4>P&`zA?9E z_Bn24{I^+iM#zonY5T-XChIX%R}yp*18yXQO)cq-*N|}k{>#tItNbu zpY;$_0|Xre_K2dVDBQ4=>VfdG-10rp|EO9CqqNpmP0^~7EyP`{H{&(3;&t}-HH0iz zc9}{ISVH&JOld|61u$1rD)z$qHZO$(c$J};_QL}M8JC8zFU>V@aT=jUN|*Es`ix6> zLD7lV59EyFsU0PpJ&m6M5(xK+DMb=G#?H`4pIM8bu?)v?+dQ?uf#jNw0mgo!n%Yf6 zH!K#doz0Ns$w6RDTBZ;9zV?sRFf=u#WU-c_mZVuy4dI=#L7{$Th5B`)JVnc9@A)3>Bj6fNhx$SL z==pyD^z39grFr$B+f=8y(mW?Q1)4>jWC_m3nLz0rAD?150GibT?tB2c?uwu-zF)~( z7oSb@9hre#kl1LhrFg+6l?zrqCti|-(feF%-NSU*Eyb~#P286abt2qg`>@`F|dCb*J28N7pa2R!3 zp^e6@W7U{f8N7z%S~vV~=uTi!_5>G!U)+Ot7W5K*e+iO|tCAG8l=06P>M)|Sq*%*i z%PL&qH~*~vFgZ!yC*B6co@aczmR-KdftY6+sLo|$^|iLZE-#%sOdY?&$r0SUn;7$H zB4MIinXa9pAOx+>`2pSv0WN{lt)%`vL2^ig3&ur}h2EkTAh$xlKPlx7 zu7>V}^lOW@H74nx*vno_p2FLDrquf?=cJfVxrzDgx@Sihx7hQ5Tzf^a&(K%BV1(7` zN($Y;xfxcidhV^4-`e?BVB1+}#{);pTqiWYGrt;^*X{{^0~+(B*n9mABx;qS{Te&- z+Ddx!OcOZ-i?goSVlQ`U^lS}Y?y}PxZ5q3@m92@syC>wUZjD3*zcXe?>xK(LG?gFk z?I9d*Xr|wIEC@-RI{pK)q#EI_j}61jct;gTF5C#|z)kzN{5Vr|MTK_U7RyA6q7O&v zU@=Ns=_{h$@A{n|8g_ZpHl#;ZcK^!nY=-tzcd7E-q-|W}k(J1=k&c(IMOf;d30jWx z$nVrL2ur>1`N+ziReq;Nvv}ovr-uDa#(`_)q3_dI`Vzz`L%3 zGtYDo_h-4!jq!^?dSgT{zqIP&veIQ5`C^b6@rvCgzpvZ@%q>!1|JajyM{f}sZFakb z9gW4ONBh^@uoZ4_j^>Up$QpCXEgTtIlD9Bs+_-*Y@S3&wjmKxC+cT&^@b;iqR|`Y}5Dw~3F|d>r z!$)l+x(G?|@e=E$p&Ry!G#{wBBTaw3QHsGb$a}7;`u*fT$f0lW)*?MU*vMW&PtMW0 z&;X^n8=-IBoA@xJ>{^r5BzjS7(>Q+p^#$m{$!Nvtq}H+9dWqg*Z92Uc6vd*IKuahcMN60liU632bd>rgI?gFC z^F)Q+=2lWFy5rflYEZjZGHgR>>OKQH6rD_O*~e`3<%o$J8=@BROYkhEprB8oFShQo@)``QPOKiJZrCSsuuCa27ON(TwWEg0hOUA z{t|{nYI!YbkbVw|ct`ExTD~onihIEEPB>+60VPsjrCCJCR^4TK_5z!9Xk+kzxpr<#?$WnGK?DV-VLjDkoCaQ?LZq{-&JmqqI!_c`y;?sB%~LnGEj=JABhb*MOH`f|ZlqRyB+ zdR?c^REc;S+quQEIQUDvHdvuw6#Uhq(nV7XHN*de zJx^TC+5X^XChY!_XWiYvCmS=H-1H4}V{ZKfqb!$5OG)@Vx4(~6nB>KUf8 zYZlm&=o>P+y0@rg0-kK^P@*FV3{cL63(z45!WL(&#dx^^d47jHnMxjuNb|gvlO z9pKt}Q5UuCQk<5NTL=jGU2$>*`5`JT(wOW9PXIPb|)kRtp zlDf<=7W}l{m!amJ?n!l}O{8a0Wc^%{pIhiF)SjaB-x3m6Ds$xtfr>d=)uD@^oZl zFaxia|F>n?*0PfNH+zEHjCpb z24D?TEUu%Y+UB-XEF_$)#XK;^W2X|>tgA%w zTs3@2q=jBv?OyPV7LmhiPt^Ac^#NspI}Hl$JxyPMW*pMul5YXVF!|CAF4GYMrST-26Z4bfxMXM4c3S$CACa)7K6` z=fvR^$05+QT|#cjmeD*WN8J--8%11cSY45KcHH!8lN(oVcj)nQu49|#$&H~N z;Gfd3PNg_;p2`NeM*~ZEIjr7^wTkRqyAbQtPIL|pp)~0XFqrD74&t^cEF6k1Tzxb6 zGFN>~xE^bVzL>_UuQL9Y#;KOL>+c13DPgZl3f(}t|NH{vZY3Uifn2Gi zBhcNdT4m)HR?m`DDEGZ~+?%Sio6-<38?iHF>m1y?dbN{31Z2aZbKiNVlfKd!#Veh7 z0Y%=i;PXZ!_o3F?SiYtx_*dhr>$5=lb_qB5)A}Ogoqnkr@&n)SpnW}Y*qg{Tdvn;B z`K+7EY;oTeC5mKVVM@ghxl2Qb2ewPSihJfArh10-89%5!CGJ@@Lt>?V-#xJqPzLp# zRL@1<_z3Y5sgR08^!6X_0W$Z(eZ2E-$tcm;qq5o@2`8bwNyC#_c#DI|h$j5M5bE1i zt5#hwRbPt=Gx4^tdDRjPLr)--?O`k^^FC<=a#=(>UQ>X^0&*wt?hIZ?f}V-;Ezvf5 zGcT)Vtf?HUZpSyQG>$vS>=V^>0KTTglRY0+26}@CJbJiJ|Mr^i{ybbnra>};CFbw| zZt^W(1f3WwRg1+~w8io*a+y3q#!XVZRJ>jCrQ~A^_CBdcsC+!4w}3 z{cbetY3#0XQDH5l-KFY;BN{xaP6}D$Uii8FIH1@ajnK}x^soMzthWSpP=2lAO+{N-= z`6ff&XOyG;RqDksmFF)Ajb7aSuBOg^E6LeawWEl$E4!#J7aS2Li{GeFeX1KvbhP{5 zwoKegd+QGxKY!i0C)|WPqp4TlJQd;@Q}s|)@PBXZISZ9}bK3EXm2wv8YF8M9iP#U*`%uAY_64@4IN9p7li*O0-8MysLlHZ zTPQ1dUiW44bm(E|Xei$5h4Uh*9;Qwok%0OiOlI$Cdn8zbX_*9x*U4* zcBOLjmX$`~WmIDyUShbek?FK}uc_!cEEw#ZG%uvm{DaZ^u4|EINZYNKuJHn90Tv4a zOAOVMQ_Xvyt&HjipjT%T&e0=q>;8o8-$&=$+wf}%0&V{05H!lVH=RHieTy$jNzk|E zS;{WGW`89-zl4m-2<6vKP5p2Z{VEE1Bwh18um{{L>96lE{Eq_76_TcTKK9Dp(s1je z0?f!kDWkq$+D}5yUUC|%hz?(6JUD@EE7#r^AlV&}}Ks~Yask5sX zZ?u_fXG?EfrdnSrg{;BD&sTAQRI?3^;mOsZnDV@jU`31 z3JDG5EQ*HW52<7OO85uX`QsL+##a5GO6b_$(1{7aT>rtmF}%Rol1%4O$C=*Gqcc(d zopGjEWaa;_h*~9k@KxNr7=iVbf%U~n?0$=+-EWpO`z>O6b(1#_rYs&*(`mfyfcBem z=9BS4b~(|5<5RzN47CmzGuOGbe;kEsW1bvP9CGj>0)+%(=z0GCwRJVXO_q23Nt%y0 zX_7ZBrG)||Ep1^eqb+ofQ8(W|MMnAys#0gYhLuSVXeObwSd$s$5&s8tuP2MWHL`hd2BIaT z=vut?DL1{w7(Cc<-AI;k-S>^Wd2cdy5PNLNBORW|JaC&)ufDi#06Q$pl!aG!sbYXW z==9Ddc`dP4RAR+rWG81E?fLQ@TJxDtnk&r z5_IWjNgK`>|J5d%#aEl?kLI$T(DJJrSOKcTmRQ+( z@W+XIcWN%?<+ACpIp+I5H>ghsB1CnuN-f>~A2!77051DBO04f6@? zmqIhw2ktRn?mk0j>-2{7kRCKz@}C$TO~HwG28CUIoOtbg%jq@tvvT5M3g#BG>w(3E z&t%l*H&3r$wPwBJGSQLtQY=<~rE* zp8`{xksHsAuCEL`S1pejc$Tds-M(JWxAx0?onU)g+N;e@d=R3ku8cr&Z#J+^V1D%2- zbRAY(TDNy%4Q5RFeI_KEO%EU+>3MS)K0bRY)fps4FWidT0tE;4*z>-I-w7OnM7$vHNp~@FHr@=#vxYUZjBkFj8OO;<4_AA;kt|1Z+e)a(; zY^?5r^I2(TyFGbs)ENIdFRcVl@1=>?(rQ-A#3=wIi9jk=y28Y_@GZuU(w$&GSfyfU z-a~#0SP)w&U*De+>vys~lRTGUcajhRZ}DC>-x`p5R$_)=Met4%7$m|o^85DSSwjB4 zhy3HwDK|#lyf1;*qEyI5A{9DUPmRy~o#*HoGvTv})qLptq`MWVmyip}0NzH$&`~Z^ z61g1rUIN~aa#AsBnYf-nIwekuA*9m~>Z)|zL-vR=aQ%k3uIgiUit58PYM0UlofW12 zkh`fJX@vPo_KRAwiuY0b=;g2ntG)#%HC1+;Hr*OLoZel70K>A8o8pfN~1ocC~0$HKEZsv_0lMc6AVc^Yih@bB@N z=n+Cnd-$1{o=F#&?mLxF86@f}b^fWxVn3=t> zX%hnrVcQg70{2k4!pcS|qVGyv{5N+owz}6MjYjoyk=7X(*L?f0JTI_vbR ztT8L-B#G`BNL9}1`DlUnvQK=(Rx~usS<^I^N&ucW9e26TJxJ&~@!c9r){?%vP)Bvf zj=J)hylVix7LZLaT0uK{S8Mw8yloEpt5rUMQ9ym2WCq#M8!~jojrS(G39@h!m zM-qVWo#Eox}m(ul_mD=|zKErx$kq3_r zV{+79QL%o>9>cuBDKkkd)+?CX3lJ?`$=UV`X}f|nt8M&(&(-0M%;XDV?t*X@c$5-n z!;HadI~(3)ZA1#MLj-9!#T`fuRNU5b(!7cajm1Ec4d43$Bmvp4mdm!?V@EFmAAbse ze8Q&t7Z++v6!fgFgH9C~UH^E2k~z9w3kh8xxd;mzbYN&Y-@o(wcP&Y!yMFCknffd| zx{q34hu@JT5Xw%5$u$9#SwqqNsBid60XxncD8E~;*X>AxbhJ{-<(#zO4Cx;lGh?^eGMt%9g-sU zK@H{N2s3@lvX;_yl>UU@c)Kh>45;i>O03;14;}G&rUXmgfcILpd8_u?QB~C27mR${ zbeGbh`|L_UhjR(a(=~{6pXZgXo-bHp|9On;-#VxyUrnee9`X6Y#^=Oebso=jPfn3& zw;jYOjn6k8Skn3Cv(?sEOFq1mjXG769WW=(JKE5YurS-HKd$@WL&=L6Nw*@&c1y#d zGj%8TTf6pl!GC$=wVU3g%~Rb|4kH#r)lSC1da5A4X}O1QAn(97LlI)3$j`)r|1|2h z%l(X4C4z4n*ip^)(MPr0*|C)EqmRv30xoqefjwGn-`d1=wSCpNu5_vG zZ~}{0VJ(XHC0c6nElRYPa{ncsD;B#Vp~TeKWMB{ZX5tX0RmGk;@x$~Q?9{q&3ba5E z*OEqP)#I}|OAei3p-$k~eic((gwW9OCx&ekuoi^IC4BC`2%znOtN^&AIl$O|JTGHP5;=ZOt6$rfjzCYagt|BAT(=Uu0|@FXetiPO7njyMYgs$9$>p? zzUm)cUo>%6@$Q)=0VYr#JpOOF;^a&RYy`mB7;!eG9$r~}Cw#CLedCsf1~Hotof&EV z63kc!6LuwLcbs(l$o4uLQM8HHI&fBt@MA2?!7qNwz%3J4=q}C(jf+tteDxTOlRS%Z z7KXk^Es8&e_d;0)i;y}mI)S*-(fCiy1Nz>HdGbMu9EAo-l;x;8ISY{o zn!Uc^3AgVpj4oKeFplM(^)`9vI!-m(Etl>&?)B%ARi{?N*lnvka8KV!DOL3yabD51 zAg6U~zaIYbffn%84w-JnTYBVZi^vha=xM?a*l{{s9ri%qy@y>W0}ew28Ae7qm5^D0 zaDY~njD(*Idz@6c!_nM&(>ny2#`txnRUSmdf#l{%>xRX*Gn{TcF*v(xt$Zm?XfAE9 z5@q8^duPEM>`duxDh8vP{h=ofXAU2Y5FBAYS8(A@8><$y!9eHzUiIL72i8pBYj$J5|N0K4y_0#hiS%Ru^$q=}wm*e?>{=sDU&`yf4Il>q4zx73oG| z%}vxaN9EdGLv3mmsTQ9qzpBv`bbYP3u9gFROKrcn){1c%kAmx0Tzg1d>rk*PEYY-C zRu5UI&Da5S8vF|6JJldY^)2iP27@*>E&8EImmqag3(o;>3=EyO0w|cB;hTtS)ZrKD zZOg-5x7&W$(rdU%{jckALWhb+LvPS8QQm!CT+c|<=&bl=@vg-?tlOlkVO2MA_;=fE rhz~U5x1WOEa(Yt?sG0rQzPo~O4S_`v{B5{rB8q*k|7$J+} zUp7ogosbIGgo9x*KLRKtXT$(B;s5^!j2{>lFjO!kFa$6-GuSYgG8i!EFlaESGAJ=9 zFvu~;V4A|n#LULd#m&brB`qg!Wo>8Az@VVPFTy1M0pzAF{~3WMZ-KDCfJAnJ*}K5x zZZOFRCWXP|&krmN3{1a3B*SkI$&&Daoq>ZP6-Y8LBmqqWN&{6YFaa67OpMIjJbYp- z0)i53JOW}e3Mv|GJVFw3DjGU$Tzn!DKmj%`0Wm3{cpd{2&>?>rSQz+$z5^Nd0?7W) T@CQh;uvh_QnHU7Y;tUJ`;dwZi literal 0 HcmV?d00001 diff --git a/build/meta-bsp/recipes-bsp/bsp/verdin-imx8mp/lpddr4_pmu_train_2d_imem_202006.bin b/build/meta-bsp/recipes-bsp/bsp/verdin-imx8mp/lpddr4_pmu_train_2d_imem_202006.bin new file mode 100644 index 0000000000000000000000000000000000000000..1340657bd2807f5f2cc3ba0736d5bba3a8267742 GIT binary patch literal 25456 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 WADXn&I5c6X2RyD4(f&9s|9=3wLfex7 literal 0 HcmV?d00001 diff --git a/build/meta-bsp/recipes-bsp/bsp/x86/boot/grub/i386-pc/modinfo.sh b/build/meta-bsp/recipes-bsp/bsp/x86/boot/grub/i386-pc/modinfo.sh index cb6012e..e29cc2a 100755 --- a/build/meta-bsp/recipes-bsp/bsp/x86/boot/grub/i386-pc/modinfo.sh +++ b/build/meta-bsp/recipes-bsp/bsp/x86/boot/grub/i386-pc/modinfo.sh @@ -1,5 +1,7 @@ #!/bin/sh +# Copyright (c) 2025-2026 EDGEMTech SA + # User-controllable options grub_modinfo_target_cpu=i386 grub_modinfo_platform=pc diff --git a/build/meta-bsp/recipes-bsp/capsule/bsp-capsules_1.0.0.bb b/build/meta-bsp/recipes-bsp/capsule/bsp-capsules_1.0.0.bb index 6f67930..8c6102b 100644 --- a/build/meta-bsp/recipes-bsp/capsule/bsp-capsules_1.0.0.bb +++ b/build/meta-bsp/recipes-bsp/capsule/bsp-capsules_1.0.0.bb @@ -1,3 +1,5 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD SUMMARY = "SO3 capsule Deployment" DESCRIPTION = "SO3 capsules are aimed to run with Linux as guest on top of the AVZ hypervisor." @@ -13,7 +15,10 @@ inherit uboot inherit logging inherit bsp -OVERRIDES += ":so3" +# :append (not +=) so no space is inserted before ":so3" — otherwise the +# preceding CPU token parses as "arm "/"aarch64 " and : overrides +# stop matching. See usr-so3_1.0.bb for the full rationale. +OVERRIDES:append = ":so3" do_configure[noexec] = "1" do_attach_infrabase[noexec] = "1" diff --git a/build/meta-bsp/recipes-bsp/linux/bsp-linux_1.0.bb b/build/meta-bsp/recipes-bsp/linux/bsp-linux_1.0.bb index 95bcc39..fcdf4e3 100644 --- a/build/meta-bsp/recipes-bsp/linux/bsp-linux_1.0.bb +++ b/build/meta-bsp/recipes-bsp/linux/bsp-linux_1.0.bb @@ -1,3 +1,5 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD SUMMARY = "Linux Board Support Package" DESCRIPTION = "Linux Board Support Package (BSP) which builds the whole set of software components \ @@ -14,14 +16,16 @@ inherit linux inherit logging inherit bsp inherit uboot +inherit atf OVERRIDES += ":linux" -COMPATIBLE_PLATFORM = "virt32|virt64|rpi4_64|x86_qemu" +COMPATIBLE_PLATFORM = "virt32|virt64|rpi4_64" do_attach_infrabase[noexec] = "1" -include ../bsp/files/bsp_${IB_PLATFORM}.inc +# Platform-specific deploy logic (__do_platform_deploy). +include recipes-bsp/bsp/files/bsp_${IB_PLATFORM}.inc do_configure[noexec] = "1" @@ -40,14 +44,81 @@ do_itb[nostamp] = "1" do_itb () { - if [ ! -f ${IB_ITB_PATH}/${IB_TARGET_ITS}.its ]; then - bbfatal "No corresponding ITS found (${IB_TARGET_ITS})" + if [ "${IB_BOOT_CHAIN}" = "full" ]; then + # AVZ mode: wrap Linux (agency) into the AVZ ITB. + + if [ ! -f ${IB_ITB_PATH}/${IB_TARGET_ITS}.its ]; then + bbfatal "No corresponding ITS found (${IB_TARGET_ITS})" + fi + mkimage -f ${IB_ITB_PATH}/${IB_TARGET_ITS}.its ${IB_ITB_PATH}/${IB_PLATFORM}_avz.itb else - mkimage -f ${IB_ITB_PATH}/${IB_TARGET_ITS}.its ${IB_ITB_PATH}/${IB_TARGET_ITS}.itb + # Bare bsp-linux (IB_BOOT_CHAIN ∈ {uboot, atf+uboot}): single + # plain ITB from ${IB_PLATFORM}.its with the buildroot initrd + # bundled in. Direct bootm by U-Boot, no AVZ wrapping. + + if [ ! -f ${IB_ITB_PATH}/${IB_PLATFORM}.its ]; then + bbfatal "No bare ITS found at ${IB_ITB_PATH}/${IB_PLATFORM}.its" + fi + mkimage -f ${IB_ITB_PATH}/${IB_PLATFORM}.its ${IB_ITB_PATH}/${IB_PLATFORM}.itb fi +} +# do_prepare_initrd: gzip rootfs.cpio (produced by usr-linux:do_deploy) +# into initrd.cpio.gz so do_itb /incbin/'s it. Lived in the FC capsule +# bbappend originally; moved here so bare bsp-linux (no capsule layer +# loaded) still gets a fresh initrd in the bare ITB. The FC bbappend's +# do_inject_kernel_modules still runs before this, editing rootfs.cpio +# in place — the content-hash guard below picks up the new content and +# regenerates initrd.cpio.gz. + +do_prepare_initrd[nostamp] = "1" +do_prepare_initrd[depends] = "usr-linux:do_deploy" + +python do_prepare_initrd () { + import hashlib + import shutil + import gzip + import os + + IB_ROOTFS_PATH = d.getVar('IB_ROOTFS_PATH') + IB_PLATFORM = d.getVar('IB_PLATFORM') + + board_dir = os.path.join(IB_ROOTFS_PATH, "board", IB_PLATFORM) + src = os.path.join(board_dir, "rootfs.cpio") + initrd = os.path.join(board_dir, "initrd.cpio") + initrd_gz = initrd + ".gz" + src_hash_file = src + ".sha256" + + if not os.path.exists(src): + bb.fatal("rootfs.cpio not found: {}".format(src)) + + # Content hash instead of mtime: __do_rootfs_umount always rewrites + # rootfs.cpio with a fresh mtime even when content is unchanged, so + # mtime would force false rebuilds. sha256 fixes both directions. + + h = hashlib.sha256() + with open(src, 'rb') as f: + for chunk in iter(lambda: f.read(65536), b''): + h.update(chunk) + current_hash = h.hexdigest() + + if os.path.exists(initrd_gz) and os.path.exists(src_hash_file): + with open(src_hash_file, 'r') as f: + stored_hash = f.read().strip() + if stored_hash == current_hash: + bb.plain("initrd.cpio.gz is up to date, skipping") + return + + bb.plain("Prepare initrd.cpio.gz from rootfs.cpio") + shutil.copy2(src, initrd) + with open(initrd, 'rb') as f_in, gzip.open(initrd_gz, 'wb') as f_out: + shutil.copyfileobj(f_in, f_out) + with open(src_hash_file, 'w') as f: + f.write(current_hash) } +addtask do_prepare_initrd before do_itb + # Deploy everything do_deploy[depends] = "filesystem:do_fs_check usr-linux:do_deploy" @@ -60,7 +131,10 @@ python do_deploy() { __do_deploy_boot(d); } -addtask do_itb before do_deploy +# Wire do_itb before both do_build (so `build.sh -a` produces the +# .itb artefacts) and do_deploy (so a standalone `deploy.sh -a` still +# triggers the assembly through sstate misses). +addtask do_itb before do_build before do_deploy addtask do_deploy do_deploy_boot[nostamp] = "1" @@ -75,7 +149,11 @@ python do_deploy_boot() { addtask do_itb before do_deploy_boot addtask do_deploy_boot -do_clean[depends] = "usr-linux:do_clean linux:do_clean uboot:do_clean" +do_clean[depends] = "usr-linux:do_clean rootfs-linux:do_clean linux:do_clean uboot:do_clean" +python () { + if d.getVar('IB_PLATFORM') == 'virt64': + d.appendVarFlag('do_clean', 'depends', ' atf:do_clean optee:do_clean avz:do_clean') +} do_clean[nostamp] = "1" do_clean () { rm -f ${TMPDIR}/stamps/bsp-linux* diff --git a/build/meta-bsp/recipes-bsp/linux/files/uEnv_rpi4_64.txt b/build/meta-bsp/recipes-bsp/linux/files/uEnv_rpi4_64.txt index 546ecc5..c4f37bb 100644 --- a/build/meta-bsp/recipes-bsp/linux/files/uEnv_rpi4_64.txt +++ b/build/meta-bsp/recipes-bsp/linux/files/uEnv_rpi4_64.txt @@ -2,4 +2,4 @@ fdt_high=ffffffffffffffff initrd_high=ffffffffffffffff start=fatload mmc 0 0x30000000 rpi4_64.itb; bootm 0x30000000 -bootargs=console=ttyS0,115200 root=/dev/ram coherent_pool=1M 8250.nr_uarts=1 smsc95xx.macaddr=DC:A6:32:18:DD:95 vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000 fsck.repair=yes rootwait cma=96M net.ifnames=0 +bootargs=console=ttyS0,115200 root=/dev/ram coherent_pool=1M 8250.nr_uarts=1 cma=64M cma=256M smsc95xx.macaddr=DC:A6:32:18:DD:95 vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000 fsck.repair=yes rootwait diff --git a/build/meta-bsp/recipes-bsp/linux/files/uEnv_virt64.txt b/build/meta-bsp/recipes-bsp/linux/files/uEnv_virt64.txt index 7442db2..7ce9ef0 100644 --- a/build/meta-bsp/recipes-bsp/linux/files/uEnv_virt64.txt +++ b/build/meta-bsp/recipes-bsp/linux/files/uEnv_virt64.txt @@ -1,8 +1,12 @@ fdt_high=ffffffffffffffff initrd_high=ffffffffffffffff -start=load virtio 0 0x70000000 virt64.itb; bootm 0x70000000 -bootargs=console=ttyAMA0,115200n8 root=/dev/ram rw slub_debug=PUZ +# Bare bsp-linux on virt64: U-Boot bootm's a single ITB carrying kernel +# + DTB + buildroot initrd. No AVZ. QEMU loads U-Boot directly via +# -bios filesystem/u-boot.bin (no flash0.img in this mode). -# Uncomment if there is no initrd -# bootargs=console=ttyAMA0,115200n8 root=/dev/mmcblk0p1 rw slub_debug=PUZ +LOAD_ADDR=0x65000000 + +start=load virtio 0:1 ${LOAD_ADDR} virt64.itb; bootm ${LOAD_ADDR} + +bootargs=earlycon=pl011,mmio32,0x09000000 console=ttyAMA0,115200n8 root=/dev/ram rw diff --git a/build/meta-bsp/recipes-bsp/so3/bsp-so3_1.0.0.bb b/build/meta-bsp/recipes-bsp/so3/bsp-so3_1.0.0.bb index 198c885..f3d8012 100644 --- a/build/meta-bsp/recipes-bsp/so3/bsp-so3_1.0.0.bb +++ b/build/meta-bsp/recipes-bsp/so3/bsp-so3_1.0.0.bb @@ -1,3 +1,5 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD SUMMARY = "SO3 Board Support Package" DESCRIPTION = "SO3 Board Support Package (BSP) which builds the whole set of software components \ @@ -14,16 +16,25 @@ inherit uboot inherit logging inherit bsp -OVERRIDES += ":so3" +# :append (not +=) so no space is inserted before ":so3" — otherwise the +# preceding CPU token parses as "arm "/"aarch64 " and : overrides +# stop matching. See usr-so3_1.0.bb for the full rationale. +OVERRIDES:append = ":so3" include ../bsp/files/bsp_${IB_PLATFORM}.inc do_configure[noexec] = "1" do_attach_infrabase[noexec] = "1" -# Building all components - -do_build[depends] = "usr-so3:do_build uboot:do_build" +# Building all components. +# +# Every platform needs U-Boot: on QEMU it is the bare U-Boot payload, on +# verdin-imx8mp it is U-Boot wrapped into imx-boot/flash.bin (ATF + OP-TEE + +# U-Boot) by the uboot recipe. verdin additionally needs the AVZ hypervisor +# (bundled by the AVZ+SO3 ITS), so its dependency set is overridden to add it. +IB_BSP_BUILD_DEPENDS = "usr-so3:do_build uboot:do_build" +IB_BSP_BUILD_DEPENDS:verdin-imx8mp = "usr-so3:do_build uboot:do_build avz:do_build" +do_build[depends] = "${IB_BSP_BUILD_DEPENDS}" do_build () { bbplain "Everything built OK ..." @@ -41,7 +52,21 @@ do_itb () { else mkimage -f ${IB_ITB_PATH}/${IB_TARGET_ITS}.its ${IB_ITB_PATH}/${IB_TARGET_ITS}.itb fi - + + # AVZ boot uses a SEPARATE guest ITB (loaded alongside the AVZ ITB by + # the e1c-boot U-Boot command). The guest ITS is derived from the + # selected AVZ ITS: _avz -> _so3_guest (deriving from + # IB_TARGET_ITS, not IB_PLATFORM, keeps the underscore naming on + # platforms whose IB_PLATFORM carries a hyphen, e.g. verdin-imx8mp). + case "${IB_TARGET_ITS}" in + *_avz) + guest_its="${IB_TARGET_ITS%_avz}_so3_guest" + if [ -f ${IB_ITB_PATH}/${guest_its}.its ]; then + mkimage -f ${IB_ITB_PATH}/${guest_its}.its ${IB_ITB_PATH}/${guest_its}.itb + fi + ;; + esac + } do_deploy[depends] = "usr-so3:do_deploy" diff --git a/build/meta-bsp/recipes-bsp/so3/files/uEnv_rpi4_64_avz.txt b/build/meta-bsp/recipes-bsp/so3/files/uEnv_rpi4_64_avz.txt new file mode 100644 index 0000000..533b399 --- /dev/null +++ b/build/meta-bsp/recipes-bsp/so3/files/uEnv_rpi4_64_avz.txt @@ -0,0 +1,9 @@ +fdt_high=ffffffffffffffff +initrd_high=ffffffffffffffff + +# AVZ boot on RPi4 64-bit: two ITBs (AVZ + SO3 guest) loaded to staging +# addresses (above the 0x00080000-0x17c00000 sub-image extraction range), +# then jumped via the e1c-boot U-Boot command which passes the AVZ FIT in +# x0 and the guest ITB in x1 (AVZ loadAgency loads the guest from x1). + +start=fatload mmc 0 0x20000000 rpi4_64_avz.itb; fatload mmc 0 0x30000000 rpi4_64_guest.itb; e1c-boot 0x20000000 0x30000000 diff --git a/build/meta-bsp/recipes-bsp/so3/files/uEnv_virt64_avz.txt b/build/meta-bsp/recipes-bsp/so3/files/uEnv_virt64_avz.txt new file mode 100644 index 0000000..d1f48f5 --- /dev/null +++ b/build/meta-bsp/recipes-bsp/so3/files/uEnv_virt64_avz.txt @@ -0,0 +1,9 @@ +fdt_high=ffffffffffffffff +initrd_high=ffffffffffffffff + +# AVZ boot on virt64: two ITBs (AVZ + SO3 guest) loaded to staging +# addresses, then jumped via the e1c-boot U-Boot command which passes the +# AVZ FIT in x0 and the guest ITB in x1 (AVZ loadAgency loads the guest +# from x1). EL2 is required (st.sh enables -M virt,virtualization=on). + +start=load virtio 0 0x65000000 virt64_avz.itb; load virtio 0 0x70000000 virt64_guest.itb; e1c-boot 0x65000000 0x70000000 diff --git a/build/meta-filesystem/classes/filesystem.bbclass b/build/meta-filesystem/classes/filesystem.bbclass index 85a8b4d..84495ea 100644 --- a/build/meta-filesystem/classes/filesystem.bbclass +++ b/build/meta-filesystem/classes/filesystem.bbclass @@ -1,22 +1,23 @@ ################################################################### # # The filesystem creation class -# IB_STORAGE = soft create .img disk image +# IB_STORAGE_MODE = soft create .img disk image # Prepares a flashable filesystem image containing # two partitions one for the bootloader and one for the rootfs # using losetup(8) to mount the image on a loop device /dev/loopXX # -# IB_STORAGE = hard write to a real disk device +# IB_STORAGE_MODE = hard write to a real disk device # Writes to actual disk device, please double check config! # # this class is inherited by platform-specific filesystem creation # classes init_storage_XX # -# Also see the IB_STORAGE_*, IB_ROOTFS_* +# Also see the IB_STORAGE_MODE, IB_STORAGE_DEVICE, IB_ROOTFS_* # options in local.conf # -# Copyright (c) 2014-2023 REDS Institute, HEIG-VD -# Copyright (c) 2023-2025 EDGEMTech Ltd +# Copyright (c) 2014-2026 REDS Institute, HEIG-VD +# Copyright (c) 2023-2026 EDGEMTech Ltd +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD # # Authors: # EDGEMTech Ltd, Daniel Rossier (daniel.rossier@edgemtech.ch) @@ -30,24 +31,24 @@ inherit fs_${IB_PLATFORM} IB_FILESYSTEM_PATH = "${IB_DIR}/filesystem" -# Create and initialize the storage (including formatting partitions) +# __do_fs_mount and __do_fs_umount must be implemented +# in the specific board class. + +# Create and initialize the storage (including formatting partitions). +# bitbake runs as the unprivileged user; privileged ops inside +# __platform_init_storage escalate via `utils_sudo` and rely on the +# caller having opened a sudo session (scripts/common/sudo_session.sh). def __do_fs_init_storage(d): - IB_STORAGE = d.getVar('IB_STORAGE') + IB_STORAGE_MODE = d.getVar('IB_STORAGE_MODE') IB_STORAGE_DEVICE = d.getVar('IB_STORAGE_DEVICE') WORKDIR = d.getVar("WORKDIR") - # Perform the check as this task can also be executed from a - # script or directly using bitbake - if utils_chk_is_root_user(d) == False: - bb.fatal(("Please re-run the task/script as root - " - "It is required to access loop devices")) - - if IB_STORAGE == "remote": + if IB_STORAGE_MODE == "remote": return None - if IB_STORAGE == "hard" and IB_STORAGE_DEVICE == "": + if IB_STORAGE_MODE == "hard" and IB_STORAGE_DEVICE == "": bb.fatal(("No device found; please edit conf/local.conf" " IB_STORAGE_DEVICE is not set")) @@ -69,18 +70,15 @@ def __do_fs_init_storage(d): # Check the presence of the virtual disk image # if the deployment is done on the virtual ("soft") storage # and call filesystem:fs_init_storage() if it does not exist + def __do_fs_check(d): import subprocess IB_PLATFORM = d.getVar('IB_PLATFORM') - IB_STORAGE = d.getVar('IB_STORAGE') + IB_STORAGE_MODE = d.getVar('IB_STORAGE_MODE') IB_FILESYSTEM_PATH = d.getVar('IB_FILESYSTEM_PATH') - # Check if the user is running the filesystem recipe as root - if utils_chk_is_root_user(d) == False: - bb.fatal("Please re-run the task/script as root") - - if IB_STORAGE == "soft": + if IB_STORAGE_MODE == "soft": image_path = os.path.join(IB_FILESYSTEM_PATH , "work", f"sdcard.img.{IB_PLATFORM}") if not os.path.isfile(image_path): bb.plain((f"The filesystem image: sdcard.img.{IB_PLATFORM} " @@ -88,106 +86,6 @@ def __do_fs_check(d): __do_fs_init_storage(d) -# Mount the partitions to p1, p2 respectively -def __do_fs_mount(d): - import os - import subprocess - import json - import errno - - WORKDIR = d.getVar('IB_FILESYSTEM_PATH') + "/work" - IB_STORAGE = d.getVar('IB_STORAGE') - IB_PLATFORM = d.getVar('IB_PLATFORM') - IB_STORAGE_DEVICE = d.getVar('IB_STORAGE_DEVICE') - IB_FILESYSTEM_PATH = d.getVar('IB_FILESYSTEM_PATH') - TMPDIR = d.getVar("TMPDIR") - - # Check if the user is running the filesystem recipe as root - if utils_chk_is_root_user(d) == False: - bb.fatal("Please re-run the task/script as root") - - if IB_STORAGE == "soft": - img_path = f"{WORKDIR}/sdcard.img.{IB_PLATFORM}" - - # Check if image exists before running losetup - try: - os.stat(img_path) - except OSError as e: - if e.errno == errno.ENOENT: - bb.fatal(f"{img_path} does not exist") - - p1 = os.path.join(WORKDIR, "p1") - p2 = os.path.join(WORKDIR, "p2") - - if os.path.ismount(p1): - bb.warn(f"{p1} is already mounted - avoid remount") - return - - if os.path.ismount(p2): - bb.warn(f"{p2} is already mounted - avoid remount") - return - - os.makedirs(p1, exist_ok=True) - os.makedirs(p2, exist_ok=True) - - if IB_STORAGE == "soft": - - try: - devname = subprocess.check_output( - f"losetup --partscan --find --show {img_path}", shell=True, - text=True).strip() - except Exception as e: - bb.fatal((f"Could not attach image: {img_path}" - f" to a loop device error: {e}")) - - # Keep device name only without /dev/ - devname = devname.replace("/dev/", "") - else: - devname = d.getVar('IB_STORAGE_DEVICE') - - shdata = { - 'IB_FILESYSTEM_DEVNAME': devname - } - - # NOTE: Currently this file is only written too - path = os.path.join(TMPDIR, "global_datastore.json") - with open(path, "w") as f: - json.dump(shdata, f) - - f.close() - utils_chown_file(d, path) - - if devname[-1].isdigit(): - devname += "p" - - # TODO: handle more than 2 partitions - try: - subprocess.run(['mount', f'/dev/{devname}1', os.path.join(WORKDIR, 'p1')], check=True) - - except Exception as e: - bb.fatal((f"Could not mount image: {IB_FILESYSTEM_PATH}" - f" on /dev/{devname}1 error: {e}")) - - try: - subprocess.run(['mount', f'/dev/{devname}2', os.path.join(WORKDIR, 'p2')], check=True) - - except Exception as e: - bb.fatal((f"Could not mount image: {IB_FILESYSTEM_PATH}" - f" on /dev/{devname}2 error: {e}")) - - bb.note(f"Mounted filesystem at: {IB_FILESYSTEM_PATH}/p1,p2") - - if os.path.ismount(os.path.join(WORKDIR, 'p1')): - if os.path.lexists(IB_FILESYSTEM_PATH + "/p1"): - os.remove(IB_FILESYSTEM_PATH + "/p1") - os.symlink(os.path.join(WORKDIR, 'p1'), IB_FILESYSTEM_PATH+"/p1") - - if os.path.ismount(os.path.join(WORKDIR, 'p2')): - if os.path.lexists(IB_FILESYSTEM_PATH + "/p2"): - os.remove(IB_FILESYSTEM_PATH + "/p2") - os.symlink(os.path.join(WORKDIR, 'p2'), IB_FILESYSTEM_PATH+"/p2") - - def __do_main_umount(d, partition_number): import os @@ -207,41 +105,16 @@ def __do_main_umount(d, partition_number): time.sleep(1) # Unmount the source directory - os.system(f"umount '{directory}'") + utils_sudo(["umount", directory]) else: bb.warn(f"{directory} wasn't mounted - will remove mount point dir") - # Remove the mountpoint dir and the symlink in the fs staging area - os.system(f"rm -rf '{directory}'") - os.system(f"rm '{IB_FILESYSTEM_PATH}/p{partition_number}'") - - utils_restore_user_ownership(d) - -def __do_fs_umount(d): - import subprocess - - IB_FILESYSTEM_PATH = d.getVar('IB_FILESYSTEM_PATH') - WORKDIR = d.getVar('WORKDIR') - - # Check if the user is running the filesystem recipe as root - if utils_chk_is_root_user(d) == False: - bb.fatal("Please re-run the task/script as root") - - __do_main_umount(d, 1) - __do_main_umount(d, 2) - - try: - subprocess.run(['losetup', '-D'], check=True) - - except Exception as e: - bb.fatal(f"Failed during losetup -D operation, could not unmount all devices: {e}") - - # Change ownership of filesystem/sdcard.img.* and filesystem/work - utils_chown_dir(d, f"{IB_FILESYSTEM_PATH}", follow_symlinks=False, recursive=True) - - # And of the filesystem/ dir itself - utils_chown_dir(d, f"{IB_FILESYSTEM_PATH}", follow_symlinks=False, recursive=False) + # Remove the mountpoint dir (root-owned because mount populated it) + # and the symlink in the fs staging area (user-owned). + utils_sudo(["rm", "-rf", directory]) + if os.path.lexists(f"{IB_FILESYSTEM_PATH}/p{partition_number}"): + os.remove(f"{IB_FILESYSTEM_PATH}/p{partition_number}") python do_fs_mount () { @@ -272,5 +145,3 @@ do_fs_check[nostamp] = "1" do_fs_init_storage[nostamp] = "1" do_fs_mount[nostamp] = "1" do_fs_umount[nostamp] = "1" - - diff --git a/build/meta-filesystem/classes/fs_arm_common.bbclass b/build/meta-filesystem/classes/fs_arm_common.bbclass index 8104d70..e20bb85 100644 --- a/build/meta-filesystem/classes/fs_arm_common.bbclass +++ b/build/meta-filesystem/classes/fs_arm_common.bbclass @@ -1,18 +1,23 @@ - -# Specific task description for formatting -# the storage of ARM platform with 3 partitions - -# Partition layout is as follows: -# - Partition #1: 128 MB (u-boot, kernel, etc.) -# - Partition #2: 400 MB (Main rootfs) -# - Partition #3: 100 MB (A data partition used for SO3 capsules for example) +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + +# Storage layout for ARM platforms (sdcard.img, IB_ROOTFS_SIZE total). +# +# Two partitions: +# - p1, FAT, 128 MiB — boot partition +# uEnv.txt, AVZ ITB (small), legacy firmware artefacts +# - p2, ext4, ~rest of IB_ROOTFS_SIZE — rootfs partition (label "rootfs1") +# / — Linux rootfs proper (deployed by rootfs-linux). +# +# bitbake itself runs as the unprivileged user. Each privileged op +# (losetup/fdisk/mkfs/mount/umount) goes through utils_sudo (`sudo -n`) +# and assumes the caller pre-opened a sudo session. def __platform_init_storage(d): import os import subprocess - from bb.process import run - IB_STORAGE = d.getVar('IB_STORAGE') + IB_STORAGE_MODE = d.getVar('IB_STORAGE_MODE') IB_ROOTFS_SIZE = d.getVar('IB_ROOTFS_SIZE') IB_PLATFORM = d.getVar('IB_PLATFORM') IB_STORAGE_DEVICE = d.getVar('IB_STORAGE_DEVICE') @@ -24,9 +29,9 @@ def __platform_init_storage(d): store_path = os.path.join(WORKDIR, store_filename) devname = IB_STORAGE_DEVICE - if IB_STORAGE == "soft": - # Make sure the filesystem dir exists - run(f"sudo mkdir -p {IB_FILESYSTEM_PATH}") + if IB_STORAGE_MODE == "soft": + # Make sure the filesystem dir exists (user-owned) + os.makedirs(IB_FILESYSTEM_PATH, exist_ok=True) # Create image first print(f"Creating {store_path}") @@ -34,7 +39,7 @@ def __platform_init_storage(d): dd_size = IB_ROOTFS_SIZE subprocess.run(["truncate", "-s", dd_size, store_path]) - devname = subprocess.run(["losetup", "--partscan", "--find", "--show", store_path], + devname = utils_sudo(["losetup", "--partscan", "--find", "--show", store_path], capture_output=True, text=True).stdout.strip() print(devname) @@ -67,7 +72,7 @@ def __platform_init_storage(d): # Create the partition layout this way # TODO: use sfdisk(8) which is more suitable for scripting fdisk_input = "o\nn\np\n\n\n+128M\nt\nc\na\nn\np\n\n\n+1600M\nw\n" - subprocess.run(["fdisk", f"/dev/{devname}"], input=fdisk_input.encode()) + utils_sudo(["fdisk", f"/dev/{devname}"], input=fdisk_input.encode()) print("Waiting ...") @@ -78,11 +83,11 @@ def __platform_init_storage(d): if devname[-1].isdigit(): devname += "p" - subprocess.run(["mkfs.fat", "-F32", "-a", "-v", "-n", "boot", f"/dev/{devname}1"]) - subprocess.run(["mkfs.ext4", "-L", "rootfs1", f"/dev/{devname}2"]) + utils_sudo(["mkfs.fat", "-F32", "-a", "-v", "-n", "boot", f"/dev/{devname}1"]) + utils_sudo(["mkfs.ext4", "-L", "rootfs1", f"/dev/{devname}2"]) - if IB_STORAGE == "soft": - subprocess.run(["losetup", "-D"]) + if IB_STORAGE_MODE == "soft": + utils_sudo(["losetup", "-D"]) print("Done! The storage is now initialized") @@ -91,21 +96,15 @@ def __platform_init_storage(d): # Create and initialize the storage (including formatting partitions) def __do_fs_init_storage(d): - IB_STORAGE = d.getVar('IB_STORAGE') + IB_STORAGE_MODE = d.getVar('IB_STORAGE_MODE') IB_STORAGE_DEVICE = d.getVar('IB_STORAGE_DEVICE') WORKDIR = d.getVar("WORKDIR") - # Perform the check as this task can also be executed from a - # script or directly using bitbake - if utils_chk_is_root_user(d) == False: - bb.fatal(("Please re-run the task/script as root - " - "It is required to access loop devices")) - - if IB_STORAGE == "remote": + if IB_STORAGE_MODE == "remote": return None - if IB_STORAGE == "hard" and IB_STORAGE_DEVICE == "": + if IB_STORAGE_MODE == "hard" and IB_STORAGE_DEVICE == "": bb.fatal(("No device found; please edit conf/local.conf" " IB_STORAGE_DEVICE is not set")) @@ -121,40 +120,27 @@ def __do_fs_init_storage(d): # Remove the existing symbolic link os.unlink(target_link) - # Restore the ownership of the filesystem workdir to - # the user that ran the task - note that this is done before the filesystem - # is mounted to avoid touching the mounted rootfs - utils_chown_dir(d, WORKDIR) - os.symlink(WORKDIR, target_link) - utils_restore_user_ownership(d) - # Check the presence of the virtual disk image # if the deployment is done on the virtual ("soft") storage # and call filesystem:fs_init_storage() if it does not exist + def __do_fs_check(d): import subprocess IB_PLATFORM = d.getVar('IB_PLATFORM') - IB_STORAGE = d.getVar('IB_STORAGE') + IB_STORAGE_MODE = d.getVar('IB_STORAGE_MODE') IB_FILESYSTEM_PATH = d.getVar('IB_FILESYSTEM_PATH') - uid = utils_get_user_uid(d) - - # Check if the user is running the filesystem recipe as root - if utils_chk_is_root_user(d) == False: - bb.fatal("Please re-run the task/script as root") - - if IB_STORAGE == "soft": + if IB_STORAGE_MODE == "soft": image_path = os.path.join(IB_FILESYSTEM_PATH , "work", f"sdcard.img.{IB_PLATFORM}") if not os.path.isfile(image_path): bb.plain((f"The filesystem image: sdcard.img.{IB_PLATFORM} " "does not exist - creating it")) __do_fs_init_storage(d) - utils_restore_user_ownership(d) # Mount the partitions to p1, p2 respectively def __do_fs_mount(d): @@ -164,17 +150,13 @@ def __do_fs_mount(d): import errno WORKDIR = d.getVar('IB_FILESYSTEM_PATH') + "/work" - IB_STORAGE = d.getVar('IB_STORAGE') + IB_STORAGE_MODE = d.getVar('IB_STORAGE_MODE') IB_PLATFORM = d.getVar('IB_PLATFORM') IB_STORAGE_DEVICE = d.getVar('IB_STORAGE_DEVICE') IB_FILESYSTEM_PATH = d.getVar('IB_FILESYSTEM_PATH') TMPDIR = d.getVar("TMPDIR") - # Check if the user is running the filesystem recipe as root - if utils_chk_is_root_user(d) == False: - bb.fatal("Please re-run the task/script as root") - - if IB_STORAGE == "soft": + if IB_STORAGE_MODE == "soft": img_path = f"{WORKDIR}/sdcard.img.{IB_PLATFORM}" # Check if image exists before running losetup @@ -189,23 +171,20 @@ def __do_fs_mount(d): if os.path.ismount(p1): bb.warn(f"{p1} is already mounted - avoid remount") - utils_restore_user_ownership(d) return if os.path.ismount(p2): bb.warn(f"{p2} is already mounted - avoid remount") - utils_restore_user_ownership(d) return os.makedirs(p1, exist_ok=True) os.makedirs(p2, exist_ok=True) - if IB_STORAGE == "soft": + if IB_STORAGE_MODE == "soft": try: - devname = subprocess.check_output( - f"losetup --partscan --find --show {img_path}", shell=True, - text=True).strip() + devname = utils_sudo(["losetup", "--partscan", "--find", "--show", img_path], + capture_output=True, text=True, check=True).stdout.strip() except Exception as e: bb.fatal((f"Could not attach image: {img_path}" f" to a loop device error: {e}")) @@ -225,21 +204,34 @@ def __do_fs_mount(d): json.dump(shdata, f); f.close() - utils_chown_file(d, path) if devname[-1].isdigit(): devname += "p" + # bitbake runs unprivileged in the post-refactor architecture (cf. + # utils_sudo). The subsequent __do_platform_deploy needs to write + # uEnv.txt, ITBs and rootfs payloads to both partitions WITHOUT + # escalating each cp/tar call. Make the mounts user-writable: + # - FAT (p1): pass uid=/gid= mount opts so every file appears + # owned by the invoking user (vfat has no on-disk uid/gid). + # - ext4 (p2): mount normally, then chown the root inode to the + # user (mkfs.ext4 sets / to root:root by default; chowning just + # the top inode is enough — children inherit the new owner). + uid = os.getuid() + gid = os.getgid() + # TODO: handle more than 2 partitions try: - subprocess.run(['mount', f'/dev/{devname}1', os.path.join(WORKDIR, 'p1')], check=True) + utils_sudo(['mount', '-o', f'uid={uid},gid={gid}', + f'/dev/{devname}1', os.path.join(WORKDIR, 'p1')], check=True) except Exception as e: bb.fatal((f"Could not mount image: {IB_FILESYSTEM_PATH}" f" on /dev/{devname}1 error: {e}")) try: - subprocess.run(['mount', f'/dev/{devname}2', os.path.join(WORKDIR, 'p2')], check=True) + utils_sudo(['mount', f'/dev/{devname}2', os.path.join(WORKDIR, 'p2')], check=True) + utils_sudo(['chown', f'{uid}:{gid}', os.path.join(WORKDIR, 'p2')], check=True) except Exception as e: bb.fatal((f"Could not mount image: {IB_FILESYSTEM_PATH}" @@ -257,21 +249,13 @@ def __do_fs_mount(d): os.remove(IB_FILESYSTEM_PATH + "/p2") os.symlink(os.path.join(WORKDIR, 'p2'), IB_FILESYSTEM_PATH+"/p2") - utils_restore_user_ownership(d) - def __do_fs_umount(d): IB_FILESYSTEM_PATH = d.getVar('IB_FILESYSTEM_PATH') WORKDIR = d.getVar('WORKDIR') - # Check if the user is running the filesystem recipe as root - if utils_chk_is_root_user(d) == False: - bb.fatal("Please re-run the task/script as root") - __do_main_umount(d, 1) __do_main_umount(d, 2) - os.system("losetup -D") - - utils_restore_user_ownership(d) + utils_sudo(["losetup", "-D"]) diff --git a/build/meta-filesystem/classes/fs_rpi4.bbclass b/build/meta-filesystem/classes/fs_rpi4.bbclass index bbc7c4e..0805ac4 100644 --- a/build/meta-filesystem/classes/fs_rpi4.bbclass +++ b/build/meta-filesystem/classes/fs_rpi4.bbclass @@ -1,3 +1,5 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD # Specific task description for formatting # the storage of Raspberry Pi 4 (32-bit) (rpi4) platform diff --git a/build/meta-filesystem/classes/fs_rpi4_64.bbclass b/build/meta-filesystem/classes/fs_rpi4_64.bbclass index fbac171..e970fb4 100644 --- a/build/meta-filesystem/classes/fs_rpi4_64.bbclass +++ b/build/meta-filesystem/classes/fs_rpi4_64.bbclass @@ -1,3 +1,5 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD # Specific task description for formatting # the storage of Raspberry Pi 4 (64-bit) (rpi4_64) platform diff --git a/build/meta-filesystem/classes/fs_verdin-imx8mp.bbclass b/build/meta-filesystem/classes/fs_verdin-imx8mp.bbclass index 2eb4b68..dc2206f 100644 --- a/build/meta-filesystem/classes/fs_verdin-imx8mp.bbclass +++ b/build/meta-filesystem/classes/fs_verdin-imx8mp.bbclass @@ -1,6 +1,13 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD # Specific task description for formatting -# the storage of imx8mp-verdin platform +# the storage of imx8mp-verdin platform. +# +# bitbake runs unprivileged; root ops go through utils_sudo (`sudo -n`). +# The caller (deploy.sh / build.sh / mount.sh / umount.sh) is expected +# to have opened a sudo session beforehand. + inherit logging inherit utils @@ -10,9 +17,8 @@ IB_FILESYSTEM_PATH = "${IB_DIR}/filesystem" def __platform_init_storage(d): import os import subprocess - from bb.process import run - IB_STORAGE = d.getVar('IB_STORAGE') + IB_STORAGE_MODE = d.getVar('IB_STORAGE_MODE') IB_ROOTFS_SIZE = d.getVar('IB_ROOTFS_SIZE') IB_PLATFORM = d.getVar('IB_PLATFORM') IB_STORAGE_DEVICE = d.getVar('IB_STORAGE_DEVICE') @@ -30,9 +36,8 @@ def __platform_init_storage(d): print(f"Partitioning and formatting: {devname}") - subprocess.run(["parted", f"/dev/{devname}", "--script", "mklabel", "msdos"]) - subprocess.run(["parted", f"/dev/{devname}", "--script", "mkpart", "primary", "ext4", "2048s", "100%"]) - + utils_sudo(["parted", f"/dev/{devname}", "--script", "mklabel", "msdos"]) + utils_sudo(["parted", f"/dev/{devname}", "--script", "mkpart", "primary", "ext4", "2048s", "100%"]) print("Waiting ...") @@ -40,7 +45,7 @@ def __platform_init_storage(d): # Give a chance to the USB drive to be sync'd time.sleep(2) - subprocess.run(["mkfs.ext4", "-L", "TEZI", f"/dev/{devname}1"]) + utils_sudo(["mkfs.ext4", "-L", "TEZI", f"/dev/{devname}1"]) print("Done! The storage is now initialized") @@ -49,17 +54,11 @@ def __platform_init_storage(d): # Create and initialize the storage (including formatting partitions) def __do_fs_init_storage(d): - IB_STORAGE = d.getVar('IB_STORAGE') + IB_STORAGE_MODE = d.getVar('IB_STORAGE_MODE') IB_STORAGE_DEVICE = d.getVar('IB_STORAGE_DEVICE') WORKDIR = d.getVar("WORKDIR") - # Perform the check as this task can also be executed from a - # script or directly using bitbake - if utils_chk_is_root_user(d) == False: - bb.fatal(("Please re-run the task/script as root - " - "It is required to access loop devices")) - # Perform the tasks specific to the platform __platform_init_storage(d) @@ -72,24 +71,16 @@ def __do_fs_init_storage(d): # Remove the existing symbolic link os.unlink(target_link) - # Restore the ownership of the filesystem workdir to - # the user that ran the task - note that this is done before the filesystem - # is mounted to avoid touching the mounted rootfs - utils_chown_dir(d, WORKDIR) - os.symlink(WORKDIR, target_link) - utils_restore_user_ownership(d) - # Check the presence of the virtual disk image # if the deployment is done on the virtual ("soft") storage # and call filesystem:fs_init_storage() if it does not exist + def __do_fs_check(d): import subprocess - utils_restore_user_ownership(d) - def __do_fs_mount(d): import os @@ -99,26 +90,21 @@ def __do_fs_mount(d): IB_STORAGE_DEVICE = d.getVar('IB_STORAGE_DEVICE') IB_FILESYSTEM_PATH = d.getVar('IB_FILESYSTEM_PATH') - if utils_chk_is_root_user(d) == False: - bb.fatal("Please re-run the task/script as root") - usb_mountpoint = os.path.join(WORKDIR, "usb") if os.path.ismount(usb_mountpoint): bb.warn(f"{usb_mountpoint} is already mounted - avoid remount") - utils_restore_user_ownership(d) return os.makedirs(usb_mountpoint, exist_ok=True) try: - subprocess.run(['mount', f'/dev/{IB_STORAGE_DEVICE}1', - os.path.join(WORKDIR, 'usb')], check=True) + utils_sudo(['mount', f'/dev/{IB_STORAGE_DEVICE}1', + os.path.join(WORKDIR, 'usb')], check=True) except Exception as e: bb.fatal(f"Could not mount USB: {e}") bb.plain(f"Mounted USB at: {WORKDIR}/usb") - utils_restore_user_ownership(d) def __do_fs_umount(d): @@ -126,9 +112,6 @@ def __do_fs_umount(d): IB_FILESYSTEM_PATH = d.getVar('IB_FILESYSTEM_PATH') - if utils_chk_is_root_user(d) == False: - bb.fatal("Please re-run the task/script as root") - usb_mountpoint = f"{IB_FILESYSTEM_PATH}/work/usb" if os.path.ismount(usb_mountpoint): @@ -138,10 +121,8 @@ def __do_fs_umount(d): os.sync() time.sleep(1) - os.system(f"umount '{usb_mountpoint}'") + utils_sudo(["umount", usb_mountpoint]) else: bb.warn(f"{usb_mountpoint} wasn't mounted") - os.system(f"rm -rf '{usb_mountpoint}'") - - utils_restore_user_ownership(d) \ No newline at end of file + utils_sudo(["rm", "-rf", usb_mountpoint]) diff --git a/build/meta-filesystem/classes/fs_virt32.bbclass b/build/meta-filesystem/classes/fs_virt32.bbclass index ae6be4e..4a13093 100644 --- a/build/meta-filesystem/classes/fs_virt32.bbclass +++ b/build/meta-filesystem/classes/fs_virt32.bbclass @@ -1,3 +1,5 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD # Specific task description for formatting # the storage of virt32 platform diff --git a/build/meta-filesystem/classes/fs_virt64.bbclass b/build/meta-filesystem/classes/fs_virt64.bbclass index e8d9cb1..7b7dfc1 100644 --- a/build/meta-filesystem/classes/fs_virt64.bbclass +++ b/build/meta-filesystem/classes/fs_virt64.bbclass @@ -1,3 +1,5 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD # Specific task description for formatting # the storage of virt64 platform diff --git a/build/meta-filesystem/classes/fs_x86-pc.bbclass b/build/meta-filesystem/classes/fs_x86-pc.bbclass index 9cf9e5a..8859fc8 100644 --- a/build/meta-filesystem/classes/fs_x86-pc.bbclass +++ b/build/meta-filesystem/classes/fs_x86-pc.bbclass @@ -1,15 +1,20 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD # TODO: move to a Python function # Specific task description for formatting -# the storage of x86 platform with one partition +# the storage of x86 platform with one partition. +# +# bitbake runs unprivileged; each privileged tool is invoked with +# `sudo -n` and assumes the caller pre-opened a sudo session. do_filesystem_platform_init_storage () { # Partition layout is as follows: # - Partition #1: 8 GB with rootfs including kernel image and GRUB - if [ "${IB_STORAGE}" = "soft" ]; then + if [ "${IB_STORAGE_MODE}" = "soft" ]; then # Create image first bbnote "Creating sdcard.img.${IB_PLATFORM} ..." @@ -17,7 +22,7 @@ do_filesystem_platform_init_storage () { truncate -s $dd_size ${WORKDIR}/sdcard.img.${IB_PLATFORM} - devname=$(losetup --partscan --find --show ${WORKDIR}/sdcard.img.${IB_PLATFORM}) + devname=$(sudo -n losetup --partscan --find --show ${WORKDIR}/sdcard.img.${IB_PLATFORM}) # Keep device name only without /dev/ devname=${devname#"/dev/"} @@ -36,7 +41,7 @@ do_filesystem_platform_init_storage () { # Create the partition layout this way - parted -s /dev/"$devname" mklabel msdos mkpart primary ext4 1MiB 100% + sudo -n parted -s /dev/"$devname" mklabel msdos mkpart primary ext4 1MiB 100% bbnote Waiting... @@ -49,13 +54,13 @@ do_filesystem_platform_init_storage () { set +e - mke2fs -F -t ext4 /dev/"$devname"1 - e2label /dev/"$devname"1 rootfs + sudo -n mke2fs -F -t ext4 /dev/"$devname"1 + sudo -n e2label /dev/"$devname"1 rootfs set -e - if [ "${IB_STORAGE}" = "soft" ]; then - losetup -D + if [ "${IB_STORAGE_MODE}" = "soft" ]; then + sudo -n losetup -D fi bbnote "Done! The storage is now initialized" diff --git a/build/meta-filesystem/classes/fs_x86-qemu.bbclass b/build/meta-filesystem/classes/fs_x86-qemu.bbclass index 5d650d2..7092fb7 100644 --- a/build/meta-filesystem/classes/fs_x86-qemu.bbclass +++ b/build/meta-filesystem/classes/fs_x86-qemu.bbclass @@ -1,13 +1,17 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD # Specific task description for formatting -# the storage of QEMU/x86 platform with one partition +# the storage of QEMU/x86 platform with one partition. +# +# bitbake runs unprivileged; root ops go through utils_sudo (`sudo -n`). def do_filesystem_platform_init_storage(d): import os import subprocess - IB_STORAGE = d.getVar('IB_STORAGE') + IB_STORAGE_MODE = d.getVar('IB_STORAGE_MODE') IB_PLATFORM = d.getVar('IB_PLATFORM') IB_DIR = d.getVar('IB_DIR') WORKDIR = d.getVar('WORKDIR') @@ -17,7 +21,7 @@ def do_filesystem_platform_init_storage(d): # Partition layout is as follows: # - Partition #1: 8 GB with rootfs including kernel image and GRUB - if IB_STORAGE != "soft": + if IB_STORAGE_MODE != "soft": raise ValueError("Cannot be a hard storage deployment ...") # Create image first @@ -27,7 +31,9 @@ def do_filesystem_platform_init_storage(d): subprocess.run(["truncate", "-s", dd_size, os.path.join(WORKDIR, store_filename)]) - devname = subprocess.check_output(["losetup", "--partscan", "--find", "--show", os.path.join(WORKDIR, "sdcard.img.{}".format(IB_PLATFORM))], text=True).strip() + devname = utils_sudo(["losetup", "--partscan", "--find", "--show", + os.path.join(WORKDIR, "sdcard.img.{}".format(IB_PLATFORM))], + capture_output=True, text=True).stdout.strip() # Keep device name only without /dev/ devname = devname.replace("/dev/", "") @@ -50,7 +56,7 @@ def do_filesystem_platform_init_storage(d): # Create the partition layout this way fdisk_input = "o\nn\np\n\n\n\n\n\nw\n" - subprocess.run(["fdisk", "/dev/{}".format(devname)], input=fdisk_input.encode()) + utils_sudo(["fdisk", "/dev/{}".format(devname)], input=fdisk_input.encode()) print("Waiting ...") @@ -60,12 +66,9 @@ def do_filesystem_platform_init_storage(d): if devname[-1].isdigit(): devname += "p" - subprocess.run(["mke2fs", "-F", "-t", "ext4", "/dev/{}1".format(devname)]) - subprocess.run(["e2label", "/dev/{}1".format(devname), "rootfs"]) + utils_sudo(["mke2fs", "-F", "-t", "ext4", "/dev/{}1".format(devname)]) + utils_sudo(["e2label", "/dev/{}1".format(devname), "rootfs"]) - subprocess.run(["losetup", "-D"]) + utils_sudo(["losetup", "-D"]) print("Done! The storage is now initialized") - - - diff --git a/build/meta-filesystem/conf/layer.conf b/build/meta-filesystem/conf/layer.conf index 0275b1b..59cf96a 100644 --- a/build/meta-filesystem/conf/layer.conf +++ b/build/meta-filesystem/conf/layer.conf @@ -1,3 +1,6 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + BBPATH .= ":${LAYERDIR}" BBFILES += "${LAYERDIR}/recipes-*/*/*.bb ${LAYERDIR}/recipes-*/*/*.bbappend" diff --git a/build/meta-filesystem/recipes-filesystem/generic/filesystem_1.0.0.bb b/build/meta-filesystem/recipes-filesystem/generic/filesystem_1.0.0.bb index 18e5d03..21eb562 100644 --- a/build/meta-filesystem/recipes-filesystem/generic/filesystem_1.0.0.bb +++ b/build/meta-filesystem/recipes-filesystem/generic/filesystem_1.0.0.bb @@ -1,3 +1,5 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD SUMMARY = "Filesystem management" DESCRIPTION = "This is the core filesystem recipe to create a virtual or physical \ diff --git a/build/meta-linux/classes/linux.bbclass b/build/meta-linux/classes/linux.bbclass index cd07919..5a404ea 100644 --- a/build/meta-linux/classes/linux.bbclass +++ b/build/meta-linux/classes/linux.bbclass @@ -1,3 +1,5 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD # Class of Linux layer diff --git a/build/meta-linux/conf/layer.conf b/build/meta-linux/conf/layer.conf index 5a8dc05..62ead72 100644 --- a/build/meta-linux/conf/layer.conf +++ b/build/meta-linux/conf/layer.conf @@ -1,3 +1,6 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + BBPATH .= ":${LAYERDIR}" BBFILES += "${LAYERDIR}/recipes-*/*/*.bb ${LAYERDIR}/recipes-*/*/*.bbappend" diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0-patches.inc b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0-patches.inc index 187f046..1576bdb 100644 --- a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0-patches.inc +++ b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0-patches.inc @@ -1,7 +1,8 @@ SRC_URI += "\ - file://0011-Makefile.patch \ - file://0003-virt64_defconfig.patch \ file://0002-virt64_guest.dts.patch \ + file://0003-virt64_defconfig.patch \ file://0004-virt64.dts.patch \ file://0005-Makefile.patch \ + file://0011-Makefile.patch \ + file://0053-virt64_defconfig.patch \ " diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0002-virt64_guest.dts.patch b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0002-virt64_guest.dts.patch index 7408499..37402d6 100644 --- a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0002-virt64_guest.dts.patch +++ b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0002-virt64_guest.dts.patch @@ -1,6 +1,6 @@ ---- /home/rossierd/soo/infrabase/build/tmp/work/linux-6.12-r0/linux-6.12/arch/arm64/boot/dts/arm/virt64_guest.dts 1970-01-01 01:00:00.000000000 +0100 -+++ ./arch/arm64/boot/dts/arm/virt64_guest.dts 2025-08-27 08:31:08.947351137 +0200 -@@ -0,0 +1,406 @@ +--- /dev/null 2026-03-20 16:30:38.468300202 +0100 ++++ ./arch/arm64/boot/dts/arm/virt64_guest.dts 2026-03-20 16:55:19.220277261 +0100 +@@ -0,0 +1,425 @@ +/dts-v1/; + +/ { @@ -278,28 +278,6 @@ + compatible = "virtio,mmio"; + }; + -+ gpio-keys { -+ #address-cells = <0x01>; -+ #size-cells = <0x00>; -+ compatible = "gpio-keys"; -+ -+ poweroff { -+ gpios = <&pl061 0x03 0x00>; -+ linux,code = <0x74>; -+ label = "GPIO Key Poweroff"; -+ }; -+ }; -+ -+ pl061: pl061@9030000 { -+ clock-names = "apb_pclk"; -+ clocks = <&apb_clk>; -+ interrupts = <0x00 0x07 0x04>; -+ gpio-controller; -+ #gpio-cells = <0x02>; -+ compatible = "arm,pl061\0arm,primecell"; -+ reg = <0x00 0x9030000 0x00 0x1000>; -+ }; -+ + pcie@10000000 { + interrupt-map-mask = <0x1800 0x00 0x00 0x07>; + interrupt-map = <0x00 0x00 0x00 0x01 0x8001 0x00 0x00 0x00 0x03 0x04 0x00 0x00 0x00 0x02 0x8001 0x00 0x00 0x00 0x04 0x04 0x00 0x00 0x00 0x03 0x8001 0x00 0x00 0x00 0x05 0x04 0x00 0x00 0x00 0x04 0x8001 0x00 0x00 0x00 0x06 0x04 0x800 0x00 0x00 0x01 0x8001 0x00 0x00 0x00 0x04 0x04 0x800 0x00 0x00 0x02 0x8001 0x00 0x00 0x00 0x05 0x04 0x800 0x00 0x00 0x03 0x8001 0x00 0x00 0x00 0x06 0x04 0x800 0x00 0x00 0x04 0x8001 0x00 0x00 0x00 0x03 0x04 0x1000 0x00 0x00 0x01 0x8001 0x00 0x00 0x00 0x05 0x04 0x1000 0x00 0x00 0x02 0x8001 0x00 0x00 0x00 0x06 0x04 0x1000 0x00 0x00 0x03 0x8001 0x00 0x00 0x00 0x03 0x04 0x1000 0x00 0x00 0x04 0x8001 0x00 0x00 0x00 0x04 0x04 0x1800 0x00 0x00 0x01 0x8001 0x00 0x00 0x00 0x06 0x04 0x1800 0x00 0x00 0x02 0x8001 0x00 0x00 0x00 0x03 0x04 0x1800 0x00 0x00 0x03 0x8001 0x00 0x00 0x00 0x04 0x04 0x1800 0x00 0x00 0x04 0x8001 0x00 0x00 0x00 0x05 0x04>; @@ -316,14 +294,6 @@ + compatible = "pci-host-ecam-generic"; + }; + -+ pl031@9010000 { -+ clock-names = "apb_pclk"; -+ clocks = <&apb_clk>; -+ interrupts = <0x00 0x02 0x04>; -+ reg = <0x00 0x9010000 0x00 0x1000>; -+ compatible = "arm,pl031\0arm,primecell"; -+ }; -+ + pl011@9000000 { + clock-names = "uartclk\0apb_pclk"; + clocks = <&apb_clk &apb_clk>; @@ -406,4 +376,53 @@ + compatible = "fixed-clock"; + }; + ++ clcd_clk: clcd-clk { ++ compatible = "fixed-clock"; ++ #clock-cells = <0x00>; ++ clock-frequency = <25175000>; ++ clock-output-names = "clcdclk"; ++ }; ++ ++ panel: panel { ++ compatible = "panel-dpi"; ++ width-mm = <152>; ++ height-mm = <91>; ++ ++ panel-timing { ++ clock-frequency = <25175000>; ++ hactive = <640>; ++ vactive = <480>; ++ hback-porch = <48>; ++ hfront-porch = <16>; ++ hsync-len = <96>; ++ vback-porch = <33>; ++ vfront-porch = <10>; ++ vsync-len = <2>; ++ hsync-active = <0>; ++ vsync-active = <0>; ++ de-active = <1>; ++ pixelclk-active = <0>; ++ }; ++ ++ port { ++ panel_in: endpoint { ++ remote-endpoint = <&clcd_out>; ++ }; ++ }; ++ }; ++ ++ clcd@8800000 { ++ compatible = "arm,pl111", "arm,primecell"; ++ reg = <0x00 0x8800000 0x00 0x1000>; ++ interrupts = <0x00 0x0a 0x04>; ++ clocks = <&clcd_clk>, <&apb_clk>; ++ clock-names = "clcdclk", "apb_pclk"; ++ ++ port { ++ clcd_out: endpoint { ++ remote-endpoint = <&panel_in>; ++ }; ++ }; ++ }; ++ +}; diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0003-virt64_defconfig.patch b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0003-virt64_defconfig.patch index 184c56b..3722811 100644 --- a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0003-virt64_defconfig.patch +++ b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0003-virt64_defconfig.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/infrabase/build/tmp/work/linux-6.12-r0/linux-6.12/arch/arm64/configs/virt64_defconfig 1970-01-01 01:00:00.000000000 +0100 +++ ./arch/arm64/configs/virt64_defconfig 2025-05-27 18:49:40.454170662 +0200 -@@ -0,0 +1,9021 @@ +@@ -0,0 +1,9028 @@ +# +# Automatically generated file; DO NOT EDIT. +# Linux/arm64 6.12.0 Kernel Configuration @@ -4417,6 +4417,7 @@ +# +# CONFIG_DRM_PANEL_ABT_Y030XX067A is not set +# CONFIG_DRM_PANEL_ARM_VERSATILE is not set ++CONFIG_DRM_PANEL_SIMPLE=y +# CONFIG_DRM_PANEL_AUO_A030JTN01 is not set +# CONFIG_DRM_PANEL_ILITEK_IL9322 is not set +# CONFIG_DRM_PANEL_INNOLUX_EJ030NA is not set @@ -4511,7 +4512,7 @@ +# CONFIG_TINYDRM_REPAPER is not set +# CONFIG_TINYDRM_ST7586 is not set +# CONFIG_TINYDRM_ST7735R is not set -+# CONFIG_DRM_PL111 is not set ++CONFIG_DRM_PL111=y +# CONFIG_DRM_XEN_FRONTEND is not set +# CONFIG_DRM_LIMA is not set +# CONFIG_DRM_PANFROST is not set @@ -4591,7 +4592,7 @@ +# Backlight & LCD device support +# +# CONFIG_LCD_CLASS_DEVICE is not set -+# CONFIG_BACKLIGHT_CLASS_DEVICE is not set ++CONFIG_BACKLIGHT_CLASS_DEVICE=y +# end of Backlight & LCD device support + +CONFIG_HDMI=y @@ -8867,10 +8868,17 @@ +# CONFIG_PANIC_ON_OOPS is not set +CONFIG_PANIC_ON_OOPS_VALUE=0 +CONFIG_PANIC_TIMEOUT=0 -+# CONFIG_SOFTLOCKUP_DETECTOR is not set ++CONFIG_LOCKUP_DETECTOR=y ++CONFIG_SOFTLOCKUP_DETECTOR=y ++CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC=0 +CONFIG_HAVE_HARDLOCKUP_DETECTOR_BUDDY=y -+# CONFIG_HARDLOCKUP_DETECTOR is not set -+# CONFIG_DETECT_HUNG_TASK is not set ++CONFIG_HARDLOCKUP_DETECTOR_BUDDY=y ++CONFIG_HARDLOCKUP_DETECTOR=y ++CONFIG_HARDLOCKUP_DETECTOR_COUNTS_HRTIMER=y ++CONFIG_BOOTPARAM_HARDLOCKUP_PANIC=0 ++CONFIG_DETECT_HUNG_TASK=y ++CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=10 ++CONFIG_BOOTPARAM_HUNG_TASK_PANIC=0 +# CONFIG_WQ_WATCHDOG is not set +# CONFIG_WQ_CPU_INTENSIVE_REPORT is not set +# CONFIG_TEST_LOCKUP is not set diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0021-Makefile.patch b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0021-Makefile.patch new file mode 100644 index 0000000..dcc3136 --- /dev/null +++ b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0021-Makefile.patch @@ -0,0 +1,10 @@ +--- a/arch/arm64/boot/dts/arm/Makefile ++++ b/arch/arm64/boot/dts/arm/Makefile +@@ -7,3 +7,7 @@ + dtb-$(CONFIG_ARCH_VEXPRESS) += vexpress-v2f-1xv7-ca53x2.dtb + dtb-$(CONFIG_ARCH_VEXPRESS) += fvp-base-revc.dtb + dtb-$(CONFIG_ARCH_VEXPRESS) += corstone1000-fvp.dtb corstone1000-mps3.dtb ++ ++# Infrabase ++dtb-$(CONFIG_ARCH_VEXPRESS) += virt64.dtb virt64_guest.dtb ++ diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0022-virt64.dts.patch b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0022-virt64.dts.patch new file mode 100644 index 0000000..4c08dc8 --- /dev/null +++ b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0022-virt64.dts.patch @@ -0,0 +1,392 @@ +--- a/arch/arm64/boot/dts/arm/virt64.dts ++++ b/arch/arm64/boot/dts/arm/virt64.dts +@@ -0,0 +1,389 @@ ++/dts-v1/; ++ ++/ { ++ interrupt-parent = <0x8001>; ++ #size-cells = <0x02>; ++ #address-cells = <0x02>; ++ compatible = "linux,dummy-virt"; ++ ++ psci { ++ migrate = <0xc4000005>; ++ cpu_on = <0xc4000003>; ++ cpu_off = <0x84000002>; ++ cpu_suspend = <0xc4000001>; ++ method = "hvc"; ++ compatible = "arm,psci-0.2\0arm,psci"; ++ }; ++ ++ memory@40000000 { ++ reg = <0x00 0x40000000 0x0 0x40000000>; ++ device_type = "memory"; ++ }; ++ ++ platform@c000000 { ++ interrupt-parent = <0x8001>; ++ ranges = <0x00 0x00 0xc000000 0x2000000>; ++ #address-cells = <0x01>; ++ #size-cells = <0x01>; ++ compatible = "qemu,platform\0simple-bus"; ++ }; ++ ++ fw-cfg@9020000 { ++ dma-coherent; ++ reg = <0x00 0x9020000 0x00 0x18>; ++ compatible = "qemu,fw-cfg-mmio"; ++ }; ++ ++ virtio_mmio@a000000 { ++ dma-coherent; ++ interrupts = <0x00 0x10 0x01>; ++ reg = <0x00 0xa000000 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a000200 { ++ dma-coherent; ++ interrupts = <0x00 0x11 0x01>; ++ reg = <0x00 0xa000200 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a000400 { ++ dma-coherent; ++ interrupts = <0x00 0x12 0x01>; ++ reg = <0x00 0xa000400 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a000600 { ++ dma-coherent; ++ interrupts = <0x00 0x13 0x01>; ++ reg = <0x00 0xa000600 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a000800 { ++ dma-coherent; ++ interrupts = <0x00 0x14 0x01>; ++ reg = <0x00 0xa000800 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a000a00 { ++ dma-coherent; ++ interrupts = <0x00 0x15 0x01>; ++ reg = <0x00 0xa000a00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a000c00 { ++ dma-coherent; ++ interrupts = <0x00 0x16 0x01>; ++ reg = <0x00 0xa000c00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a000e00 { ++ dma-coherent; ++ interrupts = <0x00 0x17 0x01>; ++ reg = <0x00 0xa000e00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a001000 { ++ dma-coherent; ++ interrupts = <0x00 0x18 0x01>; ++ reg = <0x00 0xa001000 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a001200 { ++ dma-coherent; ++ interrupts = <0x00 0x19 0x01>; ++ reg = <0x00 0xa001200 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a001400 { ++ dma-coherent; ++ interrupts = <0x00 0x1a 0x01>; ++ reg = <0x00 0xa001400 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a001600 { ++ dma-coherent; ++ interrupts = <0x00 0x1b 0x01>; ++ reg = <0x00 0xa001600 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a001800 { ++ dma-coherent; ++ interrupts = <0x00 0x1c 0x01>; ++ reg = <0x00 0xa001800 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a001a00 { ++ dma-coherent; ++ interrupts = <0x00 0x1d 0x01>; ++ reg = <0x00 0xa001a00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a001c00 { ++ dma-coherent; ++ interrupts = <0x00 0x1e 0x01>; ++ reg = <0x00 0xa001c00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a001e00 { ++ dma-coherent; ++ interrupts = <0x00 0x1f 0x01>; ++ reg = <0x00 0xa001e00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a002000 { ++ dma-coherent; ++ interrupts = <0x00 0x20 0x01>; ++ reg = <0x00 0xa002000 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a002200 { ++ dma-coherent; ++ interrupts = <0x00 0x21 0x01>; ++ reg = <0x00 0xa002200 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a002400 { ++ dma-coherent; ++ interrupts = <0x00 0x22 0x01>; ++ reg = <0x00 0xa002400 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a002600 { ++ dma-coherent; ++ interrupts = <0x00 0x23 0x01>; ++ reg = <0x00 0xa002600 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a002800 { ++ dma-coherent; ++ interrupts = <0x00 0x24 0x01>; ++ reg = <0x00 0xa002800 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a002a00 { ++ dma-coherent; ++ interrupts = <0x00 0x25 0x01>; ++ reg = <0x00 0xa002a00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a002c00 { ++ dma-coherent; ++ interrupts = <0x00 0x26 0x01>; ++ reg = <0x00 0xa002c00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a002e00 { ++ dma-coherent; ++ interrupts = <0x00 0x27 0x01>; ++ reg = <0x00 0xa002e00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a003000 { ++ dma-coherent; ++ interrupts = <0x00 0x28 0x01>; ++ reg = <0x00 0xa003000 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a003200 { ++ dma-coherent; ++ interrupts = <0x00 0x29 0x01>; ++ reg = <0x00 0xa003200 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a003400 { ++ dma-coherent; ++ interrupts = <0x00 0x2a 0x01>; ++ reg = <0x00 0xa003400 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a003600 { ++ dma-coherent; ++ interrupts = <0x00 0x2b 0x01>; ++ reg = <0x00 0xa003600 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a003800 { ++ dma-coherent; ++ interrupts = <0x00 0x2c 0x01>; ++ reg = <0x00 0xa003800 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a003a00 { ++ dma-coherent; ++ interrupts = <0x00 0x2d 0x01>; ++ reg = <0x00 0xa003a00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a003c00 { ++ dma-coherent; ++ interrupts = <0x00 0x2e 0x01>; ++ reg = <0x00 0xa003c00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a003e00 { ++ dma-coherent; ++ interrupts = <0x00 0x2f 0x01>; ++ reg = <0x00 0xa003e00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ gpio-keys { ++ #address-cells = <0x01>; ++ #size-cells = <0x00>; ++ compatible = "gpio-keys"; ++ ++ poweroff { ++ gpios = <&pl061 0x03 0x00>; ++ linux,code = <0x74>; ++ label = "GPIO Key Poweroff"; ++ }; ++ }; ++ ++ pl061: pl061@9030000 { ++ clock-names = "apb_pclk"; ++ clocks = <&apb_clk>; ++ interrupts = <0x00 0x07 0x04>; ++ gpio-controller; ++ #gpio-cells = <0x02>; ++ compatible = "arm,pl061\0arm,primecell"; ++ reg = <0x00 0x9030000 0x00 0x1000>; ++ }; ++ ++ pcie@10000000 { ++ interrupt-map-mask = <0x1800 0x00 0x00 0x07>; ++ interrupt-map = <0x00 0x00 0x00 0x01 0x8001 0x00 0x00 0x00 0x03 0x04 0x00 0x00 0x00 0x02 0x8001 0x00 0x00 0x00 0x04 0x04 0x00 0x00 0x00 0x03 0x8001 0x00 0x00 0x00 0x05 0x04 0x00 0x00 0x00 0x04 0x8001 0x00 0x00 0x00 0x06 0x04 0x800 0x00 0x00 0x01 0x8001 0x00 0x00 0x00 0x04 0x04 0x800 0x00 0x00 0x02 0x8001 0x00 0x00 0x00 0x05 0x04 0x800 0x00 0x00 0x03 0x8001 0x00 0x00 0x00 0x06 0x04 0x800 0x00 0x00 0x04 0x8001 0x00 0x00 0x00 0x03 0x04 0x1000 0x00 0x00 0x01 0x8001 0x00 0x00 0x00 0x05 0x04 0x1000 0x00 0x00 0x02 0x8001 0x00 0x00 0x00 0x06 0x04 0x1000 0x00 0x00 0x03 0x8001 0x00 0x00 0x00 0x03 0x04 0x1000 0x00 0x00 0x04 0x8001 0x00 0x00 0x00 0x04 0x04 0x1800 0x00 0x00 0x01 0x8001 0x00 0x00 0x00 0x06 0x04 0x1800 0x00 0x00 0x02 0x8001 0x00 0x00 0x00 0x03 0x04 0x1800 0x00 0x00 0x03 0x8001 0x00 0x00 0x00 0x04 0x04 0x1800 0x00 0x00 0x04 0x8001 0x00 0x00 0x00 0x05 0x04>; ++ #interrupt-cells = <0x01>; ++ ranges = <0x1000000 0x00 0x00 0x00 0x3eff0000 0x00 0x10000 0x2000000 0x00 0x10000000 0x00 0x10000000 0x00 0x2eff0000 0x3000000 0x80 0x00 0x80 0x00 0x80 0x00>; ++ reg = <0x40 0x10000000 0x00 0x10000000>; ++ msi-parent = <&v2m>; ++ dma-coherent; ++ bus-range = <0x00 0xff>; ++ linux,pci-domain = <0x00>; ++ #size-cells = <0x02>; ++ #address-cells = <0x03>; ++ device_type = "pci"; ++ compatible = "pci-host-ecam-generic"; ++ }; ++ ++ pl031@9010000 { ++ clock-names = "apb_pclk"; ++ clocks = <&apb_clk>; ++ interrupts = <0x00 0x02 0x04>; ++ reg = <0x00 0x9010000 0x00 0x1000>; ++ compatible = "arm,pl031\0arm,primecell"; ++ }; ++ ++ pl011@9000000 { ++ clock-names = "uartclk\0apb_pclk"; ++ clocks = <&apb_clk &apb_clk>; ++ interrupts = <0x00 0x01 0x04>; ++ reg = <0x00 0x9000000 0x00 0x1000>; ++ compatible = "arm,pl011\0arm,primecell"; ++ }; ++ ++ pmu { ++ interrupts = <0x01 0x07 0xf04>; ++ compatible = "arm,armv8-pmuv3"; ++ }; ++ ++ intc@8000000 { ++ phandle = <0x8001>; ++ reg = <0x00 0x8000000 0x00 0x10000 0x00 0x8010000 0x00 0x10000>; ++ compatible = "arm,cortex-a15-gic"; ++ ranges; ++ #size-cells = <0x02>; ++ #address-cells = <0x02>; ++ interrupt-controller; ++ #interrupt-cells = <0x03>; ++ ++ v2m: v2m@8020000 { ++ reg = <0x00 0x8020000 0x00 0x1000>; ++ msi-controller; ++ compatible = "arm,gic-v2m-frame"; ++ }; ++ }; ++ ++ flash@0 { ++ bank-width = <0x04>; ++ reg = <0x00 0x00 0x00 0x4000000 0x00 0x4000000 0x00 0x4000000>; ++ compatible = "cfi-flash"; ++ }; ++ ++ cpus { ++ #size-cells = <0x00>; ++ #address-cells = <0x01>; ++ ++ cpu@0 { ++ reg = <0x00>; ++ enable-method = "psci"; ++ compatible = "arm,cortex-a72"; ++ device_type = "cpu"; ++ }; ++ ++ cpu@1 { ++ reg = <0x01>; ++ enable-method = "psci"; ++ compatible = "arm,cortex-a72"; ++ device_type = "cpu"; ++ }; ++ ++ cpu@2 { ++ reg = <0x02>; ++ enable-method = "psci"; ++ compatible = "arm,cortex-a72"; ++ device_type = "cpu"; ++ }; ++ ++ cpu@3 { ++ reg = <0x03>; ++ enable-method = "psci"; ++ compatible = "arm,cortex-a72"; ++ device_type = "cpu"; ++ }; ++ }; ++ ++ timer { ++ interrupts = <0x01 0x0d 0xf04 0x01 0x0e 0xf04 0x01 0x0b 0xf04 0x01 0x0a 0xf04>; ++ always-on; ++ compatible = "arm,armv8-timer\0arm,armv7-timer"; ++ }; ++ ++ apb_clk: apb-pclk { ++ clock-output-names = "clk24mhz"; ++ clock-frequency = <0x16e3600>; ++ #clock-cells = <0x00>; ++ compatible = "fixed-clock"; ++ }; ++ ++}; diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0023-virt64_guest.dts.patch b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0023-virt64_guest.dts.patch new file mode 100644 index 0000000..ef33a72 --- /dev/null +++ b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0023-virt64_guest.dts.patch @@ -0,0 +1,428 @@ +--- a/arch/arm64/boot/dts/arm/virt64_guest.dts ++++ b/arch/arm64/boot/dts/arm/virt64_guest.dts +@@ -0,0 +1,425 @@ ++/dts-v1/; ++ ++/ { ++ interrupt-parent = <0x8001>; ++ #size-cells = <0x02>; ++ #address-cells = <0x02>; ++ compatible = "linux,dummy-virt"; ++ ++ reserved-memory { ++ #address-cells = <2>; ++ #size-cells = <2>; ++ ranges; ++ linux,cma { ++ compatible = "shared-dma-pool"; ++ reusable; ++ size = <0x0 0x6000000>; ++ alignment = <0x0 0x1000>; ++ linux,cma-default; ++ }; ++ }; ++ ++ console { ++ focus-dom-max = <3>; ++ }; ++ ++ psci { ++ migrate = <0xc4000005>; ++ cpu_on = <0xc4000003>; ++ cpu_off = <0x84000002>; ++ cpu_suspend = <0xc4000001>; ++ method = "hvc"; ++ compatible = "arm,psci-0.2\0arm,psci"; ++ }; ++ ++ memory@41000000 { ++ reg = <0x00 0x41000000 0x00 0x20000000>; ++ device_type = "memory"; ++ }; ++ ++ platform@c000000 { ++ interrupt-parent = <0x8001>; ++ ranges = <0x00 0x00 0xc000000 0x2000000>; ++ #address-cells = <0x01>; ++ #size-cells = <0x01>; ++ compatible = "qemu,platform\0simple-bus"; ++ }; ++ ++ fw-cfg@9020000 { ++ dma-coherent; ++ reg = <0x00 0x9020000 0x00 0x18>; ++ compatible = "qemu,fw-cfg-mmio"; ++ }; ++ ++ virtio_mmio@a000000 { ++ dma-coherent; ++ interrupts = <0x00 0x10 0x01>; ++ reg = <0x00 0xa000000 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a000200 { ++ dma-coherent; ++ interrupts = <0x00 0x11 0x01>; ++ reg = <0x00 0xa000200 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a000400 { ++ dma-coherent; ++ interrupts = <0x00 0x12 0x01>; ++ reg = <0x00 0xa000400 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a000600 { ++ dma-coherent; ++ interrupts = <0x00 0x13 0x01>; ++ reg = <0x00 0xa000600 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a000800 { ++ dma-coherent; ++ interrupts = <0x00 0x14 0x01>; ++ reg = <0x00 0xa000800 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a000a00 { ++ dma-coherent; ++ interrupts = <0x00 0x15 0x01>; ++ reg = <0x00 0xa000a00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a000c00 { ++ dma-coherent; ++ interrupts = <0x00 0x16 0x01>; ++ reg = <0x00 0xa000c00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a000e00 { ++ dma-coherent; ++ interrupts = <0x00 0x17 0x01>; ++ reg = <0x00 0xa000e00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a001000 { ++ dma-coherent; ++ interrupts = <0x00 0x18 0x01>; ++ reg = <0x00 0xa001000 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a001200 { ++ dma-coherent; ++ interrupts = <0x00 0x19 0x01>; ++ reg = <0x00 0xa001200 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a001400 { ++ dma-coherent; ++ interrupts = <0x00 0x1a 0x01>; ++ reg = <0x00 0xa001400 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a001600 { ++ dma-coherent; ++ interrupts = <0x00 0x1b 0x01>; ++ reg = <0x00 0xa001600 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a001800 { ++ dma-coherent; ++ interrupts = <0x00 0x1c 0x01>; ++ reg = <0x00 0xa001800 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a001a00 { ++ dma-coherent; ++ interrupts = <0x00 0x1d 0x01>; ++ reg = <0x00 0xa001a00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a001c00 { ++ dma-coherent; ++ interrupts = <0x00 0x1e 0x01>; ++ reg = <0x00 0xa001c00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a001e00 { ++ dma-coherent; ++ interrupts = <0x00 0x1f 0x01>; ++ reg = <0x00 0xa001e00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a002000 { ++ dma-coherent; ++ interrupts = <0x00 0x20 0x01>; ++ reg = <0x00 0xa002000 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a002200 { ++ dma-coherent; ++ interrupts = <0x00 0x21 0x01>; ++ reg = <0x00 0xa002200 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a002400 { ++ dma-coherent; ++ interrupts = <0x00 0x22 0x01>; ++ reg = <0x00 0xa002400 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a002600 { ++ dma-coherent; ++ interrupts = <0x00 0x23 0x01>; ++ reg = <0x00 0xa002600 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a002800 { ++ dma-coherent; ++ interrupts = <0x00 0x24 0x01>; ++ reg = <0x00 0xa002800 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a002a00 { ++ dma-coherent; ++ interrupts = <0x00 0x25 0x01>; ++ reg = <0x00 0xa002a00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a002c00 { ++ dma-coherent; ++ interrupts = <0x00 0x26 0x01>; ++ reg = <0x00 0xa002c00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a002e00 { ++ dma-coherent; ++ interrupts = <0x00 0x27 0x01>; ++ reg = <0x00 0xa002e00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a003000 { ++ dma-coherent; ++ interrupts = <0x00 0x28 0x01>; ++ reg = <0x00 0xa003000 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a003200 { ++ dma-coherent; ++ interrupts = <0x00 0x29 0x01>; ++ reg = <0x00 0xa003200 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a003400 { ++ dma-coherent; ++ interrupts = <0x00 0x2a 0x01>; ++ reg = <0x00 0xa003400 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a003600 { ++ dma-coherent; ++ interrupts = <0x00 0x2b 0x01>; ++ reg = <0x00 0xa003600 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a003800 { ++ dma-coherent; ++ interrupts = <0x00 0x2c 0x01>; ++ reg = <0x00 0xa003800 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a003a00 { ++ dma-coherent; ++ interrupts = <0x00 0x2d 0x01>; ++ reg = <0x00 0xa003a00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a003c00 { ++ dma-coherent; ++ interrupts = <0x00 0x2e 0x01>; ++ reg = <0x00 0xa003c00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a003e00 { ++ dma-coherent; ++ interrupts = <0x00 0x2f 0x01>; ++ reg = <0x00 0xa003e00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ pcie@10000000 { ++ interrupt-map-mask = <0x1800 0x00 0x00 0x07>; ++ interrupt-map = <0x00 0x00 0x00 0x01 0x8001 0x00 0x00 0x00 0x03 0x04 0x00 0x00 0x00 0x02 0x8001 0x00 0x00 0x00 0x04 0x04 0x00 0x00 0x00 0x03 0x8001 0x00 0x00 0x00 0x05 0x04 0x00 0x00 0x00 0x04 0x8001 0x00 0x00 0x00 0x06 0x04 0x800 0x00 0x00 0x01 0x8001 0x00 0x00 0x00 0x04 0x04 0x800 0x00 0x00 0x02 0x8001 0x00 0x00 0x00 0x05 0x04 0x800 0x00 0x00 0x03 0x8001 0x00 0x00 0x00 0x06 0x04 0x800 0x00 0x00 0x04 0x8001 0x00 0x00 0x00 0x03 0x04 0x1000 0x00 0x00 0x01 0x8001 0x00 0x00 0x00 0x05 0x04 0x1000 0x00 0x00 0x02 0x8001 0x00 0x00 0x00 0x06 0x04 0x1000 0x00 0x00 0x03 0x8001 0x00 0x00 0x00 0x03 0x04 0x1000 0x00 0x00 0x04 0x8001 0x00 0x00 0x00 0x04 0x04 0x1800 0x00 0x00 0x01 0x8001 0x00 0x00 0x00 0x06 0x04 0x1800 0x00 0x00 0x02 0x8001 0x00 0x00 0x00 0x03 0x04 0x1800 0x00 0x00 0x03 0x8001 0x00 0x00 0x00 0x04 0x04 0x1800 0x00 0x00 0x04 0x8001 0x00 0x00 0x00 0x05 0x04>; ++ #interrupt-cells = <0x01>; ++ ranges = <0x1000000 0x00 0x00 0x00 0x3eff0000 0x00 0x10000 0x2000000 0x00 0x10000000 0x00 0x10000000 0x00 0x2eff0000 0x3000000 0x80 0x00 0x80 0x00 0x80 0x00>; ++ reg = <0x40 0x10000000 0x00 0x10000000>; ++ msi-parent = <&v2m>; ++ dma-coherent; ++ bus-range = <0x00 0xff>; ++ linux,pci-domain = <0x00>; ++ #size-cells = <0x02>; ++ #address-cells = <0x03>; ++ device_type = "pci"; ++ compatible = "pci-host-ecam-generic"; ++ }; ++ ++ pl011@9000000 { ++ clock-names = "uartclk\0apb_pclk"; ++ clocks = <&apb_clk &apb_clk>; ++ interrupts = <0x00 0x01 0x04>; ++ reg = <0x00 0x9000000 0x00 0x1000>; ++ compatible = "arm,pl011\0arm,primecell"; ++ }; ++ ++ pmu { ++ interrupts = <0x01 0x07 0xf04>; ++ compatible = "arm,armv8-pmuv3"; ++ }; ++ ++ intc@8000000 { ++ phandle = <0x8001>; ++ reg = <0x00 0x8000000 0x00 0x10000 0x00 0x8010000 0x00 0x10000>; ++ compatible = "arm,cortex-a15-gic"; ++ ranges; ++ #size-cells = <0x02>; ++ #address-cells = <0x02>; ++ interrupt-controller; ++ #interrupt-cells = <0x03>; ++ ++ v2m: v2m@8020000 { ++ reg = <0x00 0x8020000 0x00 0x1000>; ++ msi-controller; ++ compatible = "arm,gic-v2m-frame"; ++ }; ++ }; ++ ++ flash@0 { ++ bank-width = <0x04>; ++ reg = <0x00 0x00 0x00 0x4000000 0x00 0x4000000 0x00 0x4000000>; ++ compatible = "cfi-flash"; ++ }; ++ ++ cpus { ++ #size-cells = <0x00>; ++ #address-cells = <0x01>; ++ ++ cpu@0 { ++ reg = <0x00>; ++ enable-method = "psci"; ++ compatible = "arm,cortex-a72"; ++ device_type = "cpu"; ++ }; ++ ++ cpu@1 { ++ reg = <0x01>; ++ enable-method = "psci"; ++ compatible = "arm,cortex-a72"; ++ device_type = "cpu"; ++ }; ++ ++ cpu@2 { ++ reg = <0x02>; ++ enable-method = "psci"; ++ compatible = "arm,cortex-a72"; ++ device_type = "cpu"; ++ }; ++ ++ cpu@3 { ++ reg = <0x03>; ++ enable-method = "psci"; ++ compatible = "arm,cortex-a72"; ++ device_type = "cpu"; ++ }; ++ }; ++ ++ timer { ++ interrupts = <0x01 0x0d 0xf04 0x01 0x0e 0xf04 0x01 0x0b 0xf04 0x01 0x0a 0xf04>; ++ always-on; ++ compatible = "arm,armv8-timer\0arm,armv7-timer"; ++ }; ++ ++ apb_clk: apb-pclk { ++ clock-output-names = "clk24mhz"; ++ clock-frequency = <0x16e3600>; ++ #clock-cells = <0x00>; ++ compatible = "fixed-clock"; ++ }; ++ ++ clcd_clk: clcd-clk { ++ compatible = "fixed-clock"; ++ #clock-cells = <0x00>; ++ clock-frequency = <25175000>; ++ clock-output-names = "clcdclk"; ++ }; ++ ++ panel: panel { ++ compatible = "panel-dpi"; ++ width-mm = <152>; ++ height-mm = <91>; ++ ++ panel-timing { ++ clock-frequency = <25175000>; ++ hactive = <640>; ++ vactive = <480>; ++ hback-porch = <48>; ++ hfront-porch = <16>; ++ hsync-len = <96>; ++ vback-porch = <33>; ++ vfront-porch = <10>; ++ vsync-len = <2>; ++ hsync-active = <0>; ++ vsync-active = <0>; ++ de-active = <1>; ++ pixelclk-active = <0>; ++ }; ++ ++ port { ++ panel_in: endpoint { ++ remote-endpoint = <&clcd_out>; ++ }; ++ }; ++ }; ++ ++ clcd@8800000 { ++ compatible = "arm,pl111", "arm,primecell"; ++ reg = <0x00 0x8800000 0x00 0x1000>; ++ interrupts = <0x00 0x0a 0x04>; ++ clocks = <&clcd_clk>, <&apb_clk>; ++ clock-names = "clcdclk", "apb_pclk"; ++ ++ port { ++ clcd_out: endpoint { ++ remote-endpoint = <&panel_in>; ++ }; ++ }; ++ }; ++ ++}; diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0053-virt64_defconfig.patch b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0053-virt64_defconfig.patch new file mode 100644 index 0000000..7b3e5e7 --- /dev/null +++ b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0053-virt64_defconfig.patch @@ -0,0 +1,9031 @@ +--- a/arch/arm64/configs/virt64_defconfig ++++ b/arch/arm64/configs/virt64_defconfig +@@ -0,0 +1,9028 @@ ++# ++# Automatically generated file; DO NOT EDIT. ++# Linux/arm64 6.12.0 Kernel Configuration ++# ++CONFIG_CC_VERSION_TEXT="aarch64-none-linux-gnu-gcc (Arm GNU Toolchain 12.2.Rel1 (Build arm-12.24)) 12.2.1 20221205" ++CONFIG_CC_IS_GCC=y ++CONFIG_GCC_VERSION=120201 ++CONFIG_CLANG_VERSION=0 ++CONFIG_AS_IS_GNU=y ++CONFIG_AS_VERSION=23900 ++CONFIG_LD_IS_BFD=y ++CONFIG_LD_VERSION=23900 ++CONFIG_LLD_VERSION=0 ++CONFIG_RUSTC_VERSION=0 ++CONFIG_RUSTC_LLVM_VERSION=0 ++CONFIG_CC_CAN_LINK=y ++CONFIG_CC_CAN_LINK_STATIC=y ++CONFIG_GCC_ASM_GOTO_OUTPUT_BROKEN=y ++CONFIG_CC_HAS_ASM_INLINE=y ++CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y ++CONFIG_PAHOLE_VERSION=0 ++CONFIG_IRQ_WORK=y ++CONFIG_BUILDTIME_TABLE_SORT=y ++CONFIG_THREAD_INFO_IN_TASK=y ++ ++# ++# General setup ++# ++CONFIG_INIT_ENV_ARG_LIMIT=32 ++# CONFIG_COMPILE_TEST is not set ++# CONFIG_WERROR is not set ++CONFIG_LOCALVERSION="" ++CONFIG_LOCALVERSION_AUTO=y ++CONFIG_BUILD_SALT="" ++CONFIG_DEFAULT_INIT="" ++CONFIG_DEFAULT_HOSTNAME="(none)" ++CONFIG_SYSVIPC=y ++CONFIG_SYSVIPC_SYSCTL=y ++CONFIG_SYSVIPC_COMPAT=y ++CONFIG_POSIX_MQUEUE=y ++CONFIG_POSIX_MQUEUE_SYSCTL=y ++# CONFIG_WATCH_QUEUE is not set ++CONFIG_CROSS_MEMORY_ATTACH=y ++# CONFIG_USELIB is not set ++CONFIG_AUDIT=y ++CONFIG_HAVE_ARCH_AUDITSYSCALL=y ++CONFIG_AUDITSYSCALL=y ++ ++# ++# IRQ subsystem ++# ++CONFIG_GENERIC_IRQ_PROBE=y ++CONFIG_GENERIC_IRQ_SHOW=y ++CONFIG_GENERIC_IRQ_SHOW_LEVEL=y ++CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y ++CONFIG_GENERIC_IRQ_MIGRATION=y ++CONFIG_HARDIRQS_SW_RESEND=y ++CONFIG_GENERIC_IRQ_CHIP=y ++CONFIG_IRQ_DOMAIN=y ++CONFIG_IRQ_DOMAIN_HIERARCHY=y ++CONFIG_IRQ_FASTEOI_HIERARCHY_HANDLERS=y ++CONFIG_GENERIC_IRQ_IPI=y ++CONFIG_GENERIC_IRQ_IPI_MUX=y ++CONFIG_GENERIC_MSI_IRQ=y ++CONFIG_IRQ_MSI_IOMMU=y ++CONFIG_IRQ_FORCED_THREADING=y ++CONFIG_SPARSE_IRQ=y ++# CONFIG_GENERIC_IRQ_DEBUGFS is not set ++# end of IRQ subsystem ++ ++CONFIG_GENERIC_TIME_VSYSCALL=y ++CONFIG_GENERIC_CLOCKEVENTS=y ++CONFIG_ARCH_HAS_TICK_BROADCAST=y ++CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y ++CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y ++CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y ++CONFIG_CONTEXT_TRACKING=y ++CONFIG_CONTEXT_TRACKING_IDLE=y ++ ++# ++# Timers subsystem ++# ++CONFIG_TICK_ONESHOT=y ++CONFIG_NO_HZ_COMMON=y ++# CONFIG_HZ_PERIODIC is not set ++CONFIG_NO_HZ_IDLE=y ++# CONFIG_NO_HZ_FULL is not set ++# CONFIG_NO_HZ is not set ++CONFIG_HIGH_RES_TIMERS=y ++# end of Timers subsystem ++ ++CONFIG_BPF=y ++CONFIG_HAVE_EBPF_JIT=y ++CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y ++ ++# ++# BPF subsystem ++# ++CONFIG_BPF_SYSCALL=y ++CONFIG_BPF_JIT=y ++# CONFIG_BPF_JIT_ALWAYS_ON is not set ++CONFIG_BPF_JIT_DEFAULT_ON=y ++CONFIG_BPF_UNPRIV_DEFAULT_OFF=y ++# CONFIG_BPF_PRELOAD is not set ++# end of BPF subsystem ++ ++CONFIG_PREEMPT_BUILD=y ++# CONFIG_PREEMPT_NONE is not set ++# CONFIG_PREEMPT_VOLUNTARY is not set ++CONFIG_PREEMPT=y ++CONFIG_PREEMPT_COUNT=y ++CONFIG_PREEMPTION=y ++# CONFIG_PREEMPT_DYNAMIC is not set ++# CONFIG_SCHED_CORE is not set ++ ++# ++# CPU/Task time and stats accounting ++# ++CONFIG_TICK_CPU_ACCOUNTING=y ++# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set ++CONFIG_IRQ_TIME_ACCOUNTING=y ++CONFIG_HAVE_SCHED_AVG_IRQ=y ++CONFIG_SCHED_HW_PRESSURE=y ++CONFIG_BSD_PROCESS_ACCT=y ++CONFIG_BSD_PROCESS_ACCT_V3=y ++CONFIG_TASKSTATS=y ++# CONFIG_TASK_DELAY_ACCT is not set ++CONFIG_TASK_XACCT=y ++CONFIG_TASK_IO_ACCOUNTING=y ++# CONFIG_PSI is not set ++# end of CPU/Task time and stats accounting ++ ++CONFIG_CPU_ISOLATION=y ++ ++# ++# RCU Subsystem ++# ++CONFIG_TREE_RCU=y ++CONFIG_PREEMPT_RCU=y ++# CONFIG_RCU_EXPERT is not set ++CONFIG_TREE_SRCU=y ++CONFIG_TASKS_RCU_GENERIC=y ++CONFIG_NEED_TASKS_RCU=y ++CONFIG_TASKS_RCU=y ++CONFIG_TASKS_TRACE_RCU=y ++CONFIG_RCU_STALL_COMMON=y ++CONFIG_RCU_NEED_SEGCBLIST=y ++# end of RCU Subsystem ++ ++CONFIG_IKCONFIG=y ++CONFIG_IKCONFIG_PROC=y ++# CONFIG_IKHEADERS is not set ++CONFIG_LOG_BUF_SHIFT=17 ++CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 ++# CONFIG_PRINTK_INDEX is not set ++CONFIG_GENERIC_SCHED_CLOCK=y ++ ++# ++# Scheduler features ++# ++# CONFIG_UCLAMP_TASK is not set ++# end of Scheduler features ++ ++CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y ++CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y ++CONFIG_CC_HAS_INT128=y ++CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" ++CONFIG_GCC10_NO_ARRAY_BOUNDS=y ++CONFIG_CC_NO_ARRAY_BOUNDS=y ++CONFIG_GCC_NO_STRINGOP_OVERFLOW=y ++CONFIG_CC_NO_STRINGOP_OVERFLOW=y ++CONFIG_ARCH_SUPPORTS_INT128=y ++CONFIG_NUMA_BALANCING=y ++CONFIG_NUMA_BALANCING_DEFAULT_ENABLED=y ++CONFIG_SLAB_OBJ_EXT=y ++CONFIG_CGROUPS=y ++CONFIG_PAGE_COUNTER=y ++# CONFIG_CGROUP_FAVOR_DYNMODS is not set ++CONFIG_MEMCG=y ++# CONFIG_MEMCG_V1 is not set ++CONFIG_BLK_CGROUP=y ++CONFIG_CGROUP_WRITEBACK=y ++CONFIG_CGROUP_SCHED=y ++CONFIG_GROUP_SCHED_WEIGHT=y ++CONFIG_FAIR_GROUP_SCHED=y ++# CONFIG_CFS_BANDWIDTH is not set ++# CONFIG_RT_GROUP_SCHED is not set ++CONFIG_SCHED_MM_CID=y ++CONFIG_CGROUP_PIDS=y ++# CONFIG_CGROUP_RDMA is not set ++CONFIG_CGROUP_FREEZER=y ++CONFIG_CGROUP_HUGETLB=y ++CONFIG_CPUSETS=y ++# CONFIG_CPUSETS_V1 is not set ++CONFIG_PROC_PID_CPUSET=y ++CONFIG_CGROUP_DEVICE=y ++CONFIG_CGROUP_CPUACCT=y ++CONFIG_CGROUP_PERF=y ++CONFIG_CGROUP_BPF=y ++# CONFIG_CGROUP_MISC is not set ++# CONFIG_CGROUP_DEBUG is not set ++CONFIG_SOCK_CGROUP_DATA=y ++CONFIG_NAMESPACES=y ++CONFIG_UTS_NS=y ++CONFIG_TIME_NS=y ++CONFIG_IPC_NS=y ++CONFIG_USER_NS=y ++CONFIG_PID_NS=y ++CONFIG_NET_NS=y ++# CONFIG_CHECKPOINT_RESTORE is not set ++CONFIG_SCHED_AUTOGROUP=y ++# CONFIG_RELAY is not set ++CONFIG_BLK_DEV_INITRD=y ++CONFIG_INITRAMFS_SOURCE="" ++CONFIG_RD_GZIP=y ++CONFIG_RD_BZIP2=y ++CONFIG_RD_LZMA=y ++CONFIG_RD_XZ=y ++CONFIG_RD_LZO=y ++CONFIG_RD_LZ4=y ++CONFIG_RD_ZSTD=y ++# CONFIG_BOOT_CONFIG is not set ++CONFIG_INITRAMFS_PRESERVE_MTIME=y ++CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y ++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set ++CONFIG_LD_ORPHAN_WARN=y ++CONFIG_LD_ORPHAN_WARN_LEVEL="warn" ++CONFIG_SYSCTL=y ++CONFIG_HAVE_UID16=y ++CONFIG_SYSCTL_EXCEPTION_TRACE=y ++# CONFIG_EXPERT is not set ++CONFIG_UID16=y ++CONFIG_MULTIUSER=y ++CONFIG_SYSFS_SYSCALL=y ++CONFIG_FHANDLE=y ++CONFIG_POSIX_TIMERS=y ++CONFIG_PRINTK=y ++CONFIG_BUG=y ++CONFIG_ELF_CORE=y ++CONFIG_FUTEX=y ++CONFIG_FUTEX_PI=y ++CONFIG_EPOLL=y ++CONFIG_SIGNALFD=y ++CONFIG_TIMERFD=y ++CONFIG_EVENTFD=y ++CONFIG_SHMEM=y ++CONFIG_AIO=y ++CONFIG_IO_URING=y ++CONFIG_ADVISE_SYSCALLS=y ++CONFIG_MEMBARRIER=y ++CONFIG_KCMP=y ++CONFIG_RSEQ=y ++CONFIG_CACHESTAT_SYSCALL=y ++CONFIG_KALLSYMS=y ++# CONFIG_KALLSYMS_SELFTEST is not set ++CONFIG_KALLSYMS_ALL=y ++CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y ++CONFIG_HAVE_PERF_EVENTS=y ++CONFIG_GUEST_PERF_EVENTS=y ++ ++# ++# Kernel Performance Events And Counters ++# ++CONFIG_PERF_EVENTS=y ++# CONFIG_DEBUG_PERF_USE_VMALLOC is not set ++# end of Kernel Performance Events And Counters ++ ++CONFIG_PROFILING=y ++ ++# ++# Kexec and crash features ++# ++CONFIG_CRASH_RESERVE=y ++CONFIG_VMCORE_INFO=y ++CONFIG_KEXEC_CORE=y ++CONFIG_KEXEC=y ++CONFIG_KEXEC_FILE=y ++# CONFIG_KEXEC_SIG is not set ++CONFIG_CRASH_DUMP=y ++# end of Kexec and crash features ++# end of General setup ++ ++CONFIG_ARM64=y ++CONFIG_RUSTC_SUPPORTS_ARM64=y ++CONFIG_GCC_SUPPORTS_DYNAMIC_FTRACE_WITH_ARGS=y ++CONFIG_64BIT=y ++CONFIG_MMU=y ++CONFIG_ARM64_CONT_PTE_SHIFT=4 ++CONFIG_ARM64_CONT_PMD_SHIFT=4 ++CONFIG_ARCH_MMAP_RND_BITS_MIN=18 ++CONFIG_ARCH_MMAP_RND_BITS_MAX=33 ++CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11 ++CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 ++CONFIG_STACKTRACE_SUPPORT=y ++CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 ++CONFIG_LOCKDEP_SUPPORT=y ++CONFIG_GENERIC_BUG=y ++CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y ++CONFIG_GENERIC_HWEIGHT=y ++CONFIG_GENERIC_CSUM=y ++CONFIG_GENERIC_CALIBRATE_DELAY=y ++CONFIG_SMP=y ++CONFIG_KERNEL_MODE_NEON=y ++CONFIG_FIX_EARLYCON_MEM=y ++CONFIG_PGTABLE_LEVELS=4 ++CONFIG_ARCH_SUPPORTS_UPROBES=y ++CONFIG_ARCH_PROC_KCORE_TEXT=y ++CONFIG_BUILTIN_RETURN_ADDRESS_STRIPS_PAC=y ++ ++# ++# Platform selection ++# ++CONFIG_ARCH_ACTIONS=y ++# CONFIG_ARCH_AIROHA is not set ++CONFIG_ARCH_SUNXI=y ++CONFIG_ARCH_ALPINE=y ++CONFIG_ARCH_APPLE=y ++CONFIG_ARCH_BCM=y ++CONFIG_ARCH_BCM2835=y ++CONFIG_ARCH_BCM_IPROC=y ++CONFIG_ARCH_BCMBCA=y ++CONFIG_ARCH_BRCMSTB=y ++CONFIG_ARCH_BERLIN=y ++# CONFIG_ARCH_BITMAIN is not set ++CONFIG_ARCH_EXYNOS=y ++CONFIG_ARCH_SPARX5=y ++CONFIG_ARCH_K3=y ++CONFIG_ARCH_LG1K=y ++CONFIG_ARCH_HISI=y ++CONFIG_ARCH_KEEMBAY=y ++CONFIG_ARCH_MEDIATEK=y ++CONFIG_ARCH_MESON=y ++CONFIG_ARCH_MVEBU=y ++CONFIG_ARCH_NXP=y ++CONFIG_ARCH_LAYERSCAPE=y ++CONFIG_ARCH_MXC=y ++CONFIG_ARCH_S32=y ++CONFIG_ARCH_MA35=y ++CONFIG_ARCH_NPCM=y ++# CONFIG_ARCH_PENSANDO is not set ++CONFIG_ARCH_QCOM=y ++CONFIG_ARCH_REALTEK=y ++CONFIG_ARCH_RENESAS=y ++CONFIG_ARCH_ROCKCHIP=y ++CONFIG_ARCH_SEATTLE=y ++CONFIG_ARCH_INTEL_SOCFPGA=y ++CONFIG_ARCH_STM32=y ++CONFIG_ARCH_SYNQUACER=y ++CONFIG_ARCH_TEGRA=y ++CONFIG_ARCH_TESLA_FSD=y ++CONFIG_ARCH_SPRD=y ++CONFIG_ARCH_THUNDER=y ++CONFIG_ARCH_THUNDER2=y ++CONFIG_ARCH_UNIPHIER=y ++CONFIG_ARCH_VEXPRESS=y ++CONFIG_ARCH_VISCONTI=y ++CONFIG_ARCH_XGENE=y ++CONFIG_ARCH_ZYNQMP=y ++# end of Platform selection ++ ++# ++# Kernel Features ++# ++ ++# ++# ARM errata workarounds via the alternatives framework ++# ++CONFIG_AMPERE_ERRATUM_AC03_CPU_38=y ++CONFIG_ARM64_WORKAROUND_CLEAN_CACHE=y ++CONFIG_ARM64_ERRATUM_826319=y ++CONFIG_ARM64_ERRATUM_827319=y ++CONFIG_ARM64_ERRATUM_824069=y ++CONFIG_ARM64_ERRATUM_819472=y ++CONFIG_ARM64_ERRATUM_832075=y ++CONFIG_ARM64_ERRATUM_834220=y ++CONFIG_ARM64_ERRATUM_1742098=y ++CONFIG_ARM64_ERRATUM_845719=y ++CONFIG_ARM64_ERRATUM_843419=y ++CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y ++CONFIG_ARM64_ERRATUM_1024718=y ++CONFIG_ARM64_ERRATUM_1418040=y ++CONFIG_ARM64_WORKAROUND_SPECULATIVE_AT=y ++CONFIG_ARM64_ERRATUM_1165522=y ++CONFIG_ARM64_ERRATUM_1319367=y ++CONFIG_ARM64_ERRATUM_1530923=y ++CONFIG_ARM64_WORKAROUND_REPEAT_TLBI=y ++CONFIG_ARM64_ERRATUM_2441007=y ++CONFIG_ARM64_ERRATUM_1286807=y ++CONFIG_ARM64_ERRATUM_1463225=y ++CONFIG_ARM64_ERRATUM_1542419=y ++CONFIG_ARM64_ERRATUM_1508412=y ++CONFIG_ARM64_ERRATUM_2051678=y ++CONFIG_ARM64_ERRATUM_2077057=y ++CONFIG_ARM64_ERRATUM_2658417=y ++CONFIG_ARM64_WORKAROUND_TSB_FLUSH_FAILURE=y ++CONFIG_ARM64_ERRATUM_2054223=y ++CONFIG_ARM64_ERRATUM_2067961=y ++CONFIG_ARM64_ERRATUM_2441009=y ++CONFIG_ARM64_ERRATUM_2457168=y ++CONFIG_ARM64_ERRATUM_2645198=y ++CONFIG_ARM64_WORKAROUND_SPECULATIVE_UNPRIV_LOAD=y ++CONFIG_ARM64_ERRATUM_2966298=y ++CONFIG_ARM64_ERRATUM_3117295=y ++CONFIG_ARM64_ERRATUM_3194386=y ++CONFIG_CAVIUM_ERRATUM_22375=y ++CONFIG_CAVIUM_ERRATUM_23144=y ++CONFIG_CAVIUM_ERRATUM_23154=y ++CONFIG_CAVIUM_ERRATUM_27456=y ++CONFIG_CAVIUM_ERRATUM_30115=y ++CONFIG_CAVIUM_TX2_ERRATUM_219=y ++CONFIG_FUJITSU_ERRATUM_010001=y ++CONFIG_HISILICON_ERRATUM_161600802=y ++CONFIG_QCOM_FALKOR_ERRATUM_1003=y ++CONFIG_QCOM_FALKOR_ERRATUM_1009=y ++CONFIG_QCOM_QDF2400_ERRATUM_0065=y ++CONFIG_QCOM_FALKOR_ERRATUM_E1041=y ++CONFIG_NVIDIA_CARMEL_CNP_ERRATUM=y ++CONFIG_ROCKCHIP_ERRATUM_3588001=y ++CONFIG_SOCIONEXT_SYNQUACER_PREITS=y ++# end of ARM errata workarounds via the alternatives framework ++ ++CONFIG_ARM64_4K_PAGES=y ++# CONFIG_ARM64_16K_PAGES is not set ++# CONFIG_ARM64_64K_PAGES is not set ++# CONFIG_ARM64_VA_BITS_39 is not set ++CONFIG_ARM64_VA_BITS_48=y ++# CONFIG_ARM64_VA_BITS_52 is not set ++CONFIG_ARM64_VA_BITS=48 ++CONFIG_ARM64_PA_BITS_48=y ++CONFIG_ARM64_PA_BITS=48 ++# CONFIG_CPU_BIG_ENDIAN is not set ++CONFIG_CPU_LITTLE_ENDIAN=y ++CONFIG_SCHED_MC=y ++# CONFIG_SCHED_CLUSTER is not set ++CONFIG_SCHED_SMT=y ++CONFIG_NR_CPUS=256 ++CONFIG_HOTPLUG_CPU=y ++CONFIG_NUMA=y ++CONFIG_NODES_SHIFT=4 ++# CONFIG_HZ_100 is not set ++CONFIG_HZ_250=y ++# CONFIG_HZ_300 is not set ++# CONFIG_HZ_1000 is not set ++CONFIG_HZ=250 ++CONFIG_SCHED_HRTICK=y ++CONFIG_ARCH_SPARSEMEM_ENABLE=y ++CONFIG_HW_PERF_EVENTS=y ++CONFIG_CC_HAVE_SHADOW_CALL_STACK=y ++CONFIG_PARAVIRT=y ++# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set ++CONFIG_ARCH_SUPPORTS_KEXEC=y ++CONFIG_ARCH_SUPPORTS_KEXEC_FILE=y ++CONFIG_ARCH_SELECTS_KEXEC_FILE=y ++CONFIG_ARCH_SUPPORTS_KEXEC_SIG=y ++CONFIG_ARCH_SUPPORTS_KEXEC_IMAGE_VERIFY_SIG=y ++CONFIG_ARCH_DEFAULT_KEXEC_IMAGE_VERIFY_SIG=y ++CONFIG_ARCH_SUPPORTS_CRASH_DUMP=y ++CONFIG_ARCH_DEFAULT_CRASH_DUMP=y ++CONFIG_ARCH_HAS_GENERIC_CRASHKERNEL_RESERVATION=y ++CONFIG_TRANS_TABLE=y ++CONFIG_XEN_DOM0=y ++CONFIG_XEN=y ++CONFIG_ARCH_FORCE_MAX_ORDER=10 ++CONFIG_UNMAP_KERNEL_AT_EL0=y ++CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY=y ++CONFIG_RODATA_FULL_DEFAULT_ENABLED=y ++# CONFIG_ARM64_SW_TTBR0_PAN is not set ++CONFIG_ARM64_TAGGED_ADDR_ABI=y ++CONFIG_COMPAT=y ++CONFIG_KUSER_HELPERS=y ++# CONFIG_COMPAT_ALIGNMENT_FIXUPS is not set ++# CONFIG_ARMV8_DEPRECATED is not set ++ ++# ++# ARMv8.1 architectural features ++# ++CONFIG_ARM64_HW_AFDBM=y ++CONFIG_ARM64_PAN=y ++CONFIG_AS_HAS_LSE_ATOMICS=y ++CONFIG_ARM64_LSE_ATOMICS=y ++CONFIG_ARM64_USE_LSE_ATOMICS=y ++# end of ARMv8.1 architectural features ++ ++# ++# ARMv8.2 architectural features ++# ++CONFIG_AS_HAS_ARMV8_2=y ++CONFIG_AS_HAS_SHA3=y ++# CONFIG_ARM64_PMEM is not set ++CONFIG_ARM64_RAS_EXTN=y ++CONFIG_ARM64_CNP=y ++# end of ARMv8.2 architectural features ++ ++# ++# ARMv8.3 architectural features ++# ++CONFIG_ARM64_PTR_AUTH=y ++CONFIG_ARM64_PTR_AUTH_KERNEL=y ++CONFIG_CC_HAS_BRANCH_PROT_PAC_RET=y ++CONFIG_CC_HAS_SIGN_RETURN_ADDRESS=y ++CONFIG_AS_HAS_ARMV8_3=y ++CONFIG_AS_HAS_CFI_NEGATE_RA_STATE=y ++CONFIG_AS_HAS_LDAPR=y ++# end of ARMv8.3 architectural features ++ ++# ++# ARMv8.4 architectural features ++# ++CONFIG_ARM64_AMU_EXTN=y ++CONFIG_AS_HAS_ARMV8_4=y ++CONFIG_ARM64_TLB_RANGE=y ++# end of ARMv8.4 architectural features ++ ++# ++# ARMv8.5 architectural features ++# ++CONFIG_AS_HAS_ARMV8_5=y ++CONFIG_ARM64_BTI=y ++CONFIG_CC_HAS_BRANCH_PROT_PAC_RET_BTI=y ++CONFIG_ARM64_E0PD=y ++CONFIG_ARM64_AS_HAS_MTE=y ++CONFIG_ARM64_MTE=y ++# end of ARMv8.5 architectural features ++ ++# ++# ARMv8.7 architectural features ++# ++CONFIG_ARM64_EPAN=y ++# end of ARMv8.7 architectural features ++ ++# ++# ARMv8.9 architectural features ++# ++CONFIG_ARM64_POE=y ++CONFIG_ARCH_PKEY_BITS=3 ++# end of ARMv8.9 architectural features ++ ++CONFIG_ARM64_SVE=y ++# CONFIG_ARM64_PSEUDO_NMI is not set ++CONFIG_RELOCATABLE=y ++CONFIG_RANDOMIZE_BASE=y ++CONFIG_RANDOMIZE_MODULE_REGION_FULL=y ++CONFIG_CC_HAVE_STACKPROTECTOR_SYSREG=y ++CONFIG_STACKPROTECTOR_PER_TASK=y ++CONFIG_ARM64_CONTPTE=y ++# end of Kernel Features ++ ++# ++# Boot options ++# ++# CONFIG_ARM64_ACPI_PARKING_PROTOCOL is not set ++CONFIG_CMDLINE="" ++CONFIG_EFI_STUB=y ++CONFIG_EFI=y ++# CONFIG_COMPRESSED_INSTALL is not set ++CONFIG_DMI=y ++# end of Boot options ++ ++# ++# Power management options ++# ++CONFIG_SUSPEND=y ++CONFIG_SUSPEND_FREEZER=y ++CONFIG_HIBERNATE_CALLBACKS=y ++CONFIG_HIBERNATION=y ++CONFIG_HIBERNATION_SNAPSHOT_DEV=y ++CONFIG_HIBERNATION_COMP_LZO=y ++CONFIG_HIBERNATION_DEF_COMP="lzo" ++CONFIG_PM_STD_PARTITION="" ++CONFIG_PM_SLEEP=y ++CONFIG_PM_SLEEP_SMP=y ++# CONFIG_PM_AUTOSLEEP is not set ++# CONFIG_PM_USERSPACE_AUTOSLEEP is not set ++# CONFIG_PM_WAKELOCKS is not set ++CONFIG_PM=y ++# CONFIG_PM_DEBUG is not set ++CONFIG_PM_CLK=y ++CONFIG_PM_GENERIC_DOMAINS=y ++CONFIG_WQ_POWER_EFFICIENT_DEFAULT=y ++CONFIG_PM_GENERIC_DOMAINS_SLEEP=y ++CONFIG_PM_GENERIC_DOMAINS_OF=y ++CONFIG_CPU_PM=y ++CONFIG_ENERGY_MODEL=y ++CONFIG_ARCH_HIBERNATION_POSSIBLE=y ++CONFIG_ARCH_HIBERNATION_HEADER=y ++CONFIG_ARCH_SUSPEND_POSSIBLE=y ++# end of Power management options ++ ++# ++# CPU Power Management ++# ++ ++# ++# CPU Idle ++# ++CONFIG_CPU_IDLE=y ++CONFIG_CPU_IDLE_MULTIPLE_DRIVERS=y ++# CONFIG_CPU_IDLE_GOV_LADDER is not set ++CONFIG_CPU_IDLE_GOV_MENU=y ++# CONFIG_CPU_IDLE_GOV_TEO is not set ++CONFIG_DT_IDLE_STATES=y ++CONFIG_DT_IDLE_GENPD=y ++ ++# ++# ARM CPU Idle Drivers ++# ++CONFIG_ARM_PSCI_CPUIDLE=y ++CONFIG_ARM_PSCI_CPUIDLE_DOMAIN=y ++# end of ARM CPU Idle Drivers ++# end of CPU Idle ++ ++# ++# CPU Frequency scaling ++# ++CONFIG_CPU_FREQ=y ++CONFIG_CPU_FREQ_GOV_ATTR_SET=y ++CONFIG_CPU_FREQ_GOV_COMMON=y ++CONFIG_CPU_FREQ_STAT=y ++# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set ++# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set ++# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set ++# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set ++# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set ++CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y ++CONFIG_CPU_FREQ_GOV_PERFORMANCE=y ++# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set ++CONFIG_CPU_FREQ_GOV_USERSPACE=y ++CONFIG_CPU_FREQ_GOV_ONDEMAND=y ++# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set ++CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y ++ ++# ++# CPU frequency scaling drivers ++# ++CONFIG_CPUFREQ_DT=y ++CONFIG_CPUFREQ_DT_PLATDEV=y ++# CONFIG_ARM_ALLWINNER_SUN50I_CPUFREQ_NVMEM is not set ++CONFIG_ARM_APPLE_SOC_CPUFREQ=y ++CONFIG_ARM_ARMADA_37XX_CPUFREQ=y ++# CONFIG_ARM_ARMADA_8K_CPUFREQ is not set ++CONFIG_ARM_SCPI_CPUFREQ=y ++# CONFIG_ARM_IMX_CPUFREQ_DT is not set ++CONFIG_ARM_MEDIATEK_CPUFREQ=y ++# CONFIG_ARM_MEDIATEK_CPUFREQ_HW is not set ++CONFIG_ARM_QCOM_CPUFREQ_NVMEM=y ++CONFIG_ARM_QCOM_CPUFREQ_HW=y ++CONFIG_ARM_SCMI_CPUFREQ=y ++CONFIG_ARM_TEGRA20_CPUFREQ=y ++CONFIG_ARM_TEGRA124_CPUFREQ=y ++CONFIG_ARM_TEGRA186_CPUFREQ=y ++CONFIG_ARM_TEGRA194_CPUFREQ=y ++CONFIG_ARM_TI_CPUFREQ=y ++CONFIG_QORIQ_CPUFREQ=y ++# CONFIG_ACPI_CPPC_CPUFREQ is not set ++# end of CPU Frequency scaling ++# end of CPU Power Management ++ ++CONFIG_ARCH_SUPPORTS_ACPI=y ++CONFIG_ACPI=y ++CONFIG_ACPI_GENERIC_GSI=y ++CONFIG_ACPI_CCA_REQUIRED=y ++CONFIG_ACPI_THERMAL_LIB=y ++# CONFIG_ACPI_DEBUGGER is not set ++CONFIG_ACPI_SPCR_TABLE=y ++# CONFIG_ACPI_FPDT is not set ++# CONFIG_ACPI_EC_DEBUGFS is not set ++CONFIG_ACPI_AC=y ++CONFIG_ACPI_BATTERY=y ++CONFIG_ACPI_BUTTON=y ++CONFIG_ACPI_FAN=y ++# CONFIG_ACPI_TAD is not set ++# CONFIG_ACPI_DOCK is not set ++CONFIG_ACPI_PROCESSOR_IDLE=y ++CONFIG_ACPI_MCFG=y ++CONFIG_ACPI_PROCESSOR=y ++CONFIG_ACPI_HOTPLUG_CPU=y ++CONFIG_ACPI_THERMAL=y ++CONFIG_ARCH_HAS_ACPI_TABLE_UPGRADE=y ++CONFIG_ACPI_TABLE_UPGRADE=y ++# CONFIG_ACPI_DEBUG is not set ++# CONFIG_ACPI_PCI_SLOT is not set ++CONFIG_ACPI_CONTAINER=y ++CONFIG_ACPI_HOTPLUG_MEMORY=y ++CONFIG_ACPI_HED=y ++# CONFIG_ACPI_BGRT is not set ++CONFIG_ACPI_REDUCED_HARDWARE_ONLY=y ++CONFIG_ACPI_NUMA=y ++CONFIG_ACPI_HMAT=y ++CONFIG_HAVE_ACPI_APEI=y ++CONFIG_ACPI_APEI=y ++CONFIG_ACPI_APEI_GHES=y ++CONFIG_ACPI_APEI_PCIEAER=y ++CONFIG_ACPI_APEI_SEA=y ++CONFIG_ACPI_APEI_MEMORY_FAILURE=y ++CONFIG_ACPI_APEI_EINJ=y ++# CONFIG_ACPI_APEI_ERST_DEBUG is not set ++# CONFIG_ACPI_CONFIGFS is not set ++# CONFIG_ACPI_PFRUT is not set ++CONFIG_ACPI_IORT=y ++CONFIG_ACPI_GTDT=y ++CONFIG_ACPI_APMT=y ++CONFIG_ACPI_PPTT=y ++CONFIG_ACPI_PCC=y ++# CONFIG_ACPI_FFH is not set ++# CONFIG_PMIC_OPREGION is not set ++CONFIG_ACPI_PRMT=y ++CONFIG_KVM_COMMON=y ++CONFIG_HAVE_KVM_IRQCHIP=y ++CONFIG_HAVE_KVM_IRQ_ROUTING=y ++CONFIG_HAVE_KVM_DIRTY_RING=y ++CONFIG_HAVE_KVM_DIRTY_RING_ACQ_REL=y ++CONFIG_NEED_KVM_DIRTY_RING_WITH_BITMAP=y ++CONFIG_KVM_MMIO=y ++CONFIG_HAVE_KVM_MSI=y ++CONFIG_HAVE_KVM_READONLY_MEM=y ++CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT=y ++CONFIG_KVM_VFIO=y ++CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y ++CONFIG_HAVE_KVM_IRQ_BYPASS=y ++CONFIG_HAVE_KVM_VCPU_RUN_PID_CHANGE=y ++CONFIG_KVM_XFER_TO_GUEST_WORK=y ++CONFIG_KVM_GENERIC_HARDWARE_ENABLING=y ++CONFIG_KVM_GENERIC_MMU_NOTIFIER=y ++CONFIG_VIRTUALIZATION=y ++CONFIG_KVM=y ++# CONFIG_NVHE_EL2_DEBUG is not set ++# CONFIG_PTDUMP_STAGE2_DEBUGFS is not set ++CONFIG_CPU_MITIGATIONS=y ++CONFIG_ARCH_HAS_DMA_OPS=y ++ ++# ++# General architecture-dependent options ++# ++CONFIG_ARCH_HAS_SUBPAGE_FAULTS=y ++CONFIG_HOTPLUG_CORE_SYNC=y ++CONFIG_HOTPLUG_CORE_SYNC_DEAD=y ++# CONFIG_KPROBES is not set ++CONFIG_JUMP_LABEL=y ++# CONFIG_STATIC_KEYS_SELFTEST is not set ++CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y ++CONFIG_HAVE_IOREMAP_PROT=y ++CONFIG_HAVE_KPROBES=y ++CONFIG_HAVE_KRETPROBES=y ++CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y ++CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y ++CONFIG_HAVE_NMI=y ++CONFIG_TRACE_IRQFLAGS_SUPPORT=y ++CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y ++CONFIG_HAVE_ARCH_TRACEHOOK=y ++CONFIG_HAVE_DMA_CONTIGUOUS=y ++CONFIG_GENERIC_SMP_IDLE_THREAD=y ++CONFIG_GENERIC_IDLE_POLL_SETUP=y ++CONFIG_ARCH_HAS_FORTIFY_SOURCE=y ++CONFIG_ARCH_HAS_KEEPINITRD=y ++CONFIG_ARCH_HAS_SET_MEMORY=y ++CONFIG_ARCH_HAS_SET_DIRECT_MAP=y ++CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y ++CONFIG_ARCH_WANTS_NO_INSTR=y ++CONFIG_HAVE_ASM_MODVERSIONS=y ++CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y ++CONFIG_HAVE_RSEQ=y ++CONFIG_HAVE_RUST=y ++CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y ++CONFIG_HAVE_HW_BREAKPOINT=y ++CONFIG_HAVE_PERF_REGS=y ++CONFIG_HAVE_PERF_USER_STACK_DUMP=y ++CONFIG_HAVE_ARCH_JUMP_LABEL=y ++CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y ++CONFIG_MMU_GATHER_TABLE_FREE=y ++CONFIG_MMU_GATHER_RCU_TABLE_FREE=y ++CONFIG_MMU_LAZY_TLB_REFCOUNT=y ++CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y ++CONFIG_ARCH_HAS_NMI_SAFE_THIS_CPU_OPS=y ++CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y ++CONFIG_HAVE_CMPXCHG_LOCAL=y ++CONFIG_HAVE_CMPXCHG_DOUBLE=y ++CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y ++CONFIG_HAVE_ARCH_SECCOMP=y ++CONFIG_HAVE_ARCH_SECCOMP_FILTER=y ++CONFIG_SECCOMP=y ++CONFIG_SECCOMP_FILTER=y ++# CONFIG_SECCOMP_CACHE_DEBUG is not set ++CONFIG_HAVE_ARCH_STACKLEAK=y ++CONFIG_HAVE_STACKPROTECTOR=y ++CONFIG_STACKPROTECTOR=y ++CONFIG_STACKPROTECTOR_STRONG=y ++CONFIG_ARCH_SUPPORTS_SHADOW_CALL_STACK=y ++# CONFIG_SHADOW_CALL_STACK is not set ++CONFIG_ARCH_SUPPORTS_LTO_CLANG=y ++CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y ++CONFIG_LTO_NONE=y ++CONFIG_ARCH_SUPPORTS_CFI_CLANG=y ++CONFIG_HAVE_CONTEXT_TRACKING_USER=y ++CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y ++CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y ++CONFIG_HAVE_MOVE_PUD=y ++CONFIG_HAVE_MOVE_PMD=y ++CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y ++CONFIG_HAVE_ARCH_HUGE_VMAP=y ++CONFIG_HAVE_ARCH_HUGE_VMALLOC=y ++CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y ++CONFIG_ARCH_WANT_PMD_MKWRITE=y ++CONFIG_HAVE_MOD_ARCH_SPECIFIC=y ++CONFIG_MODULES_USE_ELF_RELA=y ++CONFIG_ARCH_WANTS_EXECMEM_LATE=y ++CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y ++CONFIG_SOFTIRQ_ON_OWN_STACK=y ++CONFIG_ARCH_HAS_ELF_RANDOMIZE=y ++CONFIG_HAVE_ARCH_MMAP_RND_BITS=y ++CONFIG_ARCH_MMAP_RND_BITS=18 ++CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y ++CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11 ++CONFIG_HAVE_PAGE_SIZE_4KB=y ++CONFIG_PAGE_SIZE_4KB=y ++CONFIG_PAGE_SIZE_LESS_THAN_64KB=y ++CONFIG_PAGE_SIZE_LESS_THAN_256KB=y ++CONFIG_PAGE_SHIFT=12 ++CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y ++CONFIG_CLONE_BACKWARDS=y ++CONFIG_OLD_SIGSUSPEND3=y ++CONFIG_COMPAT_OLD_SIGACTION=y ++CONFIG_COMPAT_32BIT_TIME=y ++CONFIG_ARCH_SUPPORTS_RT=y ++CONFIG_HAVE_ARCH_VMAP_STACK=y ++CONFIG_VMAP_STACK=y ++CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y ++CONFIG_RANDOMIZE_KSTACK_OFFSET=y ++# CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set ++CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y ++CONFIG_STRICT_KERNEL_RWX=y ++CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y ++CONFIG_STRICT_MODULE_RWX=y ++CONFIG_HAVE_ARCH_COMPILER_H=y ++CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y ++CONFIG_ARCH_USE_MEMREMAP_PROT=y ++# CONFIG_LOCK_EVENT_COUNTS is not set ++CONFIG_ARCH_HAS_RELR=y ++CONFIG_ARCH_HAS_MEM_ENCRYPT=y ++CONFIG_HAVE_PREEMPT_DYNAMIC=y ++CONFIG_HAVE_PREEMPT_DYNAMIC_KEY=y ++CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y ++CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y ++CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y ++CONFIG_ARCH_HAVE_TRACE_MMIO_ACCESS=y ++CONFIG_ARCH_HAS_HW_PTE_YOUNG=y ++CONFIG_ARCH_HAS_KERNEL_FPU_SUPPORT=y ++ ++# ++# GCOV-based kernel profiling ++# ++# CONFIG_GCOV_KERNEL is not set ++CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y ++# end of GCOV-based kernel profiling ++ ++CONFIG_HAVE_GCC_PLUGINS=y ++CONFIG_GCC_PLUGINS=y ++# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set ++CONFIG_FUNCTION_ALIGNMENT_4B=y ++CONFIG_FUNCTION_ALIGNMENT=4 ++# end of General architecture-dependent options ++ ++CONFIG_RT_MUTEXES=y ++CONFIG_MODULES=y ++# CONFIG_MODULE_DEBUG is not set ++# CONFIG_MODULE_FORCE_LOAD is not set ++CONFIG_MODULE_UNLOAD=y ++# CONFIG_MODULE_FORCE_UNLOAD is not set ++# CONFIG_MODULE_UNLOAD_TAINT_TRACKING is not set ++# CONFIG_MODVERSIONS is not set ++# CONFIG_MODULE_SRCVERSION_ALL is not set ++# CONFIG_MODULE_SIG is not set ++# CONFIG_MODULE_COMPRESS is not set ++# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set ++CONFIG_MODPROBE_PATH="/sbin/modprobe" ++# CONFIG_TRIM_UNUSED_KSYMS is not set ++CONFIG_MODULES_TREE_LOOKUP=y ++CONFIG_BLOCK=y ++CONFIG_BLOCK_LEGACY_AUTOLOAD=y ++CONFIG_BLK_CGROUP_RWSTAT=y ++CONFIG_BLK_DEV_BSG_COMMON=y ++CONFIG_BLK_ICQ=y ++CONFIG_BLK_DEV_BSGLIB=y ++CONFIG_BLK_DEV_INTEGRITY=y ++CONFIG_BLK_DEV_WRITE_MOUNTED=y ++# CONFIG_BLK_DEV_ZONED is not set ++# CONFIG_BLK_DEV_THROTTLING is not set ++# CONFIG_BLK_WBT is not set ++# CONFIG_BLK_CGROUP_IOLATENCY is not set ++# CONFIG_BLK_CGROUP_IOCOST is not set ++# CONFIG_BLK_CGROUP_IOPRIO is not set ++CONFIG_BLK_DEBUG_FS=y ++# CONFIG_BLK_SED_OPAL is not set ++# CONFIG_BLK_INLINE_ENCRYPTION is not set ++ ++# ++# Partition Types ++# ++# CONFIG_PARTITION_ADVANCED is not set ++CONFIG_MSDOS_PARTITION=y ++CONFIG_EFI_PARTITION=y ++# end of Partition Types ++ ++CONFIG_BLK_MQ_PCI=y ++CONFIG_BLK_MQ_VIRTIO=y ++CONFIG_BLK_PM=y ++ ++# ++# IO Schedulers ++# ++CONFIG_MQ_IOSCHED_DEADLINE=y ++CONFIG_MQ_IOSCHED_KYBER=y ++CONFIG_IOSCHED_BFQ=y ++CONFIG_BFQ_GROUP_IOSCHED=y ++# CONFIG_BFQ_CGROUP_DEBUG is not set ++# end of IO Schedulers ++ ++CONFIG_PREEMPT_NOTIFIERS=y ++CONFIG_PADATA=y ++CONFIG_ASN1=y ++CONFIG_UNINLINE_SPIN_UNLOCK=y ++CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y ++CONFIG_MUTEX_SPIN_ON_OWNER=y ++CONFIG_RWSEM_SPIN_ON_OWNER=y ++CONFIG_LOCK_SPIN_ON_OWNER=y ++CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y ++CONFIG_QUEUED_SPINLOCKS=y ++CONFIG_ARCH_USE_QUEUED_RWLOCKS=y ++CONFIG_QUEUED_RWLOCKS=y ++CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y ++CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y ++CONFIG_FREEZER=y ++ ++# ++# Executable file formats ++# ++CONFIG_BINFMT_ELF=y ++CONFIG_COMPAT_BINFMT_ELF=y ++CONFIG_ARCH_BINFMT_ELF_STATE=y ++CONFIG_ARCH_BINFMT_ELF_EXTRA_PHDRS=y ++CONFIG_ARCH_HAVE_ELF_PROT=y ++CONFIG_ARCH_USE_GNU_PROPERTY=y ++CONFIG_ELFCORE=y ++# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set ++CONFIG_BINFMT_SCRIPT=y ++# CONFIG_BINFMT_MISC is not set ++CONFIG_COREDUMP=y ++# end of Executable file formats ++ ++# ++# Memory Management options ++# ++CONFIG_SWAP=y ++# CONFIG_ZSWAP is not set ++ ++# ++# Slab allocator options ++# ++CONFIG_SLUB=y ++CONFIG_SLAB_MERGE_DEFAULT=y ++# CONFIG_SLAB_FREELIST_RANDOM is not set ++# CONFIG_SLAB_FREELIST_HARDENED is not set ++# CONFIG_SLAB_BUCKETS is not set ++# CONFIG_SLUB_STATS is not set ++CONFIG_SLUB_CPU_PARTIAL=y ++# CONFIG_RANDOM_KMALLOC_CACHES is not set ++# end of Slab allocator options ++ ++# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set ++# CONFIG_COMPAT_BRK is not set ++CONFIG_SPARSEMEM=y ++CONFIG_SPARSEMEM_EXTREME=y ++CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y ++CONFIG_SPARSEMEM_VMEMMAP=y ++CONFIG_HAVE_GUP_FAST=y ++CONFIG_ARCH_KEEP_MEMBLOCK=y ++CONFIG_NUMA_KEEP_MEMINFO=y ++CONFIG_MEMORY_ISOLATION=y ++CONFIG_EXCLUSIVE_SYSTEM_RAM=y ++CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y ++CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y ++CONFIG_MEMORY_HOTPLUG=y ++# CONFIG_MEMORY_HOTPLUG_DEFAULT_ONLINE is not set ++CONFIG_MEMORY_HOTREMOVE=y ++CONFIG_MHP_MEMMAP_ON_MEMORY=y ++CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y ++CONFIG_SPLIT_PTE_PTLOCKS=y ++CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y ++CONFIG_SPLIT_PMD_PTLOCKS=y ++CONFIG_MEMORY_BALLOON=y ++CONFIG_BALLOON_COMPACTION=y ++CONFIG_COMPACTION=y ++CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1 ++CONFIG_PAGE_REPORTING=y ++CONFIG_MIGRATION=y ++CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION=y ++CONFIG_ARCH_ENABLE_THP_MIGRATION=y ++CONFIG_CONTIG_ALLOC=y ++CONFIG_PCP_BATCH_SCALE_MAX=5 ++CONFIG_PHYS_ADDR_T_64BIT=y ++CONFIG_MMU_NOTIFIER=y ++CONFIG_KSM=y ++CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 ++CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y ++CONFIG_MEMORY_FAILURE=y ++# CONFIG_HWPOISON_INJECT is not set ++CONFIG_ARCH_WANTS_THP_SWAP=y ++CONFIG_TRANSPARENT_HUGEPAGE=y ++CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y ++# CONFIG_TRANSPARENT_HUGEPAGE_MADVISE is not set ++# CONFIG_TRANSPARENT_HUGEPAGE_NEVER is not set ++CONFIG_THP_SWAP=y ++# CONFIG_READ_ONLY_THP_FOR_FS is not set ++CONFIG_PGTABLE_HAS_HUGE_LEAVES=y ++CONFIG_ARCH_SUPPORTS_HUGE_PFNMAP=y ++CONFIG_ARCH_SUPPORTS_PMD_PFNMAP=y ++CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y ++CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y ++CONFIG_USE_PERCPU_NUMA_NODE_ID=y ++CONFIG_HAVE_SETUP_PER_CPU_AREA=y ++CONFIG_CMA=y ++# CONFIG_CMA_DEBUGFS is not set ++# CONFIG_CMA_SYSFS is not set ++CONFIG_CMA_AREAS=19 ++CONFIG_GENERIC_EARLY_IOREMAP=y ++# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set ++# CONFIG_IDLE_PAGE_TRACKING is not set ++CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y ++CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y ++CONFIG_ARCH_HAS_PTE_DEVMAP=y ++CONFIG_ZONE_DMA=y ++CONFIG_ZONE_DMA32=y ++# CONFIG_ZONE_DEVICE is not set ++CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y ++CONFIG_ARCH_HAS_PKEYS=y ++CONFIG_ARCH_USES_PG_ARCH_2=y ++CONFIG_ARCH_USES_PG_ARCH_3=y ++CONFIG_VM_EVENT_COUNTERS=y ++# CONFIG_PERCPU_STATS is not set ++# CONFIG_GUP_TEST is not set ++# CONFIG_DMAPOOL_TEST is not set ++CONFIG_ARCH_HAS_PTE_SPECIAL=y ++CONFIG_MEMFD_CREATE=y ++CONFIG_SECRETMEM=y ++# CONFIG_ANON_VMA_NAME is not set ++# CONFIG_USERFAULTFD is not set ++# CONFIG_LRU_GEN is not set ++CONFIG_ARCH_SUPPORTS_PER_VMA_LOCK=y ++CONFIG_PER_VMA_LOCK=y ++CONFIG_LOCK_MM_AND_FIND_VMA=y ++CONFIG_EXECMEM=y ++CONFIG_NUMA_MEMBLKS=y ++# CONFIG_NUMA_EMU is not set ++ ++# ++# Data Access Monitoring ++# ++# CONFIG_DAMON is not set ++# end of Data Access Monitoring ++# end of Memory Management options ++ ++CONFIG_NET=y ++CONFIG_NET_INGRESS=y ++CONFIG_NET_EGRESS=y ++CONFIG_NET_XGRESS=y ++CONFIG_NET_DEVMEM=y ++ ++# ++# Networking options ++# ++CONFIG_PACKET=y ++# CONFIG_PACKET_DIAG is not set ++CONFIG_UNIX=y ++CONFIG_AF_UNIX_OOB=y ++# CONFIG_UNIX_DIAG is not set ++# CONFIG_TLS is not set ++# CONFIG_XFRM_USER is not set ++# CONFIG_NET_KEY is not set ++# CONFIG_XDP_SOCKETS is not set ++CONFIG_NET_HANDSHAKE=y ++CONFIG_INET=y ++CONFIG_IP_MULTICAST=y ++# CONFIG_IP_ADVANCED_ROUTER is not set ++CONFIG_IP_PNP=y ++CONFIG_IP_PNP_DHCP=y ++CONFIG_IP_PNP_BOOTP=y ++# CONFIG_IP_PNP_RARP is not set ++# CONFIG_NET_IPIP is not set ++# CONFIG_NET_IPGRE_DEMUX is not set ++# CONFIG_IP_MROUTE is not set ++# CONFIG_SYN_COOKIES is not set ++# CONFIG_NET_IPVTI is not set ++# CONFIG_NET_FOU is not set ++# CONFIG_INET_AH is not set ++# CONFIG_INET_ESP is not set ++# CONFIG_INET_IPCOMP is not set ++CONFIG_INET_TABLE_PERTURB_ORDER=16 ++CONFIG_INET_DIAG=y ++CONFIG_INET_TCP_DIAG=y ++# CONFIG_INET_UDP_DIAG is not set ++# CONFIG_INET_RAW_DIAG is not set ++# CONFIG_INET_DIAG_DESTROY is not set ++# CONFIG_TCP_CONG_ADVANCED is not set ++CONFIG_TCP_CONG_CUBIC=y ++CONFIG_DEFAULT_TCP_CONG="cubic" ++# CONFIG_TCP_AO is not set ++# CONFIG_TCP_MD5SIG is not set ++# CONFIG_IPV6 is not set ++# CONFIG_NETLABEL is not set ++# CONFIG_MPTCP is not set ++# CONFIG_NETWORK_SECMARK is not set ++CONFIG_NET_PTP_CLASSIFY=y ++# CONFIG_NETWORK_PHY_TIMESTAMPING is not set ++CONFIG_NETFILTER=y ++CONFIG_NETFILTER_ADVANCED=y ++ ++# ++# Core Netfilter Configuration ++# ++CONFIG_NETFILTER_INGRESS=y ++CONFIG_NETFILTER_EGRESS=y ++CONFIG_NETFILTER_SKIP_EGRESS=y ++CONFIG_NETFILTER_BPF_LINK=y ++# CONFIG_NETFILTER_NETLINK_ACCT is not set ++# CONFIG_NETFILTER_NETLINK_QUEUE is not set ++# CONFIG_NETFILTER_NETLINK_LOG is not set ++# CONFIG_NETFILTER_NETLINK_OSF is not set ++# CONFIG_NF_CONNTRACK is not set ++# CONFIG_NF_LOG_SYSLOG is not set ++# CONFIG_NF_TABLES is not set ++# CONFIG_NETFILTER_XTABLES is not set ++# end of Core Netfilter Configuration ++ ++# CONFIG_IP_SET is not set ++# CONFIG_IP_VS is not set ++ ++# ++# IP: Netfilter Configuration ++# ++# CONFIG_NF_SOCKET_IPV4 is not set ++# CONFIG_NF_TPROXY_IPV4 is not set ++# CONFIG_NF_DUP_IPV4 is not set ++# CONFIG_NF_LOG_ARP is not set ++# CONFIG_NF_LOG_IPV4 is not set ++# CONFIG_NF_REJECT_IPV4 is not set ++# CONFIG_IP_NF_IPTABLES is not set ++# end of IP: Netfilter Configuration ++ ++# CONFIG_IP_DCCP is not set ++# CONFIG_IP_SCTP is not set ++# CONFIG_RDS is not set ++# CONFIG_TIPC is not set ++# CONFIG_ATM is not set ++# CONFIG_L2TP is not set ++# CONFIG_BRIDGE is not set ++# CONFIG_NET_DSA is not set ++# CONFIG_VLAN_8021Q is not set ++# CONFIG_LLC2 is not set ++# CONFIG_ATALK is not set ++# CONFIG_X25 is not set ++# CONFIG_LAPB is not set ++# CONFIG_PHONET is not set ++# CONFIG_IEEE802154 is not set ++CONFIG_NET_SCHED=y ++ ++# ++# Queueing/Scheduling ++# ++# CONFIG_NET_SCH_HTB is not set ++# CONFIG_NET_SCH_HFSC is not set ++# CONFIG_NET_SCH_PRIO is not set ++# CONFIG_NET_SCH_MULTIQ is not set ++# CONFIG_NET_SCH_RED is not set ++# CONFIG_NET_SCH_SFB is not set ++# CONFIG_NET_SCH_SFQ is not set ++# CONFIG_NET_SCH_TEQL is not set ++# CONFIG_NET_SCH_TBF is not set ++# CONFIG_NET_SCH_CBS is not set ++# CONFIG_NET_SCH_ETF is not set ++# CONFIG_NET_SCH_TAPRIO is not set ++# CONFIG_NET_SCH_GRED is not set ++# CONFIG_NET_SCH_NETEM is not set ++# CONFIG_NET_SCH_DRR is not set ++# CONFIG_NET_SCH_MQPRIO is not set ++# CONFIG_NET_SCH_SKBPRIO is not set ++# CONFIG_NET_SCH_CHOKE is not set ++# CONFIG_NET_SCH_QFQ is not set ++# CONFIG_NET_SCH_CODEL is not set ++# CONFIG_NET_SCH_FQ_CODEL is not set ++# CONFIG_NET_SCH_CAKE is not set ++# CONFIG_NET_SCH_FQ is not set ++# CONFIG_NET_SCH_HHF is not set ++# CONFIG_NET_SCH_PIE is not set ++# CONFIG_NET_SCH_INGRESS is not set ++# CONFIG_NET_SCH_PLUG is not set ++# CONFIG_NET_SCH_ETS is not set ++# CONFIG_NET_SCH_DEFAULT is not set ++ ++# ++# Classification ++# ++CONFIG_NET_CLS=y ++# CONFIG_NET_CLS_BASIC is not set ++# CONFIG_NET_CLS_ROUTE4 is not set ++# CONFIG_NET_CLS_FW is not set ++# CONFIG_NET_CLS_U32 is not set ++# CONFIG_NET_CLS_FLOW is not set ++# CONFIG_NET_CLS_CGROUP is not set ++# CONFIG_NET_CLS_BPF is not set ++# CONFIG_NET_CLS_FLOWER is not set ++# CONFIG_NET_CLS_MATCHALL is not set ++# CONFIG_NET_EMATCH is not set ++CONFIG_NET_CLS_ACT=y ++# CONFIG_NET_ACT_POLICE is not set ++# CONFIG_NET_ACT_GACT is not set ++# CONFIG_NET_ACT_MIRRED is not set ++# CONFIG_NET_ACT_SAMPLE is not set ++# CONFIG_NET_ACT_NAT is not set ++# CONFIG_NET_ACT_PEDIT is not set ++# CONFIG_NET_ACT_SIMP is not set ++# CONFIG_NET_ACT_SKBEDIT is not set ++# CONFIG_NET_ACT_CSUM is not set ++# CONFIG_NET_ACT_MPLS is not set ++# CONFIG_NET_ACT_VLAN is not set ++# CONFIG_NET_ACT_BPF is not set ++# CONFIG_NET_ACT_SKBMOD is not set ++# CONFIG_NET_ACT_IFE is not set ++# CONFIG_NET_ACT_TUNNEL_KEY is not set ++# CONFIG_NET_ACT_GATE is not set ++# CONFIG_NET_TC_SKB_EXT is not set ++CONFIG_NET_SCH_FIFO=y ++# CONFIG_DCB is not set ++CONFIG_DNS_RESOLVER=y ++# CONFIG_BATMAN_ADV is not set ++# CONFIG_OPENVSWITCH is not set ++# CONFIG_VSOCKETS is not set ++# CONFIG_NETLINK_DIAG is not set ++# CONFIG_MPLS is not set ++# CONFIG_NET_NSH is not set ++# CONFIG_HSR is not set ++CONFIG_NET_SWITCHDEV=y ++# CONFIG_NET_L3_MASTER_DEV is not set ++# CONFIG_QRTR is not set ++# CONFIG_NET_NCSI is not set ++CONFIG_PCPU_DEV_REFCNT=y ++CONFIG_MAX_SKB_FRAGS=17 ++CONFIG_RPS=y ++CONFIG_RFS_ACCEL=y ++CONFIG_SOCK_RX_QUEUE_MAPPING=y ++CONFIG_XPS=y ++# CONFIG_CGROUP_NET_PRIO is not set ++# CONFIG_CGROUP_NET_CLASSID is not set ++CONFIG_NET_RX_BUSY_POLL=y ++CONFIG_BQL=y ++# CONFIG_BPF_STREAM_PARSER is not set ++CONFIG_NET_FLOW_LIMIT=y ++ ++# ++# Network testing ++# ++# CONFIG_NET_PKTGEN is not set ++# end of Network testing ++# end of Networking options ++ ++# CONFIG_HAMRADIO is not set ++# CONFIG_CAN is not set ++# CONFIG_BT is not set ++# CONFIG_AF_RXRPC is not set ++# CONFIG_AF_KCM is not set ++# CONFIG_MCTP is not set ++CONFIG_WIRELESS=y ++# CONFIG_CFG80211 is not set ++ ++# ++# CFG80211 needs to be enabled for MAC80211 ++# ++CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 ++# CONFIG_RFKILL is not set ++CONFIG_NET_9P=y ++CONFIG_NET_9P_FD=y ++CONFIG_NET_9P_VIRTIO=y ++# CONFIG_NET_9P_XEN is not set ++# CONFIG_NET_9P_USBG is not set ++# CONFIG_NET_9P_DEBUG is not set ++# CONFIG_CAIF is not set ++# CONFIG_CEPH_LIB is not set ++# CONFIG_NFC is not set ++# CONFIG_PSAMPLE is not set ++# CONFIG_NET_IFE is not set ++# CONFIG_LWTUNNEL is not set ++CONFIG_NET_SELFTESTS=y ++CONFIG_NET_SOCK_MSG=y ++CONFIG_NET_DEVLINK=y ++CONFIG_PAGE_POOL=y ++CONFIG_PAGE_POOL_STATS=y ++CONFIG_FAILOVER=y ++CONFIG_ETHTOOL_NETLINK=y ++ ++# ++# Device Drivers ++# ++CONFIG_ARM_AMBA=y ++CONFIG_TEGRA_AHB=y ++CONFIG_HAVE_PCI=y ++CONFIG_GENERIC_PCI_IOMAP=y ++CONFIG_PCI=y ++CONFIG_PCI_DOMAINS=y ++CONFIG_PCI_DOMAINS_GENERIC=y ++CONFIG_PCI_SYSCALL=y ++CONFIG_PCIEPORTBUS=y ++# CONFIG_HOTPLUG_PCI_PCIE is not set ++CONFIG_PCIEAER=y ++# CONFIG_PCIEAER_INJECT is not set ++# CONFIG_PCIE_ECRC is not set ++CONFIG_PCIEASPM=y ++CONFIG_PCIEASPM_DEFAULT=y ++# CONFIG_PCIEASPM_POWERSAVE is not set ++# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set ++# CONFIG_PCIEASPM_PERFORMANCE is not set ++CONFIG_PCIE_PME=y ++# CONFIG_PCIE_DPC is not set ++# CONFIG_PCIE_PTM is not set ++CONFIG_PCI_MSI=y ++CONFIG_PCI_QUIRKS=y ++# CONFIG_PCI_DEBUG is not set ++# CONFIG_PCI_REALLOC_ENABLE_AUTO is not set ++# CONFIG_PCI_STUB is not set ++# CONFIG_PCI_PF_STUB is not set ++CONFIG_PCI_ATS=y ++CONFIG_PCI_ECAM=y ++CONFIG_PCI_BRIDGE_EMUL=y ++CONFIG_PCI_IOV=y ++# CONFIG_PCI_NPEM is not set ++# CONFIG_PCI_PRI is not set ++CONFIG_PCI_PASID=y ++CONFIG_PCI_LABEL=y ++# CONFIG_PCI_DYNAMIC_OF_NODES is not set ++CONFIG_VGA_ARB=y ++CONFIG_VGA_ARB_MAX_GPUS=16 ++CONFIG_HOTPLUG_PCI=y ++CONFIG_HOTPLUG_PCI_ACPI=y ++# CONFIG_HOTPLUG_PCI_ACPI_AMPERE_ALTRA is not set ++# CONFIG_HOTPLUG_PCI_ACPI_IBM is not set ++# CONFIG_HOTPLUG_PCI_CPCI is not set ++# CONFIG_HOTPLUG_PCI_SHPC is not set ++ ++# ++# PCI controller drivers ++# ++CONFIG_PCI_AARDVARK=y ++CONFIG_PCIE_ALTERA=y ++CONFIG_PCIE_ALTERA_MSI=y ++# CONFIG_PCIE_APPLE is not set ++# CONFIG_PCIE_BRCMSTB is not set ++CONFIG_PCIE_IPROC=y ++CONFIG_PCIE_IPROC_PLATFORM=y ++CONFIG_PCIE_IPROC_MSI=y ++CONFIG_PCI_HOST_THUNDER_PEM=y ++CONFIG_PCI_HOST_THUNDER_ECAM=y ++# CONFIG_PCI_FTPCI100 is not set ++CONFIG_PCI_HOST_COMMON=y ++CONFIG_PCI_HOST_GENERIC=y ++# CONFIG_PCIE_HISI_ERR is not set ++# CONFIG_PCIE_MEDIATEK is not set ++# CONFIG_PCIE_MEDIATEK_GEN3 is not set ++CONFIG_PCI_TEGRA=y ++CONFIG_PCIE_RCAR_HOST=y ++CONFIG_PCIE_RCAR_EP=y ++# CONFIG_PCIE_ROCKCHIP_HOST is not set ++# CONFIG_PCIE_ROCKCHIP_EP is not set ++CONFIG_PCI_XGENE=y ++CONFIG_PCI_XGENE_MSI=y ++# CONFIG_PCIE_XILINX is not set ++# CONFIG_PCIE_XILINX_DMA_PL is not set ++# CONFIG_PCIE_XILINX_NWL is not set ++# CONFIG_PCIE_XILINX_CPM is not set ++ ++# ++# Cadence-based PCIe controllers ++# ++# CONFIG_PCIE_CADENCE_PLAT_HOST is not set ++# CONFIG_PCIE_CADENCE_PLAT_EP is not set ++# CONFIG_PCI_J721E_HOST is not set ++# CONFIG_PCI_J721E_EP is not set ++# end of Cadence-based PCIe controllers ++ ++# ++# DesignWare-based PCIe controllers ++# ++CONFIG_PCIE_DW=y ++CONFIG_PCIE_DW_HOST=y ++# CONFIG_PCIE_AL is not set ++# CONFIG_PCI_MESON is not set ++CONFIG_PCI_IMX6=y ++CONFIG_PCI_IMX6_HOST=y ++# CONFIG_PCI_IMX6_EP is not set ++CONFIG_PCI_LAYERSCAPE=y ++# CONFIG_PCI_LAYERSCAPE_EP is not set ++CONFIG_PCI_HISI=y ++CONFIG_PCIE_KIRIN=y ++CONFIG_PCIE_HISI_STB=y ++# CONFIG_PCIE_KEEMBAY_HOST is not set ++# CONFIG_PCIE_KEEMBAY_EP is not set ++CONFIG_PCIE_ARMADA_8K=y ++# CONFIG_PCIE_TEGRA194_HOST is not set ++# CONFIG_PCIE_TEGRA194_EP is not set ++# CONFIG_PCIE_DW_PLAT_HOST is not set ++# CONFIG_PCIE_DW_PLAT_EP is not set ++CONFIG_PCIE_QCOM_COMMON=y ++CONFIG_PCIE_QCOM=y ++# CONFIG_PCIE_QCOM_EP is not set ++# CONFIG_PCIE_RCAR_GEN4_HOST is not set ++# CONFIG_PCIE_RCAR_GEN4_EP is not set ++CONFIG_PCIE_ROCKCHIP_DW=y ++CONFIG_PCIE_ROCKCHIP_DW_HOST=y ++# CONFIG_PCIE_ROCKCHIP_DW_EP is not set ++# CONFIG_PCI_EXYNOS is not set ++# CONFIG_PCIE_UNIPHIER is not set ++# CONFIG_PCIE_UNIPHIER_EP is not set ++# CONFIG_PCI_KEYSTONE_HOST is not set ++# CONFIG_PCI_KEYSTONE_EP is not set ++CONFIG_PCIE_VISCONTI_HOST=y ++# end of DesignWare-based PCIe controllers ++ ++# ++# Mobiveil-based PCIe controllers ++# ++CONFIG_PCIE_MOBIVEIL=y ++CONFIG_PCIE_MOBIVEIL_HOST=y ++CONFIG_PCIE_LAYERSCAPE_GEN4=y ++# CONFIG_PCIE_MOBIVEIL_PLAT is not set ++# end of Mobiveil-based PCIe controllers ++ ++# ++# PLDA-based PCIe controllers ++# ++# CONFIG_PCIE_MICROCHIP_HOST is not set ++# end of PLDA-based PCIe controllers ++# end of PCI controller drivers ++ ++# ++# PCI Endpoint ++# ++CONFIG_PCI_ENDPOINT=y ++CONFIG_PCI_ENDPOINT_CONFIGFS=y ++# CONFIG_PCI_EPF_TEST is not set ++# CONFIG_PCI_EPF_NTB is not set ++# end of PCI Endpoint ++ ++# ++# PCI switch controller drivers ++# ++# CONFIG_PCI_SW_SWITCHTEC is not set ++# end of PCI switch controller drivers ++ ++CONFIG_HAVE_PWRCTL=y ++# CONFIG_CXL_BUS is not set ++# CONFIG_PCCARD is not set ++# CONFIG_RAPIDIO is not set ++ ++# ++# Generic Driver Options ++# ++CONFIG_AUXILIARY_BUS=y ++# CONFIG_UEVENT_HELPER is not set ++CONFIG_DEVTMPFS=y ++CONFIG_DEVTMPFS_MOUNT=y ++# CONFIG_DEVTMPFS_SAFE is not set ++CONFIG_STANDALONE=y ++CONFIG_PREVENT_FIRMWARE_BUILD=y ++ ++# ++# Firmware loader ++# ++CONFIG_FW_LOADER=y ++CONFIG_FW_LOADER_PAGED_BUF=y ++CONFIG_FW_LOADER_SYSFS=y ++CONFIG_EXTRA_FIRMWARE="" ++CONFIG_FW_LOADER_USER_HELPER=y ++# CONFIG_FW_LOADER_USER_HELPER_FALLBACK is not set ++# CONFIG_FW_LOADER_COMPRESS is not set ++CONFIG_FW_CACHE=y ++# CONFIG_FW_UPLOAD is not set ++# end of Firmware loader ++ ++CONFIG_WANT_DEV_COREDUMP=y ++CONFIG_ALLOW_DEV_COREDUMP=y ++CONFIG_DEV_COREDUMP=y ++# CONFIG_DEBUG_DRIVER is not set ++# CONFIG_DEBUG_DEVRES is not set ++# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set ++CONFIG_HMEM_REPORTING=y ++# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set ++CONFIG_SYS_HYPERVISOR=y ++CONFIG_GENERIC_CPU_DEVICES=y ++CONFIG_GENERIC_CPU_AUTOPROBE=y ++CONFIG_GENERIC_CPU_VULNERABILITIES=y ++CONFIG_SOC_BUS=y ++CONFIG_REGMAP=y ++CONFIG_REGMAP_I2C=y ++CONFIG_REGMAP_SPI=y ++CONFIG_REGMAP_SPMI=y ++CONFIG_REGMAP_MMIO=y ++CONFIG_REGMAP_IRQ=y ++CONFIG_DMA_SHARED_BUFFER=y ++# CONFIG_DMA_FENCE_TRACE is not set ++CONFIG_GENERIC_ARCH_TOPOLOGY=y ++CONFIG_GENERIC_ARCH_NUMA=y ++# CONFIG_FW_DEVLINK_SYNC_STATE_TIMEOUT is not set ++# end of Generic Driver Options ++ ++# ++# Bus devices ++# ++CONFIG_BRCMSTB_GISB_ARB=y ++# CONFIG_MOXTET is not set ++CONFIG_HISILICON_LPC=y ++# CONFIG_IMX_WEIM is not set ++CONFIG_QCOM_EBI2=y ++# CONFIG_QCOM_SSC_BLOCK_BUS is not set ++CONFIG_STM32_FIREWALL=y ++CONFIG_SUN50I_DE2_BUS=y ++CONFIG_SUNXI_RSB=y ++# CONFIG_TEGRA_ACONNECT is not set ++# CONFIG_TEGRA_GMI is not set ++CONFIG_TI_SYSC=y ++CONFIG_UNIPHIER_SYSTEM_BUS=y ++CONFIG_VEXPRESS_CONFIG=y ++CONFIG_FSL_MC_BUS=y ++# CONFIG_FSL_MC_UAPI_SUPPORT is not set ++# CONFIG_MHI_BUS is not set ++# CONFIG_MHI_BUS_EP is not set ++# end of Bus devices ++ ++# ++# Cache Drivers ++# ++# end of Cache Drivers ++ ++# CONFIG_CONNECTOR is not set ++ ++# ++# Firmware Drivers ++# ++ ++# ++# ARM System Control and Management Interface Protocol ++# ++CONFIG_ARM_SCMI_PROTOCOL=y ++# CONFIG_ARM_SCMI_RAW_MODE_SUPPORT is not set ++# CONFIG_ARM_SCMI_DEBUG_COUNTERS is not set ++ ++# ++# SCMI Transport Drivers ++# ++CONFIG_ARM_SCMI_HAVE_TRANSPORT=y ++CONFIG_ARM_SCMI_HAVE_SHMEM=y ++CONFIG_ARM_SCMI_HAVE_MSG=y ++CONFIG_ARM_SCMI_TRANSPORT_MAILBOX=y ++CONFIG_ARM_SCMI_TRANSPORT_SMC=y ++# CONFIG_ARM_SCMI_TRANSPORT_SMC_ATOMIC_ENABLE is not set ++CONFIG_ARM_SCMI_TRANSPORT_OPTEE=y ++# CONFIG_ARM_SCMI_TRANSPORT_VIRTIO is not set ++# end of SCMI Transport Drivers ++ ++# ++# ARM SCMI NXP i.MX Vendor Protocols ++# ++CONFIG_IMX_SCMI_BBM_EXT=y ++CONFIG_IMX_SCMI_MISC_EXT=y ++# end of ARM SCMI NXP i.MX Vendor Protocols ++ ++# CONFIG_ARM_SCMI_POWER_CONTROL is not set ++# end of ARM System Control and Management Interface Protocol ++ ++CONFIG_ARM_SCPI_PROTOCOL=y ++# CONFIG_ARM_SDE_INTERFACE is not set ++CONFIG_DMIID=y ++# CONFIG_DMI_SYSFS is not set ++# CONFIG_ISCSI_IBFT is not set ++CONFIG_RASPBERRYPI_FIRMWARE=y ++# CONFIG_FW_CFG_SYSFS is not set ++CONFIG_INTEL_STRATIX10_SERVICE=y ++# CONFIG_INTEL_STRATIX10_RSU is not set ++CONFIG_SYSFB=y ++# CONFIG_SYSFB_SIMPLEFB is not set ++CONFIG_TI_SCI_PROTOCOL=y ++# CONFIG_TURRIS_MOX_RWTM is not set ++# CONFIG_ARM_FFA_TRANSPORT is not set ++CONFIG_TEE_BNXT_FW=y ++# CONFIG_GOOGLE_FIRMWARE is not set ++ ++# ++# EFI (Extensible Firmware Interface) Support ++# ++CONFIG_EFI_ESRT=y ++CONFIG_EFI_VARS_PSTORE=y ++# CONFIG_EFI_VARS_PSTORE_DEFAULT_DISABLE is not set ++CONFIG_EFI_SOFT_RESERVE=y ++CONFIG_EFI_PARAMS_FROM_FDT=y ++CONFIG_EFI_RUNTIME_WRAPPERS=y ++CONFIG_EFI_GENERIC_STUB=y ++# CONFIG_EFI_ZBOOT is not set ++CONFIG_EFI_ARMSTUB_DTB_LOADER=y ++# CONFIG_EFI_BOOTLOADER_CONTROL is not set ++CONFIG_EFI_CAPSULE_LOADER=y ++# CONFIG_EFI_TEST is not set ++# CONFIG_RESET_ATTACK_MITIGATION is not set ++# CONFIG_EFI_DISABLE_PCI_DMA is not set ++CONFIG_EFI_EARLYCON=y ++CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y ++# CONFIG_EFI_DISABLE_RUNTIME is not set ++# CONFIG_EFI_COCO_SECRET is not set ++# end of EFI (Extensible Firmware Interface) Support ++ ++CONFIG_UEFI_CPER=y ++CONFIG_UEFI_CPER_ARM=y ++# CONFIG_TEE_STMM_EFI is not set ++# CONFIG_IMX_DSP is not set ++CONFIG_IMX_SCU=y ++CONFIG_IMX_SCMI_MISC_DRV=y ++CONFIG_MESON_SM=y ++CONFIG_ARM_PSCI_FW=y ++# CONFIG_ARM_PSCI_CHECKER is not set ++ ++# ++# Qualcomm firmware drivers ++# ++CONFIG_QCOM_SCM=y ++CONFIG_QCOM_TZMEM=y ++CONFIG_QCOM_TZMEM_MODE_GENERIC=y ++# CONFIG_QCOM_TZMEM_MODE_SHMBRIDGE is not set ++# CONFIG_QCOM_QSEECOM is not set ++# end of Qualcomm firmware drivers ++ ++CONFIG_HAVE_ARM_SMCCC=y ++CONFIG_HAVE_ARM_SMCCC_DISCOVERY=y ++CONFIG_ARM_SMCCC_SOC_ID=y ++ ++# ++# Tegra firmware driver ++# ++CONFIG_TEGRA_IVC=y ++CONFIG_TEGRA_BPMP=y ++# end of Tegra firmware driver ++ ++# ++# Zynq MPSoC Firmware Drivers ++# ++CONFIG_ZYNQMP_FIRMWARE=y ++# CONFIG_ZYNQMP_FIRMWARE_DEBUG is not set ++# end of Zynq MPSoC Firmware Drivers ++# end of Firmware Drivers ++ ++# CONFIG_GNSS is not set ++CONFIG_MTD=y ++# CONFIG_MTD_TESTS is not set ++ ++# ++# Partition parsers ++# ++# CONFIG_MTD_BRCM_U_BOOT is not set ++# CONFIG_MTD_CMDLINE_PARTS is not set ++CONFIG_MTD_OF_PARTS=y ++CONFIG_MTD_OF_PARTS_BCM4908=y ++# CONFIG_MTD_OF_PARTS_LINKSYS_NS is not set ++# CONFIG_MTD_AFS_PARTS is not set ++# CONFIG_MTD_PARSER_TRX is not set ++# CONFIG_MTD_REDBOOT_PARTS is not set ++# CONFIG_MTD_QCOMSMEM_PARTS is not set ++# end of Partition parsers ++ ++# ++# User Modules And Translation Layers ++# ++CONFIG_MTD_BLKDEVS=y ++CONFIG_MTD_BLOCK=y ++ ++# ++# Note that in some cases UBI block is preferred. See MTD_UBI_BLOCK. ++# ++# CONFIG_FTL is not set ++# CONFIG_NFTL is not set ++# CONFIG_INFTL is not set ++# CONFIG_RFD_FTL is not set ++# CONFIG_SSFDC is not set ++# CONFIG_SM_FTL is not set ++# CONFIG_MTD_OOPS is not set ++# CONFIG_MTD_SWAP is not set ++# CONFIG_MTD_PARTITIONED_MASTER is not set ++ ++# ++# RAM/ROM/Flash chip drivers ++# ++CONFIG_MTD_CFI=y ++# CONFIG_MTD_JEDECPROBE is not set ++CONFIG_MTD_GEN_PROBE=y ++CONFIG_MTD_CFI_ADV_OPTIONS=y ++CONFIG_MTD_CFI_NOSWAP=y ++# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set ++# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set ++# CONFIG_MTD_CFI_GEOMETRY is not set ++CONFIG_MTD_MAP_BANK_WIDTH_1=y ++CONFIG_MTD_MAP_BANK_WIDTH_2=y ++CONFIG_MTD_MAP_BANK_WIDTH_4=y ++CONFIG_MTD_CFI_I1=y ++CONFIG_MTD_CFI_I2=y ++# CONFIG_MTD_OTP is not set ++CONFIG_MTD_CFI_INTELEXT=y ++CONFIG_MTD_CFI_AMDSTD=y ++CONFIG_MTD_CFI_STAA=y ++CONFIG_MTD_CFI_UTIL=y ++# CONFIG_MTD_RAM is not set ++# CONFIG_MTD_ROM is not set ++# CONFIG_MTD_ABSENT is not set ++# end of RAM/ROM/Flash chip drivers ++ ++# ++# Mapping drivers for chip access ++# ++# CONFIG_MTD_COMPLEX_MAPPINGS is not set ++CONFIG_MTD_PHYSMAP=y ++# CONFIG_MTD_PHYSMAP_COMPAT is not set ++CONFIG_MTD_PHYSMAP_OF=y ++# CONFIG_MTD_PHYSMAP_VERSATILE is not set ++# CONFIG_MTD_PHYSMAP_GEMINI is not set ++# CONFIG_MTD_PLATRAM is not set ++# end of Mapping drivers for chip access ++ ++# ++# Self-contained MTD device drivers ++# ++# CONFIG_MTD_PMC551 is not set ++CONFIG_MTD_DATAFLASH=y ++# CONFIG_MTD_DATAFLASH_WRITE_VERIFY is not set ++# CONFIG_MTD_DATAFLASH_OTP is not set ++# CONFIG_MTD_MCHP23K256 is not set ++# CONFIG_MTD_MCHP48L640 is not set ++CONFIG_MTD_SST25L=y ++# CONFIG_MTD_SLRAM is not set ++# CONFIG_MTD_PHRAM is not set ++# CONFIG_MTD_MTDRAM is not set ++# CONFIG_MTD_BLOCK2MTD is not set ++ ++# ++# Disk-On-Chip Device Drivers ++# ++# CONFIG_MTD_DOCG3 is not set ++# end of Self-contained MTD device drivers ++ ++# ++# NAND ++# ++CONFIG_MTD_NAND_CORE=y ++# CONFIG_MTD_ONENAND is not set ++CONFIG_MTD_RAW_NAND=y ++ ++# ++# Raw/parallel NAND flash controllers ++# ++CONFIG_MTD_NAND_DENALI=y ++# CONFIG_MTD_NAND_DENALI_PCI is not set ++CONFIG_MTD_NAND_DENALI_DT=y ++# CONFIG_MTD_NAND_CAFE is not set ++CONFIG_MTD_NAND_MARVELL=y ++# CONFIG_MTD_NAND_BRCMNAND is not set ++CONFIG_MTD_NAND_FSL_IFC=y ++# CONFIG_MTD_NAND_MXC is not set ++# CONFIG_MTD_NAND_SUNXI is not set ++# CONFIG_MTD_NAND_HISI504 is not set ++CONFIG_MTD_NAND_QCOM=y ++# CONFIG_MTD_NAND_MXIC is not set ++# CONFIG_MTD_NAND_TEGRA is not set ++# CONFIG_MTD_NAND_STM32_FMC2 is not set ++# CONFIG_MTD_NAND_MESON is not set ++# CONFIG_MTD_NAND_GPIO is not set ++# CONFIG_MTD_NAND_PLATFORM is not set ++# CONFIG_MTD_NAND_CADENCE is not set ++# CONFIG_MTD_NAND_ARASAN is not set ++# CONFIG_MTD_NAND_INTEL_LGM is not set ++# CONFIG_MTD_NAND_ROCKCHIP is not set ++# CONFIG_MTD_NAND_RENESAS is not set ++ ++# ++# Misc ++# ++# CONFIG_MTD_NAND_NANDSIM is not set ++# CONFIG_MTD_NAND_RICOH is not set ++# CONFIG_MTD_NAND_DISKONCHIP is not set ++# CONFIG_MTD_SPI_NAND is not set ++ ++# ++# ECC engine support ++# ++CONFIG_MTD_NAND_ECC=y ++CONFIG_MTD_NAND_ECC_SW_HAMMING=y ++# CONFIG_MTD_NAND_ECC_SW_HAMMING_SMC is not set ++# CONFIG_MTD_NAND_ECC_SW_BCH is not set ++# CONFIG_MTD_NAND_ECC_MXIC is not set ++# CONFIG_MTD_NAND_ECC_MEDIATEK is not set ++# end of ECC engine support ++# end of NAND ++ ++# ++# LPDDR & LPDDR2 PCM memory drivers ++# ++# CONFIG_MTD_LPDDR is not set ++# end of LPDDR & LPDDR2 PCM memory drivers ++ ++CONFIG_MTD_SPI_NOR=y ++CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y ++# CONFIG_MTD_SPI_NOR_SWP_DISABLE is not set ++CONFIG_MTD_SPI_NOR_SWP_DISABLE_ON_VOLATILE=y ++# CONFIG_MTD_SPI_NOR_SWP_KEEP is not set ++# CONFIG_SPI_HISI_SFC is not set ++# CONFIG_MTD_UBI is not set ++# CONFIG_MTD_HYPERBUS is not set ++CONFIG_DTC=y ++CONFIG_OF=y ++# CONFIG_OF_UNITTEST is not set ++CONFIG_OF_FLATTREE=y ++CONFIG_OF_EARLY_FLATTREE=y ++CONFIG_OF_KOBJ=y ++CONFIG_OF_DYNAMIC=y ++CONFIG_OF_ADDRESS=y ++CONFIG_OF_IRQ=y ++CONFIG_OF_RESERVED_MEM=y ++# CONFIG_OF_OVERLAY is not set ++CONFIG_OF_NUMA=y ++# CONFIG_PARPORT is not set ++CONFIG_PNP=y ++CONFIG_PNP_DEBUG_MESSAGES=y ++ ++# ++# Protocols ++# ++CONFIG_PNPACPI=y ++CONFIG_BLK_DEV=y ++# CONFIG_BLK_DEV_NULL_BLK is not set ++# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set ++# CONFIG_ZRAM is not set ++CONFIG_ZRAM_DEF_COMP="unset-value" ++CONFIG_BLK_DEV_LOOP=y ++CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 ++# CONFIG_BLK_DEV_DRBD is not set ++# CONFIG_BLK_DEV_NBD is not set ++# CONFIG_BLK_DEV_RAM is not set ++# CONFIG_CDROM_PKTCDVD is not set ++# CONFIG_ATA_OVER_ETH is not set ++CONFIG_XEN_BLKDEV_FRONTEND=y ++# CONFIG_XEN_BLKDEV_BACKEND is not set ++CONFIG_VIRTIO_BLK=y ++# CONFIG_BLK_DEV_RBD is not set ++# CONFIG_BLK_DEV_UBLK is not set ++ ++# ++# NVME Support ++# ++# CONFIG_BLK_DEV_NVME is not set ++# CONFIG_NVME_FC is not set ++# CONFIG_NVME_TCP is not set ++# CONFIG_NVME_APPLE is not set ++# CONFIG_NVME_TARGET is not set ++# end of NVME Support ++ ++# ++# Misc devices ++# ++# CONFIG_AD525X_DPOT is not set ++# CONFIG_DUMMY_IRQ is not set ++# CONFIG_PHANTOM is not set ++# CONFIG_RPMB is not set ++# CONFIG_TIFM_CORE is not set ++# CONFIG_ICS932S401 is not set ++# CONFIG_ENCLOSURE_SERVICES is not set ++# CONFIG_HI6421V600_IRQ is not set ++# CONFIG_HP_ILO is not set ++# CONFIG_QCOM_COINCELL is not set ++# CONFIG_QCOM_FASTRPC is not set ++# CONFIG_APDS9802ALS is not set ++# CONFIG_ISL29003 is not set ++# CONFIG_ISL29020 is not set ++# CONFIG_SENSORS_TSL2550 is not set ++# CONFIG_SENSORS_BH1770 is not set ++# CONFIG_SENSORS_APDS990X is not set ++# CONFIG_HMC6352 is not set ++# CONFIG_DS1682 is not set ++# CONFIG_LATTICE_ECP3_CONFIG is not set ++CONFIG_SRAM=y ++# CONFIG_DW_XDATA_PCIE is not set ++# CONFIG_PCI_ENDPOINT_TEST is not set ++# CONFIG_XILINX_SDFEC is not set ++# CONFIG_HISI_HIKEY_USB is not set ++# CONFIG_OPEN_DICE is not set ++# CONFIG_VCPU_STALL_DETECTOR is not set ++# CONFIG_NSM is not set ++# CONFIG_MARVELL_CN10K_DPI is not set ++# CONFIG_C2PORT is not set ++ ++# ++# EEPROM support ++# ++# CONFIG_EEPROM_AT24 is not set ++# CONFIG_EEPROM_AT25 is not set ++# CONFIG_EEPROM_MAX6875 is not set ++# CONFIG_EEPROM_93CX6 is not set ++# CONFIG_EEPROM_93XX46 is not set ++# CONFIG_EEPROM_IDT_89HPESX is not set ++# CONFIG_EEPROM_EE1004 is not set ++# end of EEPROM support ++ ++# CONFIG_CB710_CORE is not set ++ ++# ++# Texas Instruments shared transport line discipline ++# ++# CONFIG_TI_ST is not set ++# end of Texas Instruments shared transport line discipline ++ ++# CONFIG_SENSORS_LIS3_I2C is not set ++# CONFIG_ALTERA_STAPL is not set ++# CONFIG_VMWARE_VMCI is not set ++# CONFIG_GENWQE is not set ++# CONFIG_ECHO is not set ++# CONFIG_BCM_VK is not set ++# CONFIG_MISC_ALCOR_PCI is not set ++# CONFIG_MISC_RTSX_PCI is not set ++# CONFIG_MISC_RTSX_USB is not set ++# CONFIG_UACCE is not set ++# CONFIG_PVPANIC is not set ++# CONFIG_GP_PCI1XXXX is not set ++# CONFIG_KEBA_CP500 is not set ++# end of Misc devices ++ ++# ++# SCSI device support ++# ++CONFIG_SCSI_MOD=y ++# CONFIG_RAID_ATTRS is not set ++CONFIG_SCSI_COMMON=y ++CONFIG_SCSI=y ++CONFIG_SCSI_DMA=y ++# CONFIG_SCSI_PROC_FS is not set ++ ++# ++# SCSI support type (disk, tape, CD-ROM) ++# ++CONFIG_BLK_DEV_SD=y ++# CONFIG_CHR_DEV_ST is not set ++# CONFIG_BLK_DEV_SR is not set ++# CONFIG_CHR_DEV_SG is not set ++CONFIG_BLK_DEV_BSG=y ++# CONFIG_CHR_DEV_SCH is not set ++# CONFIG_SCSI_CONSTANTS is not set ++# CONFIG_SCSI_LOGGING is not set ++# CONFIG_SCSI_SCAN_ASYNC is not set ++ ++# ++# SCSI Transports ++# ++# CONFIG_SCSI_SPI_ATTRS is not set ++# CONFIG_SCSI_FC_ATTRS is not set ++# CONFIG_SCSI_ISCSI_ATTRS is not set ++CONFIG_SCSI_SAS_ATTRS=y ++CONFIG_SCSI_SAS_LIBSAS=y ++CONFIG_SCSI_SAS_ATA=y ++CONFIG_SCSI_SAS_HOST_SMP=y ++# CONFIG_SCSI_SRP_ATTRS is not set ++# end of SCSI Transports ++ ++CONFIG_SCSI_LOWLEVEL=y ++# CONFIG_ISCSI_TCP is not set ++# CONFIG_ISCSI_BOOT_SYSFS is not set ++# CONFIG_SCSI_CXGB3_ISCSI is not set ++# CONFIG_SCSI_CXGB4_ISCSI is not set ++# CONFIG_SCSI_BNX2_ISCSI is not set ++# CONFIG_BE2ISCSI is not set ++# CONFIG_BLK_DEV_3W_XXXX_RAID is not set ++# CONFIG_SCSI_HPSA is not set ++# CONFIG_SCSI_3W_9XXX is not set ++# CONFIG_SCSI_3W_SAS is not set ++# CONFIG_SCSI_ACARD is not set ++# CONFIG_SCSI_AACRAID is not set ++# CONFIG_SCSI_AIC7XXX is not set ++# CONFIG_SCSI_AIC79XX is not set ++# CONFIG_SCSI_AIC94XX is not set ++CONFIG_SCSI_HISI_SAS=y ++CONFIG_SCSI_HISI_SAS_PCI=y ++# CONFIG_SCSI_HISI_SAS_DEBUGFS_DEFAULT_ENABLE is not set ++# CONFIG_SCSI_MVSAS is not set ++# CONFIG_SCSI_MVUMI is not set ++# CONFIG_SCSI_ADVANSYS is not set ++# CONFIG_SCSI_ARCMSR is not set ++# CONFIG_SCSI_ESAS2R is not set ++# CONFIG_MEGARAID_NEWGEN is not set ++# CONFIG_MEGARAID_LEGACY is not set ++CONFIG_MEGARAID_SAS=y ++# CONFIG_SCSI_MPT3SAS is not set ++# CONFIG_SCSI_MPT2SAS is not set ++# CONFIG_SCSI_MPI3MR is not set ++# CONFIG_SCSI_SMARTPQI is not set ++# CONFIG_SCSI_HPTIOP is not set ++# CONFIG_SCSI_BUSLOGIC is not set ++# CONFIG_SCSI_MYRB is not set ++# CONFIG_SCSI_MYRS is not set ++# CONFIG_XEN_SCSI_FRONTEND is not set ++# CONFIG_SCSI_SNIC is not set ++# CONFIG_SCSI_DMX3191D is not set ++# CONFIG_SCSI_FDOMAIN_PCI is not set ++# CONFIG_SCSI_IPS is not set ++# CONFIG_SCSI_INITIO is not set ++# CONFIG_SCSI_INIA100 is not set ++# CONFIG_SCSI_STEX is not set ++# CONFIG_SCSI_SYM53C8XX_2 is not set ++# CONFIG_SCSI_IPR is not set ++# CONFIG_SCSI_QLOGIC_1280 is not set ++# CONFIG_SCSI_QLA_ISCSI is not set ++# CONFIG_SCSI_DC395x is not set ++# CONFIG_SCSI_AM53C974 is not set ++# CONFIG_SCSI_WD719X is not set ++# CONFIG_SCSI_DEBUG is not set ++# CONFIG_SCSI_PMCRAID is not set ++# CONFIG_SCSI_PM8001 is not set ++# CONFIG_SCSI_VIRTIO is not set ++# CONFIG_SCSI_DH is not set ++# end of SCSI device support ++ ++CONFIG_ATA=y ++CONFIG_SATA_HOST=y ++CONFIG_PATA_TIMINGS=y ++CONFIG_ATA_VERBOSE_ERROR=y ++CONFIG_ATA_FORCE=y ++CONFIG_ATA_ACPI=y ++# CONFIG_SATA_ZPODD is not set ++CONFIG_SATA_PMP=y ++ ++# ++# Controllers with non-SFF native interface ++# ++CONFIG_SATA_AHCI=y ++CONFIG_SATA_MOBILE_LPM_POLICY=0 ++CONFIG_SATA_AHCI_PLATFORM=y ++# CONFIG_AHCI_BRCM is not set ++# CONFIG_AHCI_DWC is not set ++# CONFIG_AHCI_IMX is not set ++CONFIG_AHCI_CEVA=y ++# CONFIG_AHCI_MTK is not set ++CONFIG_AHCI_MVEBU=y ++# CONFIG_AHCI_SUNXI is not set ++# CONFIG_AHCI_TEGRA is not set ++CONFIG_AHCI_XGENE=y ++CONFIG_AHCI_QORIQ=y ++# CONFIG_SATA_AHCI_SEATTLE is not set ++# CONFIG_SATA_INIC162X is not set ++# CONFIG_SATA_ACARD_AHCI is not set ++CONFIG_SATA_SIL24=y ++CONFIG_ATA_SFF=y ++ ++# ++# SFF controllers with custom DMA interface ++# ++# CONFIG_PDC_ADMA is not set ++# CONFIG_SATA_QSTOR is not set ++# CONFIG_SATA_SX4 is not set ++CONFIG_ATA_BMDMA=y ++ ++# ++# SATA SFF controllers with BMDMA ++# ++# CONFIG_ATA_PIIX is not set ++# CONFIG_SATA_DWC is not set ++# CONFIG_SATA_MV is not set ++# CONFIG_SATA_NV is not set ++# CONFIG_SATA_PROMISE is not set ++CONFIG_SATA_RCAR=y ++# CONFIG_SATA_SIL is not set ++# CONFIG_SATA_SIS is not set ++# CONFIG_SATA_SVW is not set ++# CONFIG_SATA_ULI is not set ++# CONFIG_SATA_VIA is not set ++# CONFIG_SATA_VITESSE is not set ++ ++# ++# PATA SFF controllers with BMDMA ++# ++# CONFIG_PATA_ALI is not set ++# CONFIG_PATA_AMD is not set ++# CONFIG_PATA_ARTOP is not set ++# CONFIG_PATA_ATIIXP is not set ++# CONFIG_PATA_ATP867X is not set ++# CONFIG_PATA_CMD64X is not set ++# CONFIG_PATA_CYPRESS is not set ++# CONFIG_PATA_EFAR is not set ++# CONFIG_PATA_HPT366 is not set ++# CONFIG_PATA_HPT37X is not set ++# CONFIG_PATA_HPT3X2N is not set ++# CONFIG_PATA_HPT3X3 is not set ++# CONFIG_PATA_IMX is not set ++# CONFIG_PATA_IT8213 is not set ++# CONFIG_PATA_IT821X is not set ++# CONFIG_PATA_JMICRON is not set ++# CONFIG_PATA_MARVELL is not set ++# CONFIG_PATA_NETCELL is not set ++# CONFIG_PATA_NINJA32 is not set ++# CONFIG_PATA_NS87415 is not set ++# CONFIG_PATA_OLDPIIX is not set ++# CONFIG_PATA_OPTIDMA is not set ++# CONFIG_PATA_PDC2027X is not set ++# CONFIG_PATA_PDC_OLD is not set ++# CONFIG_PATA_RADISYS is not set ++# CONFIG_PATA_RDC is not set ++# CONFIG_PATA_SCH is not set ++# CONFIG_PATA_SERVERWORKS is not set ++# CONFIG_PATA_SIL680 is not set ++# CONFIG_PATA_SIS is not set ++# CONFIG_PATA_TOSHIBA is not set ++# CONFIG_PATA_TRIFLEX is not set ++# CONFIG_PATA_VIA is not set ++# CONFIG_PATA_WINBOND is not set ++ ++# ++# PIO-only SFF controllers ++# ++# CONFIG_PATA_CMD640_PCI is not set ++# CONFIG_PATA_MPIIX is not set ++# CONFIG_PATA_NS87410 is not set ++# CONFIG_PATA_OPTI is not set ++CONFIG_PATA_PLATFORM=y ++CONFIG_PATA_OF_PLATFORM=y ++# CONFIG_PATA_RZ1000 is not set ++ ++# ++# Generic fallback / legacy drivers ++# ++# CONFIG_PATA_ACPI is not set ++# CONFIG_ATA_GENERIC is not set ++# CONFIG_PATA_LEGACY is not set ++CONFIG_MD=y ++# CONFIG_BLK_DEV_MD is not set ++CONFIG_MD_BITMAP_FILE=y ++# CONFIG_BCACHE is not set ++# CONFIG_BLK_DEV_DM is not set ++# CONFIG_TARGET_CORE is not set ++# CONFIG_FUSION is not set ++ ++# ++# IEEE 1394 (FireWire) support ++# ++# CONFIG_FIREWIRE is not set ++# CONFIG_FIREWIRE_NOSY is not set ++# end of IEEE 1394 (FireWire) support ++ ++CONFIG_NETDEVICES=y ++CONFIG_MII=y ++CONFIG_NET_CORE=y ++# CONFIG_BONDING is not set ++# CONFIG_DUMMY is not set ++# CONFIG_WIREGUARD is not set ++# CONFIG_EQUALIZER is not set ++# CONFIG_NET_FC is not set ++# CONFIG_NET_TEAM is not set ++CONFIG_MACVLAN=y ++# CONFIG_MACVTAP is not set ++# CONFIG_IPVLAN is not set ++# CONFIG_VXLAN is not set ++# CONFIG_GENEVE is not set ++# CONFIG_BAREUDP is not set ++# CONFIG_GTP is not set ++# CONFIG_PFCP is not set ++# CONFIG_AMT is not set ++# CONFIG_MACSEC is not set ++# CONFIG_NETCONSOLE is not set ++CONFIG_TUN=y ++# CONFIG_TUN_VNET_CROSS_LE is not set ++# CONFIG_VETH is not set ++CONFIG_VIRTIO_NET=y ++CONFIG_NLMON=y ++# CONFIG_NETKIT is not set ++# CONFIG_ARCNET is not set ++CONFIG_ETHERNET=y ++CONFIG_NET_VENDOR_3COM=y ++# CONFIG_VORTEX is not set ++# CONFIG_TYPHOON is not set ++CONFIG_NET_VENDOR_ACTIONS=y ++# CONFIG_OWL_EMAC is not set ++CONFIG_NET_VENDOR_ADAPTEC=y ++# CONFIG_ADAPTEC_STARFIRE is not set ++CONFIG_NET_VENDOR_AGERE=y ++# CONFIG_ET131X is not set ++CONFIG_NET_VENDOR_ALACRITECH=y ++# CONFIG_SLICOSS is not set ++CONFIG_NET_VENDOR_ALLWINNER=y ++# CONFIG_SUN4I_EMAC is not set ++CONFIG_NET_VENDOR_ALTEON=y ++# CONFIG_ACENIC is not set ++# CONFIG_ALTERA_TSE is not set ++CONFIG_NET_VENDOR_AMAZON=y ++# CONFIG_ENA_ETHERNET is not set ++CONFIG_NET_VENDOR_AMD=y ++# CONFIG_AMD8111_ETH is not set ++# CONFIG_PCNET32 is not set ++CONFIG_AMD_XGBE=y ++# CONFIG_PDS_CORE is not set ++CONFIG_NET_XGENE=y ++# CONFIG_NET_XGENE_V2 is not set ++CONFIG_NET_VENDOR_AQUANTIA=y ++# CONFIG_AQTION is not set ++CONFIG_NET_VENDOR_ARC=y ++# CONFIG_EMAC_ROCKCHIP is not set ++CONFIG_NET_VENDOR_ASIX=y ++# CONFIG_SPI_AX88796C is not set ++CONFIG_NET_VENDOR_ATHEROS=y ++# CONFIG_ATL2 is not set ++# CONFIG_ATL1 is not set ++# CONFIG_ATL1E is not set ++# CONFIG_ATL1C is not set ++# CONFIG_ALX is not set ++CONFIG_NET_VENDOR_BROADCOM=y ++# CONFIG_B44 is not set ++CONFIG_BCM4908_ENET=y ++# CONFIG_BCMGENET is not set ++# CONFIG_BNX2 is not set ++# CONFIG_CNIC is not set ++# CONFIG_TIGON3 is not set ++# CONFIG_BNX2X is not set ++CONFIG_BGMAC=y ++CONFIG_BGMAC_PLATFORM=y ++# CONFIG_SYSTEMPORT is not set ++# CONFIG_BNXT is not set ++CONFIG_BCMASP=y ++CONFIG_NET_VENDOR_CADENCE=y ++CONFIG_MACB=y ++CONFIG_MACB_USE_HWSTAMP=y ++# CONFIG_MACB_PCI is not set ++CONFIG_NET_VENDOR_CAVIUM=y ++CONFIG_THUNDER_NIC_PF=y ++# CONFIG_THUNDER_NIC_VF is not set ++CONFIG_THUNDER_NIC_BGX=y ++CONFIG_THUNDER_NIC_RGX=y ++# CONFIG_CAVIUM_PTP is not set ++# CONFIG_LIQUIDIO is not set ++# CONFIG_LIQUIDIO_VF is not set ++CONFIG_NET_VENDOR_CHELSIO=y ++# CONFIG_CHELSIO_T1 is not set ++# CONFIG_CHELSIO_T3 is not set ++# CONFIG_CHELSIO_T4 is not set ++# CONFIG_CHELSIO_T4VF is not set ++CONFIG_NET_VENDOR_CISCO=y ++# CONFIG_ENIC is not set ++CONFIG_NET_VENDOR_CORTINA=y ++# CONFIG_GEMINI_ETHERNET is not set ++CONFIG_NET_VENDOR_DAVICOM=y ++# CONFIG_DM9051 is not set ++# CONFIG_DNET is not set ++CONFIG_NET_VENDOR_DEC=y ++# CONFIG_NET_TULIP is not set ++CONFIG_NET_VENDOR_DLINK=y ++# CONFIG_DL2K is not set ++# CONFIG_SUNDANCE is not set ++CONFIG_NET_VENDOR_EMULEX=y ++# CONFIG_BE2NET is not set ++CONFIG_NET_VENDOR_ENGLEDER=y ++# CONFIG_TSNEP is not set ++CONFIG_NET_VENDOR_EZCHIP=y ++# CONFIG_EZCHIP_NPS_MANAGEMENT_ENET is not set ++CONFIG_NET_VENDOR_FREESCALE=y ++CONFIG_FEC=y ++CONFIG_FSL_FMAN=y ++CONFIG_DPAA_ERRATUM_A050385=y ++# CONFIG_FSL_PQ_MDIO is not set ++CONFIG_FSL_XGMAC_MDIO=y ++# CONFIG_GIANFAR is not set ++CONFIG_FSL_DPAA_ETH=y ++CONFIG_FSL_DPAA2_ETH=y ++CONFIG_FSL_DPAA2_PTP_CLOCK=y ++# CONFIG_FSL_DPAA2_SWITCH is not set ++CONFIG_FSL_ENETC_CORE=y ++CONFIG_FSL_ENETC=y ++CONFIG_FSL_ENETC_VF=y ++CONFIG_FSL_ENETC_IERB=y ++CONFIG_FSL_ENETC_MDIO=y ++CONFIG_FSL_ENETC_PTP_CLOCK=y ++CONFIG_NET_VENDOR_FUNGIBLE=y ++# CONFIG_FUN_ETH is not set ++CONFIG_NET_VENDOR_GOOGLE=y ++# CONFIG_GVE is not set ++CONFIG_NET_VENDOR_HISILICON=y ++CONFIG_HIX5HD2_GMAC=y ++# CONFIG_HISI_FEMAC is not set ++# CONFIG_HIP04_ETH is not set ++CONFIG_HNS_MDIO=y ++CONFIG_HNS=y ++CONFIG_HNS_DSAF=y ++CONFIG_HNS_ENET=y ++CONFIG_HNS3=y ++CONFIG_HNS3_HCLGE=y ++# CONFIG_HNS3_HCLGEVF is not set ++CONFIG_HNS3_ENET=y ++CONFIG_NET_VENDOR_HUAWEI=y ++# CONFIG_HINIC is not set ++CONFIG_NET_VENDOR_I825XX=y ++CONFIG_NET_VENDOR_INTEL=y ++# CONFIG_E100 is not set ++CONFIG_E1000=y ++CONFIG_E1000E=y ++CONFIG_IGB=y ++CONFIG_IGB_HWMON=y ++CONFIG_IGBVF=y ++# CONFIG_IXGBE is not set ++# CONFIG_IXGBEVF is not set ++# CONFIG_I40E is not set ++# CONFIG_I40EVF is not set ++# CONFIG_ICE is not set ++# CONFIG_FM10K is not set ++# CONFIG_IGC is not set ++# CONFIG_IDPF is not set ++# CONFIG_JME is not set ++CONFIG_NET_VENDOR_ADI=y ++# CONFIG_ADIN1110 is not set ++CONFIG_NET_VENDOR_LITEX=y ++# CONFIG_LITEX_LITEETH is not set ++CONFIG_NET_VENDOR_MARVELL=y ++CONFIG_MVMDIO=y ++CONFIG_MVNETA=y ++CONFIG_MVPP2=y ++# CONFIG_MVPP2_PTP is not set ++# CONFIG_PXA168_ETH is not set ++# CONFIG_SKGE is not set ++CONFIG_SKY2=y ++# CONFIG_SKY2_DEBUG is not set ++# CONFIG_OCTEONTX2_AF is not set ++# CONFIG_OCTEONTX2_PF is not set ++# CONFIG_OCTEON_EP is not set ++# CONFIG_OCTEON_EP_VF is not set ++# CONFIG_NET_VENDOR_MEDIATEK is not set ++CONFIG_NET_VENDOR_MELLANOX=y ++# CONFIG_MLX4_EN is not set ++# CONFIG_MLX5_CORE is not set ++# CONFIG_MLXSW_CORE is not set ++# CONFIG_MLXFW is not set ++# CONFIG_MLXBF_GIGE is not set ++CONFIG_NET_VENDOR_META=y ++CONFIG_NET_VENDOR_MICREL=y ++# CONFIG_KS8842 is not set ++# CONFIG_KS8851 is not set ++# CONFIG_KS8851_MLL is not set ++# CONFIG_KSZ884X_PCI is not set ++CONFIG_NET_VENDOR_MICROCHIP=y ++# CONFIG_ENC28J60 is not set ++# CONFIG_ENCX24J600 is not set ++# CONFIG_LAN743X is not set ++# CONFIG_LAN865X is not set ++# CONFIG_LAN966X_SWITCH is not set ++# CONFIG_SPARX5_SWITCH is not set ++# CONFIG_VCAP is not set ++CONFIG_NET_VENDOR_MICROSEMI=y ++# CONFIG_MSCC_OCELOT_SWITCH is not set ++CONFIG_NET_VENDOR_MICROSOFT=y ++CONFIG_NET_VENDOR_MYRI=y ++# CONFIG_MYRI10GE is not set ++# CONFIG_FEALNX is not set ++CONFIG_NET_VENDOR_NI=y ++# CONFIG_NI_XGE_MANAGEMENT_ENET is not set ++CONFIG_NET_VENDOR_NATSEMI=y ++# CONFIG_NATSEMI is not set ++# CONFIG_NS83820 is not set ++CONFIG_NET_VENDOR_NETERION=y ++# CONFIG_S2IO is not set ++CONFIG_NET_VENDOR_NETRONOME=y ++# CONFIG_NFP is not set ++CONFIG_NET_VENDOR_8390=y ++# CONFIG_NE2K_PCI is not set ++CONFIG_NET_VENDOR_NVIDIA=y ++# CONFIG_FORCEDETH is not set ++CONFIG_NET_VENDOR_OKI=y ++# CONFIG_ETHOC is not set ++# CONFIG_OA_TC6 is not set ++CONFIG_NET_VENDOR_PACKET_ENGINES=y ++# CONFIG_HAMACHI is not set ++# CONFIG_YELLOWFIN is not set ++CONFIG_NET_VENDOR_PENSANDO=y ++# CONFIG_IONIC is not set ++CONFIG_NET_VENDOR_QLOGIC=y ++# CONFIG_QLA3XXX is not set ++# CONFIG_QLCNIC is not set ++# CONFIG_NETXEN_NIC is not set ++# CONFIG_QED is not set ++CONFIG_NET_VENDOR_BROCADE=y ++# CONFIG_BNA is not set ++CONFIG_NET_VENDOR_QUALCOMM=y ++# CONFIG_QCA7000_SPI is not set ++# CONFIG_QCA7000_UART is not set ++# CONFIG_QCOM_EMAC is not set ++# CONFIG_RMNET is not set ++CONFIG_NET_VENDOR_RDC=y ++# CONFIG_R6040 is not set ++CONFIG_NET_VENDOR_REALTEK=y ++# CONFIG_8139CP is not set ++# CONFIG_8139TOO is not set ++# CONFIG_R8169 is not set ++# CONFIG_RTASE is not set ++CONFIG_NET_VENDOR_RENESAS=y ++CONFIG_SH_ETH=y ++CONFIG_RAVB=y ++CONFIG_RENESAS_ETHER_SWITCH=y ++CONFIG_RENESAS_GEN4_PTP=y ++# CONFIG_RTSN is not set ++CONFIG_NET_VENDOR_ROCKER=y ++CONFIG_NET_VENDOR_SAMSUNG=y ++# CONFIG_SXGBE_ETH is not set ++CONFIG_NET_VENDOR_SEEQ=y ++CONFIG_NET_VENDOR_SILAN=y ++# CONFIG_SC92031 is not set ++CONFIG_NET_VENDOR_SIS=y ++# CONFIG_SIS900 is not set ++# CONFIG_SIS190 is not set ++CONFIG_NET_VENDOR_SOLARFLARE=y ++# CONFIG_SFC is not set ++# CONFIG_SFC_FALCON is not set ++# CONFIG_SFC_SIENA is not set ++CONFIG_NET_VENDOR_SMSC=y ++CONFIG_SMC91X=y ++# CONFIG_EPIC100 is not set ++CONFIG_SMSC911X=y ++# CONFIG_SMSC9420 is not set ++CONFIG_NET_VENDOR_SOCIONEXT=y ++CONFIG_SNI_AVE=y ++CONFIG_SNI_NETSEC=y ++CONFIG_NET_VENDOR_STMICRO=y ++# CONFIG_STMMAC_ETH is not set ++CONFIG_NET_VENDOR_SUN=y ++# CONFIG_HAPPYMEAL is not set ++# CONFIG_SUNGEM is not set ++# CONFIG_CASSINI is not set ++# CONFIG_NIU is not set ++CONFIG_NET_VENDOR_SYNOPSYS=y ++# CONFIG_DWC_XLGMAC is not set ++CONFIG_NET_VENDOR_TEHUTI=y ++# CONFIG_TEHUTI is not set ++# CONFIG_TEHUTI_TN40 is not set ++CONFIG_NET_VENDOR_TI=y ++CONFIG_TI_DAVINCI_MDIO=y ++# CONFIG_TI_CPSW_PHY_SEL is not set ++CONFIG_TI_K3_CPPI_DESC_POOL=y ++CONFIG_TI_K3_AM65_CPSW_NUSS=y ++# CONFIG_TI_K3_AM65_CPSW_SWITCHDEV is not set ++# CONFIG_TI_K3_AM65_CPTS is not set ++# CONFIG_TLAN is not set ++CONFIG_NET_VENDOR_VERTEXCOM=y ++# CONFIG_MSE102X is not set ++CONFIG_NET_VENDOR_VIA=y ++# CONFIG_VIA_RHINE is not set ++# CONFIG_VIA_VELOCITY is not set ++CONFIG_NET_VENDOR_WANGXUN=y ++# CONFIG_NGBE is not set ++# CONFIG_TXGBE is not set ++CONFIG_NET_VENDOR_WIZNET=y ++# CONFIG_WIZNET_W5100 is not set ++# CONFIG_WIZNET_W5300 is not set ++CONFIG_NET_VENDOR_XILINX=y ++# CONFIG_XILINX_EMACLITE is not set ++# CONFIG_XILINX_LL_TEMAC is not set ++# CONFIG_FDDI is not set ++# CONFIG_HIPPI is not set ++CONFIG_PHYLINK=y ++CONFIG_PHYLIB=y ++CONFIG_SWPHY=y ++# CONFIG_LED_TRIGGER_PHY is not set ++CONFIG_PHYLIB_LEDS=y ++CONFIG_FIXED_PHY=y ++# CONFIG_SFP is not set ++ ++# ++# MII PHY device drivers ++# ++# CONFIG_AIR_EN8811H_PHY is not set ++# CONFIG_AMD_PHY is not set ++# CONFIG_MESON_GXL_PHY is not set ++# CONFIG_ADIN_PHY is not set ++# CONFIG_ADIN1100_PHY is not set ++CONFIG_AQUANTIA_PHY=y ++# CONFIG_AX88796B_PHY is not set ++# CONFIG_BROADCOM_PHY is not set ++# CONFIG_BCM54140_PHY is not set ++# CONFIG_BCM7XXX_PHY is not set ++# CONFIG_BCM84881_PHY is not set ++# CONFIG_BCM87XX_PHY is not set ++# CONFIG_BCM_CYGNUS_PHY is not set ++# CONFIG_CICADA_PHY is not set ++# CONFIG_CORTINA_PHY is not set ++# CONFIG_DAVICOM_PHY is not set ++# CONFIG_ICPLUS_PHY is not set ++# CONFIG_LXT_PHY is not set ++# CONFIG_INTEL_XWAY_PHY is not set ++# CONFIG_LSI_ET1011C_PHY is not set ++# CONFIG_MARVELL_PHY is not set ++CONFIG_MARVELL_10G_PHY=y ++# CONFIG_MARVELL_88Q2XXX_PHY is not set ++# CONFIG_MARVELL_88X2222_PHY is not set ++# CONFIG_MAXLINEAR_GPHY is not set ++# CONFIG_MEDIATEK_GE_PHY is not set ++# CONFIG_MEDIATEK_GE_SOC_PHY is not set ++CONFIG_MICREL_PHY=y ++# CONFIG_MICROCHIP_T1S_PHY is not set ++# CONFIG_MICROCHIP_PHY is not set ++# CONFIG_MICROCHIP_T1_PHY is not set ++CONFIG_MICROSEMI_PHY=y ++# CONFIG_MOTORCOMM_PHY is not set ++# CONFIG_NATIONAL_PHY is not set ++# CONFIG_NXP_CBTX_PHY is not set ++# CONFIG_NXP_C45_TJA11XX_PHY is not set ++# CONFIG_NXP_TJA11XX_PHY is not set ++# CONFIG_NCN26000_PHY is not set ++CONFIG_QCOM_NET_PHYLIB=y ++CONFIG_AT803X_PHY=y ++# CONFIG_QCA83XX_PHY is not set ++# CONFIG_QCA808X_PHY is not set ++# CONFIG_QCA807X_PHY is not set ++# CONFIG_QSEMI_PHY is not set ++CONFIG_REALTEK_PHY=y ++# CONFIG_RENESAS_PHY is not set ++CONFIG_ROCKCHIP_PHY=y ++# CONFIG_SMSC_PHY is not set ++# CONFIG_STE10XP is not set ++# CONFIG_TERANETICS_PHY is not set ++# CONFIG_DP83822_PHY is not set ++# CONFIG_DP83TC811_PHY is not set ++# CONFIG_DP83848_PHY is not set ++CONFIG_DP83867_PHY=y ++# CONFIG_DP83869_PHY is not set ++CONFIG_DP83TD510_PHY=y ++# CONFIG_DP83TG720_PHY is not set ++CONFIG_VITESSE_PHY=y ++# CONFIG_XILINX_GMII2RGMII is not set ++# CONFIG_MICREL_KS8995MA is not set ++# CONFIG_PSE_CONTROLLER is not set ++CONFIG_MDIO_DEVICE=y ++CONFIG_MDIO_BUS=y ++CONFIG_FWNODE_MDIO=y ++CONFIG_OF_MDIO=y ++CONFIG_ACPI_MDIO=y ++CONFIG_MDIO_DEVRES=y ++# CONFIG_MDIO_SUN4I is not set ++CONFIG_MDIO_XGENE=y ++CONFIG_MDIO_BITBANG=y ++CONFIG_MDIO_BCM_IPROC=y ++CONFIG_MDIO_BCM_UNIMAC=y ++CONFIG_MDIO_CAVIUM=y ++CONFIG_MDIO_GPIO=y ++# CONFIG_MDIO_HISI_FEMAC is not set ++# CONFIG_MDIO_MVUSB is not set ++# CONFIG_MDIO_MSCC_MIIM is not set ++# CONFIG_MDIO_OCTEON is not set ++# CONFIG_MDIO_IPQ4019 is not set ++# CONFIG_MDIO_IPQ8064 is not set ++CONFIG_MDIO_THUNDER=y ++ ++# ++# MDIO Multiplexers ++# ++CONFIG_MDIO_BUS_MUX=y ++# CONFIG_MDIO_BUS_MUX_MESON_G12A is not set ++# CONFIG_MDIO_BUS_MUX_MESON_GXL is not set ++CONFIG_MDIO_BUS_MUX_BCM_IPROC=y ++# CONFIG_MDIO_BUS_MUX_GPIO is not set ++CONFIG_MDIO_BUS_MUX_MULTIPLEXER=y ++CONFIG_MDIO_BUS_MUX_MMIOREG=y ++ ++# ++# PCS device drivers ++# ++# CONFIG_PCS_XPCS is not set ++CONFIG_PCS_LYNX=y ++# end of PCS device drivers ++ ++# CONFIG_PPP is not set ++# CONFIG_SLIP is not set ++CONFIG_USB_NET_DRIVERS=y ++# CONFIG_USB_CATC is not set ++# CONFIG_USB_KAWETH is not set ++# CONFIG_USB_PEGASUS is not set ++# CONFIG_USB_RTL8150 is not set ++# CONFIG_USB_RTL8152 is not set ++# CONFIG_USB_LAN78XX is not set ++# CONFIG_USB_USBNET is not set ++# CONFIG_USB_IPHETH is not set ++CONFIG_WLAN=y ++CONFIG_WLAN_VENDOR_ADMTEK=y ++CONFIG_WLAN_VENDOR_ATH=y ++# CONFIG_ATH_DEBUG is not set ++# CONFIG_ATH5K_PCI is not set ++CONFIG_WLAN_VENDOR_ATMEL=y ++CONFIG_WLAN_VENDOR_BROADCOM=y ++CONFIG_WLAN_VENDOR_INTEL=y ++CONFIG_WLAN_VENDOR_INTERSIL=y ++CONFIG_WLAN_VENDOR_MARVELL=y ++CONFIG_WLAN_VENDOR_MEDIATEK=y ++CONFIG_WLAN_VENDOR_MICROCHIP=y ++CONFIG_WLAN_VENDOR_PURELIFI=y ++CONFIG_WLAN_VENDOR_RALINK=y ++CONFIG_WLAN_VENDOR_REALTEK=y ++CONFIG_WLAN_VENDOR_RSI=y ++CONFIG_WLAN_VENDOR_SILABS=y ++CONFIG_WLAN_VENDOR_ST=y ++CONFIG_WLAN_VENDOR_TI=y ++CONFIG_WLAN_VENDOR_ZYDAS=y ++CONFIG_WLAN_VENDOR_QUANTENNA=y ++# CONFIG_WAN is not set ++ ++# ++# Wireless WAN ++# ++# CONFIG_WWAN is not set ++# end of Wireless WAN ++ ++CONFIG_XEN_NETDEV_FRONTEND=y ++# CONFIG_XEN_NETDEV_BACKEND is not set ++# CONFIG_VMXNET3 is not set ++# CONFIG_FUJITSU_ES is not set ++# CONFIG_NETDEVSIM is not set ++CONFIG_NET_FAILOVER=y ++# CONFIG_ISDN is not set ++ ++# ++# Input device support ++# ++CONFIG_INPUT=y ++CONFIG_INPUT_LEDS=y ++CONFIG_INPUT_FF_MEMLESS=y ++# CONFIG_INPUT_SPARSEKMAP is not set ++CONFIG_INPUT_MATRIXKMAP=y ++CONFIG_INPUT_VIVALDIFMAP=y ++ ++# ++# Userland interfaces ++# ++# CONFIG_INPUT_MOUSEDEV is not set ++# CONFIG_INPUT_JOYDEV is not set ++CONFIG_INPUT_EVDEV=y ++# CONFIG_INPUT_EVBUG is not set ++ ++# ++# Input Device Drivers ++# ++CONFIG_INPUT_KEYBOARD=y ++# CONFIG_KEYBOARD_ADC is not set ++# CONFIG_KEYBOARD_ADP5588 is not set ++# CONFIG_KEYBOARD_ADP5589 is not set ++CONFIG_KEYBOARD_ATKBD=y ++# CONFIG_KEYBOARD_QT1050 is not set ++# CONFIG_KEYBOARD_QT1070 is not set ++# CONFIG_KEYBOARD_QT2160 is not set ++# CONFIG_KEYBOARD_DLINK_DIR685 is not set ++# CONFIG_KEYBOARD_LKKBD is not set ++CONFIG_KEYBOARD_GPIO=y ++# CONFIG_KEYBOARD_GPIO_POLLED is not set ++# CONFIG_KEYBOARD_TCA6416 is not set ++# CONFIG_KEYBOARD_TCA8418 is not set ++# CONFIG_KEYBOARD_MATRIX is not set ++# CONFIG_KEYBOARD_LM8323 is not set ++# CONFIG_KEYBOARD_LM8333 is not set ++# CONFIG_KEYBOARD_MAX7359 is not set ++# CONFIG_KEYBOARD_MPR121 is not set ++# CONFIG_KEYBOARD_SNVS_PWRKEY is not set ++# CONFIG_KEYBOARD_IMX is not set ++CONFIG_KEYBOARD_IMX_BBM_SCMI=y ++# CONFIG_KEYBOARD_IMX_SC_KEY is not set ++# CONFIG_KEYBOARD_NEWTON is not set ++# CONFIG_KEYBOARD_TEGRA is not set ++# CONFIG_KEYBOARD_OPENCORES is not set ++# CONFIG_KEYBOARD_PINEPHONE is not set ++# CONFIG_KEYBOARD_SAMSUNG is not set ++# CONFIG_KEYBOARD_STOWAWAY is not set ++# CONFIG_KEYBOARD_SUNKBD is not set ++# CONFIG_KEYBOARD_SUN4I_LRADC is not set ++# CONFIG_KEYBOARD_OMAP4 is not set ++# CONFIG_KEYBOARD_TM2_TOUCHKEY is not set ++# CONFIG_KEYBOARD_XTKBD is not set ++CONFIG_KEYBOARD_CROS_EC=y ++# CONFIG_KEYBOARD_CAP11XX is not set ++# CONFIG_KEYBOARD_BCM is not set ++# CONFIG_KEYBOARD_MT6779 is not set ++# CONFIG_KEYBOARD_MTK_PMIC is not set ++# CONFIG_KEYBOARD_CYPRESS_SF is not set ++CONFIG_INPUT_MOUSE=y ++CONFIG_MOUSE_PS2=y ++CONFIG_MOUSE_PS2_ALPS=y ++CONFIG_MOUSE_PS2_BYD=y ++CONFIG_MOUSE_PS2_LOGIPS2PP=y ++CONFIG_MOUSE_PS2_SYNAPTICS=y ++CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS=y ++CONFIG_MOUSE_PS2_CYPRESS=y ++CONFIG_MOUSE_PS2_TRACKPOINT=y ++# CONFIG_MOUSE_PS2_ELANTECH is not set ++# CONFIG_MOUSE_PS2_SENTELIC is not set ++# CONFIG_MOUSE_PS2_TOUCHKIT is not set ++CONFIG_MOUSE_PS2_FOCALTECH=y ++CONFIG_MOUSE_PS2_SMBUS=y ++# CONFIG_MOUSE_SERIAL is not set ++# CONFIG_MOUSE_APPLETOUCH is not set ++# CONFIG_MOUSE_BCM5974 is not set ++# CONFIG_MOUSE_CYAPA is not set ++# CONFIG_MOUSE_ELAN_I2C is not set ++# CONFIG_MOUSE_VSXXXAA is not set ++# CONFIG_MOUSE_GPIO is not set ++# CONFIG_MOUSE_SYNAPTICS_I2C is not set ++# CONFIG_MOUSE_SYNAPTICS_USB is not set ++# CONFIG_INPUT_JOYSTICK is not set ++# CONFIG_INPUT_TABLET is not set ++CONFIG_INPUT_TOUCHSCREEN=y ++# CONFIG_TOUCHSCREEN_ADS7846 is not set ++# CONFIG_TOUCHSCREEN_AD7877 is not set ++# CONFIG_TOUCHSCREEN_AD7879 is not set ++# CONFIG_TOUCHSCREEN_ADC is not set ++# CONFIG_TOUCHSCREEN_AR1021_I2C is not set ++# CONFIG_TOUCHSCREEN_ATMEL_MXT is not set ++# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set ++# CONFIG_TOUCHSCREEN_BU21013 is not set ++# CONFIG_TOUCHSCREEN_BU21029 is not set ++# CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set ++# CONFIG_TOUCHSCREEN_CHIPONE_ICN8505 is not set ++# CONFIG_TOUCHSCREEN_CY8CTMA140 is not set ++# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set ++# CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set ++# CONFIG_TOUCHSCREEN_CYTTSP5 is not set ++# CONFIG_TOUCHSCREEN_DYNAPRO is not set ++# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set ++# CONFIG_TOUCHSCREEN_EETI is not set ++# CONFIG_TOUCHSCREEN_EGALAX is not set ++# CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set ++# CONFIG_TOUCHSCREEN_EXC3000 is not set ++# CONFIG_TOUCHSCREEN_FUJITSU is not set ++# CONFIG_TOUCHSCREEN_GOODIX is not set ++# CONFIG_TOUCHSCREEN_GOODIX_BERLIN_I2C is not set ++# CONFIG_TOUCHSCREEN_GOODIX_BERLIN_SPI is not set ++# CONFIG_TOUCHSCREEN_HIDEEP is not set ++# CONFIG_TOUCHSCREEN_HYCON_HY46XX is not set ++# CONFIG_TOUCHSCREEN_HYNITRON_CSTXXX is not set ++# CONFIG_TOUCHSCREEN_ILI210X is not set ++# CONFIG_TOUCHSCREEN_ILITEK is not set ++# CONFIG_TOUCHSCREEN_IPROC is not set ++# CONFIG_TOUCHSCREEN_S6SY761 is not set ++# CONFIG_TOUCHSCREEN_GUNZE is not set ++# CONFIG_TOUCHSCREEN_EKTF2127 is not set ++# CONFIG_TOUCHSCREEN_ELAN is not set ++# CONFIG_TOUCHSCREEN_ELO is not set ++# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set ++# CONFIG_TOUCHSCREEN_WACOM_I2C is not set ++# CONFIG_TOUCHSCREEN_MAX11801 is not set ++# CONFIG_TOUCHSCREEN_MMS114 is not set ++# CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set ++# CONFIG_TOUCHSCREEN_MSG2638 is not set ++# CONFIG_TOUCHSCREEN_MTOUCH is not set ++# CONFIG_TOUCHSCREEN_NOVATEK_NVT_TS is not set ++# CONFIG_TOUCHSCREEN_IMAGIS is not set ++# CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set ++# CONFIG_TOUCHSCREEN_INEXIO is not set ++# CONFIG_TOUCHSCREEN_PENMOUNT is not set ++# CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set ++# CONFIG_TOUCHSCREEN_RASPBERRYPI_FW is not set ++# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set ++# CONFIG_TOUCHSCREEN_TOUCHWIN is not set ++# CONFIG_TOUCHSCREEN_PIXCIR is not set ++# CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set ++# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set ++# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set ++# CONFIG_TOUCHSCREEN_TSC_SERIO is not set ++# CONFIG_TOUCHSCREEN_TSC2004 is not set ++# CONFIG_TOUCHSCREEN_TSC2005 is not set ++# CONFIG_TOUCHSCREEN_TSC2007 is not set ++# CONFIG_TOUCHSCREEN_RM_TS is not set ++# CONFIG_TOUCHSCREEN_SILEAD is not set ++# CONFIG_TOUCHSCREEN_SIS_I2C is not set ++# CONFIG_TOUCHSCREEN_ST1232 is not set ++# CONFIG_TOUCHSCREEN_STMFTS is not set ++# CONFIG_TOUCHSCREEN_SUN4I is not set ++# CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set ++# CONFIG_TOUCHSCREEN_SX8654 is not set ++# CONFIG_TOUCHSCREEN_TPS6507X is not set ++# CONFIG_TOUCHSCREEN_ZET6223 is not set ++# CONFIG_TOUCHSCREEN_ZFORCE is not set ++# CONFIG_TOUCHSCREEN_COLIBRI_VF50 is not set ++# CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set ++# CONFIG_TOUCHSCREEN_IQS5XX is not set ++# CONFIG_TOUCHSCREEN_IQS7211 is not set ++# CONFIG_TOUCHSCREEN_ZINITIX is not set ++# CONFIG_TOUCHSCREEN_HIMAX_HX83112B is not set ++CONFIG_INPUT_MISC=y ++# CONFIG_INPUT_AD714X is not set ++# CONFIG_INPUT_ATMEL_CAPTOUCH is not set ++# CONFIG_INPUT_BBNSM_PWRKEY is not set ++# CONFIG_INPUT_BMA150 is not set ++# CONFIG_INPUT_E3X0_BUTTON is not set ++CONFIG_INPUT_PM8941_PWRKEY=y ++# CONFIG_INPUT_PM8XXX_VIBRATOR is not set ++# CONFIG_INPUT_MMA8450 is not set ++# CONFIG_INPUT_GPIO_BEEPER is not set ++# CONFIG_INPUT_GPIO_DECODER is not set ++# CONFIG_INPUT_GPIO_VIBRA is not set ++# CONFIG_INPUT_ATI_REMOTE2 is not set ++# CONFIG_INPUT_KEYSPAN_REMOTE is not set ++# CONFIG_INPUT_KXTJ9 is not set ++# CONFIG_INPUT_POWERMATE is not set ++# CONFIG_INPUT_YEALINK is not set ++# CONFIG_INPUT_CM109 is not set ++# CONFIG_INPUT_REGULATOR_HAPTIC is not set ++# CONFIG_INPUT_TPS65219_PWRBUTTON is not set ++# CONFIG_INPUT_AXP20X_PEK is not set ++# CONFIG_INPUT_UINPUT is not set ++# CONFIG_INPUT_PCF8574 is not set ++# CONFIG_INPUT_PWM_BEEPER is not set ++# CONFIG_INPUT_PWM_VIBRA is not set ++# CONFIG_INPUT_RK805_PWRKEY is not set ++# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set ++# CONFIG_INPUT_DA7280_HAPTICS is not set ++# CONFIG_INPUT_ADXL34X is not set ++# CONFIG_INPUT_IBM_PANEL is not set ++# CONFIG_INPUT_IMS_PCU is not set ++# CONFIG_INPUT_IQS269A is not set ++# CONFIG_INPUT_IQS626A is not set ++# CONFIG_INPUT_IQS7222 is not set ++# CONFIG_INPUT_CMA3000 is not set ++CONFIG_INPUT_XEN_KBDDEV_FRONTEND=y ++# CONFIG_INPUT_SOC_BUTTON_ARRAY is not set ++# CONFIG_INPUT_DRV260X_HAPTICS is not set ++# CONFIG_INPUT_DRV2665_HAPTICS is not set ++# CONFIG_INPUT_DRV2667_HAPTICS is not set ++CONFIG_INPUT_HISI_POWERKEY=y ++# CONFIG_RMI4_CORE is not set ++ ++# ++# Hardware I/O ports ++# ++CONFIG_SERIO=y ++# CONFIG_SERIO_SERPORT is not set ++CONFIG_SERIO_AMBAKMI=y ++# CONFIG_SERIO_PCIPS2 is not set ++CONFIG_SERIO_LIBPS2=y ++# CONFIG_SERIO_RAW is not set ++# CONFIG_SERIO_ALTERA_PS2 is not set ++# CONFIG_SERIO_PS2MULT is not set ++# CONFIG_SERIO_ARC_PS2 is not set ++# CONFIG_SERIO_APBPS2 is not set ++# CONFIG_SERIO_SUN4I_PS2 is not set ++# CONFIG_SERIO_GPIO_PS2 is not set ++# CONFIG_USERIO is not set ++# CONFIG_GAMEPORT is not set ++# end of Hardware I/O ports ++# end of Input device support ++ ++# ++# Character devices ++# ++CONFIG_TTY=y ++CONFIG_VT=y ++CONFIG_CONSOLE_TRANSLATIONS=y ++CONFIG_VT_CONSOLE=y ++CONFIG_VT_CONSOLE_SLEEP=y ++CONFIG_VT_HW_CONSOLE_BINDING=y ++CONFIG_UNIX98_PTYS=y ++CONFIG_LEGACY_PTYS=y ++CONFIG_LEGACY_PTY_COUNT=16 ++CONFIG_LEGACY_TIOCSTI=y ++CONFIG_LDISC_AUTOLOAD=y ++ ++# ++# Serial drivers ++# ++CONFIG_SERIAL_EARLYCON=y ++CONFIG_SERIAL_8250=y ++CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y ++CONFIG_SERIAL_8250_PNP=y ++CONFIG_SERIAL_8250_16550A_VARIANTS=y ++# CONFIG_SERIAL_8250_FINTEK is not set ++CONFIG_SERIAL_8250_CONSOLE=y ++CONFIG_SERIAL_8250_DMA=y ++CONFIG_SERIAL_8250_PCILIB=y ++CONFIG_SERIAL_8250_PCI=y ++CONFIG_SERIAL_8250_EXAR=y ++CONFIG_SERIAL_8250_NR_UARTS=4 ++CONFIG_SERIAL_8250_RUNTIME_UARTS=4 ++CONFIG_SERIAL_8250_EXTENDED=y ++# CONFIG_SERIAL_8250_MANY_PORTS is not set ++# CONFIG_SERIAL_8250_PCI1XXXX is not set ++CONFIG_SERIAL_8250_SHARE_IRQ=y ++# CONFIG_SERIAL_8250_DETECT_IRQ is not set ++# CONFIG_SERIAL_8250_RSA is not set ++CONFIG_SERIAL_8250_DWLIB=y ++CONFIG_SERIAL_8250_BCM2835AUX=y ++CONFIG_SERIAL_8250_FSL=y ++CONFIG_SERIAL_8250_DW=y ++CONFIG_SERIAL_8250_EM=y ++# CONFIG_SERIAL_8250_RT288X is not set ++CONFIG_SERIAL_8250_OMAP=y ++CONFIG_SERIAL_8250_OMAP_TTYO_FIXUP=y ++CONFIG_SERIAL_8250_MT6577=y ++CONFIG_SERIAL_8250_UNIPHIER=y ++CONFIG_SERIAL_8250_PERICOM=y ++CONFIG_SERIAL_8250_TEGRA=y ++CONFIG_SERIAL_8250_BCM7271=y ++CONFIG_SERIAL_OF_PLATFORM=y ++ ++# ++# Non-8250 serial port support ++# ++# CONFIG_SERIAL_AMBA_PL010 is not set ++CONFIG_SERIAL_AMBA_PL011=y ++CONFIG_SERIAL_AMBA_PL011_CONSOLE=y ++# CONFIG_SERIAL_EARLYCON_SEMIHOST is not set ++CONFIG_SERIAL_MESON=y ++CONFIG_SERIAL_MESON_CONSOLE=y ++CONFIG_SERIAL_SAMSUNG=y ++CONFIG_SERIAL_SAMSUNG_UARTS=4 ++CONFIG_SERIAL_SAMSUNG_CONSOLE=y ++CONFIG_SERIAL_TEGRA=y ++CONFIG_SERIAL_TEGRA_TCU=y ++CONFIG_SERIAL_TEGRA_TCU_CONSOLE=y ++# CONFIG_SERIAL_MAX3100 is not set ++# CONFIG_SERIAL_MAX310X is not set ++CONFIG_SERIAL_IMX=y ++CONFIG_SERIAL_IMX_CONSOLE=y ++CONFIG_SERIAL_IMX_EARLYCON=y ++# CONFIG_SERIAL_UARTLITE is not set ++CONFIG_SERIAL_SH_SCI=y ++CONFIG_SERIAL_SH_SCI_NR_UARTS=18 ++CONFIG_SERIAL_SH_SCI_CONSOLE=y ++CONFIG_SERIAL_SH_SCI_EARLYCON=y ++CONFIG_SERIAL_SH_SCI_DMA=y ++CONFIG_SERIAL_CORE=y ++CONFIG_SERIAL_CORE_CONSOLE=y ++# CONFIG_SERIAL_JSM is not set ++CONFIG_SERIAL_MSM=y ++CONFIG_SERIAL_MSM_CONSOLE=y ++CONFIG_SERIAL_QCOM_GENI=y ++CONFIG_SERIAL_QCOM_GENI_CONSOLE=y ++# CONFIG_SERIAL_SIFIVE is not set ++# CONFIG_SERIAL_SCCNXP is not set ++# CONFIG_SERIAL_SC16IS7XX is not set ++CONFIG_SERIAL_BCM63XX=y ++# CONFIG_SERIAL_BCM63XX_CONSOLE is not set ++# CONFIG_SERIAL_ALTERA_JTAGUART is not set ++# CONFIG_SERIAL_ALTERA_UART is not set ++CONFIG_SERIAL_XILINX_PS_UART=y ++CONFIG_SERIAL_XILINX_PS_UART_CONSOLE=y ++# CONFIG_SERIAL_ARC is not set ++# CONFIG_SERIAL_RP2 is not set ++CONFIG_SERIAL_FSL_LPUART=y ++CONFIG_SERIAL_FSL_LPUART_CONSOLE=y ++CONFIG_SERIAL_FSL_LINFLEXUART=y ++CONFIG_SERIAL_FSL_LINFLEXUART_CONSOLE=y ++# CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set ++# CONFIG_SERIAL_SPRD is not set ++CONFIG_SERIAL_STM32=y ++CONFIG_SERIAL_STM32_CONSOLE=y ++CONFIG_SERIAL_MVEBU_UART=y ++CONFIG_SERIAL_MVEBU_CONSOLE=y ++CONFIG_SERIAL_OWL=y ++CONFIG_SERIAL_OWL_CONSOLE=y ++# CONFIG_SERIAL_NUVOTON_MA35D1 is not set ++# end of Serial drivers ++ ++CONFIG_SERIAL_MCTRL_GPIO=y ++# CONFIG_SERIAL_NONSTANDARD is not set ++# CONFIG_N_GSM is not set ++# CONFIG_NOZOMI is not set ++# CONFIG_NULL_TTY is not set ++CONFIG_HVC_DRIVER=y ++CONFIG_HVC_IRQ=y ++CONFIG_HVC_XEN=y ++CONFIG_HVC_XEN_FRONTEND=y ++# CONFIG_HVC_DCC is not set ++# CONFIG_RPMSG_TTY is not set ++CONFIG_SERIAL_DEV_BUS=y ++CONFIG_SERIAL_DEV_CTRL_TTYPORT=y ++CONFIG_VIRTIO_CONSOLE=y ++# CONFIG_IPMI_HANDLER is not set ++# CONFIG_NPCM7XX_KCS_IPMI_BMC is not set ++# CONFIG_SSIF_IPMI_BMC is not set ++# CONFIG_IPMB_DEVICE_INTERFACE is not set ++CONFIG_HW_RANDOM=y ++# CONFIG_HW_RANDOM_TIMERIOMEM is not set ++# CONFIG_HW_RANDOM_BA431 is not set ++CONFIG_HW_RANDOM_BCM2835=y ++CONFIG_HW_RANDOM_IPROC_RNG200=y ++CONFIG_HW_RANDOM_OMAP=y ++CONFIG_HW_RANDOM_VIRTIO=y ++CONFIG_HW_RANDOM_HISI=y ++CONFIG_HW_RANDOM_HISTB=y ++CONFIG_HW_RANDOM_XGENE=y ++CONFIG_HW_RANDOM_STM32=y ++CONFIG_HW_RANDOM_MESON=y ++CONFIG_HW_RANDOM_CAVIUM=y ++CONFIG_HW_RANDOM_MTK=y ++CONFIG_HW_RANDOM_EXYNOS=y ++CONFIG_HW_RANDOM_OPTEE=y ++CONFIG_HW_RANDOM_NPCM=y ++# CONFIG_HW_RANDOM_CCTRNG is not set ++# CONFIG_HW_RANDOM_XIPHERA is not set ++CONFIG_HW_RANDOM_ARM_SMCCC_TRNG=y ++CONFIG_HW_RANDOM_CN10K=y ++CONFIG_HW_RANDOM_ROCKCHIP=y ++# CONFIG_APPLICOM is not set ++CONFIG_DEVMEM=y ++CONFIG_DEVPORT=y ++CONFIG_TCG_TPM=y ++# CONFIG_TCG_TPM2_HMAC is not set ++CONFIG_HW_RANDOM_TPM=y ++# CONFIG_TCG_TIS is not set ++# CONFIG_TCG_TIS_SPI is not set ++# CONFIG_TCG_TIS_I2C is not set ++# CONFIG_TCG_TIS_SYNQUACER is not set ++# CONFIG_TCG_TIS_I2C_CR50 is not set ++# CONFIG_TCG_TIS_I2C_ATMEL is not set ++CONFIG_TCG_TIS_I2C_INFINEON=y ++# CONFIG_TCG_TIS_I2C_NUVOTON is not set ++# CONFIG_TCG_ATMEL is not set ++# CONFIG_TCG_INFINEON is not set ++# CONFIG_TCG_XEN is not set ++# CONFIG_TCG_CRB is not set ++# CONFIG_TCG_VTPM_PROXY is not set ++# CONFIG_TCG_FTPM_TEE is not set ++# CONFIG_TCG_TIS_ST33ZP24_I2C is not set ++# CONFIG_TCG_TIS_ST33ZP24_SPI is not set ++# CONFIG_XILLYBUS is not set ++# CONFIG_XILLYUSB is not set ++# end of Character devices ++ ++# ++# I2C support ++# ++CONFIG_I2C=y ++CONFIG_ACPI_I2C_OPREGION=y ++CONFIG_I2C_BOARDINFO=y ++CONFIG_I2C_CHARDEV=y ++CONFIG_I2C_MUX=y ++ ++# ++# Multiplexer I2C Chip support ++# ++# CONFIG_I2C_ARB_GPIO_CHALLENGE is not set ++# CONFIG_I2C_MUX_GPIO is not set ++# CONFIG_I2C_MUX_GPMUX is not set ++# CONFIG_I2C_MUX_LTC4306 is not set ++# CONFIG_I2C_MUX_PCA9541 is not set ++CONFIG_I2C_MUX_PCA954x=y ++# CONFIG_I2C_MUX_PINCTRL is not set ++# CONFIG_I2C_MUX_REG is not set ++# CONFIG_I2C_DEMUX_PINCTRL is not set ++# CONFIG_I2C_MUX_MLXCPLD is not set ++# end of Multiplexer I2C Chip support ++ ++CONFIG_I2C_HELPER_AUTO=y ++CONFIG_I2C_SMBUS=y ++CONFIG_I2C_ALGOBIT=y ++ ++# ++# I2C Hardware Bus support ++# ++ ++# ++# PC SMBus host controller drivers ++# ++# CONFIG_I2C_ALI1535 is not set ++# CONFIG_I2C_ALI1563 is not set ++# CONFIG_I2C_ALI15X3 is not set ++# CONFIG_I2C_AMD756 is not set ++# CONFIG_I2C_AMD8111 is not set ++# CONFIG_I2C_AMD_MP2 is not set ++# CONFIG_I2C_HIX5HD2 is not set ++# CONFIG_I2C_I801 is not set ++# CONFIG_I2C_ISCH is not set ++# CONFIG_I2C_PIIX4 is not set ++# CONFIG_I2C_NFORCE2 is not set ++# CONFIG_I2C_NVIDIA_GPU is not set ++# CONFIG_I2C_SIS5595 is not set ++# CONFIG_I2C_SIS630 is not set ++# CONFIG_I2C_SIS96X is not set ++# CONFIG_I2C_VIA is not set ++# CONFIG_I2C_VIAPRO is not set ++# CONFIG_I2C_ZHAOXIN is not set ++ ++# ++# ACPI drivers ++# ++# CONFIG_I2C_SCMI is not set ++ ++# ++# I2C system bus drivers (mostly embedded / system-on-chip) ++# ++# CONFIG_I2C_ALTERA is not set ++# CONFIG_I2C_BCM2835 is not set ++CONFIG_I2C_BCM_IPROC=y ++CONFIG_I2C_BRCMSTB=y ++# CONFIG_I2C_CADENCE is not set ++# CONFIG_I2C_CBUS_GPIO is not set ++CONFIG_I2C_DESIGNWARE_CORE=y ++# CONFIG_I2C_DESIGNWARE_SLAVE is not set ++CONFIG_I2C_DESIGNWARE_PLATFORM=y ++# CONFIG_I2C_DESIGNWARE_PCI is not set ++# CONFIG_I2C_EMEV2 is not set ++CONFIG_I2C_EXYNOS5=y ++# CONFIG_I2C_GPIO is not set ++# CONFIG_I2C_HISI is not set ++CONFIG_I2C_IMX=y ++CONFIG_I2C_IMX_LPI2C=y ++CONFIG_I2C_MESON=y ++CONFIG_I2C_MT65XX=y ++CONFIG_I2C_MV64XXX=y ++# CONFIG_I2C_NOMADIK is not set ++# CONFIG_I2C_NPCM is not set ++# CONFIG_I2C_OCORES is not set ++CONFIG_I2C_OMAP=y ++CONFIG_I2C_OWL=y ++CONFIG_I2C_APPLE=y ++# CONFIG_I2C_PCA_PLATFORM is not set ++CONFIG_I2C_PXA=y ++# CONFIG_I2C_PXA_SLAVE is not set ++# CONFIG_I2C_QCOM_CCI is not set ++# CONFIG_I2C_QCOM_GENI is not set ++CONFIG_I2C_QUP=y ++CONFIG_I2C_RIIC=y ++CONFIG_I2C_RK3X=y ++# CONFIG_I2C_RZV2M is not set ++CONFIG_I2C_S3C2410=y ++CONFIG_I2C_SH_MOBILE=y ++# CONFIG_I2C_SIMTEC is not set ++# CONFIG_I2C_SPRD is not set ++# CONFIG_I2C_STM32F4 is not set ++# CONFIG_I2C_STM32F7 is not set ++# CONFIG_I2C_SYNQUACER is not set ++CONFIG_I2C_TEGRA=y ++CONFIG_I2C_TEGRA_BPMP=y ++# CONFIG_I2C_UNIPHIER is not set ++CONFIG_I2C_UNIPHIER_F=y ++# CONFIG_I2C_VERSATILE is not set ++# CONFIG_I2C_THUNDERX is not set ++# CONFIG_I2C_XILINX is not set ++# CONFIG_I2C_XLP9XX is not set ++CONFIG_I2C_RCAR=y ++ ++# ++# External I2C/SMBus adapter drivers ++# ++# CONFIG_I2C_DIOLAN_U2C is not set ++# CONFIG_I2C_CP2615 is not set ++# CONFIG_I2C_PCI1XXXX is not set ++# CONFIG_I2C_ROBOTFUZZ_OSIF is not set ++# CONFIG_I2C_TAOS_EVM is not set ++# CONFIG_I2C_TINY_USB is not set ++ ++# ++# Other I2C/SMBus bus drivers ++# ++# CONFIG_I2C_MLXCPLD is not set ++CONFIG_I2C_CROS_EC_TUNNEL=y ++# CONFIG_I2C_XGENE_SLIMPRO is not set ++# CONFIG_I2C_VIRTIO is not set ++# end of I2C Hardware Bus support ++ ++# CONFIG_I2C_STUB is not set ++CONFIG_I2C_SLAVE=y ++# CONFIG_I2C_SLAVE_EEPROM is not set ++# CONFIG_I2C_SLAVE_TESTUNIT is not set ++# CONFIG_I2C_DEBUG_CORE is not set ++# CONFIG_I2C_DEBUG_ALGO is not set ++# CONFIG_I2C_DEBUG_BUS is not set ++# end of I2C support ++ ++# CONFIG_I3C is not set ++CONFIG_SPI=y ++# CONFIG_SPI_DEBUG is not set ++CONFIG_SPI_MASTER=y ++CONFIG_SPI_MEM=y ++ ++# ++# SPI Master Controller Drivers ++# ++# CONFIG_SPI_ALTERA is not set ++# CONFIG_SPI_AMLOGIC_SPIFC_A1 is not set ++CONFIG_SPI_ARMADA_3700=y ++# CONFIG_SPI_AXI_SPI_ENGINE is not set ++# CONFIG_SPI_BCM2835 is not set ++# CONFIG_SPI_BCM2835AUX is not set ++# CONFIG_SPI_BCM63XX_HSSPI is not set ++CONFIG_SPI_BCM_QSPI=y ++# CONFIG_SPI_BCMBCA_HSSPI is not set ++# CONFIG_SPI_BITBANG is not set ++# CONFIG_SPI_CADENCE is not set ++CONFIG_SPI_CADENCE_QUADSPI=y ++# CONFIG_SPI_CADENCE_XSPI is not set ++# CONFIG_SPI_CH341 is not set ++# CONFIG_SPI_DESIGNWARE is not set ++CONFIG_SPI_FSL_LPSPI=y ++CONFIG_SPI_FSL_QUADSPI=y ++# CONFIG_SPI_HISI_KUNPENG is not set ++# CONFIG_SPI_HISI_SFC_V3XX is not set ++CONFIG_SPI_NXP_FLEXSPI=y ++# CONFIG_SPI_GPIO is not set ++# CONFIG_SPI_IMX is not set ++# CONFIG_SPI_FSL_SPI is not set ++CONFIG_SPI_FSL_DSPI=y ++# CONFIG_SPI_MESON_SPICC is not set ++# CONFIG_SPI_MESON_SPIFC is not set ++# CONFIG_SPI_MICROCHIP_CORE is not set ++# CONFIG_SPI_MICROCHIP_CORE_QSPI is not set ++CONFIG_SPI_MT65XX=y ++# CONFIG_SPI_MTK_NOR is not set ++# CONFIG_SPI_WPCM_FIU is not set ++# CONFIG_SPI_NPCM_FIU is not set ++# CONFIG_SPI_NPCM_PSPI is not set ++# CONFIG_SPI_OC_TINY is not set ++# CONFIG_SPI_OMAP24XX is not set ++CONFIG_SPI_ORION=y ++# CONFIG_SPI_PCI1XXXX is not set ++CONFIG_SPI_PL022=y ++CONFIG_SPI_ROCKCHIP=y ++# CONFIG_SPI_ROCKCHIP_SFC is not set ++# CONFIG_SPI_RSPI is not set ++# CONFIG_SPI_RZV2M_CSI is not set ++# CONFIG_SPI_QCOM_QSPI is not set ++CONFIG_SPI_QUP=y ++# CONFIG_SPI_QCOM_GENI is not set ++CONFIG_SPI_S3C64XX=y ++# CONFIG_SPI_SC18IS602 is not set ++# CONFIG_SPI_SH_MSIOF is not set ++# CONFIG_SPI_SH_HSPI is not set ++# CONFIG_SPI_SIFIVE is not set ++# CONFIG_SPI_SN_F_OSPI is not set ++# CONFIG_SPI_SPRD is not set ++# CONFIG_SPI_SPRD_ADI is not set ++# CONFIG_SPI_STM32 is not set ++# CONFIG_SPI_STM32_QSPI is not set ++# CONFIG_SPI_SUN4I is not set ++CONFIG_SPI_SUN6I=y ++# CONFIG_SPI_SYNQUACER is not set ++# CONFIG_SPI_MXIC is not set ++# CONFIG_SPI_TEGRA210_QUAD is not set ++# CONFIG_SPI_TEGRA114 is not set ++# CONFIG_SPI_TEGRA20_SFLASH is not set ++# CONFIG_SPI_TEGRA20_SLINK is not set ++# CONFIG_SPI_THUNDERX is not set ++# CONFIG_SPI_UNIPHIER is not set ++# CONFIG_SPI_XCOMM is not set ++# CONFIG_SPI_XILINX is not set ++# CONFIG_SPI_XLP is not set ++# CONFIG_SPI_ZYNQMP_GQSPI is not set ++# CONFIG_SPI_AMD is not set ++ ++# ++# SPI Multiplexer support ++# ++# CONFIG_SPI_MUX is not set ++ ++# ++# SPI Protocol Masters ++# ++# CONFIG_SPI_SPIDEV is not set ++# CONFIG_SPI_LOOPBACK_TEST is not set ++# CONFIG_SPI_TLE62X0 is not set ++# CONFIG_SPI_SLAVE is not set ++CONFIG_SPI_DYNAMIC=y ++CONFIG_SPMI=y ++# CONFIG_SPMI_HISI3670 is not set ++CONFIG_SPMI_MSM_PMIC_ARB=y ++# CONFIG_SPMI_MTK_PMIF is not set ++# CONFIG_HSI is not set ++CONFIG_PPS=y ++# CONFIG_PPS_DEBUG is not set ++ ++# ++# PPS clients support ++# ++# CONFIG_PPS_CLIENT_KTIMER is not set ++# CONFIG_PPS_CLIENT_LDISC is not set ++# CONFIG_PPS_CLIENT_GPIO is not set ++ ++# ++# PPS generators support ++# ++ ++# ++# PTP clock support ++# ++CONFIG_PTP_1588_CLOCK=y ++CONFIG_PTP_1588_CLOCK_OPTIONAL=y ++CONFIG_PTP_1588_CLOCK_DTE=y ++CONFIG_PTP_1588_CLOCK_QORIQ=y ++ ++# ++# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. ++# ++CONFIG_PTP_1588_CLOCK_KVM=y ++# CONFIG_PTP_1588_CLOCK_IDT82P33 is not set ++# CONFIG_PTP_1588_CLOCK_IDTCM is not set ++# CONFIG_PTP_1588_CLOCK_FC3W is not set ++# CONFIG_PTP_1588_CLOCK_MOCK is not set ++# CONFIG_PTP_1588_CLOCK_OCP is not set ++# end of PTP clock support ++ ++CONFIG_PINCTRL=y ++CONFIG_GENERIC_PINCTRL_GROUPS=y ++CONFIG_PINMUX=y ++CONFIG_GENERIC_PINMUX_FUNCTIONS=y ++CONFIG_PINCONF=y ++CONFIG_GENERIC_PINCONF=y ++# CONFIG_DEBUG_PINCTRL is not set ++# CONFIG_PINCTRL_AMD is not set ++# CONFIG_PINCTRL_APPLE_GPIO is not set ++# CONFIG_PINCTRL_AXP209 is not set ++# CONFIG_PINCTRL_AW9523 is not set ++# CONFIG_PINCTRL_CY8C95X0 is not set ++# CONFIG_PINCTRL_KEEMBAY is not set ++CONFIG_PINCTRL_MAX77620=y ++# CONFIG_PINCTRL_MCP23S08 is not set ++# CONFIG_PINCTRL_MICROCHIP_SGPIO is not set ++# CONFIG_PINCTRL_OCELOT is not set ++# CONFIG_PINCTRL_RK805 is not set ++CONFIG_PINCTRL_ROCKCHIP=y ++# CONFIG_PINCTRL_SCMI is not set ++CONFIG_PINCTRL_SINGLE=y ++# CONFIG_PINCTRL_STMFX is not set ++# CONFIG_PINCTRL_SX150X is not set ++CONFIG_PINCTRL_ZYNQMP=y ++CONFIG_PINCTRL_OWL=y ++CONFIG_PINCTRL_S700=y ++CONFIG_PINCTRL_S900=y ++CONFIG_PINCTRL_BCM2835=y ++CONFIG_PINCTRL_BCM4908=y ++CONFIG_PINCTRL_IPROC_GPIO=y ++CONFIG_PINCTRL_NS2_MUX=y ++# CONFIG_PINCTRL_AS370 is not set ++# CONFIG_PINCTRL_BERLIN_BG4CT is not set ++CONFIG_PINCTRL_IMX=y ++# CONFIG_PINCTRL_IMX_SCMI is not set ++CONFIG_PINCTRL_IMX_SCU=y ++CONFIG_PINCTRL_IMX8MM=y ++CONFIG_PINCTRL_IMX8MN=y ++CONFIG_PINCTRL_IMX8MP=y ++CONFIG_PINCTRL_IMX8MQ=y ++CONFIG_PINCTRL_IMX8QM=y ++CONFIG_PINCTRL_IMX8QXP=y ++CONFIG_PINCTRL_IMX8DXL=y ++CONFIG_PINCTRL_IMX8ULP=y ++# CONFIG_PINCTRL_IMXRT1050 is not set ++# CONFIG_PINCTRL_IMX91 is not set ++CONFIG_PINCTRL_IMX93=y ++# CONFIG_PINCTRL_IMXRT1170 is not set ++ ++# ++# MediaTek pinctrl drivers ++# ++CONFIG_EINT_MTK=y ++CONFIG_PINCTRL_MTK=y ++CONFIG_PINCTRL_MTK_V2=y ++CONFIG_PINCTRL_MTK_MOORE=y ++CONFIG_PINCTRL_MTK_PARIS=y ++CONFIG_PINCTRL_MT2712=y ++CONFIG_PINCTRL_MT6765=y ++CONFIG_PINCTRL_MT6779=y ++CONFIG_PINCTRL_MT6795=y ++CONFIG_PINCTRL_MT6797=y ++CONFIG_PINCTRL_MT7622=y ++CONFIG_PINCTRL_MT7981=y ++CONFIG_PINCTRL_MT7986=y ++CONFIG_PINCTRL_MT8167=y ++CONFIG_PINCTRL_MT8173=y ++CONFIG_PINCTRL_MT8183=y ++CONFIG_PINCTRL_MT8186=y ++CONFIG_PINCTRL_MT8188=y ++CONFIG_PINCTRL_MT8192=y ++CONFIG_PINCTRL_MT8195=y ++CONFIG_PINCTRL_MT8365=y ++CONFIG_PINCTRL_MT8516=y ++CONFIG_PINCTRL_MT6397=y ++# end of MediaTek pinctrl drivers ++ ++CONFIG_PINCTRL_MESON=y ++CONFIG_PINCTRL_MESON_GXBB=y ++CONFIG_PINCTRL_MESON_GXL=y ++CONFIG_PINCTRL_MESON8_PMX=y ++CONFIG_PINCTRL_MESON_AXG=y ++CONFIG_PINCTRL_MESON_AXG_PMX=y ++CONFIG_PINCTRL_MESON_G12A=y ++CONFIG_PINCTRL_MESON_A1=y ++CONFIG_PINCTRL_MESON_S4=y ++CONFIG_PINCTRL_AMLOGIC_C3=y ++CONFIG_PINCTRL_AMLOGIC_T7=y ++CONFIG_PINCTRL_MVEBU=y ++CONFIG_PINCTRL_ARMADA_AP806=y ++CONFIG_PINCTRL_ARMADA_CP110=y ++CONFIG_PINCTRL_AC5=y ++CONFIG_PINCTRL_ARMADA_37XX=y ++# CONFIG_PINCTRL_NPCM8XX is not set ++# CONFIG_PINCTRL_MA35D1 is not set ++# CONFIG_PINCTRL_S32G2 is not set ++CONFIG_PINCTRL_MSM=y ++CONFIG_PINCTRL_IPQ5018=y ++CONFIG_PINCTRL_IPQ5332=y ++CONFIG_PINCTRL_IPQ8074=y ++CONFIG_PINCTRL_IPQ6018=y ++CONFIG_PINCTRL_IPQ9574=y ++# CONFIG_PINCTRL_MDM9607 is not set ++CONFIG_PINCTRL_MSM8916=y ++CONFIG_PINCTRL_MSM8953=y ++CONFIG_PINCTRL_MSM8976=y ++CONFIG_PINCTRL_MSM8994=y ++CONFIG_PINCTRL_MSM8996=y ++CONFIG_PINCTRL_MSM8998=y ++CONFIG_PINCTRL_QCM2290=y ++CONFIG_PINCTRL_QCS404=y ++CONFIG_PINCTRL_QDF2XXX=y ++CONFIG_PINCTRL_QDU1000=y ++CONFIG_PINCTRL_SA8775P=y ++CONFIG_PINCTRL_SC7180=y ++CONFIG_PINCTRL_SC7280=y ++CONFIG_PINCTRL_SC8180X=y ++CONFIG_PINCTRL_SC8280XP=y ++CONFIG_PINCTRL_SDM660=y ++CONFIG_PINCTRL_SDM670=y ++CONFIG_PINCTRL_SDM845=y ++# CONFIG_PINCTRL_SDX75 is not set ++# CONFIG_PINCTRL_SM4450 is not set ++CONFIG_PINCTRL_SM6115=y ++CONFIG_PINCTRL_SM6125=y ++CONFIG_PINCTRL_SM6350=y ++CONFIG_PINCTRL_SM6375=y ++# CONFIG_PINCTRL_SM7150 is not set ++CONFIG_PINCTRL_SM8150=y ++CONFIG_PINCTRL_SM8250=y ++CONFIG_PINCTRL_SM8350=y ++CONFIG_PINCTRL_SM8450=y ++CONFIG_PINCTRL_SM8550=y ++# CONFIG_PINCTRL_SM8650 is not set ++# CONFIG_PINCTRL_X1E80100 is not set ++CONFIG_PINCTRL_QCOM_SPMI_PMIC=y ++# CONFIG_PINCTRL_QCOM_SSBI_PMIC is not set ++# CONFIG_PINCTRL_LPASS_LPI is not set ++CONFIG_PINCTRL_RTD=y ++CONFIG_PINCTRL_RTD1619B=y ++CONFIG_PINCTRL_RTD1319D=y ++CONFIG_PINCTRL_RTD1315E=y ++ ++# ++# Renesas pinctrl drivers ++# ++CONFIG_PINCTRL_RENESAS=y ++CONFIG_PINCTRL_SH_PFC=y ++CONFIG_PINCTRL_PFC_R8A77995=y ++CONFIG_PINCTRL_PFC_R8A77990=y ++CONFIG_PINCTRL_PFC_R8A77951=y ++CONFIG_PINCTRL_PFC_R8A77965=y ++CONFIG_PINCTRL_PFC_R8A77960=y ++CONFIG_PINCTRL_PFC_R8A77961=y ++CONFIG_PINCTRL_PFC_R8A779F0=y ++CONFIG_PINCTRL_PFC_R8A77980=y ++CONFIG_PINCTRL_PFC_R8A77970=y ++CONFIG_PINCTRL_PFC_R8A779A0=y ++CONFIG_PINCTRL_PFC_R8A779G0=y ++CONFIG_PINCTRL_RZG2L=y ++CONFIG_PINCTRL_PFC_R8A774C0=y ++CONFIG_PINCTRL_PFC_R8A774E1=y ++CONFIG_PINCTRL_PFC_R8A774A1=y ++CONFIG_PINCTRL_PFC_R8A774B1=y ++CONFIG_PINCTRL_RZV2M=y ++# end of Renesas pinctrl drivers ++ ++CONFIG_PINCTRL_SAMSUNG=y ++CONFIG_PINCTRL_EXYNOS=y ++CONFIG_PINCTRL_EXYNOS_ARM64=y ++# CONFIG_PINCTRL_SPRD_SC9860 is not set ++CONFIG_PINCTRL_STM32=y ++CONFIG_PINCTRL_STM32MP257=y ++CONFIG_PINCTRL_SUNXI=y ++# CONFIG_PINCTRL_SUN4I_A10 is not set ++# CONFIG_PINCTRL_SUN5I is not set ++# CONFIG_PINCTRL_SUN6I_A31 is not set ++# CONFIG_PINCTRL_SUN6I_A31_R is not set ++# CONFIG_PINCTRL_SUN8I_A23 is not set ++# CONFIG_PINCTRL_SUN8I_A33 is not set ++# CONFIG_PINCTRL_SUN8I_A83T is not set ++# CONFIG_PINCTRL_SUN8I_A83T_R is not set ++# CONFIG_PINCTRL_SUN8I_A23_R is not set ++# CONFIG_PINCTRL_SUN8I_H3 is not set ++CONFIG_PINCTRL_SUN8I_H3_R=y ++# CONFIG_PINCTRL_SUN8I_V3S is not set ++# CONFIG_PINCTRL_SUN9I_A80 is not set ++# CONFIG_PINCTRL_SUN9I_A80_R is not set ++# CONFIG_PINCTRL_SUN20I_D1 is not set ++CONFIG_PINCTRL_SUN50I_A64=y ++CONFIG_PINCTRL_SUN50I_A64_R=y ++CONFIG_PINCTRL_SUN50I_A100=y ++CONFIG_PINCTRL_SUN50I_A100_R=y ++CONFIG_PINCTRL_SUN50I_H5=y ++CONFIG_PINCTRL_SUN50I_H6=y ++CONFIG_PINCTRL_SUN50I_H6_R=y ++CONFIG_PINCTRL_SUN50I_H616=y ++CONFIG_PINCTRL_SUN50I_H616_R=y ++CONFIG_PINCTRL_TEGRA=y ++CONFIG_PINCTRL_TEGRA124=y ++CONFIG_PINCTRL_TEGRA210=y ++CONFIG_PINCTRL_TEGRA194=y ++CONFIG_PINCTRL_TEGRA234=y ++CONFIG_PINCTRL_TEGRA_XUSB=y ++CONFIG_PINCTRL_UNIPHIER=y ++# CONFIG_PINCTRL_UNIPHIER_LD4 is not set ++# CONFIG_PINCTRL_UNIPHIER_PRO4 is not set ++# CONFIG_PINCTRL_UNIPHIER_SLD8 is not set ++# CONFIG_PINCTRL_UNIPHIER_PRO5 is not set ++# CONFIG_PINCTRL_UNIPHIER_PXS2 is not set ++# CONFIG_PINCTRL_UNIPHIER_LD6B is not set ++CONFIG_PINCTRL_UNIPHIER_LD11=y ++CONFIG_PINCTRL_UNIPHIER_LD20=y ++CONFIG_PINCTRL_UNIPHIER_PXS3=y ++CONFIG_PINCTRL_UNIPHIER_NX1=y ++CONFIG_PINCTRL_VISCONTI=y ++CONFIG_PINCTRL_TMPV7700=y ++CONFIG_GPIOLIB=y ++CONFIG_GPIOLIB_FASTPATH_LIMIT=512 ++CONFIG_OF_GPIO=y ++CONFIG_GPIO_ACPI=y ++CONFIG_GPIOLIB_IRQCHIP=y ++# CONFIG_DEBUG_GPIO is not set ++CONFIG_GPIO_CDEV=y ++CONFIG_GPIO_CDEV_V1=y ++CONFIG_GPIO_GENERIC=y ++ ++# ++# Memory mapped GPIO drivers ++# ++# CONFIG_GPIO_74XX_MMIO is not set ++# CONFIG_GPIO_ALTERA is not set ++# CONFIG_GPIO_AMDPT is not set ++CONFIG_GPIO_RASPBERRYPI_EXP=y ++CONFIG_GPIO_BCM_XGS_IPROC=y ++CONFIG_GPIO_BRCMSTB=y ++# CONFIG_GPIO_CADENCE is not set ++CONFIG_GPIO_DAVINCI=y ++CONFIG_GPIO_DWAPB=y ++# CONFIG_GPIO_EIC_SPRD is not set ++# CONFIG_GPIO_EXAR is not set ++# CONFIG_GPIO_FTGPIO010 is not set ++CONFIG_GPIO_GENERIC_PLATFORM=y ++# CONFIG_GPIO_GRGPIO is not set ++# CONFIG_GPIO_HISI is not set ++# CONFIG_GPIO_HLWD is not set ++CONFIG_GPIO_IMX_SCU=y ++# CONFIG_GPIO_LOGICVC is not set ++CONFIG_GPIO_MB86S7X=y ++CONFIG_GPIO_MPC8XXX=y ++CONFIG_GPIO_MVEBU=y ++CONFIG_GPIO_MXC=y ++# CONFIG_GPIO_NPCM_SGPIO is not set ++CONFIG_GPIO_PL061=y ++CONFIG_GPIO_RCAR=y ++CONFIG_GPIO_ROCKCHIP=y ++CONFIG_GPIO_RTD=y ++# CONFIG_GPIO_SIFIVE is not set ++# CONFIG_GPIO_SPRD is not set ++CONFIG_GPIO_SYSCON=y ++CONFIG_GPIO_TEGRA=y ++CONFIG_GPIO_TEGRA186=y ++# CONFIG_GPIO_THUNDERX is not set ++CONFIG_GPIO_UNIPHIER=y ++# CONFIG_GPIO_VF610 is not set ++CONFIG_GPIO_VISCONTI=y ++CONFIG_GPIO_XGENE=y ++CONFIG_GPIO_XGENE_SB=y ++# CONFIG_GPIO_XILINX is not set ++# CONFIG_GPIO_XLP is not set ++# CONFIG_GPIO_ZYNQ is not set ++CONFIG_GPIO_ZYNQMP_MODEPIN=y ++# CONFIG_GPIO_AMD_FCH is not set ++# end of Memory mapped GPIO drivers ++ ++# ++# I2C GPIO expanders ++# ++# CONFIG_GPIO_ADNP is not set ++# CONFIG_GPIO_FXL6408 is not set ++# CONFIG_GPIO_DS4520 is not set ++# CONFIG_GPIO_GW_PLD is not set ++# CONFIG_GPIO_MAX7300 is not set ++CONFIG_GPIO_MAX732X=y ++# CONFIG_GPIO_MAX732X_IRQ is not set ++CONFIG_GPIO_PCA953X=y ++CONFIG_GPIO_PCA953X_IRQ=y ++# CONFIG_GPIO_PCA9570 is not set ++# CONFIG_GPIO_PCF857X is not set ++# CONFIG_GPIO_TPIC2810 is not set ++# end of I2C GPIO expanders ++ ++# ++# MFD GPIO expanders ++# ++# CONFIG_GPIO_BD9571MWV is not set ++# CONFIG_GPIO_CROS_EC is not set ++CONFIG_GPIO_MAX77620=y ++# CONFIG_GPIO_SL28CPLD is not set ++CONFIG_GPIO_TPS65219=y ++# end of MFD GPIO expanders ++ ++# ++# PCI GPIO expanders ++# ++# CONFIG_GPIO_BT8XX is not set ++# CONFIG_GPIO_PCI_IDIO_16 is not set ++# CONFIG_GPIO_PCIE_IDIO_24 is not set ++# CONFIG_GPIO_RDC321X is not set ++# end of PCI GPIO expanders ++ ++# ++# SPI GPIO expanders ++# ++# CONFIG_GPIO_74X164 is not set ++# CONFIG_GPIO_MAX3191X is not set ++# CONFIG_GPIO_MAX7301 is not set ++# CONFIG_GPIO_MC33880 is not set ++# CONFIG_GPIO_PISOSR is not set ++# CONFIG_GPIO_XRA1403 is not set ++# end of SPI GPIO expanders ++ ++# ++# USB GPIO expanders ++# ++# end of USB GPIO expanders ++ ++# ++# Virtual GPIO drivers ++# ++# CONFIG_GPIO_AGGREGATOR is not set ++# CONFIG_GPIO_LATCH is not set ++# CONFIG_GPIO_MOCKUP is not set ++# CONFIG_GPIO_VIRTIO is not set ++# CONFIG_GPIO_SIM is not set ++# end of Virtual GPIO drivers ++ ++# ++# GPIO Debugging utilities ++# ++# CONFIG_GPIO_VIRTUSER is not set ++# end of GPIO Debugging utilities ++ ++# CONFIG_W1 is not set ++CONFIG_POWER_RESET=y ++CONFIG_POWER_RESET_BRCMSTB=y ++# CONFIG_POWER_RESET_GPIO is not set ++# CONFIG_POWER_RESET_GPIO_RESTART is not set ++# CONFIG_POWER_RESET_HISI is not set ++# CONFIG_POWER_RESET_LINKSTATION is not set ++CONFIG_POWER_RESET_MSM=y ++# CONFIG_POWER_RESET_QCOM_PON is not set ++# CONFIG_POWER_RESET_OCELOT_RESET is not set ++# CONFIG_POWER_RESET_ODROID_GO_ULTRA_POWEROFF is not set ++# CONFIG_POWER_RESET_LTC2952 is not set ++# CONFIG_POWER_RESET_MT6323 is not set ++# CONFIG_POWER_RESET_REGULATOR is not set ++# CONFIG_POWER_RESET_RESTART is not set ++# CONFIG_POWER_RESET_VEXPRESS is not set ++CONFIG_POWER_RESET_XGENE=y ++CONFIG_POWER_RESET_SYSCON=y ++CONFIG_POWER_RESET_SYSCON_POWEROFF=y ++CONFIG_REBOOT_MODE=y ++CONFIG_SYSCON_REBOOT_MODE=y ++# CONFIG_NVMEM_REBOOT_MODE is not set ++# CONFIG_POWER_SEQUENCING is not set ++CONFIG_POWER_SUPPLY=y ++# CONFIG_POWER_SUPPLY_DEBUG is not set ++CONFIG_POWER_SUPPLY_HWMON=y ++# CONFIG_GENERIC_ADC_BATTERY is not set ++# CONFIG_IP5XXX_POWER is not set ++# CONFIG_TEST_POWER is not set ++# CONFIG_CHARGER_ADP5061 is not set ++# CONFIG_BATTERY_CW2015 is not set ++# CONFIG_BATTERY_DS2780 is not set ++# CONFIG_BATTERY_DS2781 is not set ++# CONFIG_BATTERY_DS2782 is not set ++# CONFIG_BATTERY_SAMSUNG_SDI is not set ++# CONFIG_BATTERY_SBS is not set ++# CONFIG_CHARGER_SBS is not set ++# CONFIG_MANAGER_SBS is not set ++CONFIG_BATTERY_BQ27XXX=y ++CONFIG_BATTERY_BQ27XXX_I2C=y ++# CONFIG_BATTERY_BQ27XXX_DT_UPDATES_NVM is not set ++# CONFIG_AXP20X_POWER is not set ++# CONFIG_BATTERY_MAX17040 is not set ++# CONFIG_BATTERY_MAX17042 is not set ++# CONFIG_BATTERY_MAX1720X is not set ++# CONFIG_CHARGER_ISP1704 is not set ++# CONFIG_CHARGER_MAX8903 is not set ++# CONFIG_CHARGER_LP8727 is not set ++# CONFIG_CHARGER_GPIO is not set ++# CONFIG_CHARGER_MANAGER is not set ++# CONFIG_CHARGER_LT3651 is not set ++# CONFIG_CHARGER_LTC4162L is not set ++# CONFIG_CHARGER_DETECTOR_MAX14656 is not set ++# CONFIG_CHARGER_MAX77976 is not set ++# CONFIG_CHARGER_MT6360 is not set ++# CONFIG_CHARGER_QCOM_SMBB is not set ++# CONFIG_BATTERY_PM8916_BMS_VM is not set ++# CONFIG_CHARGER_PM8916_LBC is not set ++# CONFIG_CHARGER_BQ2415X is not set ++# CONFIG_CHARGER_BQ24190 is not set ++# CONFIG_CHARGER_BQ24257 is not set ++# CONFIG_CHARGER_BQ24735 is not set ++# CONFIG_CHARGER_BQ2515X is not set ++# CONFIG_CHARGER_BQ25890 is not set ++# CONFIG_CHARGER_BQ25980 is not set ++# CONFIG_CHARGER_BQ256XX is not set ++# CONFIG_CHARGER_RK817 is not set ++# CONFIG_CHARGER_SMB347 is not set ++# CONFIG_BATTERY_GAUGE_LTC2941 is not set ++# CONFIG_BATTERY_GOLDFISH is not set ++# CONFIG_BATTERY_RT5033 is not set ++# CONFIG_CHARGER_RT9455 is not set ++# CONFIG_CHARGER_RT9467 is not set ++# CONFIG_CHARGER_RT9471 is not set ++# CONFIG_CHARGER_CROS_USBPD is not set ++CONFIG_CHARGER_CROS_PCHG=y ++CONFIG_CHARGER_CROS_CONTROL=y ++# CONFIG_CHARGER_UCS1002 is not set ++# CONFIG_CHARGER_BD99954 is not set ++# CONFIG_BATTERY_UG3105 is not set ++# CONFIG_CHARGER_QCOM_SMB2 is not set ++# CONFIG_FUEL_GAUGE_MM8013 is not set ++CONFIG_HWMON=y ++# CONFIG_HWMON_DEBUG_CHIP is not set ++ ++# ++# Native drivers ++# ++# CONFIG_SENSORS_AD7314 is not set ++# CONFIG_SENSORS_AD7414 is not set ++# CONFIG_SENSORS_AD7418 is not set ++# CONFIG_SENSORS_ADM1025 is not set ++# CONFIG_SENSORS_ADM1026 is not set ++# CONFIG_SENSORS_ADM1029 is not set ++# CONFIG_SENSORS_ADM1031 is not set ++# CONFIG_SENSORS_ADM1177 is not set ++# CONFIG_SENSORS_ADM9240 is not set ++# CONFIG_SENSORS_ADT7310 is not set ++# CONFIG_SENSORS_ADT7410 is not set ++# CONFIG_SENSORS_ADT7411 is not set ++# CONFIG_SENSORS_ADT7462 is not set ++# CONFIG_SENSORS_ADT7470 is not set ++# CONFIG_SENSORS_ADT7475 is not set ++# CONFIG_SENSORS_AHT10 is not set ++# CONFIG_SENSORS_AQUACOMPUTER_D5NEXT is not set ++# CONFIG_SENSORS_AS370 is not set ++# CONFIG_SENSORS_ASC7621 is not set ++# CONFIG_SENSORS_ASUS_ROG_RYUJIN is not set ++# CONFIG_SENSORS_AXI_FAN_CONTROL is not set ++CONFIG_SENSORS_ARM_SCMI=y ++CONFIG_SENSORS_ARM_SCPI=y ++# CONFIG_SENSORS_ATXP1 is not set ++# CONFIG_SENSORS_CHIPCAP2 is not set ++# CONFIG_SENSORS_CORSAIR_CPRO is not set ++# CONFIG_SENSORS_CORSAIR_PSU is not set ++CONFIG_SENSORS_CROS_EC=y ++# CONFIG_SENSORS_DRIVETEMP is not set ++# CONFIG_SENSORS_DS620 is not set ++# CONFIG_SENSORS_DS1621 is not set ++# CONFIG_SENSORS_I5K_AMB is not set ++# CONFIG_SENSORS_SPARX5 is not set ++# CONFIG_SENSORS_F71805F is not set ++# CONFIG_SENSORS_F71882FG is not set ++# CONFIG_SENSORS_F75375S is not set ++# CONFIG_SENSORS_FTSTEUTATES is not set ++# CONFIG_SENSORS_GIGABYTE_WATERFORCE is not set ++# CONFIG_SENSORS_GL518SM is not set ++# CONFIG_SENSORS_GL520SM is not set ++# CONFIG_SENSORS_G760A is not set ++# CONFIG_SENSORS_G762 is not set ++# CONFIG_SENSORS_GPIO_FAN is not set ++# CONFIG_SENSORS_HIH6130 is not set ++# CONFIG_SENSORS_HS3001 is not set ++# CONFIG_SENSORS_IIO_HWMON is not set ++# CONFIG_SENSORS_IT87 is not set ++# CONFIG_SENSORS_JC42 is not set ++# CONFIG_SENSORS_POWERZ is not set ++# CONFIG_SENSORS_POWR1220 is not set ++# CONFIG_SENSORS_LINEAGE is not set ++# CONFIG_SENSORS_LTC2945 is not set ++# CONFIG_SENSORS_LTC2947_I2C is not set ++# CONFIG_SENSORS_LTC2947_SPI is not set ++# CONFIG_SENSORS_LTC2990 is not set ++# CONFIG_SENSORS_LTC2991 is not set ++# CONFIG_SENSORS_LTC2992 is not set ++# CONFIG_SENSORS_LTC4151 is not set ++# CONFIG_SENSORS_LTC4215 is not set ++# CONFIG_SENSORS_LTC4222 is not set ++# CONFIG_SENSORS_LTC4245 is not set ++# CONFIG_SENSORS_LTC4260 is not set ++# CONFIG_SENSORS_LTC4261 is not set ++# CONFIG_SENSORS_LTC4282 is not set ++# CONFIG_SENSORS_MAX1111 is not set ++# CONFIG_SENSORS_MAX127 is not set ++# CONFIG_SENSORS_MAX16065 is not set ++# CONFIG_SENSORS_MAX1619 is not set ++# CONFIG_SENSORS_MAX1668 is not set ++# CONFIG_SENSORS_MAX197 is not set ++# CONFIG_SENSORS_MAX31722 is not set ++# CONFIG_SENSORS_MAX31730 is not set ++# CONFIG_SENSORS_MAX31760 is not set ++# CONFIG_MAX31827 is not set ++# CONFIG_SENSORS_MAX6620 is not set ++# CONFIG_SENSORS_MAX6621 is not set ++# CONFIG_SENSORS_MAX6639 is not set ++# CONFIG_SENSORS_MAX6650 is not set ++# CONFIG_SENSORS_MAX6697 is not set ++# CONFIG_SENSORS_MAX31790 is not set ++# CONFIG_SENSORS_MC34VR500 is not set ++# CONFIG_SENSORS_MCP3021 is not set ++# CONFIG_SENSORS_TC654 is not set ++# CONFIG_SENSORS_TPS23861 is not set ++# CONFIG_SENSORS_MR75203 is not set ++# CONFIG_SENSORS_ADCXX is not set ++# CONFIG_SENSORS_LM63 is not set ++# CONFIG_SENSORS_LM70 is not set ++# CONFIG_SENSORS_LM73 is not set ++# CONFIG_SENSORS_LM75 is not set ++# CONFIG_SENSORS_LM77 is not set ++# CONFIG_SENSORS_LM78 is not set ++# CONFIG_SENSORS_LM80 is not set ++# CONFIG_SENSORS_LM83 is not set ++# CONFIG_SENSORS_LM85 is not set ++# CONFIG_SENSORS_LM87 is not set ++# CONFIG_SENSORS_LM90 is not set ++# CONFIG_SENSORS_LM92 is not set ++# CONFIG_SENSORS_LM93 is not set ++# CONFIG_SENSORS_LM95234 is not set ++# CONFIG_SENSORS_LM95241 is not set ++# CONFIG_SENSORS_LM95245 is not set ++# CONFIG_SENSORS_PC87360 is not set ++# CONFIG_SENSORS_PC87427 is not set ++# CONFIG_SENSORS_NTC_THERMISTOR is not set ++# CONFIG_SENSORS_NCT6683 is not set ++# CONFIG_SENSORS_NCT6775 is not set ++# CONFIG_SENSORS_NCT6775_I2C is not set ++# CONFIG_SENSORS_NCT7802 is not set ++# CONFIG_SENSORS_NCT7904 is not set ++# CONFIG_SENSORS_NPCM7XX is not set ++# CONFIG_SENSORS_NZXT_KRAKEN2 is not set ++# CONFIG_SENSORS_NZXT_KRAKEN3 is not set ++# CONFIG_SENSORS_NZXT_SMART2 is not set ++# CONFIG_SENSORS_OCC_P8_I2C is not set ++# CONFIG_SENSORS_PCF8591 is not set ++# CONFIG_PMBUS is not set ++# CONFIG_SENSORS_PT5161L is not set ++# CONFIG_SENSORS_PWM_FAN is not set ++# CONFIG_SENSORS_RASPBERRYPI_HWMON is not set ++# CONFIG_SENSORS_SL28CPLD is not set ++# CONFIG_SENSORS_SBTSI is not set ++# CONFIG_SENSORS_SBRMI is not set ++# CONFIG_SENSORS_SHT15 is not set ++# CONFIG_SENSORS_SHT21 is not set ++# CONFIG_SENSORS_SHT3x is not set ++# CONFIG_SENSORS_SHT4x is not set ++# CONFIG_SENSORS_SHTC1 is not set ++# CONFIG_SENSORS_SIS5595 is not set ++# CONFIG_SENSORS_DME1737 is not set ++# CONFIG_SENSORS_EMC1403 is not set ++# CONFIG_SENSORS_EMC2103 is not set ++# CONFIG_SENSORS_EMC2305 is not set ++# CONFIG_SENSORS_EMC6W201 is not set ++# CONFIG_SENSORS_SMSC47M1 is not set ++# CONFIG_SENSORS_SMSC47M192 is not set ++# CONFIG_SENSORS_SMSC47B397 is not set ++# CONFIG_SENSORS_SCH5627 is not set ++# CONFIG_SENSORS_SCH5636 is not set ++# CONFIG_SENSORS_STTS751 is not set ++# CONFIG_SENSORS_ADC128D818 is not set ++# CONFIG_SENSORS_ADS7828 is not set ++# CONFIG_SENSORS_ADS7871 is not set ++# CONFIG_SENSORS_AMC6821 is not set ++# CONFIG_SENSORS_INA209 is not set ++# CONFIG_SENSORS_INA2XX is not set ++# CONFIG_SENSORS_INA238 is not set ++# CONFIG_SENSORS_INA3221 is not set ++# CONFIG_SENSORS_SPD5118 is not set ++# CONFIG_SENSORS_TC74 is not set ++# CONFIG_SENSORS_THMC50 is not set ++# CONFIG_SENSORS_TMP102 is not set ++# CONFIG_SENSORS_TMP103 is not set ++# CONFIG_SENSORS_TMP108 is not set ++# CONFIG_SENSORS_TMP401 is not set ++# CONFIG_SENSORS_TMP421 is not set ++# CONFIG_SENSORS_TMP464 is not set ++# CONFIG_SENSORS_TMP513 is not set ++# CONFIG_SENSORS_VEXPRESS is not set ++# CONFIG_SENSORS_VIA686A is not set ++# CONFIG_SENSORS_VT1211 is not set ++# CONFIG_SENSORS_VT8231 is not set ++# CONFIG_SENSORS_W83773G is not set ++# CONFIG_SENSORS_W83781D is not set ++# CONFIG_SENSORS_W83791D is not set ++# CONFIG_SENSORS_W83792D is not set ++# CONFIG_SENSORS_W83793 is not set ++# CONFIG_SENSORS_W83795 is not set ++# CONFIG_SENSORS_W83L785TS is not set ++# CONFIG_SENSORS_W83L786NG is not set ++# CONFIG_SENSORS_W83627HF is not set ++# CONFIG_SENSORS_W83627EHF is not set ++# CONFIG_SENSORS_XGENE is not set ++ ++# ++# ACPI drivers ++# ++# CONFIG_SENSORS_ACPI_POWER is not set ++CONFIG_THERMAL=y ++# CONFIG_THERMAL_NETLINK is not set ++# CONFIG_THERMAL_STATISTICS is not set ++# CONFIG_THERMAL_DEBUGFS is not set ++# CONFIG_THERMAL_CORE_TESTING is not set ++CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 ++CONFIG_THERMAL_HWMON=y ++CONFIG_THERMAL_OF=y ++CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y ++# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set ++# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set ++# CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR is not set ++# CONFIG_THERMAL_GOV_FAIR_SHARE is not set ++CONFIG_THERMAL_GOV_STEP_WISE=y ++# CONFIG_THERMAL_GOV_BANG_BANG is not set ++# CONFIG_THERMAL_GOV_USER_SPACE is not set ++CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y ++CONFIG_CPU_THERMAL=y ++CONFIG_CPU_FREQ_THERMAL=y ++CONFIG_DEVFREQ_THERMAL=y ++CONFIG_THERMAL_EMULATION=y ++# CONFIG_THERMAL_MMIO is not set ++CONFIG_HISI_THERMAL=y ++# CONFIG_IMX_THERMAL is not set ++# CONFIG_IMX_SC_THERMAL is not set ++# CONFIG_IMX8MM_THERMAL is not set ++# CONFIG_K3_THERMAL is not set ++# CONFIG_MAX77620_THERMAL is not set ++# CONFIG_QORIQ_THERMAL is not set ++CONFIG_SUN8I_THERMAL=y ++# CONFIG_ROCKCHIP_THERMAL is not set ++CONFIG_ARMADA_THERMAL=y ++ ++# ++# Mediatek thermal drivers ++# ++# CONFIG_MTK_THERMAL is not set ++# end of Mediatek thermal drivers ++ ++CONFIG_AMLOGIC_THERMAL=y ++ ++# ++# Broadcom thermal drivers ++# ++# CONFIG_BCM2711_THERMAL is not set ++# CONFIG_BCM2835_THERMAL is not set ++# CONFIG_BRCMSTB_THERMAL is not set ++CONFIG_BCM_NS_THERMAL=y ++CONFIG_BCM_SR_THERMAL=y ++# end of Broadcom thermal drivers ++ ++# ++# Samsung thermal drivers ++# ++CONFIG_EXYNOS_THERMAL=y ++# end of Samsung thermal drivers ++ ++# ++# STMicroelectronics thermal drivers ++# ++# CONFIG_ST_THERMAL is not set ++# CONFIG_ST_THERMAL_MEMMAP is not set ++# end of STMicroelectronics thermal drivers ++ ++CONFIG_RCAR_THERMAL=y ++CONFIG_RCAR_GEN3_THERMAL=y ++CONFIG_RZG2L_THERMAL=y ++ ++# ++# NVIDIA Tegra thermal drivers ++# ++# CONFIG_TEGRA_SOCTHERM is not set ++# CONFIG_TEGRA_BPMP_THERMAL is not set ++# end of NVIDIA Tegra thermal drivers ++ ++# CONFIG_GENERIC_ADC_THERMAL is not set ++ ++# ++# Qualcomm thermal drivers ++# ++CONFIG_QCOM_TSENS=y ++# CONFIG_QCOM_SPMI_ADC_TM5 is not set ++# CONFIG_QCOM_SPMI_TEMP_ALARM is not set ++# CONFIG_QCOM_LMH is not set ++# end of Qualcomm thermal drivers ++ ++CONFIG_UNIPHIER_THERMAL=y ++# CONFIG_SPRD_THERMAL is not set ++CONFIG_WATCHDOG=y ++CONFIG_WATCHDOG_CORE=y ++# CONFIG_WATCHDOG_NOWAYOUT is not set ++CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y ++CONFIG_WATCHDOG_OPEN_TIMEOUT=0 ++# CONFIG_WATCHDOG_SYSFS is not set ++# CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT is not set ++ ++# ++# Watchdog Pretimeout Governors ++# ++# CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set ++ ++# ++# Watchdog Device Drivers ++# ++# CONFIG_SOFT_WATCHDOG is not set ++# CONFIG_CROS_EC_WATCHDOG is not set ++# CONFIG_GPIO_WATCHDOG is not set ++# CONFIG_WDAT_WDT is not set ++# CONFIG_XILINX_WATCHDOG is not set ++# CONFIG_XILINX_WINDOW_WATCHDOG is not set ++# CONFIG_ZIIRAVE_WATCHDOG is not set ++# CONFIG_SL28CPLD_WATCHDOG is not set ++CONFIG_ARM_SP805_WATCHDOG=y ++CONFIG_ARM_SBSA_WATCHDOG=y ++# CONFIG_ARMADA_37XX_WATCHDOG is not set ++# CONFIG_CADENCE_WATCHDOG is not set ++CONFIG_S3C2410_WATCHDOG=y ++CONFIG_DW_WATCHDOG=y ++# CONFIG_K3_RTI_WATCHDOG is not set ++# CONFIG_SUNXI_WATCHDOG is not set ++CONFIG_NPCM7XX_WATCHDOG=y ++# CONFIG_MAX63XX_WATCHDOG is not set ++# CONFIG_MAX77620_WATCHDOG is not set ++CONFIG_IMX2_WDT=y ++# CONFIG_IMX_SC_WDT is not set ++# CONFIG_IMX7ULP_WDT is not set ++# CONFIG_TEGRA_WATCHDOG is not set ++# CONFIG_QCOM_WDT is not set ++# CONFIG_MESON_GXBB_WATCHDOG is not set ++# CONFIG_MESON_WATCHDOG is not set ++CONFIG_MEDIATEK_WATCHDOG=y ++CONFIG_ARM_SMC_WATCHDOG=y ++CONFIG_RENESAS_WDT=y ++# CONFIG_RENESAS_RZAWDT is not set ++# CONFIG_RENESAS_RZN1WDT is not set ++CONFIG_RENESAS_RZG2LWDT=y ++CONFIG_STM32_WATCHDOG=y ++CONFIG_UNIPHIER_WATCHDOG=y ++CONFIG_RTD119X_WATCHDOG=y ++# CONFIG_SPRD_WATCHDOG is not set ++# CONFIG_PM8916_WATCHDOG is not set ++# CONFIG_VISCONTI_WATCHDOG is not set ++# CONFIG_APPLE_WATCHDOG is not set ++# CONFIG_ALIM7101_WDT is not set ++# CONFIG_I6300ESB_WDT is not set ++# CONFIG_HP_WATCHDOG is not set ++CONFIG_MARVELL_GTI_WDT=y ++CONFIG_BCM2835_WDT=y ++# CONFIG_BCM7038_WDT is not set ++# CONFIG_MEN_A21_WDT is not set ++# CONFIG_XEN_WDT is not set ++ ++# ++# PCI-based Watchdog Cards ++# ++# CONFIG_PCIPCWATCHDOG is not set ++# CONFIG_WDTPCI is not set ++ ++# ++# USB-based Watchdog Cards ++# ++# CONFIG_USBPCWATCHDOG is not set ++# CONFIG_KEEMBAY_WATCHDOG is not set ++CONFIG_SSB_POSSIBLE=y ++# CONFIG_SSB is not set ++CONFIG_BCMA_POSSIBLE=y ++# CONFIG_BCMA is not set ++ ++# ++# Multifunction device drivers ++# ++CONFIG_MFD_CORE=y ++# CONFIG_MFD_ADP5585 is not set ++# CONFIG_MFD_ALTERA_A10SR is not set ++CONFIG_MFD_ALTERA_SYSMGR=y ++# CONFIG_MFD_ACT8945A is not set ++# CONFIG_MFD_SUN4I_GPADC is not set ++# CONFIG_MFD_AS3711 is not set ++# CONFIG_MFD_SMPRO is not set ++# CONFIG_MFD_AS3722 is not set ++# CONFIG_PMIC_ADP5520 is not set ++# CONFIG_MFD_AAT2870_CORE is not set ++# CONFIG_MFD_ATMEL_FLEXCOM is not set ++# CONFIG_MFD_ATMEL_HLCDC is not set ++# CONFIG_MFD_BCM590XX is not set ++CONFIG_MFD_BD9571MWV=y ++# CONFIG_MFD_AC100 is not set ++CONFIG_MFD_AXP20X=y ++CONFIG_MFD_AXP20X_I2C=y ++CONFIG_MFD_AXP20X_RSB=y ++CONFIG_MFD_CROS_EC_DEV=y ++# CONFIG_MFD_CS42L43_I2C is not set ++# CONFIG_MFD_MADERA is not set ++# CONFIG_MFD_MAX5970 is not set ++# CONFIG_PMIC_DA903X is not set ++# CONFIG_MFD_DA9052_SPI is not set ++# CONFIG_MFD_DA9052_I2C is not set ++# CONFIG_MFD_DA9055 is not set ++# CONFIG_MFD_DA9062 is not set ++# CONFIG_MFD_DA9063 is not set ++# CONFIG_MFD_DA9150 is not set ++# CONFIG_MFD_DLN2 is not set ++# CONFIG_MFD_EXYNOS_LPASS is not set ++# CONFIG_MFD_GATEWORKS_GSC is not set ++# CONFIG_MFD_MC13XXX_SPI is not set ++# CONFIG_MFD_MC13XXX_I2C is not set ++# CONFIG_MFD_MP2629 is not set ++CONFIG_MFD_HI6421_PMIC=y ++# CONFIG_MFD_HI6421_SPMI is not set ++CONFIG_MFD_HI655X_PMIC=y ++# CONFIG_LPC_ICH is not set ++# CONFIG_LPC_SCH is not set ++# CONFIG_MFD_IQS62X is not set ++# CONFIG_MFD_JANZ_CMODIO is not set ++# CONFIG_MFD_KEMPLD is not set ++# CONFIG_MFD_88PM800 is not set ++# CONFIG_MFD_88PM805 is not set ++# CONFIG_MFD_88PM860X is not set ++# CONFIG_MFD_88PM886_PMIC is not set ++# CONFIG_MFD_MAX14577 is not set ++# CONFIG_MFD_MAX77541 is not set ++CONFIG_MFD_MAX77620=y ++# CONFIG_MFD_MAX77650 is not set ++# CONFIG_MFD_MAX77686 is not set ++# CONFIG_MFD_MAX77693 is not set ++# CONFIG_MFD_MAX77714 is not set ++# CONFIG_MFD_MAX77843 is not set ++# CONFIG_MFD_MAX8907 is not set ++# CONFIG_MFD_MAX8925 is not set ++# CONFIG_MFD_MAX8997 is not set ++# CONFIG_MFD_MAX8998 is not set ++CONFIG_MFD_MT6360=y ++# CONFIG_MFD_MT6370 is not set ++CONFIG_MFD_MT6397=y ++# CONFIG_MFD_MENF21BMC is not set ++# CONFIG_MFD_OCELOT is not set ++# CONFIG_EZX_PCAP is not set ++# CONFIG_MFD_CPCAP is not set ++# CONFIG_MFD_VIPERBOARD is not set ++# CONFIG_MFD_NTXEC is not set ++# CONFIG_MFD_RETU is not set ++# CONFIG_MFD_PCF50633 is not set ++# CONFIG_MFD_QCOM_RPM is not set ++CONFIG_MFD_SPMI_PMIC=y ++# CONFIG_MFD_SY7636A is not set ++# CONFIG_MFD_RDC321X is not set ++# CONFIG_MFD_RT4831 is not set ++# CONFIG_MFD_RT5033 is not set ++# CONFIG_MFD_RT5120 is not set ++# CONFIG_MFD_RC5T583 is not set ++CONFIG_MFD_RK8XX=y ++CONFIG_MFD_RK8XX_I2C=y ++CONFIG_MFD_RK8XX_SPI=y ++# CONFIG_MFD_RN5T618 is not set ++CONFIG_MFD_SEC_CORE=y ++# CONFIG_MFD_SI476X_CORE is not set ++CONFIG_MFD_SIMPLE_MFD_I2C=y ++CONFIG_MFD_SL28CPLD=y ++# CONFIG_MFD_SM501 is not set ++# CONFIG_MFD_SKY81452 is not set ++# CONFIG_MFD_SC27XX_PMIC is not set ++CONFIG_RZ_MTU3=y ++# CONFIG_MFD_STMPE is not set ++# CONFIG_MFD_SUN6I_PRCM is not set ++CONFIG_MFD_SYSCON=y ++# CONFIG_MFD_TI_AM335X_TSCADC is not set ++# CONFIG_MFD_LP3943 is not set ++# CONFIG_MFD_LP8788 is not set ++# CONFIG_MFD_TI_LMU is not set ++# CONFIG_MFD_PALMAS is not set ++# CONFIG_TPS6105X is not set ++# CONFIG_TPS65010 is not set ++# CONFIG_TPS6507X is not set ++# CONFIG_MFD_TPS65086 is not set ++# CONFIG_MFD_TPS65090 is not set ++# CONFIG_MFD_TPS65217 is not set ++# CONFIG_MFD_TI_LP873X is not set ++# CONFIG_MFD_TI_LP87565 is not set ++# CONFIG_MFD_TPS65218 is not set ++CONFIG_MFD_TPS65219=y ++# CONFIG_MFD_TPS6586X is not set ++# CONFIG_MFD_TPS65910 is not set ++# CONFIG_MFD_TPS65912_I2C is not set ++# CONFIG_MFD_TPS65912_SPI is not set ++# CONFIG_MFD_TPS6594_I2C is not set ++# CONFIG_MFD_TPS6594_SPI is not set ++# CONFIG_TWL4030_CORE is not set ++# CONFIG_TWL6040_CORE is not set ++# CONFIG_MFD_WL1273_CORE is not set ++# CONFIG_MFD_LM3533 is not set ++# CONFIG_MFD_TC3589X is not set ++# CONFIG_MFD_TQMX86 is not set ++# CONFIG_MFD_VX855 is not set ++# CONFIG_MFD_LOCHNAGAR is not set ++# CONFIG_MFD_ARIZONA_I2C is not set ++# CONFIG_MFD_ARIZONA_SPI is not set ++# CONFIG_MFD_WM8400 is not set ++# CONFIG_MFD_WM831X_I2C is not set ++# CONFIG_MFD_WM831X_SPI is not set ++# CONFIG_MFD_WM8350_I2C is not set ++# CONFIG_MFD_WM8994 is not set ++CONFIG_MFD_ROHM_BD718XX=y ++# CONFIG_MFD_ROHM_BD71828 is not set ++# CONFIG_MFD_ROHM_BD957XMUF is not set ++# CONFIG_MFD_ROHM_BD96801 is not set ++# CONFIG_MFD_STM32_LPTIMER is not set ++# CONFIG_MFD_STM32_TIMERS is not set ++# CONFIG_MFD_STPMIC1 is not set ++# CONFIG_MFD_STMFX is not set ++# CONFIG_MFD_ATC260X_I2C is not set ++# CONFIG_MFD_KHADAS_MCU is not set ++# CONFIG_MFD_QCOM_PM8008 is not set ++# CONFIG_MFD_CS40L50_I2C is not set ++# CONFIG_MFD_CS40L50_SPI is not set ++CONFIG_MFD_VEXPRESS_SYSREG=y ++# CONFIG_RAVE_SP_CORE is not set ++# CONFIG_MFD_INTEL_M10_BMC_SPI is not set ++# CONFIG_MFD_RSMU_I2C is not set ++# CONFIG_MFD_RSMU_SPI is not set ++# end of Multifunction device drivers ++ ++CONFIG_REGULATOR=y ++# CONFIG_REGULATOR_DEBUG is not set ++CONFIG_REGULATOR_FIXED_VOLTAGE=y ++# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set ++# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set ++# CONFIG_REGULATOR_NETLINK_EVENTS is not set ++# CONFIG_REGULATOR_88PG86X is not set ++# CONFIG_REGULATOR_ACT8865 is not set ++# CONFIG_REGULATOR_AD5398 is not set ++# CONFIG_REGULATOR_ANATOP is not set ++CONFIG_REGULATOR_ARM_SCMI=y ++# CONFIG_REGULATOR_AW37503 is not set ++CONFIG_REGULATOR_AXP20X=y ++CONFIG_REGULATOR_BD718XX=y ++CONFIG_REGULATOR_BD9571MWV=y ++CONFIG_REGULATOR_CROS_EC=y ++# CONFIG_REGULATOR_DA9121 is not set ++# CONFIG_REGULATOR_DA9210 is not set ++# CONFIG_REGULATOR_DA9211 is not set ++CONFIG_REGULATOR_FAN53555=y ++# CONFIG_REGULATOR_FAN53880 is not set ++CONFIG_REGULATOR_GPIO=y ++# CONFIG_REGULATOR_HI6421 is not set ++CONFIG_REGULATOR_HI6421V530=y ++CONFIG_REGULATOR_HI655X=y ++# CONFIG_REGULATOR_ISL9305 is not set ++# CONFIG_REGULATOR_ISL6271A is not set ++# CONFIG_REGULATOR_LP3971 is not set ++# CONFIG_REGULATOR_LP3972 is not set ++# CONFIG_REGULATOR_LP872X is not set ++# CONFIG_REGULATOR_LP8755 is not set ++# CONFIG_REGULATOR_LTC3589 is not set ++# CONFIG_REGULATOR_LTC3676 is not set ++# CONFIG_REGULATOR_MAX1586 is not set ++# CONFIG_REGULATOR_MAX77503 is not set ++CONFIG_REGULATOR_MAX77620=y ++# CONFIG_REGULATOR_MAX77857 is not set ++# CONFIG_REGULATOR_MAX8649 is not set ++# CONFIG_REGULATOR_MAX8660 is not set ++# CONFIG_REGULATOR_MAX8893 is not set ++# CONFIG_REGULATOR_MAX8952 is not set ++CONFIG_REGULATOR_MAX8973=y ++# CONFIG_REGULATOR_MAX20086 is not set ++# CONFIG_REGULATOR_MAX20411 is not set ++# CONFIG_REGULATOR_MAX77826 is not set ++# CONFIG_REGULATOR_MCP16502 is not set ++# CONFIG_REGULATOR_MP5416 is not set ++CONFIG_REGULATOR_MP8859=y ++# CONFIG_REGULATOR_MP886X is not set ++# CONFIG_REGULATOR_MPQ7920 is not set ++# CONFIG_REGULATOR_MT6311 is not set ++# CONFIG_REGULATOR_MT6315 is not set ++# CONFIG_REGULATOR_MT6323 is not set ++# CONFIG_REGULATOR_MT6331 is not set ++# CONFIG_REGULATOR_MT6332 is not set ++CONFIG_REGULATOR_MT6357=y ++CONFIG_REGULATOR_MT6358=y ++CONFIG_REGULATOR_MT6359=y ++CONFIG_REGULATOR_MT6360=y ++# CONFIG_REGULATOR_MT6380 is not set ++CONFIG_REGULATOR_MT6397=y ++CONFIG_REGULATOR_PCA9450=y ++CONFIG_REGULATOR_PF8X00=y ++CONFIG_REGULATOR_PFUZE100=y ++# CONFIG_REGULATOR_PV88060 is not set ++# CONFIG_REGULATOR_PV88080 is not set ++# CONFIG_REGULATOR_PV88090 is not set ++CONFIG_REGULATOR_PWM=y ++# CONFIG_REGULATOR_QCOM_REFGEN is not set ++CONFIG_REGULATOR_QCOM_RPMH=y ++CONFIG_REGULATOR_QCOM_SMD_RPM=y ++CONFIG_REGULATOR_QCOM_SPMI=y ++# CONFIG_REGULATOR_QCOM_USB_VBUS is not set ++CONFIG_REGULATOR_RAA215300=y ++CONFIG_REGULATOR_RK808=y ++CONFIG_REGULATOR_ROHM=y ++# CONFIG_REGULATOR_RT4801 is not set ++# CONFIG_REGULATOR_RT4803 is not set ++# CONFIG_REGULATOR_RT5190A is not set ++# CONFIG_REGULATOR_RT5739 is not set ++# CONFIG_REGULATOR_RT5759 is not set ++# CONFIG_REGULATOR_RT6160 is not set ++# CONFIG_REGULATOR_RT6190 is not set ++# CONFIG_REGULATOR_RT6245 is not set ++# CONFIG_REGULATOR_RTQ2134 is not set ++# CONFIG_REGULATOR_RTMV20 is not set ++# CONFIG_REGULATOR_RTQ6752 is not set ++# CONFIG_REGULATOR_RTQ2208 is not set ++# CONFIG_REGULATOR_S2MPA01 is not set ++CONFIG_REGULATOR_S2MPS11=y ++# CONFIG_REGULATOR_S5M8767 is not set ++# CONFIG_REGULATOR_SLG51000 is not set ++# CONFIG_REGULATOR_STM32_BOOSTER is not set ++# CONFIG_REGULATOR_STM32_VREFBUF is not set ++# CONFIG_REGULATOR_STM32_PWR is not set ++CONFIG_REGULATOR_SUN20I=y ++# CONFIG_REGULATOR_SY8106A is not set ++# CONFIG_REGULATOR_SY8824X is not set ++# CONFIG_REGULATOR_SY8827N is not set ++# CONFIG_REGULATOR_TPS51632 is not set ++# CONFIG_REGULATOR_TPS62360 is not set ++# CONFIG_REGULATOR_TPS6286X is not set ++# CONFIG_REGULATOR_TPS6287X is not set ++# CONFIG_REGULATOR_TPS65023 is not set ++# CONFIG_REGULATOR_TPS6507X is not set ++# CONFIG_REGULATOR_TPS65132 is not set ++CONFIG_REGULATOR_TPS65219=y ++# CONFIG_REGULATOR_TPS6524X is not set ++CONFIG_REGULATOR_UNIPHIER=y ++CONFIG_REGULATOR_RZG2L_VBCTRL=y ++# CONFIG_REGULATOR_VCTRL is not set ++# CONFIG_REGULATOR_VEXPRESS is not set ++# CONFIG_REGULATOR_VQMMC_IPQ4019 is not set ++# CONFIG_REGULATOR_QCOM_LABIBB is not set ++# CONFIG_RC_CORE is not set ++ ++# ++# CEC support ++# ++# CONFIG_MEDIA_CEC_SUPPORT is not set ++# end of CEC support ++ ++# CONFIG_MEDIA_SUPPORT is not set ++ ++# ++# Graphics support ++# ++CONFIG_APERTURE_HELPERS=y ++CONFIG_SCREEN_INFO=y ++CONFIG_VIDEO=y ++# CONFIG_AUXDISPLAY is not set ++# CONFIG_TEGRA_HOST1X is not set ++CONFIG_DRM=y ++# CONFIG_DRM_DEBUG_MM is not set ++CONFIG_DRM_KMS_HELPER=y ++# CONFIG_DRM_PANIC is not set ++CONFIG_DRM_FBDEV_EMULATION=y ++CONFIG_DRM_FBDEV_OVERALLOC=100 ++# CONFIG_DRM_LOAD_EDID_FIRMWARE is not set ++CONFIG_DRM_GEM_SHMEM_HELPER=y ++ ++# ++# I2C encoder or helper chips ++# ++# CONFIG_DRM_I2C_CH7006 is not set ++# CONFIG_DRM_I2C_SIL164 is not set ++# CONFIG_DRM_I2C_NXP_TDA998X is not set ++# CONFIG_DRM_I2C_NXP_TDA9950 is not set ++# end of I2C encoder or helper chips ++ ++# ++# ARM devices ++# ++# CONFIG_DRM_HDLCD is not set ++# CONFIG_DRM_MALI_DISPLAY is not set ++# CONFIG_DRM_KOMEDA is not set ++# end of ARM devices ++ ++# CONFIG_DRM_RADEON is not set ++# CONFIG_DRM_AMDGPU is not set ++# CONFIG_DRM_NOUVEAU is not set ++# CONFIG_DRM_XE is not set ++# CONFIG_DRM_KMB_DISPLAY is not set ++# CONFIG_DRM_VGEM is not set ++# CONFIG_DRM_VKMS is not set ++# CONFIG_DRM_EXYNOS is not set ++# CONFIG_DRM_ROCKCHIP is not set ++# CONFIG_DRM_VMWGFX is not set ++# CONFIG_DRM_UDL is not set ++# CONFIG_DRM_AST is not set ++# CONFIG_DRM_MGAG200 is not set ++# CONFIG_DRM_RCAR_DU is not set ++# CONFIG_DRM_RZG2L_MIPI_DSI is not set ++# CONFIG_DRM_SHMOBILE is not set ++# CONFIG_DRM_SUN4I is not set ++# CONFIG_DRM_QXL is not set ++CONFIG_DRM_VIRTIO_GPU=y ++CONFIG_DRM_VIRTIO_GPU_KMS=y ++# CONFIG_DRM_MSM is not set ++# CONFIG_DRM_TEGRA is not set ++# CONFIG_DRM_STM is not set ++CONFIG_DRM_PANEL=y ++ ++# ++# Display Panels ++# ++# CONFIG_DRM_PANEL_ABT_Y030XX067A is not set ++# CONFIG_DRM_PANEL_ARM_VERSATILE is not set ++CONFIG_DRM_PANEL_SIMPLE=y ++# CONFIG_DRM_PANEL_AUO_A030JTN01 is not set ++# CONFIG_DRM_PANEL_ILITEK_IL9322 is not set ++# CONFIG_DRM_PANEL_INNOLUX_EJ030NA is not set ++# CONFIG_DRM_PANEL_LG_LB035Q02 is not set ++# CONFIG_DRM_PANEL_LG_LG4573 is not set ++# CONFIG_DRM_PANEL_NEC_NL8048HL11 is not set ++# CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01 is not set ++# CONFIG_DRM_PANEL_SAMSUNG_S6D27A1 is not set ++# CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set ++# CONFIG_DRM_PANEL_SHARP_LS037V7DW01 is not set ++# CONFIG_DRM_PANEL_TPO_TD043MTEA1 is not set ++# end of Display Panels ++ ++CONFIG_DRM_BRIDGE=y ++CONFIG_DRM_PANEL_BRIDGE=y ++ ++# ++# Display Interface Bridges ++# ++# CONFIG_DRM_CHIPONE_ICN6211 is not set ++# CONFIG_DRM_CHRONTEL_CH7033 is not set ++# CONFIG_DRM_CROS_EC_ANX7688 is not set ++# CONFIG_DRM_DISPLAY_CONNECTOR is not set ++# CONFIG_DRM_FSL_LDB is not set ++# CONFIG_DRM_ITE_IT6505 is not set ++# CONFIG_DRM_LONTIUM_LT8912B is not set ++# CONFIG_DRM_LONTIUM_LT9211 is not set ++# CONFIG_DRM_LONTIUM_LT9611 is not set ++# CONFIG_DRM_LONTIUM_LT9611UXC is not set ++# CONFIG_DRM_ITE_IT66121 is not set ++# CONFIG_DRM_LVDS_CODEC is not set ++# CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set ++# CONFIG_DRM_NWL_MIPI_DSI is not set ++# CONFIG_DRM_NXP_PTN3460 is not set ++# CONFIG_DRM_PARADE_PS8622 is not set ++# CONFIG_DRM_PARADE_PS8640 is not set ++# CONFIG_DRM_SAMSUNG_DSIM is not set ++# CONFIG_DRM_SIL_SII8620 is not set ++# CONFIG_DRM_SII902X is not set ++# CONFIG_DRM_SII9234 is not set ++# CONFIG_DRM_SIMPLE_BRIDGE is not set ++# CONFIG_DRM_THINE_THC63LVD1024 is not set ++# CONFIG_DRM_TOSHIBA_TC358762 is not set ++# CONFIG_DRM_TOSHIBA_TC358764 is not set ++# CONFIG_DRM_TOSHIBA_TC358767 is not set ++# CONFIG_DRM_TOSHIBA_TC358768 is not set ++# CONFIG_DRM_TOSHIBA_TC358775 is not set ++# CONFIG_DRM_TI_DLPC3433 is not set ++# CONFIG_DRM_TI_TFP410 is not set ++# CONFIG_DRM_TI_SN65DSI83 is not set ++# CONFIG_DRM_TI_SN65DSI86 is not set ++# CONFIG_DRM_TI_TPD12S015 is not set ++# CONFIG_DRM_ANALOGIX_ANX6345 is not set ++# CONFIG_DRM_ANALOGIX_ANX78XX is not set ++# CONFIG_DRM_ANALOGIX_ANX7625 is not set ++# CONFIG_DRM_I2C_ADV7511 is not set ++# CONFIG_DRM_CDNS_DSI is not set ++# CONFIG_DRM_CDNS_MHDP8546 is not set ++# CONFIG_DRM_IMX8MP_DW_HDMI_BRIDGE is not set ++# CONFIG_DRM_IMX8MP_HDMI_PVI is not set ++# CONFIG_DRM_IMX8QM_LDB is not set ++# CONFIG_DRM_IMX8QXP_LDB is not set ++# CONFIG_DRM_IMX8QXP_PIXEL_COMBINER is not set ++# CONFIG_DRM_IMX8QXP_PIXEL_LINK is not set ++# CONFIG_DRM_IMX8QXP_PIXEL_LINK_TO_DPI is not set ++# CONFIG_DRM_IMX93_MIPI_DSI is not set ++# end of Display Interface Bridges ++ ++# CONFIG_DRM_IMX_DCSS is not set ++# CONFIG_DRM_IMX_LCDC is not set ++# CONFIG_DRM_V3D is not set ++# CONFIG_DRM_VC4 is not set ++# CONFIG_DRM_ETNAVIV is not set ++# CONFIG_DRM_HISI_HIBMC is not set ++# CONFIG_DRM_HISI_KIRIN is not set ++# CONFIG_DRM_LOGICVC is not set ++# CONFIG_DRM_MXSFB is not set ++# CONFIG_DRM_IMX_LCDIF is not set ++# CONFIG_DRM_MESON is not set ++# CONFIG_DRM_ARCPGU is not set ++# CONFIG_DRM_BOCHS is not set ++# CONFIG_DRM_CIRRUS_QEMU is not set ++# CONFIG_DRM_GM12U320 is not set ++# CONFIG_DRM_PANEL_MIPI_DBI is not set ++# CONFIG_DRM_SIMPLEDRM is not set ++# CONFIG_TINYDRM_HX8357D is not set ++# CONFIG_TINYDRM_ILI9163 is not set ++# CONFIG_TINYDRM_ILI9225 is not set ++# CONFIG_TINYDRM_ILI9341 is not set ++# CONFIG_TINYDRM_ILI9486 is not set ++# CONFIG_TINYDRM_MI0283QT is not set ++# CONFIG_TINYDRM_REPAPER is not set ++# CONFIG_TINYDRM_ST7586 is not set ++# CONFIG_TINYDRM_ST7735R is not set ++CONFIG_DRM_PL111=y ++# CONFIG_DRM_XEN_FRONTEND is not set ++# CONFIG_DRM_LIMA is not set ++# CONFIG_DRM_PANFROST is not set ++# CONFIG_DRM_PANTHOR is not set ++# CONFIG_DRM_TIDSS is not set ++# CONFIG_DRM_GUD is not set ++# CONFIG_DRM_SSD130X is not set ++# CONFIG_DRM_SPRD is not set ++# CONFIG_DRM_POWERVR is not set ++CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y ++ ++# ++# Frame buffer Devices ++# ++CONFIG_FB=y ++# CONFIG_FB_CIRRUS is not set ++# CONFIG_FB_PM2 is not set ++# CONFIG_FB_IMX is not set ++# CONFIG_FB_CYBER2000 is not set ++# CONFIG_FB_ASILIANT is not set ++# CONFIG_FB_IMSTT is not set ++CONFIG_FB_EFI=y ++# CONFIG_FB_OPENCORES is not set ++# CONFIG_FB_S1D13XXX is not set ++# CONFIG_FB_NVIDIA is not set ++# CONFIG_FB_RIVA is not set ++# CONFIG_FB_I740 is not set ++# CONFIG_FB_MATROX is not set ++# CONFIG_FB_RADEON is not set ++# CONFIG_FB_ATY128 is not set ++# CONFIG_FB_ATY is not set ++# CONFIG_FB_S3 is not set ++# CONFIG_FB_SAVAGE is not set ++# CONFIG_FB_SIS is not set ++# CONFIG_FB_NEOMAGIC is not set ++# CONFIG_FB_KYRO is not set ++# CONFIG_FB_3DFX is not set ++# CONFIG_FB_VOODOO1 is not set ++# CONFIG_FB_VT8623 is not set ++# CONFIG_FB_TRIDENT is not set ++# CONFIG_FB_ARK is not set ++# CONFIG_FB_PM3 is not set ++# CONFIG_FB_CARMINE is not set ++# CONFIG_FB_SMSCUFX is not set ++# CONFIG_FB_UDL is not set ++# CONFIG_FB_IBM_GXT4500 is not set ++# CONFIG_FB_XILINX is not set ++# CONFIG_FB_VIRTUAL is not set ++CONFIG_XEN_FBDEV_FRONTEND=y ++# CONFIG_FB_METRONOME is not set ++# CONFIG_FB_MB862XX is not set ++# CONFIG_FB_SIMPLE is not set ++# CONFIG_FB_SSD1307 is not set ++# CONFIG_FB_SM712 is not set ++CONFIG_FB_CORE=y ++CONFIG_FB_NOTIFY=y ++# CONFIG_FIRMWARE_EDID is not set ++CONFIG_FB_DEVICE=y ++CONFIG_FB_CFB_FILLRECT=y ++CONFIG_FB_CFB_COPYAREA=y ++CONFIG_FB_CFB_IMAGEBLIT=y ++CONFIG_FB_SYS_FILLRECT=y ++CONFIG_FB_SYS_COPYAREA=y ++CONFIG_FB_SYS_IMAGEBLIT=y ++# CONFIG_FB_FOREIGN_ENDIAN is not set ++CONFIG_FB_SYSMEM_FOPS=y ++CONFIG_FB_DEFERRED_IO=y ++CONFIG_FB_IOMEM_FOPS=y ++CONFIG_FB_IOMEM_HELPERS=y ++CONFIG_FB_SYSMEM_HELPERS=y ++CONFIG_FB_SYSMEM_HELPERS_DEFERRED=y ++CONFIG_FB_MODE_HELPERS=y ++# CONFIG_FB_TILEBLITTING is not set ++# end of Frame buffer Devices ++ ++# ++# Backlight & LCD device support ++# ++# CONFIG_LCD_CLASS_DEVICE is not set ++CONFIG_BACKLIGHT_CLASS_DEVICE=y ++# end of Backlight & LCD device support ++ ++CONFIG_HDMI=y ++ ++# ++# Console display driver support ++# ++CONFIG_DUMMY_CONSOLE=y ++CONFIG_DUMMY_CONSOLE_COLUMNS=80 ++CONFIG_DUMMY_CONSOLE_ROWS=25 ++CONFIG_FRAMEBUFFER_CONSOLE=y ++# CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION is not set ++CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y ++# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set ++# CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set ++# end of Console display driver support ++ ++CONFIG_LOGO=y ++# CONFIG_LOGO_LINUX_MONO is not set ++# CONFIG_LOGO_LINUX_VGA16 is not set ++CONFIG_LOGO_LINUX_CLUT224=y ++# end of Graphics support ++ ++# CONFIG_DRM_ACCEL is not set ++CONFIG_SOUND=y ++CONFIG_SND=y ++CONFIG_SND_TIMER=y ++CONFIG_SND_PCM=y ++CONFIG_SND_DMAENGINE_PCM=y ++CONFIG_SND_JACK=y ++CONFIG_SND_JACK_INPUT_DEV=y ++# CONFIG_SND_OSSEMUL is not set ++CONFIG_SND_PCM_TIMER=y ++# CONFIG_SND_HRTIMER is not set ++CONFIG_SND_DYNAMIC_MINORS=y ++CONFIG_SND_MAX_CARDS=32 ++CONFIG_SND_SUPPORT_OLD_API=y ++CONFIG_SND_PROC_FS=y ++CONFIG_SND_VERBOSE_PROCFS=y ++CONFIG_SND_CTL_FAST_LOOKUP=y ++# CONFIG_SND_DEBUG is not set ++# CONFIG_SND_CTL_INPUT_VALIDATION is not set ++# CONFIG_SND_UTIMER is not set ++# CONFIG_SND_SEQUENCER is not set ++CONFIG_SND_DRIVERS=y ++# CONFIG_SND_DUMMY is not set ++# CONFIG_SND_ALOOP is not set ++# CONFIG_SND_PCMTEST is not set ++# CONFIG_SND_MTPAV is not set ++# CONFIG_SND_SERIAL_U16550 is not set ++# CONFIG_SND_SERIAL_GENERIC is not set ++# CONFIG_SND_MPU401 is not set ++CONFIG_SND_PCI=y ++# CONFIG_SND_AD1889 is not set ++# CONFIG_SND_ALS300 is not set ++# CONFIG_SND_ALI5451 is not set ++# CONFIG_SND_ATIIXP is not set ++# CONFIG_SND_ATIIXP_MODEM is not set ++# CONFIG_SND_AU8810 is not set ++# CONFIG_SND_AU8820 is not set ++# CONFIG_SND_AU8830 is not set ++# CONFIG_SND_AW2 is not set ++# CONFIG_SND_AZT3328 is not set ++# CONFIG_SND_BT87X is not set ++# CONFIG_SND_CA0106 is not set ++# CONFIG_SND_CMIPCI is not set ++# CONFIG_SND_OXYGEN is not set ++# CONFIG_SND_CS4281 is not set ++# CONFIG_SND_CS46XX is not set ++# CONFIG_SND_CTXFI is not set ++# CONFIG_SND_DARLA20 is not set ++# CONFIG_SND_GINA20 is not set ++# CONFIG_SND_LAYLA20 is not set ++# CONFIG_SND_DARLA24 is not set ++# CONFIG_SND_GINA24 is not set ++# CONFIG_SND_LAYLA24 is not set ++# CONFIG_SND_MONA is not set ++# CONFIG_SND_MIA is not set ++# CONFIG_SND_ECHO3G is not set ++# CONFIG_SND_INDIGO is not set ++# CONFIG_SND_INDIGOIO is not set ++# CONFIG_SND_INDIGODJ is not set ++# CONFIG_SND_INDIGOIOX is not set ++# CONFIG_SND_INDIGODJX is not set ++# CONFIG_SND_EMU10K1 is not set ++# CONFIG_SND_EMU10K1X is not set ++# CONFIG_SND_ENS1370 is not set ++# CONFIG_SND_ENS1371 is not set ++# CONFIG_SND_ES1938 is not set ++# CONFIG_SND_ES1968 is not set ++# CONFIG_SND_FM801 is not set ++# CONFIG_SND_HDSP is not set ++# CONFIG_SND_HDSPM is not set ++# CONFIG_SND_ICE1712 is not set ++# CONFIG_SND_ICE1724 is not set ++# CONFIG_SND_INTEL8X0 is not set ++# CONFIG_SND_INTEL8X0M is not set ++# CONFIG_SND_KORG1212 is not set ++# CONFIG_SND_LOLA is not set ++# CONFIG_SND_LX6464ES is not set ++# CONFIG_SND_MAESTRO3 is not set ++# CONFIG_SND_MIXART is not set ++# CONFIG_SND_NM256 is not set ++# CONFIG_SND_PCXHR is not set ++# CONFIG_SND_RIPTIDE is not set ++# CONFIG_SND_RME32 is not set ++# CONFIG_SND_RME96 is not set ++# CONFIG_SND_RME9652 is not set ++# CONFIG_SND_SE6X is not set ++# CONFIG_SND_SONICVIBES is not set ++# CONFIG_SND_TRIDENT is not set ++# CONFIG_SND_VIA82XX is not set ++# CONFIG_SND_VIA82XX_MODEM is not set ++# CONFIG_SND_VIRTUOSO is not set ++# CONFIG_SND_VX222 is not set ++# CONFIG_SND_YMFPCI is not set ++ ++# ++# HD-Audio ++# ++# CONFIG_SND_HDA_INTEL is not set ++# CONFIG_SND_HDA_TEGRA is not set ++# end of HD-Audio ++ ++CONFIG_SND_HDA_PREALLOC_SIZE=64 ++CONFIG_SND_SPI=y ++CONFIG_SND_USB=y ++# CONFIG_SND_USB_AUDIO is not set ++# CONFIG_SND_USB_UA101 is not set ++# CONFIG_SND_USB_CAIAQ is not set ++# CONFIG_SND_USB_6FIRE is not set ++# CONFIG_SND_USB_HIFACE is not set ++# CONFIG_SND_BCD2000 is not set ++# CONFIG_SND_USB_POD is not set ++# CONFIG_SND_USB_PODHD is not set ++# CONFIG_SND_USB_TONEPORT is not set ++# CONFIG_SND_USB_VARIAX is not set ++CONFIG_SND_SOC=y ++CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y ++# CONFIG_SND_SOC_ADI is not set ++# CONFIG_SND_SOC_AMD_ACP is not set ++# CONFIG_SND_AMD_ACP_CONFIG is not set ++CONFIG_SND_SOC_APPLE_MCA=y ++# CONFIG_SND_ATMEL_SOC is not set ++# CONFIG_SND_BCM2835_SOC_I2S is not set ++# CONFIG_SND_BCM63XX_I2S_WHISTLER is not set ++# CONFIG_SND_DESIGNWARE_I2S is not set ++ ++# ++# SoC Audio for Freescale CPUs ++# ++ ++# ++# Common SoC Audio options for Freescale CPUs: ++# ++# CONFIG_SND_SOC_FSL_ASRC is not set ++# CONFIG_SND_SOC_FSL_SAI is not set ++# CONFIG_SND_SOC_FSL_AUDMIX is not set ++# CONFIG_SND_SOC_FSL_SSI is not set ++# CONFIG_SND_SOC_FSL_SPDIF is not set ++# CONFIG_SND_SOC_FSL_ESAI is not set ++# CONFIG_SND_SOC_FSL_MICFIL is not set ++# CONFIG_SND_SOC_FSL_XCVR is not set ++# CONFIG_SND_SOC_FSL_AUD2HTX is not set ++# CONFIG_SND_SOC_FSL_RPMSG is not set ++# CONFIG_SND_SOC_IMX_AUDMUX is not set ++# CONFIG_SND_IMX_SOC is not set ++# end of SoC Audio for Freescale CPUs ++ ++# CONFIG_SND_SOC_CHV3_I2S is not set ++# CONFIG_SND_I2S_HI6210_I2S is not set ++# CONFIG_SND_KIRKWOOD_SOC is not set ++# CONFIG_SND_SOC_IMG is not set ++# CONFIG_SND_SOC_INTEL_KEEMBAY is not set ++# CONFIG_SND_SOC_MT2701 is not set ++# CONFIG_SND_SOC_MT6797 is not set ++# CONFIG_SND_SOC_MT7986 is not set ++# CONFIG_SND_SOC_MT8173 is not set ++# CONFIG_SND_SOC_MT8183 is not set ++# CONFIG_SND_SOC_MT8186 is not set ++# CONFIG_SND_SOC_MTK_BTCVSD is not set ++# CONFIG_SND_SOC_MT8188 is not set ++# CONFIG_SND_SOC_MT8192 is not set ++# CONFIG_SND_SOC_MT8195 is not set ++# CONFIG_SND_SOC_MT8365 is not set ++ ++# ++# ASoC support for Amlogic platforms ++# ++# CONFIG_SND_MESON_AIU is not set ++# CONFIG_SND_MESON_AXG_FRDDR is not set ++# CONFIG_SND_MESON_AXG_TODDR is not set ++# CONFIG_SND_MESON_AXG_TDMIN is not set ++# CONFIG_SND_MESON_AXG_TDMOUT is not set ++# CONFIG_SND_MESON_AXG_SOUND_CARD is not set ++# CONFIG_SND_MESON_AXG_SPDIFOUT is not set ++# CONFIG_SND_MESON_AXG_SPDIFIN is not set ++# CONFIG_SND_MESON_AXG_PDM is not set ++# CONFIG_SND_MESON_GX_SOUND_CARD is not set ++# CONFIG_SND_MESON_G12A_TOACODEC is not set ++# CONFIG_SND_MESON_G12A_TOHDMITX is not set ++# CONFIG_SND_SOC_MESON_T9015 is not set ++# end of ASoC support for Amlogic platforms ++ ++# CONFIG_SND_SOC_QCOM is not set ++# CONFIG_SND_SOC_ROCKCHIP is not set ++CONFIG_SND_SOC_SAMSUNG=y ++# CONFIG_SND_SAMSUNG_PCM is not set ++# CONFIG_SND_SAMSUNG_SPDIF is not set ++# CONFIG_SND_SAMSUNG_I2S is not set ++# CONFIG_SND_SOC_SAMSUNG_SMDK_WM8994 is not set ++# CONFIG_SND_SOC_SAMSUNG_SMDK_SPDIF is not set ++# CONFIG_SND_SOC_SMDK_WM8994_PCM is not set ++# CONFIG_SND_SOC_SNOW is not set ++# CONFIG_SND_SOC_ODROID is not set ++# CONFIG_SND_SOC_ARNDALE is not set ++# CONFIG_SND_SOC_SAMSUNG_MIDAS_WM1811 is not set ++ ++# ++# SoC Audio support for Renesas SoCs ++# ++# CONFIG_SND_SOC_SH4_FSI is not set ++# CONFIG_SND_SOC_RCAR is not set ++# CONFIG_SND_SOC_RZ is not set ++# end of SoC Audio support for Renesas SoCs ++ ++# CONFIG_SND_SOC_SOF_TOPLEVEL is not set ++# CONFIG_SND_SOC_SPRD is not set ++ ++# ++# STMicroelectronics STM32 SOC audio support ++# ++# CONFIG_SND_SOC_STM32_SAI is not set ++# CONFIG_SND_SOC_STM32_I2S is not set ++# CONFIG_SND_SOC_STM32_SPDIFRX is not set ++# end of STMicroelectronics STM32 SOC audio support ++ ++# ++# Allwinner SoC Audio support ++# ++# CONFIG_SND_SUN4I_CODEC is not set ++# CONFIG_SND_SUN8I_CODEC is not set ++# CONFIG_SND_SUN8I_CODEC_ANALOG is not set ++# CONFIG_SND_SUN50I_CODEC_ANALOG is not set ++# CONFIG_SND_SUN4I_I2S is not set ++# CONFIG_SND_SUN4I_SPDIF is not set ++# CONFIG_SND_SUN50I_DMIC is not set ++# end of Allwinner SoC Audio support ++ ++# CONFIG_SND_SOC_TEGRA is not set ++ ++# ++# Audio support for Texas Instruments SoCs ++# ++ ++# ++# Texas Instruments DAI support for: ++# ++# CONFIG_SND_SOC_DAVINCI_MCASP is not set ++ ++# ++# Audio support for boards with Texas Instruments SoCs ++# ++# CONFIG_SND_SOC_J721E_EVM is not set ++# end of Audio support for Texas Instruments SoCs ++ ++# CONFIG_SND_SOC_UNIPHIER is not set ++# CONFIG_SND_SOC_XILINX_I2S is not set ++# CONFIG_SND_SOC_XILINX_AUDIO_FORMATTER is not set ++# CONFIG_SND_SOC_XILINX_SPDIF is not set ++# CONFIG_SND_SOC_XTFPGA_I2S is not set ++CONFIG_SND_SOC_I2C_AND_SPI=y ++ ++# ++# CODEC drivers ++# ++# CONFIG_SND_SOC_AC97_CODEC is not set ++# CONFIG_SND_SOC_ADAU1372_I2C is not set ++# CONFIG_SND_SOC_ADAU1372_SPI is not set ++# CONFIG_SND_SOC_ADAU1701 is not set ++# CONFIG_SND_SOC_ADAU1761_I2C is not set ++# CONFIG_SND_SOC_ADAU1761_SPI is not set ++# CONFIG_SND_SOC_ADAU7002 is not set ++# CONFIG_SND_SOC_ADAU7118_HW is not set ++# CONFIG_SND_SOC_ADAU7118_I2C is not set ++# CONFIG_SND_SOC_AK4104 is not set ++# CONFIG_SND_SOC_AK4118 is not set ++# CONFIG_SND_SOC_AK4375 is not set ++# CONFIG_SND_SOC_AK4458 is not set ++# CONFIG_SND_SOC_AK4554 is not set ++# CONFIG_SND_SOC_AK4613 is not set ++# CONFIG_SND_SOC_AK4619 is not set ++# CONFIG_SND_SOC_AK4642 is not set ++# CONFIG_SND_SOC_AK5386 is not set ++# CONFIG_SND_SOC_AK5558 is not set ++# CONFIG_SND_SOC_ALC5623 is not set ++# CONFIG_SND_SOC_AUDIO_IIO_AUX is not set ++# CONFIG_SND_SOC_AW8738 is not set ++# CONFIG_SND_SOC_AW88395 is not set ++# CONFIG_SND_SOC_AW88261 is not set ++# CONFIG_SND_SOC_AW87390 is not set ++# CONFIG_SND_SOC_AW88399 is not set ++# CONFIG_SND_SOC_BD28623 is not set ++# CONFIG_SND_SOC_BT_SCO is not set ++# CONFIG_SND_SOC_CHV3_CODEC is not set ++# CONFIG_SND_SOC_CROS_EC_CODEC is not set ++# CONFIG_SND_SOC_CS35L32 is not set ++# CONFIG_SND_SOC_CS35L33 is not set ++# CONFIG_SND_SOC_CS35L34 is not set ++# CONFIG_SND_SOC_CS35L35 is not set ++# CONFIG_SND_SOC_CS35L36 is not set ++# CONFIG_SND_SOC_CS35L41_SPI is not set ++# CONFIG_SND_SOC_CS35L41_I2C is not set ++# CONFIG_SND_SOC_CS35L45_SPI is not set ++# CONFIG_SND_SOC_CS35L45_I2C is not set ++# CONFIG_SND_SOC_CS35L56_I2C is not set ++# CONFIG_SND_SOC_CS35L56_SPI is not set ++# CONFIG_SND_SOC_CS42L42 is not set ++# CONFIG_SND_SOC_CS42L51_I2C is not set ++# CONFIG_SND_SOC_CS42L52 is not set ++# CONFIG_SND_SOC_CS42L56 is not set ++# CONFIG_SND_SOC_CS42L73 is not set ++# CONFIG_SND_SOC_CS42L83 is not set ++# CONFIG_SND_SOC_CS4234 is not set ++# CONFIG_SND_SOC_CS4265 is not set ++# CONFIG_SND_SOC_CS4270 is not set ++# CONFIG_SND_SOC_CS4271_I2C is not set ++# CONFIG_SND_SOC_CS4271_SPI is not set ++# CONFIG_SND_SOC_CS42XX8_I2C is not set ++# CONFIG_SND_SOC_CS43130 is not set ++# CONFIG_SND_SOC_CS4341 is not set ++# CONFIG_SND_SOC_CS4349 is not set ++# CONFIG_SND_SOC_CS53L30 is not set ++# CONFIG_SND_SOC_CS530X_I2C is not set ++# CONFIG_SND_SOC_CX2072X is not set ++# CONFIG_SND_SOC_DA7213 is not set ++# CONFIG_SND_SOC_DMIC is not set ++# CONFIG_SND_SOC_ES7134 is not set ++# CONFIG_SND_SOC_ES7241 is not set ++# CONFIG_SND_SOC_ES8311 is not set ++# CONFIG_SND_SOC_ES8316 is not set ++# CONFIG_SND_SOC_ES8326 is not set ++# CONFIG_SND_SOC_ES8328_I2C is not set ++# CONFIG_SND_SOC_ES8328_SPI is not set ++# CONFIG_SND_SOC_GTM601 is not set ++# CONFIG_SND_SOC_HDA is not set ++# CONFIG_SND_SOC_ICS43432 is not set ++# CONFIG_SND_SOC_IDT821034 is not set ++# CONFIG_SND_SOC_INNO_RK3036 is not set ++# CONFIG_SND_SOC_MAX98088 is not set ++# CONFIG_SND_SOC_MAX98090 is not set ++# CONFIG_SND_SOC_MAX98357A is not set ++# CONFIG_SND_SOC_MAX98504 is not set ++# CONFIG_SND_SOC_MAX9867 is not set ++# CONFIG_SND_SOC_MAX98927 is not set ++# CONFIG_SND_SOC_MAX98520 is not set ++# CONFIG_SND_SOC_MAX98373_I2C is not set ++# CONFIG_SND_SOC_MAX98388 is not set ++# CONFIG_SND_SOC_MAX98390 is not set ++# CONFIG_SND_SOC_MAX98396 is not set ++# CONFIG_SND_SOC_MAX9860 is not set ++# CONFIG_SND_SOC_MSM8916_WCD_ANALOG is not set ++# CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set ++# CONFIG_SND_SOC_PCM1681 is not set ++# CONFIG_SND_SOC_PCM1789_I2C is not set ++# CONFIG_SND_SOC_PCM179X_I2C is not set ++# CONFIG_SND_SOC_PCM179X_SPI is not set ++# CONFIG_SND_SOC_PCM186X_I2C is not set ++# CONFIG_SND_SOC_PCM186X_SPI is not set ++# CONFIG_SND_SOC_PCM3060_I2C is not set ++# CONFIG_SND_SOC_PCM3060_SPI is not set ++# CONFIG_SND_SOC_PCM3168A_I2C is not set ++# CONFIG_SND_SOC_PCM3168A_SPI is not set ++# CONFIG_SND_SOC_PCM5102A is not set ++# CONFIG_SND_SOC_PCM512x_I2C is not set ++# CONFIG_SND_SOC_PCM512x_SPI is not set ++# CONFIG_SND_SOC_PCM6240 is not set ++# CONFIG_SND_SOC_PEB2466 is not set ++# CONFIG_SND_SOC_RK3308 is not set ++# CONFIG_SND_SOC_RK3328 is not set ++# CONFIG_SND_SOC_RK817 is not set ++# CONFIG_SND_SOC_RT5616 is not set ++# CONFIG_SND_SOC_RT5631 is not set ++# CONFIG_SND_SOC_RT5640 is not set ++# CONFIG_SND_SOC_RT5659 is not set ++# CONFIG_SND_SOC_RT9120 is not set ++# CONFIG_SND_SOC_RTQ9128 is not set ++# CONFIG_SND_SOC_SGTL5000 is not set ++# CONFIG_SND_SOC_SIMPLE_AMPLIFIER is not set ++# CONFIG_SND_SOC_SIMPLE_MUX is not set ++# CONFIG_SND_SOC_SMA1303 is not set ++# CONFIG_SND_SOC_SPDIF is not set ++# CONFIG_SND_SOC_SRC4XXX_I2C is not set ++# CONFIG_SND_SOC_SSM2305 is not set ++# CONFIG_SND_SOC_SSM2518 is not set ++# CONFIG_SND_SOC_SSM2602_SPI is not set ++# CONFIG_SND_SOC_SSM2602_I2C is not set ++# CONFIG_SND_SOC_SSM3515 is not set ++# CONFIG_SND_SOC_SSM4567 is not set ++# CONFIG_SND_SOC_STA32X is not set ++# CONFIG_SND_SOC_STA350 is not set ++# CONFIG_SND_SOC_STI_SAS is not set ++# CONFIG_SND_SOC_TAS2552 is not set ++# CONFIG_SND_SOC_TAS2562 is not set ++# CONFIG_SND_SOC_TAS2764 is not set ++# CONFIG_SND_SOC_TAS2770 is not set ++# CONFIG_SND_SOC_TAS2780 is not set ++# CONFIG_SND_SOC_TAS2781_I2C is not set ++# CONFIG_SND_SOC_TAS5086 is not set ++# CONFIG_SND_SOC_TAS571X is not set ++# CONFIG_SND_SOC_TAS5720 is not set ++# CONFIG_SND_SOC_TAS5805M is not set ++# CONFIG_SND_SOC_TAS6424 is not set ++# CONFIG_SND_SOC_TDA7419 is not set ++# CONFIG_SND_SOC_TFA9879 is not set ++# CONFIG_SND_SOC_TFA989X is not set ++# CONFIG_SND_SOC_TLV320ADC3XXX is not set ++# CONFIG_SND_SOC_TLV320AIC23_I2C is not set ++# CONFIG_SND_SOC_TLV320AIC23_SPI is not set ++# CONFIG_SND_SOC_TLV320AIC31XX is not set ++# CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set ++# CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set ++# CONFIG_SND_SOC_TLV320AIC3X_I2C is not set ++# CONFIG_SND_SOC_TLV320AIC3X_SPI is not set ++# CONFIG_SND_SOC_TLV320ADCX140 is not set ++# CONFIG_SND_SOC_TS3A227E is not set ++# CONFIG_SND_SOC_TSCS42XX is not set ++# CONFIG_SND_SOC_TSCS454 is not set ++# CONFIG_SND_SOC_UDA1334 is not set ++# CONFIG_SND_SOC_WM8510 is not set ++# CONFIG_SND_SOC_WM8523 is not set ++# CONFIG_SND_SOC_WM8524 is not set ++# CONFIG_SND_SOC_WM8580 is not set ++# CONFIG_SND_SOC_WM8711 is not set ++# CONFIG_SND_SOC_WM8728 is not set ++# CONFIG_SND_SOC_WM8731_I2C is not set ++# CONFIG_SND_SOC_WM8731_SPI is not set ++# CONFIG_SND_SOC_WM8737 is not set ++# CONFIG_SND_SOC_WM8741 is not set ++# CONFIG_SND_SOC_WM8750 is not set ++# CONFIG_SND_SOC_WM8753 is not set ++# CONFIG_SND_SOC_WM8770 is not set ++# CONFIG_SND_SOC_WM8776 is not set ++# CONFIG_SND_SOC_WM8782 is not set ++# CONFIG_SND_SOC_WM8804_I2C is not set ++# CONFIG_SND_SOC_WM8804_SPI is not set ++# CONFIG_SND_SOC_WM8903 is not set ++# CONFIG_SND_SOC_WM8904 is not set ++# CONFIG_SND_SOC_WM8940 is not set ++# CONFIG_SND_SOC_WM8960 is not set ++# CONFIG_SND_SOC_WM8961 is not set ++# CONFIG_SND_SOC_WM8962 is not set ++# CONFIG_SND_SOC_WM8974 is not set ++# CONFIG_SND_SOC_WM8978 is not set ++# CONFIG_SND_SOC_WM8985 is not set ++# CONFIG_SND_SOC_ZL38060 is not set ++# CONFIG_SND_SOC_MAX9759 is not set ++# CONFIG_SND_SOC_MT6351 is not set ++# CONFIG_SND_SOC_MT6357 is not set ++# CONFIG_SND_SOC_MT6358 is not set ++# CONFIG_SND_SOC_MT6359 is not set ++# CONFIG_SND_SOC_MT6359_ACCDET is not set ++# CONFIG_SND_SOC_MT6660 is not set ++# CONFIG_SND_SOC_NAU8315 is not set ++# CONFIG_SND_SOC_NAU8540 is not set ++# CONFIG_SND_SOC_NAU8810 is not set ++# CONFIG_SND_SOC_NAU8821 is not set ++# CONFIG_SND_SOC_NAU8822 is not set ++# CONFIG_SND_SOC_NAU8824 is not set ++# CONFIG_SND_SOC_TPA6130A2 is not set ++# CONFIG_SND_SOC_LPASS_WSA_MACRO is not set ++# CONFIG_SND_SOC_LPASS_VA_MACRO is not set ++# CONFIG_SND_SOC_LPASS_RX_MACRO is not set ++# CONFIG_SND_SOC_LPASS_TX_MACRO is not set ++# end of CODEC drivers ++ ++# CONFIG_SND_SIMPLE_CARD is not set ++# CONFIG_SND_AUDIO_GRAPH_CARD is not set ++# CONFIG_SND_AUDIO_GRAPH_CARD2 is not set ++# CONFIG_SND_TEST_COMPONENT is not set ++# CONFIG_SND_XEN_FRONTEND is not set ++# CONFIG_SND_VIRTIO is not set ++CONFIG_HID_SUPPORT=y ++CONFIG_HID=y ++# CONFIG_HID_BATTERY_STRENGTH is not set ++# CONFIG_HIDRAW is not set ++# CONFIG_UHID is not set ++CONFIG_HID_GENERIC=y ++ ++# ++# Special HID drivers ++# ++CONFIG_HID_A4TECH=y ++# CONFIG_HID_ACCUTOUCH is not set ++# CONFIG_HID_ACRUX is not set ++CONFIG_HID_APPLE=y ++# CONFIG_HID_APPLEIR is not set ++# CONFIG_HID_ASUS is not set ++# CONFIG_HID_AUREAL is not set ++CONFIG_HID_BELKIN=y ++# CONFIG_HID_BETOP_FF is not set ++# CONFIG_HID_BIGBEN_FF is not set ++CONFIG_HID_CHERRY=y ++CONFIG_HID_CHICONY=y ++# CONFIG_HID_CORSAIR is not set ++# CONFIG_HID_COUGAR is not set ++# CONFIG_HID_MACALLY is not set ++# CONFIG_HID_PRODIKEYS is not set ++# CONFIG_HID_CMEDIA is not set ++# CONFIG_HID_CREATIVE_SB0540 is not set ++CONFIG_HID_CYPRESS=y ++# CONFIG_HID_DRAGONRISE is not set ++# CONFIG_HID_EMS_FF is not set ++# CONFIG_HID_ELAN is not set ++# CONFIG_HID_ELECOM is not set ++# CONFIG_HID_ELO is not set ++# CONFIG_HID_EVISION is not set ++CONFIG_HID_EZKEY=y ++# CONFIG_HID_GEMBIRD is not set ++# CONFIG_HID_GFRM is not set ++# CONFIG_HID_GLORIOUS is not set ++# CONFIG_HID_HOLTEK is not set ++# CONFIG_HID_GOODIX_SPI is not set ++# CONFIG_HID_GOOGLE_HAMMER is not set ++# CONFIG_HID_GOOGLE_STADIA_FF is not set ++# CONFIG_HID_VIVALDI is not set ++# CONFIG_HID_GT683R is not set ++# CONFIG_HID_KEYTOUCH is not set ++# CONFIG_HID_KYE is not set ++# CONFIG_HID_UCLOGIC is not set ++# CONFIG_HID_WALTOP is not set ++# CONFIG_HID_VIEWSONIC is not set ++# CONFIG_HID_VRC2 is not set ++# CONFIG_HID_XIAOMI is not set ++# CONFIG_HID_GYRATION is not set ++# CONFIG_HID_ICADE is not set ++CONFIG_HID_ITE=y ++# CONFIG_HID_JABRA is not set ++# CONFIG_HID_TWINHAN is not set ++CONFIG_HID_KENSINGTON=y ++# CONFIG_HID_LCPOWER is not set ++# CONFIG_HID_LED is not set ++# CONFIG_HID_LENOVO is not set ++# CONFIG_HID_LETSKETCH is not set ++CONFIG_HID_LOGITECH=y ++# CONFIG_HID_LOGITECH_HIDPP is not set ++# CONFIG_LOGITECH_FF is not set ++# CONFIG_LOGIRUMBLEPAD2_FF is not set ++# CONFIG_LOGIG940_FF is not set ++# CONFIG_LOGIWHEELS_FF is not set ++# CONFIG_HID_MAGICMOUSE is not set ++# CONFIG_HID_MALTRON is not set ++# CONFIG_HID_MAYFLASH is not set ++# CONFIG_HID_MEGAWORLD_FF is not set ++CONFIG_HID_REDRAGON=y ++CONFIG_HID_MICROSOFT=y ++CONFIG_HID_MONTEREY=y ++# CONFIG_HID_MULTITOUCH is not set ++# CONFIG_HID_NINTENDO is not set ++# CONFIG_HID_NTI is not set ++# CONFIG_HID_NTRIG is not set ++# CONFIG_HID_ORTEK is not set ++# CONFIG_HID_PANTHERLORD is not set ++# CONFIG_HID_PENMOUNT is not set ++# CONFIG_HID_PETALYNX is not set ++# CONFIG_HID_PICOLCD is not set ++# CONFIG_HID_PLANTRONICS is not set ++# CONFIG_HID_PXRC is not set ++# CONFIG_HID_RAZER is not set ++# CONFIG_HID_PRIMAX is not set ++# CONFIG_HID_RETRODE is not set ++# CONFIG_HID_ROCCAT is not set ++# CONFIG_HID_SAITEK is not set ++# CONFIG_HID_SAMSUNG is not set ++# CONFIG_HID_SEMITEK is not set ++# CONFIG_HID_SIGMAMICRO is not set ++# CONFIG_HID_SONY is not set ++# CONFIG_HID_SPEEDLINK is not set ++# CONFIG_HID_STEAM is not set ++# CONFIG_HID_STEELSERIES is not set ++# CONFIG_HID_SUNPLUS is not set ++# CONFIG_HID_RMI is not set ++# CONFIG_HID_GREENASIA is not set ++# CONFIG_HID_SMARTJOYPLUS is not set ++# CONFIG_HID_TIVO is not set ++# CONFIG_HID_TOPSEED is not set ++# CONFIG_HID_TOPRE is not set ++# CONFIG_HID_THINGM is not set ++# CONFIG_HID_THRUSTMASTER is not set ++# CONFIG_HID_UDRAW_PS3 is not set ++# CONFIG_HID_U2FZERO is not set ++# CONFIG_HID_WACOM is not set ++# CONFIG_HID_WIIMOTE is not set ++# CONFIG_HID_WINWING is not set ++# CONFIG_HID_XINMO is not set ++# CONFIG_HID_ZEROPLUS is not set ++# CONFIG_HID_ZYDACRON is not set ++# CONFIG_HID_SENSOR_HUB is not set ++# CONFIG_HID_ALPS is not set ++# CONFIG_HID_MCP2200 is not set ++# CONFIG_HID_MCP2221 is not set ++# end of Special HID drivers ++ ++# ++# HID-BPF support ++# ++# end of HID-BPF support ++ ++# ++# USB HID support ++# ++CONFIG_USB_HID=y ++# CONFIG_HID_PID is not set ++# CONFIG_USB_HIDDEV is not set ++# end of USB HID support ++ ++CONFIG_I2C_HID=y ++# CONFIG_I2C_HID_ACPI is not set ++# CONFIG_I2C_HID_OF is not set ++# CONFIG_I2C_HID_OF_ELAN is not set ++# CONFIG_I2C_HID_OF_GOODIX is not set ++CONFIG_USB_OHCI_LITTLE_ENDIAN=y ++CONFIG_USB_SUPPORT=y ++CONFIG_USB_COMMON=y ++# CONFIG_USB_LED_TRIG is not set ++CONFIG_USB_ULPI_BUS=y ++CONFIG_USB_CONN_GPIO=y ++CONFIG_USB_ARCH_HAS_HCD=y ++CONFIG_USB=y ++CONFIG_USB_PCI=y ++# CONFIG_USB_PCI_AMD is not set ++# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set ++ ++# ++# Miscellaneous USB options ++# ++CONFIG_USB_DEFAULT_PERSIST=y ++# CONFIG_USB_FEW_INIT_RETRIES is not set ++# CONFIG_USB_DYNAMIC_MINORS is not set ++CONFIG_USB_OTG=y ++# CONFIG_USB_OTG_PRODUCTLIST is not set ++# CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set ++# CONFIG_USB_OTG_FSM is not set ++# CONFIG_USB_LEDS_TRIGGER_USBPORT is not set ++CONFIG_USB_AUTOSUSPEND_DELAY=2 ++CONFIG_USB_DEFAULT_AUTHORIZATION_MODE=1 ++# CONFIG_USB_MON is not set ++ ++# ++# USB Host Controller Drivers ++# ++# CONFIG_USB_C67X00_HCD is not set ++CONFIG_USB_XHCI_HCD=y ++# CONFIG_USB_XHCI_DBGCAP is not set ++CONFIG_USB_XHCI_PCI=y ++# CONFIG_USB_XHCI_PCI_RENESAS is not set ++CONFIG_USB_XHCI_PLATFORM=y ++# CONFIG_USB_XHCI_HISTB is not set ++CONFIG_USB_XHCI_MTK=y ++# CONFIG_USB_XHCI_MVEBU is not set ++CONFIG_USB_XHCI_RCAR=y ++CONFIG_USB_XHCI_RZV2M=y ++CONFIG_USB_XHCI_TEGRA=y ++# CONFIG_USB_BRCMSTB is not set ++CONFIG_USB_EHCI_HCD=y ++CONFIG_USB_EHCI_ROOT_HUB_TT=y ++CONFIG_USB_EHCI_TT_NEWSCHED=y ++CONFIG_USB_EHCI_PCI=y ++# CONFIG_USB_EHCI_FSL is not set ++CONFIG_USB_EHCI_HCD_NPCM7XX=y ++CONFIG_USB_EHCI_HCD_ORION=y ++# CONFIG_USB_EHCI_TEGRA is not set ++CONFIG_USB_EHCI_EXYNOS=y ++CONFIG_USB_EHCI_HCD_PLATFORM=y ++# CONFIG_USB_OXU210HP_HCD is not set ++# CONFIG_USB_ISP116X_HCD is not set ++# CONFIG_USB_MAX3421_HCD is not set ++CONFIG_USB_OHCI_HCD=y ++CONFIG_USB_OHCI_HCD_PCI=y ++CONFIG_USB_OHCI_EXYNOS=y ++CONFIG_USB_OHCI_HCD_PLATFORM=y ++# CONFIG_USB_UHCI_HCD is not set ++# CONFIG_USB_SL811_HCD is not set ++# CONFIG_USB_R8A66597_HCD is not set ++# CONFIG_USB_HCD_TEST_MODE is not set ++# CONFIG_USB_XEN_HCD is not set ++# CONFIG_USB_RENESAS_USBHS is not set ++ ++# ++# USB Device Class drivers ++# ++# CONFIG_USB_ACM is not set ++# CONFIG_USB_PRINTER is not set ++# CONFIG_USB_WDM is not set ++# CONFIG_USB_TMC is not set ++ ++# ++# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may ++# ++ ++# ++# also be needed; see USB_STORAGE Help for more info ++# ++CONFIG_USB_STORAGE=y ++# CONFIG_USB_STORAGE_DEBUG is not set ++# CONFIG_USB_STORAGE_REALTEK is not set ++# CONFIG_USB_STORAGE_DATAFAB is not set ++# CONFIG_USB_STORAGE_FREECOM is not set ++# CONFIG_USB_STORAGE_ISD200 is not set ++# CONFIG_USB_STORAGE_USBAT is not set ++# CONFIG_USB_STORAGE_SDDR09 is not set ++# CONFIG_USB_STORAGE_SDDR55 is not set ++# CONFIG_USB_STORAGE_JUMPSHOT is not set ++# CONFIG_USB_STORAGE_ALAUDA is not set ++# CONFIG_USB_STORAGE_ONETOUCH is not set ++# CONFIG_USB_STORAGE_KARMA is not set ++# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set ++# CONFIG_USB_STORAGE_ENE_UB6250 is not set ++# CONFIG_USB_UAS is not set ++ ++# ++# USB Imaging devices ++# ++# CONFIG_USB_MDC800 is not set ++# CONFIG_USB_MICROTEK is not set ++# CONFIG_USBIP_CORE is not set ++ ++# ++# USB dual-mode controller drivers ++# ++# CONFIG_USB_CDNS_SUPPORT is not set ++CONFIG_USB_MTU3=y ++# CONFIG_USB_MTU3_HOST is not set ++# CONFIG_USB_MTU3_GADGET is not set ++CONFIG_USB_MTU3_DUAL_ROLE=y ++# CONFIG_USB_MTU3_DEBUG is not set ++CONFIG_USB_MUSB_HDRC=y ++# CONFIG_USB_MUSB_HOST is not set ++# CONFIG_USB_MUSB_GADGET is not set ++CONFIG_USB_MUSB_DUAL_ROLE=y ++ ++# ++# Platform Glue Layer ++# ++CONFIG_USB_MUSB_SUNXI=y ++# CONFIG_USB_MUSB_MEDIATEK is not set ++ ++# ++# MUSB DMA mode ++# ++# CONFIG_MUSB_PIO_ONLY is not set ++CONFIG_USB_DWC3=y ++# CONFIG_USB_DWC3_ULPI is not set ++# CONFIG_USB_DWC3_HOST is not set ++# CONFIG_USB_DWC3_GADGET is not set ++CONFIG_USB_DWC3_DUAL_ROLE=y ++ ++# ++# Platform Glue Driver Support ++# ++CONFIG_USB_DWC3_EXYNOS=y ++CONFIG_USB_DWC3_PCI=y ++CONFIG_USB_DWC3_HAPS=y ++CONFIG_USB_DWC3_KEYSTONE=y ++CONFIG_USB_DWC3_MESON_G12A=y ++CONFIG_USB_DWC3_OF_SIMPLE=y ++CONFIG_USB_DWC3_QCOM=y ++CONFIG_USB_DWC3_IMX8MP=y ++CONFIG_USB_DWC3_XILINX=y ++CONFIG_USB_DWC3_AM62=y ++CONFIG_USB_DWC3_RTK=y ++CONFIG_USB_DWC2=y ++# CONFIG_USB_DWC2_HOST is not set ++ ++# ++# Gadget/Dual-role mode requires USB Gadget support to be enabled ++# ++# CONFIG_USB_DWC2_PERIPHERAL is not set ++CONFIG_USB_DWC2_DUAL_ROLE=y ++# CONFIG_USB_DWC2_PCI is not set ++# CONFIG_USB_DWC2_DEBUG is not set ++# CONFIG_USB_DWC2_TRACK_MISSED_SOFS is not set ++CONFIG_USB_CHIPIDEA=y ++CONFIG_USB_CHIPIDEA_UDC=y ++CONFIG_USB_CHIPIDEA_HOST=y ++CONFIG_USB_CHIPIDEA_PCI=y ++CONFIG_USB_CHIPIDEA_MSM=y ++CONFIG_USB_CHIPIDEA_NPCM=y ++CONFIG_USB_CHIPIDEA_IMX=y ++CONFIG_USB_CHIPIDEA_GENERIC=y ++CONFIG_USB_CHIPIDEA_TEGRA=y ++CONFIG_USB_ISP1760=y ++CONFIG_USB_ISP1760_HCD=y ++CONFIG_USB_ISP1761_UDC=y ++# CONFIG_USB_ISP1760_HOST_ROLE is not set ++# CONFIG_USB_ISP1760_GADGET_ROLE is not set ++CONFIG_USB_ISP1760_DUAL_ROLE=y ++ ++# ++# USB port drivers ++# ++# CONFIG_USB_SERIAL is not set ++ ++# ++# USB Miscellaneous drivers ++# ++# CONFIG_USB_EMI62 is not set ++# CONFIG_USB_EMI26 is not set ++# CONFIG_USB_ADUTUX is not set ++# CONFIG_USB_SEVSEG is not set ++# CONFIG_USB_LEGOTOWER is not set ++# CONFIG_USB_LCD is not set ++# CONFIG_USB_CYPRESS_CY7C63 is not set ++# CONFIG_USB_CYTHERM is not set ++# CONFIG_USB_IDMOUSE is not set ++# CONFIG_USB_APPLEDISPLAY is not set ++# CONFIG_USB_QCOM_EUD is not set ++# CONFIG_APPLE_MFI_FASTCHARGE is not set ++# CONFIG_USB_LJCA is not set ++# CONFIG_USB_SISUSBVGA is not set ++# CONFIG_USB_LD is not set ++# CONFIG_USB_TRANCEVIBRATOR is not set ++# CONFIG_USB_IOWARRIOR is not set ++# CONFIG_USB_TEST is not set ++# CONFIG_USB_EHSET_TEST_FIXTURE is not set ++# CONFIG_USB_ISIGHTFW is not set ++# CONFIG_USB_YUREX is not set ++# CONFIG_USB_EZUSB_FX2 is not set ++# CONFIG_USB_HUB_USB251XB is not set ++CONFIG_USB_HSIC_USB3503=y ++# CONFIG_USB_HSIC_USB4604 is not set ++# CONFIG_USB_LINK_LAYER_TEST is not set ++# CONFIG_USB_CHAOSKEY is not set ++CONFIG_BRCM_USB_PINMAP=y ++# CONFIG_USB_ONBOARD_DEV is not set ++ ++# ++# USB Physical Layer drivers ++# ++CONFIG_USB_PHY=y ++CONFIG_NOP_USB_XCEIV=y ++# CONFIG_USB_ISP1301 is not set ++# CONFIG_USB_MXS_PHY is not set ++CONFIG_USB_TEGRA_PHY=y ++CONFIG_USB_ULPI=y ++CONFIG_USB_ULPI_VIEWPORT=y ++# end of USB Physical Layer drivers ++ ++CONFIG_USB_GADGET=y ++# CONFIG_USB_GADGET_DEBUG is not set ++# CONFIG_USB_GADGET_DEBUG_FILES is not set ++# CONFIG_USB_GADGET_DEBUG_FS is not set ++CONFIG_USB_GADGET_VBUS_DRAW=2 ++CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 ++ ++# ++# USB Peripheral Controller ++# ++# CONFIG_USB_GR_UDC is not set ++# CONFIG_USB_R8A66597 is not set ++CONFIG_USB_RZV2M_USB3DRD=y ++# CONFIG_USB_RENESAS_USB3 is not set ++# CONFIG_USB_RENESAS_USBF is not set ++# CONFIG_USB_PXA27X is not set ++# CONFIG_USB_MV_UDC is not set ++# CONFIG_USB_MV_U3D is not set ++CONFIG_USB_SNP_CORE=y ++CONFIG_USB_SNP_UDC_PLAT=y ++# CONFIG_USB_M66592 is not set ++CONFIG_USB_BDC_UDC=y ++# CONFIG_USB_AMD5536UDC is not set ++# CONFIG_USB_NET2272 is not set ++# CONFIG_USB_NET2280 is not set ++# CONFIG_USB_GOKU is not set ++# CONFIG_USB_EG20T is not set ++# CONFIG_USB_GADGET_XILINX is not set ++# CONFIG_USB_MAX3420_UDC is not set ++# CONFIG_USB_TEGRA_XUDC is not set ++# CONFIG_USB_CDNS2_UDC is not set ++# CONFIG_USB_DUMMY_HCD is not set ++# end of USB Peripheral Controller ++ ++# CONFIG_USB_CONFIGFS is not set ++ ++# ++# USB Gadget precomposed configurations ++# ++# CONFIG_USB_ZERO is not set ++# CONFIG_USB_AUDIO is not set ++# CONFIG_USB_ETH is not set ++# CONFIG_USB_G_NCM is not set ++# CONFIG_USB_GADGETFS is not set ++# CONFIG_USB_FUNCTIONFS is not set ++# CONFIG_USB_MASS_STORAGE is not set ++# CONFIG_USB_G_SERIAL is not set ++# CONFIG_USB_MIDI_GADGET is not set ++# CONFIG_USB_G_PRINTER is not set ++# CONFIG_USB_CDC_COMPOSITE is not set ++# CONFIG_USB_G_ACM_MS is not set ++# CONFIG_USB_G_MULTI is not set ++# CONFIG_USB_G_HID is not set ++# CONFIG_USB_G_DBGP is not set ++# CONFIG_USB_RAW_GADGET is not set ++# end of USB Gadget precomposed configurations ++ ++# CONFIG_TYPEC is not set ++CONFIG_USB_ROLE_SWITCH=y ++CONFIG_MMC=y ++CONFIG_PWRSEQ_EMMC=y ++CONFIG_PWRSEQ_SIMPLE=y ++CONFIG_MMC_BLOCK=y ++CONFIG_MMC_BLOCK_MINORS=32 ++# CONFIG_SDIO_UART is not set ++# CONFIG_MMC_TEST is not set ++ ++# ++# MMC/SD/SDIO Host Controller Drivers ++# ++# CONFIG_MMC_DEBUG is not set ++CONFIG_MMC_ARMMMCI=y ++CONFIG_MMC_QCOM_DML=y ++CONFIG_MMC_STM32_SDMMC=y ++CONFIG_MMC_SDHCI=y ++CONFIG_MMC_SDHCI_IO_ACCESSORS=y ++# CONFIG_MMC_SDHCI_PCI is not set ++CONFIG_MMC_SDHCI_ACPI=y ++CONFIG_MMC_SDHCI_PLTFM=y ++CONFIG_MMC_SDHCI_OF_ARASAN=y ++# CONFIG_MMC_SDHCI_OF_AT91 is not set ++CONFIG_MMC_SDHCI_OF_ESDHC=y ++CONFIG_MMC_SDHCI_OF_DWCMSHC=y ++CONFIG_MMC_SDHCI_OF_SPARX5=y ++# CONFIG_MMC_SDHCI_OF_MA35D1 is not set ++CONFIG_MMC_SDHCI_CADENCE=y ++CONFIG_MMC_SDHCI_ESDHC_IMX=y ++CONFIG_MMC_SDHCI_TEGRA=y ++# CONFIG_MMC_SDHCI_S3C is not set ++# CONFIG_MMC_SDHCI_PXAV3 is not set ++CONFIG_MMC_SDHCI_F_SDH30=y ++# CONFIG_MMC_SDHCI_MILBEAUT is not set ++CONFIG_MMC_SDHCI_IPROC=y ++# CONFIG_MMC_SDHCI_NPCM is not set ++CONFIG_MMC_MESON_GX=y ++# CONFIG_MMC_MESON_MX_SDIO is not set ++CONFIG_MMC_SDHCI_MSM=y ++# CONFIG_MMC_MXC is not set ++# CONFIG_MMC_TIFM_SD is not set ++CONFIG_MMC_SPI=y ++# CONFIG_MMC_SDHCI_SPRD is not set ++CONFIG_MMC_TMIO_CORE=y ++CONFIG_MMC_SDHI=y ++# CONFIG_MMC_SDHI_SYS_DMAC is not set ++CONFIG_MMC_SDHI_INTERNAL_DMAC=y ++CONFIG_MMC_UNIPHIER=y ++# CONFIG_MMC_CB710 is not set ++# CONFIG_MMC_VIA_SDMMC is not set ++CONFIG_MMC_DW=y ++CONFIG_MMC_DW_PLTFM=y ++# CONFIG_MMC_DW_BLUEFIELD is not set ++CONFIG_MMC_DW_EXYNOS=y ++CONFIG_MMC_DW_HI3798CV200=y ++# CONFIG_MMC_DW_HI3798MV200 is not set ++CONFIG_MMC_DW_K3=y ++# CONFIG_MMC_DW_PCI is not set ++CONFIG_MMC_DW_ROCKCHIP=y ++# CONFIG_MMC_SH_MMCIF is not set ++# CONFIG_MMC_VUB300 is not set ++# CONFIG_MMC_USHC is not set ++# CONFIG_MMC_USDHI6ROL0 is not set ++CONFIG_MMC_SUNXI=y ++CONFIG_MMC_CQHCI=y ++# CONFIG_MMC_HSQ is not set ++# CONFIG_MMC_TOSHIBA_PCI is not set ++CONFIG_MMC_BCM2835=y ++CONFIG_MMC_MTK=y ++CONFIG_MMC_SDHCI_BRCMSTB=y ++CONFIG_MMC_SDHCI_XENON=y ++CONFIG_MMC_SDHCI_AM654=y ++CONFIG_MMC_OWL=y ++CONFIG_SCSI_UFSHCD=y ++CONFIG_SCSI_UFS_BSG=y ++# CONFIG_SCSI_UFS_HWMON is not set ++# CONFIG_SCSI_UFSHCD_PCI is not set ++CONFIG_SCSI_UFSHCD_PLATFORM=y ++# CONFIG_SCSI_UFS_CDNS_PLATFORM is not set ++# CONFIG_SCSI_UFS_DWC_TC_PLATFORM is not set ++# CONFIG_SCSI_UFS_QCOM is not set ++# CONFIG_SCSI_UFS_MEDIATEK is not set ++CONFIG_SCSI_UFS_HISI=y ++# CONFIG_SCSI_UFS_RENESAS is not set ++# CONFIG_SCSI_UFS_TI_J721E is not set ++CONFIG_SCSI_UFS_EXYNOS=y ++# CONFIG_SCSI_UFS_SPRD is not set ++# CONFIG_MEMSTICK is not set ++CONFIG_NEW_LEDS=y ++CONFIG_LEDS_CLASS=y ++# CONFIG_LEDS_CLASS_FLASH is not set ++# CONFIG_LEDS_CLASS_MULTICOLOR is not set ++# CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set ++ ++# ++# LED drivers ++# ++# CONFIG_LEDS_AN30259A is not set ++# CONFIG_LEDS_AW200XX is not set ++# CONFIG_LEDS_AW2013 is not set ++# CONFIG_LEDS_BCM6328 is not set ++# CONFIG_LEDS_BCM6358 is not set ++# CONFIG_LEDS_CR0014114 is not set ++# CONFIG_LEDS_EL15203000 is not set ++# CONFIG_LEDS_LM3530 is not set ++# CONFIG_LEDS_LM3532 is not set ++# CONFIG_LEDS_LM3642 is not set ++# CONFIG_LEDS_LM3692X is not set ++# CONFIG_LEDS_MT6323 is not set ++# CONFIG_LEDS_PCA9532 is not set ++CONFIG_LEDS_GPIO=y ++# CONFIG_LEDS_LP3944 is not set ++# CONFIG_LEDS_LP3952 is not set ++# CONFIG_LEDS_LP8860 is not set ++# CONFIG_LEDS_PCA955X is not set ++# CONFIG_LEDS_PCA963X is not set ++# CONFIG_LEDS_PCA995X is not set ++# CONFIG_LEDS_DAC124S085 is not set ++CONFIG_LEDS_PWM=y ++# CONFIG_LEDS_REGULATOR is not set ++# CONFIG_LEDS_BD2606MVV is not set ++# CONFIG_LEDS_BD2802 is not set ++# CONFIG_LEDS_LT3593 is not set ++# CONFIG_LEDS_TCA6507 is not set ++# CONFIG_LEDS_TLC591XX is not set ++# CONFIG_LEDS_LM355x is not set ++# CONFIG_LEDS_IS31FL319X is not set ++# CONFIG_LEDS_IS31FL32XX is not set ++ ++# ++# LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) ++# ++# CONFIG_LEDS_BLINKM is not set ++CONFIG_LEDS_SYSCON=y ++# CONFIG_LEDS_MLXREG is not set ++# CONFIG_LEDS_USER is not set ++# CONFIG_LEDS_SPI_BYTE is not set ++# CONFIG_LEDS_LM3697 is not set ++CONFIG_LEDS_BCM63138=y ++ ++# ++# Flash and Torch LED drivers ++# ++ ++# ++# RGB LED drivers ++# ++ ++# ++# LED Triggers ++# ++CONFIG_LEDS_TRIGGERS=y ++CONFIG_LEDS_TRIGGER_TIMER=y ++# CONFIG_LEDS_TRIGGER_ONESHOT is not set ++CONFIG_LEDS_TRIGGER_DISK=y ++# CONFIG_LEDS_TRIGGER_MTD is not set ++CONFIG_LEDS_TRIGGER_HEARTBEAT=y ++# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set ++CONFIG_LEDS_TRIGGER_CPU=y ++# CONFIG_LEDS_TRIGGER_ACTIVITY is not set ++# CONFIG_LEDS_TRIGGER_GPIO is not set ++CONFIG_LEDS_TRIGGER_DEFAULT_ON=y ++ ++# ++# iptables trigger is under Netfilter config (LED target) ++# ++# CONFIG_LEDS_TRIGGER_TRANSIENT is not set ++# CONFIG_LEDS_TRIGGER_CAMERA is not set ++CONFIG_LEDS_TRIGGER_PANIC=y ++# CONFIG_LEDS_TRIGGER_NETDEV is not set ++# CONFIG_LEDS_TRIGGER_PATTERN is not set ++# CONFIG_LEDS_TRIGGER_TTY is not set ++# CONFIG_LEDS_TRIGGER_INPUT_EVENTS is not set ++ ++# ++# Simple LED drivers ++# ++# CONFIG_ACCESSIBILITY is not set ++# CONFIG_INFINIBAND is not set ++CONFIG_EDAC_SUPPORT=y ++CONFIG_EDAC=y ++CONFIG_EDAC_LEGACY_SYSFS=y ++# CONFIG_EDAC_DEBUG is not set ++CONFIG_EDAC_GHES=y ++# CONFIG_EDAC_AL_MC is not set ++# CONFIG_EDAC_LAYERSCAPE is not set ++# CONFIG_EDAC_THUNDERX is not set ++# CONFIG_EDAC_ALTERA is not set ++# CONFIG_EDAC_SYNOPSYS is not set ++# CONFIG_EDAC_XGENE is not set ++# CONFIG_EDAC_DMC520 is not set ++# CONFIG_EDAC_ZYNQMP is not set ++# CONFIG_EDAC_NPCM is not set ++# CONFIG_EDAC_VERSAL is not set ++CONFIG_RTC_LIB=y ++CONFIG_RTC_CLASS=y ++CONFIG_RTC_HCTOSYS=y ++CONFIG_RTC_HCTOSYS_DEVICE="rtc0" ++CONFIG_RTC_SYSTOHC=y ++CONFIG_RTC_SYSTOHC_DEVICE="rtc0" ++# CONFIG_RTC_DEBUG is not set ++CONFIG_RTC_NVMEM=y ++ ++# ++# RTC interfaces ++# ++CONFIG_RTC_INTF_SYSFS=y ++CONFIG_RTC_INTF_PROC=y ++CONFIG_RTC_INTF_DEV=y ++# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set ++# CONFIG_RTC_DRV_TEST is not set ++ ++# ++# I2C RTC drivers ++# ++# CONFIG_RTC_DRV_ABB5ZES3 is not set ++# CONFIG_RTC_DRV_ABEOZ9 is not set ++# CONFIG_RTC_DRV_ABX80X is not set ++CONFIG_RTC_DRV_BRCMSTB=y ++# CONFIG_RTC_DRV_DS1307 is not set ++# CONFIG_RTC_DRV_DS1374 is not set ++# CONFIG_RTC_DRV_DS1672 is not set ++# CONFIG_RTC_DRV_HYM8563 is not set ++# CONFIG_RTC_DRV_MAX6900 is not set ++# CONFIG_RTC_DRV_MAX31335 is not set ++CONFIG_RTC_DRV_MAX77686=y ++# CONFIG_RTC_DRV_NCT3018Y is not set ++# CONFIG_RTC_DRV_RK808 is not set ++# CONFIG_RTC_DRV_RS5C372 is not set ++# CONFIG_RTC_DRV_ISL1208 is not set ++# CONFIG_RTC_DRV_ISL12022 is not set ++# CONFIG_RTC_DRV_ISL12026 is not set ++# CONFIG_RTC_DRV_X1205 is not set ++# CONFIG_RTC_DRV_PCF8523 is not set ++# CONFIG_RTC_DRV_PCF85063 is not set ++# CONFIG_RTC_DRV_PCF85363 is not set ++# CONFIG_RTC_DRV_PCF8563 is not set ++# CONFIG_RTC_DRV_PCF8583 is not set ++# CONFIG_RTC_DRV_M41T80 is not set ++# CONFIG_RTC_DRV_BQ32K is not set ++# CONFIG_RTC_DRV_S35390A is not set ++# CONFIG_RTC_DRV_FM3130 is not set ++# CONFIG_RTC_DRV_RX8010 is not set ++# CONFIG_RTC_DRV_RX8111 is not set ++# CONFIG_RTC_DRV_RX8581 is not set ++# CONFIG_RTC_DRV_RX8025 is not set ++# CONFIG_RTC_DRV_EM3027 is not set ++# CONFIG_RTC_DRV_RV3028 is not set ++# CONFIG_RTC_DRV_RV3032 is not set ++# CONFIG_RTC_DRV_RV8803 is not set ++CONFIG_RTC_DRV_S5M=y ++# CONFIG_RTC_DRV_SD2405AL is not set ++# CONFIG_RTC_DRV_SD3078 is not set ++ ++# ++# SPI RTC drivers ++# ++# CONFIG_RTC_DRV_M41T93 is not set ++# CONFIG_RTC_DRV_M41T94 is not set ++# CONFIG_RTC_DRV_DS1302 is not set ++# CONFIG_RTC_DRV_DS1305 is not set ++# CONFIG_RTC_DRV_DS1343 is not set ++# CONFIG_RTC_DRV_DS1347 is not set ++# CONFIG_RTC_DRV_DS1390 is not set ++# CONFIG_RTC_DRV_MAX6916 is not set ++# CONFIG_RTC_DRV_R9701 is not set ++# CONFIG_RTC_DRV_RX4581 is not set ++# CONFIG_RTC_DRV_RS5C348 is not set ++# CONFIG_RTC_DRV_MAX6902 is not set ++# CONFIG_RTC_DRV_PCF2123 is not set ++# CONFIG_RTC_DRV_MCP795 is not set ++CONFIG_RTC_I2C_AND_SPI=y ++ ++# ++# SPI and I2C RTC drivers ++# ++CONFIG_RTC_DRV_DS3232=y ++CONFIG_RTC_DRV_DS3232_HWMON=y ++# CONFIG_RTC_DRV_PCF2127 is not set ++# CONFIG_RTC_DRV_RV3029C2 is not set ++# CONFIG_RTC_DRV_RX6110 is not set ++ ++# ++# Platform RTC drivers ++# ++# CONFIG_RTC_DRV_DS1286 is not set ++# CONFIG_RTC_DRV_DS1511 is not set ++# CONFIG_RTC_DRV_DS1553 is not set ++# CONFIG_RTC_DRV_DS1685_FAMILY is not set ++# CONFIG_RTC_DRV_DS1742 is not set ++# CONFIG_RTC_DRV_DS2404 is not set ++CONFIG_RTC_DRV_EFI=y ++# CONFIG_RTC_DRV_STK17TA8 is not set ++# CONFIG_RTC_DRV_M48T86 is not set ++# CONFIG_RTC_DRV_M48T35 is not set ++# CONFIG_RTC_DRV_M48T59 is not set ++# CONFIG_RTC_DRV_MSM6242 is not set ++# CONFIG_RTC_DRV_RP5C01 is not set ++# CONFIG_RTC_DRV_OPTEE is not set ++# CONFIG_RTC_DRV_ZYNQMP is not set ++CONFIG_RTC_DRV_CROS_EC=y ++ ++# ++# on-CPU RTC drivers ++# ++# CONFIG_RTC_DRV_IMXDI is not set ++# CONFIG_RTC_DRV_FSL_FTM_ALARM is not set ++# CONFIG_RTC_DRV_MESON_VRTC is not set ++CONFIG_RTC_DRV_S3C=y ++# CONFIG_RTC_DRV_SH is not set ++# CONFIG_RTC_DRV_PL030 is not set ++CONFIG_RTC_DRV_PL031=y ++CONFIG_RTC_DRV_SUN6I=y ++# CONFIG_RTC_DRV_MV is not set ++CONFIG_RTC_DRV_ARMADA38X=y ++# CONFIG_RTC_DRV_CADENCE is not set ++# CONFIG_RTC_DRV_FTRTC010 is not set ++# CONFIG_RTC_DRV_PM8XXX is not set ++CONFIG_RTC_DRV_TEGRA=y ++# CONFIG_RTC_DRV_MXC is not set ++# CONFIG_RTC_DRV_MXC_V2 is not set ++# CONFIG_RTC_DRV_SNVS is not set ++# CONFIG_RTC_DRV_BBNSM is not set ++CONFIG_RTC_DRV_IMX_BBM_SCMI=y ++# CONFIG_RTC_DRV_IMX_SC is not set ++# CONFIG_RTC_DRV_MT2712 is not set ++# CONFIG_RTC_DRV_MT6397 is not set ++# CONFIG_RTC_DRV_MT7622 is not set ++CONFIG_RTC_DRV_XGENE=y ++# CONFIG_RTC_DRV_R7301 is not set ++# CONFIG_RTC_DRV_STM32 is not set ++CONFIG_RTC_DRV_RTD119X=y ++# CONFIG_RTC_DRV_TI_K3 is not set ++# CONFIG_RTC_DRV_MA35D1 is not set ++ ++# ++# HID Sensor RTC drivers ++# ++# CONFIG_RTC_DRV_GOLDFISH is not set ++CONFIG_DMADEVICES=y ++# CONFIG_DMADEVICES_DEBUG is not set ++ ++# ++# DMA Devices ++# ++CONFIG_ASYNC_TX_ENABLE_CHANNEL_SWITCH=y ++CONFIG_DMA_ENGINE=y ++CONFIG_DMA_VIRTUAL_CHANNELS=y ++CONFIG_DMA_ACPI=y ++CONFIG_DMA_OF=y ++# CONFIG_ALTERA_MSGDMA is not set ++# CONFIG_AMBA_PL08X is not set ++CONFIG_APPLE_ADMAC=y ++# CONFIG_AXI_DMAC is not set ++CONFIG_DMA_BCM2835=y ++# CONFIG_DMA_SUN6I is not set ++# CONFIG_DW_AXI_DMAC is not set ++CONFIG_FSL_EDMA=y ++# CONFIG_FSL_QDMA is not set ++# CONFIG_HISI_DMA is not set ++# CONFIG_IMX_DMA is not set ++# CONFIG_IMX_SDMA is not set ++# CONFIG_INTEL_IDMA64 is not set ++CONFIG_K3_DMA=y ++CONFIG_MV_XOR=y ++CONFIG_MV_XOR_V2=y ++# CONFIG_MXS_DMA is not set ++CONFIG_OWL_DMA=y ++CONFIG_PL330_DMA=y ++# CONFIG_PLX_DMA is not set ++# CONFIG_SPRD_DMA is not set ++CONFIG_TEGRA186_GPC_DMA=y ++CONFIG_TEGRA20_APB_DMA=y ++# CONFIG_TEGRA210_ADMA is not set ++# CONFIG_UNIPHIER_MDMAC is not set ++# CONFIG_UNIPHIER_XDMAC is not set ++# CONFIG_XGENE_DMA is not set ++# CONFIG_XILINX_DMA is not set ++# CONFIG_XILINX_XDMA is not set ++# CONFIG_XILINX_ZYNQMP_DMA is not set ++# CONFIG_XILINX_ZYNQMP_DPDMA is not set ++# CONFIG_AMD_QDMA is not set ++# CONFIG_MTK_HSDMA is not set ++# CONFIG_MTK_CQDMA is not set ++# CONFIG_MTK_UART_APDMA is not set ++CONFIG_QCOM_BAM_DMA=y ++# CONFIG_QCOM_GPI_DMA is not set ++CONFIG_QCOM_HIDMA_MGMT=y ++CONFIG_QCOM_HIDMA=y ++# CONFIG_DW_DMAC is not set ++# CONFIG_DW_DMAC_PCI is not set ++# CONFIG_DW_EDMA is not set ++# CONFIG_SF_PDMA is not set ++CONFIG_RENESAS_DMA=y ++CONFIG_RCAR_DMAC=y ++# CONFIG_RENESAS_USB_DMAC is not set ++CONFIG_RZ_DMAC=y ++CONFIG_TI_K3_UDMA=y ++CONFIG_TI_K3_UDMA_GLUE_LAYER=y ++CONFIG_TI_K3_PSIL=y ++# CONFIG_FSL_DPAA2_QDMA is not set ++# CONFIG_STM32_DMA is not set ++# CONFIG_STM32_MDMA is not set ++# CONFIG_STM32_DMA3 is not set ++ ++# ++# DMA Clients ++# ++# CONFIG_ASYNC_TX_DMA is not set ++# CONFIG_DMATEST is not set ++CONFIG_DMA_ENGINE_RAID=y ++ ++# ++# DMABUF options ++# ++CONFIG_SYNC_FILE=y ++# CONFIG_SW_SYNC is not set ++# CONFIG_UDMABUF is not set ++# CONFIG_DMABUF_MOVE_NOTIFY is not set ++# CONFIG_DMABUF_DEBUG is not set ++# CONFIG_DMABUF_SELFTESTS is not set ++# CONFIG_DMABUF_HEAPS is not set ++# CONFIG_DMABUF_SYSFS_STATS is not set ++# end of DMABUF options ++ ++# CONFIG_UIO is not set ++CONFIG_VFIO=y ++CONFIG_VFIO_GROUP=y ++CONFIG_VFIO_CONTAINER=y ++CONFIG_VFIO_IOMMU_TYPE1=y ++# CONFIG_VFIO_NOIOMMU is not set ++CONFIG_VFIO_VIRQFD=y ++# CONFIG_VFIO_DEBUGFS is not set ++ ++# ++# VFIO support for PCI devices ++# ++CONFIG_VFIO_PCI_CORE=y ++CONFIG_VFIO_PCI_MMAP=y ++CONFIG_VFIO_PCI_INTX=y ++CONFIG_VFIO_PCI=y ++# CONFIG_NVGRACE_GPU_VFIO_PCI is not set ++# end of VFIO support for PCI devices ++ ++# ++# VFIO support for platform devices ++# ++# CONFIG_VFIO_PLATFORM is not set ++# CONFIG_VFIO_AMBA is not set ++# end of VFIO support for platform devices ++ ++# ++# VFIO support for FSL_MC bus devices ++# ++# CONFIG_VFIO_FSL_MC is not set ++# end of VFIO support for FSL_MC bus devices ++ ++CONFIG_IRQ_BYPASS_MANAGER=y ++CONFIG_VIRT_DRIVERS=y ++CONFIG_VMGENID=y ++# CONFIG_NITRO_ENCLAVES is not set ++# CONFIG_ARM_PKVM_GUEST is not set ++CONFIG_VIRTIO_ANCHOR=y ++CONFIG_VIRTIO=y ++CONFIG_VIRTIO_PCI_LIB=y ++CONFIG_VIRTIO_PCI_LIB_LEGACY=y ++CONFIG_VIRTIO_MENU=y ++CONFIG_VIRTIO_PCI=y ++CONFIG_VIRTIO_PCI_LEGACY=y ++CONFIG_VIRTIO_BALLOON=y ++CONFIG_VIRTIO_MEM=y ++CONFIG_VIRTIO_INPUT=y ++CONFIG_VIRTIO_MMIO=y ++CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y ++CONFIG_VIRTIO_DMA_SHARED_BUFFER=y ++# CONFIG_VIRTIO_DEBUG is not set ++# CONFIG_VDPA is not set ++CONFIG_VHOST_MENU=y ++# CONFIG_VHOST_NET is not set ++# CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set ++ ++# ++# Microsoft Hyper-V guest support ++# ++# CONFIG_HYPERV is not set ++# end of Microsoft Hyper-V guest support ++ ++# ++# Xen driver support ++# ++CONFIG_XEN_BALLOON=y ++CONFIG_XEN_BALLOON_MEMORY_HOTPLUG=y ++CONFIG_XEN_SCRUB_PAGES_DEFAULT=y ++CONFIG_XEN_DEV_EVTCHN=y ++CONFIG_XEN_BACKEND=y ++CONFIG_XENFS=y ++CONFIG_XEN_COMPAT_XENFS=y ++CONFIG_XEN_SYS_HYPERVISOR=y ++CONFIG_XEN_XENBUS_FRONTEND=y ++CONFIG_XEN_GNTDEV=y ++CONFIG_XEN_GRANT_DEV_ALLOC=y ++# CONFIG_XEN_GRANT_DMA_ALLOC is not set ++CONFIG_SWIOTLB_XEN=y ++# CONFIG_XEN_PCIDEV_STUB is not set ++# CONFIG_XEN_PVCALLS_FRONTEND is not set ++# CONFIG_XEN_PVCALLS_BACKEND is not set ++CONFIG_XEN_PRIVCMD=y ++CONFIG_XEN_EFI=y ++CONFIG_XEN_AUTO_XLATE=y ++# CONFIG_XEN_VIRTIO is not set ++# end of Xen driver support ++ ++# CONFIG_GREYBUS is not set ++# CONFIG_COMEDI is not set ++CONFIG_STAGING=y ++# CONFIG_RTLLIB is not set ++# CONFIG_RTS5208 is not set ++ ++# ++# IIO staging drivers ++# ++ ++# ++# Accelerometers ++# ++# CONFIG_ADIS16203 is not set ++# CONFIG_ADIS16240 is not set ++# end of Accelerometers ++ ++# ++# Analog to digital converters ++# ++# CONFIG_AD7816 is not set ++# end of Analog to digital converters ++ ++# ++# Analog digital bi-direction converters ++# ++# CONFIG_ADT7316 is not set ++# end of Analog digital bi-direction converters ++ ++# ++# Direct Digital Synthesis ++# ++# CONFIG_AD9832 is not set ++# CONFIG_AD9834 is not set ++# end of Direct Digital Synthesis ++ ++# ++# Network Analyzer, Impedance Converters ++# ++# CONFIG_AD5933 is not set ++# end of Network Analyzer, Impedance Converters ++# end of IIO staging drivers ++ ++# CONFIG_FB_SM750 is not set ++# CONFIG_MFD_NVEC is not set ++CONFIG_STAGING_MEDIA=y ++# CONFIG_LTE_GDM724X is not set ++# CONFIG_FB_TFT is not set ++CONFIG_BCM_VIDEOCORE=y ++# CONFIG_BCM2835_VCHIQ is not set ++# CONFIG_SND_BCM2835 is not set ++# CONFIG_XIL_AXIS_FIFO is not set ++# CONFIG_FIELDBUS_DEV is not set ++# CONFIG_VME_BUS is not set ++# CONFIG_GOLDFISH is not set ++CONFIG_CHROME_PLATFORMS=y ++# CONFIG_CHROMEOS_ACPI is not set ++# CONFIG_CHROMEOS_TBMC is not set ++CONFIG_CROS_EC=y ++CONFIG_CROS_EC_I2C=y ++# CONFIG_CROS_EC_RPMSG is not set ++CONFIG_CROS_EC_SPI=y ++# CONFIG_CROS_EC_UART is not set ++CONFIG_CROS_EC_PROTO=y ++# CONFIG_CROS_KBD_LED_BACKLIGHT is not set ++# CONFIG_CROS_EC_CHARDEV is not set ++CONFIG_CROS_EC_LIGHTBAR=y ++CONFIG_CROS_EC_VBC=y ++CONFIG_CROS_EC_DEBUGFS=y ++CONFIG_CROS_EC_SENSORHUB=y ++CONFIG_CROS_EC_SYSFS=y ++# CONFIG_CROS_HPS_I2C is not set ++CONFIG_CROS_USBPD_NOTIFY=y ++# CONFIG_CHROMEOS_PRIVACY_SCREEN is not set ++# CONFIG_CZNIC_PLATFORMS is not set ++# CONFIG_MELLANOX_PLATFORM is not set ++CONFIG_SURFACE_PLATFORMS=y ++# CONFIG_SURFACE_3_POWER_OPREGION is not set ++# CONFIG_SURFACE_GPE is not set ++# CONFIG_SURFACE_HOTPLUG is not set ++# CONFIG_SURFACE_PRO3_BUTTON is not set ++# CONFIG_SURFACE_AGGREGATOR is not set ++CONFIG_ARM64_PLATFORM_DEVICES=y ++# CONFIG_EC_ACER_ASPIRE1 is not set ++# CONFIG_EC_LENOVO_YOGA_C630 is not set ++CONFIG_HAVE_CLK=y ++CONFIG_HAVE_CLK_PREPARE=y ++CONFIG_COMMON_CLK=y ++ ++# ++# Clock driver for ARM Reference designs ++# ++# CONFIG_CLK_ICST is not set ++# CONFIG_CLK_SP810 is not set ++CONFIG_CLK_VEXPRESS_OSC=y ++# end of Clock driver for ARM Reference designs ++ ++# CONFIG_LMK04832 is not set ++CONFIG_COMMON_CLK_APPLE_NCO=y ++# CONFIG_COMMON_CLK_MAX77686 is not set ++# CONFIG_COMMON_CLK_MAX9485 is not set ++CONFIG_COMMON_CLK_RK808=y ++CONFIG_COMMON_CLK_HI655X=y ++CONFIG_COMMON_CLK_SCMI=y ++CONFIG_COMMON_CLK_SCPI=y ++# CONFIG_COMMON_CLK_SI5341 is not set ++# CONFIG_COMMON_CLK_SI5351 is not set ++# CONFIG_COMMON_CLK_SI514 is not set ++# CONFIG_COMMON_CLK_SI544 is not set ++# CONFIG_COMMON_CLK_SI570 is not set ++# CONFIG_COMMON_CLK_CDCE706 is not set ++# CONFIG_COMMON_CLK_CDCE925 is not set ++CONFIG_COMMON_CLK_CS2000_CP=y ++CONFIG_COMMON_CLK_FSL_FLEXSPI=y ++CONFIG_COMMON_CLK_FSL_SAI=y ++CONFIG_COMMON_CLK_S2MPS11=y ++# CONFIG_COMMON_CLK_AXI_CLKGEN is not set ++CONFIG_CLK_QORIQ=y ++CONFIG_CLK_LS1028A_PLLDIG=y ++CONFIG_COMMON_CLK_XGENE=y ++CONFIG_COMMON_CLK_PWM=y ++CONFIG_COMMON_CLK_RS9_PCIE=y ++# CONFIG_COMMON_CLK_SI521XX is not set ++# CONFIG_COMMON_CLK_VC3 is not set ++CONFIG_COMMON_CLK_VC5=y ++# CONFIG_COMMON_CLK_VC7 is not set ++# CONFIG_COMMON_CLK_BD718XX is not set ++# CONFIG_COMMON_CLK_FIXED_MMIO is not set ++CONFIG_CLK_ACTIONS=y ++CONFIG_CLK_OWL_S500=y ++CONFIG_CLK_OWL_S700=y ++CONFIG_CLK_OWL_S900=y ++CONFIG_CLK_BCM2711_DVP=y ++CONFIG_CLK_BCM2835=y ++CONFIG_CLK_BCM_63XX=y ++CONFIG_COMMON_CLK_IPROC=y ++CONFIG_CLK_BCM_NS2=y ++CONFIG_CLK_BCM_SR=y ++# CONFIG_CLK_RASPBERRYPI is not set ++CONFIG_COMMON_CLK_HI3516CV300=y ++CONFIG_COMMON_CLK_HI3519=y ++CONFIG_COMMON_CLK_HI3559A=y ++CONFIG_COMMON_CLK_HI3660=y ++CONFIG_COMMON_CLK_HI3670=y ++CONFIG_COMMON_CLK_HI3798CV200=y ++CONFIG_COMMON_CLK_HI6220=y ++CONFIG_RESET_HISI=y ++CONFIG_STUB_CLK_HI6220=y ++CONFIG_STUB_CLK_HI3660=y ++CONFIG_MXC_CLK=y ++CONFIG_MXC_CLK_SCU=y ++CONFIG_CLK_IMX8MM=y ++CONFIG_CLK_IMX8MN=y ++CONFIG_CLK_IMX8MP=y ++CONFIG_CLK_IMX8MQ=y ++CONFIG_CLK_IMX8QXP=y ++CONFIG_CLK_IMX8ULP=y ++CONFIG_CLK_IMX93=y ++# CONFIG_CLK_IMX95_BLK_CTL is not set ++CONFIG_TI_SCI_CLK=y ++# CONFIG_TI_SCI_CLK_PROBE_FROM_FW is not set ++CONFIG_TI_SYSCON_CLK=y ++ ++# ++# Clock driver for MediaTek SoC ++# ++CONFIG_COMMON_CLK_MEDIATEK=y ++CONFIG_COMMON_CLK_MEDIATEK_FHCTL=y ++CONFIG_COMMON_CLK_MT2712=y ++# CONFIG_COMMON_CLK_MT2712_BDPSYS is not set ++# CONFIG_COMMON_CLK_MT2712_IMGSYS is not set ++# CONFIG_COMMON_CLK_MT2712_JPGDECSYS is not set ++# CONFIG_COMMON_CLK_MT2712_MFGCFG is not set ++# CONFIG_COMMON_CLK_MT2712_MMSYS is not set ++# CONFIG_COMMON_CLK_MT2712_VDECSYS is not set ++# CONFIG_COMMON_CLK_MT2712_VENCSYS is not set ++CONFIG_COMMON_CLK_MT6765=y ++# CONFIG_COMMON_CLK_MT6765_AUDIOSYS is not set ++# CONFIG_COMMON_CLK_MT6765_CAMSYS is not set ++# CONFIG_COMMON_CLK_MT6765_GCESYS is not set ++# CONFIG_COMMON_CLK_MT6765_MMSYS is not set ++# CONFIG_COMMON_CLK_MT6765_IMGSYS is not set ++# CONFIG_COMMON_CLK_MT6765_VCODECSYS is not set ++# CONFIG_COMMON_CLK_MT6765_MFGSYS is not set ++# CONFIG_COMMON_CLK_MT6765_MIPI0ASYS is not set ++# CONFIG_COMMON_CLK_MT6765_MIPI0BSYS is not set ++# CONFIG_COMMON_CLK_MT6765_MIPI1ASYS is not set ++# CONFIG_COMMON_CLK_MT6765_MIPI1BSYS is not set ++# CONFIG_COMMON_CLK_MT6765_MIPI2ASYS is not set ++# CONFIG_COMMON_CLK_MT6765_MIPI2BSYS is not set ++CONFIG_COMMON_CLK_MT6779=y ++# CONFIG_COMMON_CLK_MT6779_MMSYS is not set ++# CONFIG_COMMON_CLK_MT6779_IMGSYS is not set ++# CONFIG_COMMON_CLK_MT6779_IPESYS is not set ++# CONFIG_COMMON_CLK_MT6779_CAMSYS is not set ++# CONFIG_COMMON_CLK_MT6779_VDECSYS is not set ++# CONFIG_COMMON_CLK_MT6779_VENCSYS is not set ++# CONFIG_COMMON_CLK_MT6779_MFGCFG is not set ++# CONFIG_COMMON_CLK_MT6779_AUDSYS is not set ++CONFIG_COMMON_CLK_MT6795=y ++CONFIG_COMMON_CLK_MT6795_MFGCFG=y ++CONFIG_COMMON_CLK_MT6795_MMSYS=y ++CONFIG_COMMON_CLK_MT6795_VDECSYS=y ++CONFIG_COMMON_CLK_MT6795_VENCSYS=y ++CONFIG_COMMON_CLK_MT6797=y ++# CONFIG_COMMON_CLK_MT6797_MMSYS is not set ++# CONFIG_COMMON_CLK_MT6797_IMGSYS is not set ++# CONFIG_COMMON_CLK_MT6797_VDECSYS is not set ++# CONFIG_COMMON_CLK_MT6797_VENCSYS is not set ++CONFIG_COMMON_CLK_MT7622=y ++# CONFIG_COMMON_CLK_MT7622_ETHSYS is not set ++# CONFIG_COMMON_CLK_MT7622_HIFSYS is not set ++# CONFIG_COMMON_CLK_MT7622_AUDSYS is not set ++CONFIG_COMMON_CLK_MT7981=y ++CONFIG_COMMON_CLK_MT7981_ETHSYS=y ++CONFIG_COMMON_CLK_MT7986=y ++CONFIG_COMMON_CLK_MT7986_ETHSYS=y ++CONFIG_COMMON_CLK_MT7988=y ++CONFIG_COMMON_CLK_MT8167=y ++CONFIG_COMMON_CLK_MT8167_AUDSYS=y ++CONFIG_COMMON_CLK_MT8167_IMGSYS=y ++CONFIG_COMMON_CLK_MT8167_MFGCFG=y ++CONFIG_COMMON_CLK_MT8167_MMSYS=y ++CONFIG_COMMON_CLK_MT8167_VDECSYS=y ++CONFIG_COMMON_CLK_MT8173=y ++CONFIG_COMMON_CLK_MT8173_IMGSYS=y ++CONFIG_COMMON_CLK_MT8173_MMSYS=y ++CONFIG_COMMON_CLK_MT8173_VDECSYS=y ++CONFIG_COMMON_CLK_MT8173_VENCSYS=y ++CONFIG_COMMON_CLK_MT8183=y ++CONFIG_COMMON_CLK_MT8183_AUDIOSYS=y ++CONFIG_COMMON_CLK_MT8183_CAMSYS=y ++CONFIG_COMMON_CLK_MT8183_IMGSYS=y ++CONFIG_COMMON_CLK_MT8183_IPU_CORE0=y ++CONFIG_COMMON_CLK_MT8183_IPU_CORE1=y ++CONFIG_COMMON_CLK_MT8183_IPU_ADL=y ++CONFIG_COMMON_CLK_MT8183_IPU_CONN=y ++CONFIG_COMMON_CLK_MT8183_MFGCFG=y ++CONFIG_COMMON_CLK_MT8183_MMSYS=y ++CONFIG_COMMON_CLK_MT8183_VDECSYS=y ++CONFIG_COMMON_CLK_MT8183_VENCSYS=y ++CONFIG_COMMON_CLK_MT8186=y ++CONFIG_COMMON_CLK_MT8186_CAMSYS=y ++CONFIG_COMMON_CLK_MT8186_IMGSYS=y ++CONFIG_COMMON_CLK_MT8186_IPESYS=y ++CONFIG_COMMON_CLK_MT8186_WPESYS=y ++CONFIG_COMMON_CLK_MT8186_IMP_IIC_WRAP=y ++CONFIG_COMMON_CLK_MT8186_MCUSYS=y ++CONFIG_COMMON_CLK_MT8186_MDPSYS=y ++CONFIG_COMMON_CLK_MT8186_MFGCFG=y ++CONFIG_COMMON_CLK_MT8186_MMSYS=y ++CONFIG_COMMON_CLK_MT8186_VDECSYS=y ++CONFIG_COMMON_CLK_MT8186_VENCSYS=y ++CONFIG_COMMON_CLK_MT8188=y ++CONFIG_COMMON_CLK_MT8188_ADSP_AUDIO26M=y ++CONFIG_COMMON_CLK_MT8188_CAMSYS=y ++CONFIG_COMMON_CLK_MT8188_IMGSYS=y ++CONFIG_COMMON_CLK_MT8188_IMP_IIC_WRAP=y ++CONFIG_COMMON_CLK_MT8188_IPESYS=y ++CONFIG_COMMON_CLK_MT8188_MFGCFG=y ++CONFIG_COMMON_CLK_MT8188_VDECSYS=y ++CONFIG_COMMON_CLK_MT8188_VDOSYS=y ++CONFIG_COMMON_CLK_MT8188_VENCSYS=y ++CONFIG_COMMON_CLK_MT8188_VPPSYS=y ++CONFIG_COMMON_CLK_MT8188_WPESYS=y ++CONFIG_COMMON_CLK_MT8192=y ++CONFIG_COMMON_CLK_MT8192_AUDSYS=y ++CONFIG_COMMON_CLK_MT8192_CAMSYS=y ++CONFIG_COMMON_CLK_MT8192_IMGSYS=y ++CONFIG_COMMON_CLK_MT8192_IMP_IIC_WRAP=y ++CONFIG_COMMON_CLK_MT8192_IPESYS=y ++CONFIG_COMMON_CLK_MT8192_MDPSYS=y ++CONFIG_COMMON_CLK_MT8192_MFGCFG=y ++CONFIG_COMMON_CLK_MT8192_MMSYS=y ++CONFIG_COMMON_CLK_MT8192_MSDC=y ++CONFIG_COMMON_CLK_MT8192_SCP_ADSP=y ++CONFIG_COMMON_CLK_MT8192_VDECSYS=y ++CONFIG_COMMON_CLK_MT8192_VENCSYS=y ++CONFIG_COMMON_CLK_MT8195=y ++CONFIG_COMMON_CLK_MT8195_APUSYS=y ++CONFIG_COMMON_CLK_MT8195_AUDSYS=y ++CONFIG_COMMON_CLK_MT8195_IMP_IIC_WRAP=y ++CONFIG_COMMON_CLK_MT8195_MFGCFG=y ++CONFIG_COMMON_CLK_MT8195_MSDC=y ++CONFIG_COMMON_CLK_MT8195_SCP_ADSP=y ++CONFIG_COMMON_CLK_MT8195_VDOSYS=y ++CONFIG_COMMON_CLK_MT8195_VPPSYS=y ++CONFIG_COMMON_CLK_MT8195_CAMSYS=y ++CONFIG_COMMON_CLK_MT8195_IMGSYS=y ++CONFIG_COMMON_CLK_MT8195_IPESYS=y ++CONFIG_COMMON_CLK_MT8195_WPESYS=y ++CONFIG_COMMON_CLK_MT8195_VDECSYS=y ++CONFIG_COMMON_CLK_MT8195_VENCSYS=y ++CONFIG_COMMON_CLK_MT8365=y ++CONFIG_COMMON_CLK_MT8365_APU=y ++CONFIG_COMMON_CLK_MT8365_CAM=y ++CONFIG_COMMON_CLK_MT8365_MFG=y ++CONFIG_COMMON_CLK_MT8365_MMSYS=y ++CONFIG_COMMON_CLK_MT8365_VDEC=y ++CONFIG_COMMON_CLK_MT8365_VENC=y ++CONFIG_COMMON_CLK_MT8516=y ++# CONFIG_COMMON_CLK_MT8516_AUDSYS is not set ++# end of Clock driver for MediaTek SoC ++ ++# ++# Clock support for Amlogic platforms ++# ++CONFIG_COMMON_CLK_MESON_REGMAP=y ++CONFIG_COMMON_CLK_MESON_DUALDIV=y ++CONFIG_COMMON_CLK_MESON_MPLL=y ++CONFIG_COMMON_CLK_MESON_PLL=y ++CONFIG_COMMON_CLK_MESON_VID_PLL_DIV=y ++CONFIG_COMMON_CLK_MESON_VCLK=y ++CONFIG_COMMON_CLK_MESON_CLKC_UTILS=y ++CONFIG_COMMON_CLK_MESON_AO_CLKC=y ++CONFIG_COMMON_CLK_MESON_EE_CLKC=y ++CONFIG_COMMON_CLK_MESON_CPU_DYNDIV=y ++CONFIG_COMMON_CLK_GXBB=y ++CONFIG_COMMON_CLK_AXG=y ++# CONFIG_COMMON_CLK_AXG_AUDIO is not set ++# CONFIG_COMMON_CLK_A1_PLL is not set ++# CONFIG_COMMON_CLK_A1_PERIPHERALS is not set ++CONFIG_COMMON_CLK_C3_PLL=y ++CONFIG_COMMON_CLK_C3_PERIPHERALS=y ++CONFIG_COMMON_CLK_G12A=y ++CONFIG_COMMON_CLK_S4_PLL=y ++CONFIG_COMMON_CLK_S4_PERIPHERALS=y ++# end of Clock support for Amlogic platforms ++ ++CONFIG_ARMADA_AP_CP_HELPER=y ++CONFIG_ARMADA_37XX_CLK=y ++CONFIG_ARMADA_AP806_SYSCON=y ++CONFIG_ARMADA_CP110_SYSCON=y ++CONFIG_COMMON_CLK_NUVOTON=y ++CONFIG_CLK_MA35D1=y ++CONFIG_QCOM_GDSC=y ++CONFIG_COMMON_CLK_QCOM=y ++# CONFIG_CLK_X1E80100_CAMCC is not set ++# CONFIG_CLK_X1E80100_DISPCC is not set ++# CONFIG_CLK_X1E80100_GCC is not set ++# CONFIG_CLK_X1E80100_GPUCC is not set ++# CONFIG_CLK_X1E80100_TCSRCC is not set ++# CONFIG_CLK_QCM2290_GPUCC is not set ++CONFIG_QCOM_A53PLL=y ++# CONFIG_QCOM_A7PLL is not set ++CONFIG_QCOM_CLK_APCS_MSM8916=y ++CONFIG_QCOM_CLK_APCC_MSM8996=y ++CONFIG_QCOM_CLK_SMD_RPM=y ++CONFIG_QCOM_CLK_RPMH=y ++CONFIG_IPQ_APSS_PLL=y ++CONFIG_IPQ_APSS_6018=y ++# CONFIG_IPQ_GCC_4019 is not set ++CONFIG_IPQ_GCC_5018=y ++CONFIG_IPQ_GCC_5332=y ++CONFIG_IPQ_GCC_6018=y ++CONFIG_IPQ_GCC_8074=y ++CONFIG_IPQ_GCC_9574=y ++# CONFIG_IPQ_NSSCC_QCA8K is not set ++CONFIG_MSM_GCC_8916=y ++# CONFIG_MSM_GCC_8917 is not set ++# CONFIG_MSM_GCC_8939 is not set ++# CONFIG_MSM_GCC_8953 is not set ++# CONFIG_MSM_GCC_8976 is not set ++# CONFIG_MSM_MMCC_8994 is not set ++CONFIG_MSM_GCC_8994=y ++CONFIG_MSM_GCC_8996=y ++# CONFIG_MSM_MMCC_8996 is not set ++CONFIG_MSM_GCC_8998=y ++# CONFIG_MSM_GPUCC_8998 is not set ++# CONFIG_MSM_MMCC_8998 is not set ++CONFIG_QCM_GCC_2290=y ++# CONFIG_QCM_DISPCC_2290 is not set ++CONFIG_QCS_GCC_404=y ++# CONFIG_SC_CAMCC_7180 is not set ++# CONFIG_SC_CAMCC_7280 is not set ++# CONFIG_SC_CAMCC_8280XP is not set ++# CONFIG_SC_DISPCC_7180 is not set ++# CONFIG_SC_DISPCC_7280 is not set ++# CONFIG_SC_DISPCC_8280XP is not set ++CONFIG_SA_GCC_8775P=y ++# CONFIG_SA_GPUCC_8775P is not set ++CONFIG_SC_GCC_7180=y ++CONFIG_SC_GCC_7280=y ++CONFIG_SC_GCC_8180X=y ++CONFIG_SC_GCC_8280XP=y ++# CONFIG_SC_GPUCC_7180 is not set ++# CONFIG_SC_GPUCC_7280 is not set ++# CONFIG_SC_GPUCC_8280XP is not set ++# CONFIG_SC_LPASSCC_7280 is not set ++# CONFIG_SC_LPASSCC_8280XP is not set ++# CONFIG_SC_LPASS_CORECC_7180 is not set ++# CONFIG_SC_LPASS_CORECC_7280 is not set ++# CONFIG_SC_VIDEOCC_7180 is not set ++# CONFIG_SC_VIDEOCC_7280 is not set ++# CONFIG_SDM_CAMCC_845 is not set ++# CONFIG_SDM_GCC_660 is not set ++# CONFIG_SDM_MMCC_660 is not set ++# CONFIG_SDM_GPUCC_660 is not set ++# CONFIG_QCS_TURING_404 is not set ++# CONFIG_QCS_Q6SSTOP_404 is not set ++# CONFIG_QDU_GCC_1000 is not set ++# CONFIG_QDU_ECPRICC_1000 is not set ++CONFIG_SDM_GCC_845=y ++CONFIG_SDM_GPUCC_845=y ++CONFIG_SDM_VIDEOCC_845=y ++CONFIG_SDM_DISPCC_845=y ++# CONFIG_SDM_LPASSCC_845 is not set ++# CONFIG_SDX_GCC_75 is not set ++# CONFIG_SM_CAMCC_4450 is not set ++# CONFIG_SM_CAMCC_6350 is not set ++# CONFIG_SM_CAMCC_7150 is not set ++# CONFIG_SM_CAMCC_8150 is not set ++# CONFIG_SM_CAMCC_8250 is not set ++# CONFIG_SM_CAMCC_8450 is not set ++# CONFIG_SM_CAMCC_8550 is not set ++# CONFIG_SM_CAMCC_8650 is not set ++# CONFIG_SM_DISPCC_6115 is not set ++CONFIG_SM_DISPCC_8250=y ++# CONFIG_SM_DISPCC_8450 is not set ++# CONFIG_SM_DISPCC_8550 is not set ++# CONFIG_SM_GCC_4450 is not set ++CONFIG_SM_GCC_6115=y ++# CONFIG_SM_GCC_6125 is not set ++# CONFIG_SM_GCC_6350 is not set ++# CONFIG_SM_GCC_6375 is not set ++# CONFIG_SM_GCC_7150 is not set ++CONFIG_SM_GCC_8150=y ++CONFIG_SM_GCC_8250=y ++CONFIG_SM_GCC_8350=y ++CONFIG_SM_GCC_8450=y ++CONFIG_SM_GCC_8550=y ++# CONFIG_SM_GCC_8650 is not set ++# CONFIG_SM_GPUCC_4450 is not set ++# CONFIG_SM_GPUCC_6115 is not set ++# CONFIG_SM_GPUCC_6125 is not set ++# CONFIG_SM_GPUCC_6375 is not set ++# CONFIG_SM_GPUCC_6350 is not set ++CONFIG_SM_GPUCC_8150=y ++CONFIG_SM_GPUCC_8250=y ++# CONFIG_SM_GPUCC_8350 is not set ++# CONFIG_SM_GPUCC_8450 is not set ++# CONFIG_SM_GPUCC_8550 is not set ++# CONFIG_SM_GPUCC_8650 is not set ++CONFIG_SM_TCSRCC_8550=y ++# CONFIG_SM_TCSRCC_8650 is not set ++# CONFIG_SM_VIDEOCC_7150 is not set ++# CONFIG_SM_VIDEOCC_8150 is not set ++CONFIG_SM_VIDEOCC_8250=y ++# CONFIG_SM_VIDEOCC_8350 is not set ++# CONFIG_SM_VIDEOCC_8550 is not set ++# CONFIG_SPMI_PMIC_CLKDIV is not set ++CONFIG_QCOM_HFPLL=y ++# CONFIG_KPSS_XCC is not set ++# CONFIG_CLK_GFM_LPASS_SM8250 is not set ++# CONFIG_SM_VIDEOCC_8450 is not set ++CONFIG_CLK_RENESAS=y ++CONFIG_CLK_R8A774A1=y ++CONFIG_CLK_R8A774B1=y ++CONFIG_CLK_R8A774C0=y ++CONFIG_CLK_R8A774E1=y ++CONFIG_CLK_R8A7795=y ++CONFIG_CLK_R8A77960=y ++CONFIG_CLK_R8A77961=y ++CONFIG_CLK_R8A77965=y ++CONFIG_CLK_R8A77970=y ++CONFIG_CLK_R8A77980=y ++CONFIG_CLK_R8A77990=y ++CONFIG_CLK_R8A77995=y ++CONFIG_CLK_R8A779A0=y ++CONFIG_CLK_R8A779F0=y ++CONFIG_CLK_R8A779G0=y ++CONFIG_CLK_R9A07G043=y ++CONFIG_CLK_R9A07G044=y ++CONFIG_CLK_R9A07G054=y ++CONFIG_CLK_R9A09G011=y ++CONFIG_CLK_RCAR_CPG_LIB=y ++CONFIG_CLK_RCAR_GEN3_CPG=y ++CONFIG_CLK_RCAR_GEN4_CPG=y ++CONFIG_CLK_RCAR_USB2_CLOCK_SEL=y ++CONFIG_CLK_RZG2L=y ++CONFIG_CLK_RENESAS_CPG_MSSR=y ++CONFIG_CLK_RENESAS_DIV6=y ++CONFIG_COMMON_CLK_ROCKCHIP=y ++CONFIG_CLK_PX30=y ++CONFIG_CLK_RK3308=y ++CONFIG_CLK_RK3328=y ++CONFIG_CLK_RK3368=y ++CONFIG_CLK_RK3399=y ++CONFIG_CLK_RK3568=y ++CONFIG_CLK_RK3576=y ++CONFIG_CLK_RK3588=y ++CONFIG_COMMON_CLK_SAMSUNG=y ++CONFIG_EXYNOS_ARM64_COMMON_CLK=y ++CONFIG_EXYNOS_AUDSS_CLK_CON=y ++CONFIG_EXYNOS_CLKOUT=y ++CONFIG_TESLA_FSD_COMMON_CLK=y ++CONFIG_CLK_INTEL_SOCFPGA=y ++CONFIG_CLK_INTEL_SOCFPGA64=y ++CONFIG_SPRD_COMMON_CLK=y ++CONFIG_SPRD_SC9860_CLK=y ++CONFIG_SPRD_SC9863A_CLK=y ++CONFIG_SPRD_UMS512_CLK=y ++CONFIG_SUNXI_CCU=y ++CONFIG_SUN50I_A64_CCU=y ++CONFIG_SUN50I_A100_CCU=y ++CONFIG_SUN50I_A100_R_CCU=y ++CONFIG_SUN50I_H6_CCU=y ++CONFIG_SUN50I_H616_CCU=y ++CONFIG_SUN50I_H6_R_CCU=y ++CONFIG_SUN6I_RTC_CCU=y ++CONFIG_SUN8I_H3_CCU=y ++CONFIG_SUN8I_DE2_CCU=y ++CONFIG_SUN8I_R_CCU=y ++CONFIG_CLK_TEGRA_BPMP=y ++CONFIG_TEGRA_CLK_DFLL=y ++CONFIG_COMMON_CLK_STM32MP=y ++CONFIG_COMMON_CLK_STM32MP257=y ++CONFIG_CLK_UNIPHIER=y ++CONFIG_COMMON_CLK_VISCONTI=y ++# CONFIG_XILINX_VCU is not set ++# CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set ++CONFIG_COMMON_CLK_ZYNQMP=y ++CONFIG_HWSPINLOCK=y ++# CONFIG_HWSPINLOCK_OMAP is not set ++CONFIG_HWSPINLOCK_QCOM=y ++# CONFIG_HWSPINLOCK_SPRD is not set ++# CONFIG_HWSPINLOCK_SUN6I is not set ++ ++# ++# Clock Source drivers ++# ++CONFIG_TIMER_OF=y ++CONFIG_TIMER_ACPI=y ++CONFIG_TIMER_PROBE=y ++CONFIG_CLKSRC_MMIO=y ++CONFIG_OMAP_DM_TIMER=y ++CONFIG_DW_APB_TIMER=y ++CONFIG_DW_APB_TIMER_OF=y ++CONFIG_ROCKCHIP_TIMER=y ++CONFIG_OWL_TIMER=y ++CONFIG_SUN4I_TIMER=y ++CONFIG_TEGRA_TIMER=y ++CONFIG_TEGRA186_TIMER=y ++CONFIG_NPCM7XX_TIMER=y ++CONFIG_ARM_ARCH_TIMER=y ++CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y ++CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND=y ++CONFIG_FSL_ERRATUM_A008585=y ++CONFIG_HISILICON_ERRATUM_161010101=y ++CONFIG_ARM64_ERRATUM_858921=y ++CONFIG_SUN50I_ERRATUM_UNKNOWN1=y ++CONFIG_ARM_TIMER_SP804=y ++CONFIG_CLKSRC_EXYNOS_MCT=y ++CONFIG_SYS_SUPPORTS_SH_CMT=y ++CONFIG_MTK_TIMER=y ++CONFIG_MTK_CPUX_TIMER=y ++CONFIG_SPRD_TIMER=y ++CONFIG_SYS_SUPPORTS_SH_TMU=y ++CONFIG_SH_TIMER_CMT=y ++CONFIG_RENESAS_OSTM=y ++CONFIG_SH_TIMER_TMU=y ++CONFIG_TIMER_IMX_SYS_CTR=y ++# end of Clock Source drivers ++ ++CONFIG_MAILBOX=y ++CONFIG_ARM_MHU=y ++# CONFIG_ARM_MHU_V2 is not set ++# CONFIG_ARM_MHU_V3 is not set ++CONFIG_IMX_MBOX=y ++CONFIG_PLATFORM_MHU=y ++# CONFIG_PL320_MBOX is not set ++# CONFIG_ARMADA_37XX_RWTM_MBOX is not set ++# CONFIG_OMAP2PLUS_MBOX is not set ++# CONFIG_ROCKCHIP_MBOX is not set ++CONFIG_PCC=y ++# CONFIG_ALTERA_MBOX is not set ++CONFIG_BCM2835_MBOX=y ++CONFIG_TI_MESSAGE_MANAGER=y ++CONFIG_HI3660_MBOX=y ++CONFIG_HI6220_MBOX=y ++# CONFIG_MAILBOX_TEST is not set ++CONFIG_QCOM_APCS_IPC=y ++CONFIG_TEGRA_HSP_MBOX=y ++# CONFIG_XGENE_SLIMPRO_MBOX is not set ++# CONFIG_BCM_PDC_MBOX is not set ++# CONFIG_BCM_FLEXRM_MBOX is not set ++# CONFIG_MTK_ADSP_MBOX is not set ++# CONFIG_MTK_CMDQ_MBOX is not set ++CONFIG_ZYNQMP_IPI_MBOX=y ++CONFIG_SUN6I_MSGBOX=y ++# CONFIG_SPRD_MBOX is not set ++# CONFIG_QCOM_CPUCP_MBOX is not set ++CONFIG_QCOM_IPCC=y ++CONFIG_IOMMU_IOVA=y ++CONFIG_IOMMU_API=y ++CONFIG_IOMMU_SUPPORT=y ++ ++# ++# Generic IOMMU Pagetable Support ++# ++CONFIG_IOMMU_IO_PGTABLE=y ++CONFIG_IOMMU_IO_PGTABLE_LPAE=y ++# CONFIG_IOMMU_IO_PGTABLE_LPAE_SELFTEST is not set ++CONFIG_IOMMU_IO_PGTABLE_ARMV7S=y ++# CONFIG_IOMMU_IO_PGTABLE_ARMV7S_SELFTEST is not set ++CONFIG_IOMMU_IO_PGTABLE_DART=y ++# end of Generic IOMMU Pagetable Support ++ ++# CONFIG_IOMMU_DEBUGFS is not set ++CONFIG_IOMMU_DEFAULT_DMA_STRICT=y ++# CONFIG_IOMMU_DEFAULT_DMA_LAZY is not set ++# CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set ++CONFIG_OF_IOMMU=y ++CONFIG_IOMMU_DMA=y ++# CONFIG_IOMMUFD is not set ++CONFIG_ROCKCHIP_IOMMU=y ++# CONFIG_SUN50I_IOMMU is not set ++CONFIG_TEGRA_IOMMU_SMMU=y ++# CONFIG_EXYNOS_IOMMU is not set ++# CONFIG_IPMMU_VMSA is not set ++CONFIG_APPLE_DART=y ++CONFIG_ARM_SMMU=y ++# CONFIG_ARM_SMMU_LEGACY_DT_BINDINGS is not set ++CONFIG_ARM_SMMU_DISABLE_BYPASS_BY_DEFAULT=y ++CONFIG_ARM_SMMU_QCOM=y ++# CONFIG_ARM_SMMU_QCOM_DEBUG is not set ++CONFIG_ARM_SMMU_V3=y ++# CONFIG_ARM_SMMU_V3_SVA is not set ++# CONFIG_TEGRA241_CMDQV is not set ++CONFIG_MTK_IOMMU=y ++CONFIG_QCOM_IOMMU=y ++# CONFIG_VIRTIO_IOMMU is not set ++# CONFIG_SPRD_IOMMU is not set ++ ++# ++# Remoteproc drivers ++# ++CONFIG_REMOTEPROC=y ++# CONFIG_REMOTEPROC_CDEV is not set ++CONFIG_IMX_REMOTEPROC=y ++# CONFIG_IMX_DSP_REMOTEPROC is not set ++# CONFIG_MTK_SCP is not set ++# CONFIG_QCOM_Q6V5_ADSP is not set ++# CONFIG_QCOM_Q6V5_MSS is not set ++# CONFIG_QCOM_Q6V5_PAS is not set ++# CONFIG_QCOM_Q6V5_WCSS is not set ++# CONFIG_QCOM_SYSMON is not set ++# CONFIG_QCOM_WCNSS_PIL is not set ++# CONFIG_RCAR_REMOTEPROC is not set ++# CONFIG_STM32_RPROC is not set ++# CONFIG_TI_K3_M4_REMOTEPROC is not set ++# CONFIG_XLNX_R5_REMOTEPROC is not set ++# end of Remoteproc drivers ++ ++# ++# Rpmsg drivers ++# ++CONFIG_RPMSG=y ++# CONFIG_RPMSG_CHAR is not set ++# CONFIG_RPMSG_CTRL is not set ++CONFIG_RPMSG_NS=y ++CONFIG_RPMSG_QCOM_GLINK=y ++CONFIG_RPMSG_QCOM_GLINK_RPM=y ++# CONFIG_RPMSG_QCOM_GLINK_SMEM is not set ++CONFIG_RPMSG_QCOM_SMD=y ++CONFIG_RPMSG_VIRTIO=y ++# end of Rpmsg drivers ++ ++# CONFIG_SOUNDWIRE is not set ++ ++# ++# SOC (System On Chip) specific Drivers ++# ++ ++# ++# Amlogic SoC drivers ++# ++# CONFIG_MESON_CANVAS is not set ++CONFIG_MESON_CLK_MEASURE=y ++CONFIG_MESON_GX_SOCINFO=y ++# end of Amlogic SoC drivers ++ ++# ++# Apple SoC drivers ++# ++CONFIG_APPLE_MAILBOX=y ++CONFIG_APPLE_RTKIT=y ++CONFIG_APPLE_SART=y ++# end of Apple SoC drivers ++ ++# ++# Broadcom SoC drivers ++# ++CONFIG_SOC_BRCMSTB=y ++# end of Broadcom SoC drivers ++ ++# ++# NXP/Freescale QorIQ SoC drivers ++# ++CONFIG_FSL_DPAA=y ++# CONFIG_FSL_DPAA_CHECKING is not set ++# CONFIG_FSL_BMAN_TEST is not set ++# CONFIG_FSL_QMAN_TEST is not set ++# CONFIG_QUICC_ENGINE is not set ++CONFIG_FSL_GUTS=y ++CONFIG_FSL_MC_DPIO=y ++CONFIG_DPAA2_CONSOLE=y ++CONFIG_FSL_RCPM=y ++# end of NXP/Freescale QorIQ SoC drivers ++ ++# ++# fujitsu SoC drivers ++# ++# CONFIG_A64FX_DIAG is not set ++# end of fujitsu SoC drivers ++ ++# ++# Hisilicon SoC drivers ++# ++# CONFIG_KUNPENG_HCCS is not set ++# end of Hisilicon SoC drivers ++ ++# ++# i.MX SoC drivers ++# ++CONFIG_SOC_IMX8M=y ++CONFIG_SOC_IMX9=y ++# end of i.MX SoC drivers ++ ++# ++# Enable LiteX SoC Builder specific drivers ++# ++# CONFIG_LITEX_SOC_CONTROLLER is not set ++# end of Enable LiteX SoC Builder specific drivers ++ ++# ++# MediaTek SoC drivers ++# ++# CONFIG_MTK_CMDQ is not set ++# CONFIG_MTK_DEVAPC is not set ++CONFIG_MTK_INFRACFG=y ++CONFIG_MTK_PMIC_WRAP=y ++CONFIG_MTK_REGULATOR_COUPLER=y ++# CONFIG_MTK_MMSYS is not set ++# CONFIG_MTK_SVS is not set ++CONFIG_MTK_SOCINFO=y ++# end of MediaTek SoC drivers ++ ++# CONFIG_WPCM450_SOC is not set ++ ++# ++# Qualcomm SoC drivers ++# ++CONFIG_QCOM_AOSS_QMP=y ++CONFIG_QCOM_COMMAND_DB=y ++CONFIG_QCOM_GENI_SE=y ++# CONFIG_QCOM_GSBI is not set ++# CONFIG_QCOM_LLCC is not set ++CONFIG_QCOM_KRYO_L2_ACCESSORS=y ++# CONFIG_QCOM_OCMEM is not set ++# CONFIG_QCOM_RAMP_CTRL is not set ++# CONFIG_QCOM_RMTFS_MEM is not set ++# CONFIG_QCOM_RPM_MASTER_STATS is not set ++CONFIG_QCOM_RPMH=y ++CONFIG_QCOM_SMEM=y ++CONFIG_QCOM_SMD_RPM=y ++CONFIG_QCOM_SMEM_STATE=y ++CONFIG_QCOM_SMP2P=y ++CONFIG_QCOM_SMSM=y ++# CONFIG_QCOM_SOCINFO is not set ++# CONFIG_QCOM_SPM is not set ++# CONFIG_QCOM_STATS is not set ++# CONFIG_QCOM_WCNSS_CTRL is not set ++# CONFIG_QCOM_APR is not set ++# CONFIG_QCOM_ICC_BWMON is not set ++# CONFIG_QCOM_PBS is not set ++# end of Qualcomm SoC drivers ++ ++CONFIG_SOC_RENESAS=y ++CONFIG_ARCH_RCAR_GEN3=y ++CONFIG_ARCH_RCAR_GEN4=y ++CONFIG_ARCH_RZG2L=y ++CONFIG_ARCH_R8A77995=y ++CONFIG_ARCH_R8A77990=y ++CONFIG_ARCH_R8A77951=y ++CONFIG_ARCH_R8A77965=y ++CONFIG_ARCH_R8A77960=y ++CONFIG_ARCH_R8A77961=y ++CONFIG_ARCH_R8A779F0=y ++CONFIG_ARCH_R8A77980=y ++CONFIG_ARCH_R8A77970=y ++CONFIG_ARCH_R8A779A0=y ++CONFIG_ARCH_R8A779G0=y ++# CONFIG_ARCH_R8A779H0 is not set ++CONFIG_ARCH_R8A774C0=y ++CONFIG_ARCH_R8A774E1=y ++CONFIG_ARCH_R8A774A1=y ++CONFIG_ARCH_R8A774B1=y ++CONFIG_ARCH_R9A07G043=y ++CONFIG_ARCH_R9A07G044=y ++CONFIG_ARCH_R9A07G054=y ++# CONFIG_ARCH_R9A08G045 is not set ++CONFIG_ARCH_R9A09G011=y ++# CONFIG_ARCH_R9A09G057 is not set ++CONFIG_PWC_RZV2M=y ++CONFIG_RST_RCAR=y ++CONFIG_ROCKCHIP_GRF=y ++CONFIG_ROCKCHIP_IODOMAIN=y ++CONFIG_SOC_SAMSUNG=y ++CONFIG_EXYNOS_CHIPID=y ++CONFIG_EXYNOS_USI=y ++CONFIG_EXYNOS_PMU=y ++CONFIG_SUNXI_MBUS=y ++CONFIG_SUNXI_SRAM=y ++CONFIG_ARCH_TEGRA_132_SOC=y ++CONFIG_ARCH_TEGRA_210_SOC=y ++CONFIG_ARCH_TEGRA_186_SOC=y ++CONFIG_ARCH_TEGRA_194_SOC=y ++CONFIG_ARCH_TEGRA_234_SOC=y ++# CONFIG_ARCH_TEGRA_241_SOC is not set ++CONFIG_SOC_TEGRA_FUSE=y ++CONFIG_SOC_TEGRA_FLOWCTRL=y ++CONFIG_SOC_TEGRA_PMC=y ++CONFIG_SOC_TEGRA_CBB=y ++CONFIG_SOC_TI=y ++CONFIG_TI_K3_RINGACC=y ++CONFIG_TI_K3_SOCINFO=y ++# CONFIG_TI_PRUSS is not set ++CONFIG_TI_SCI_INTA_MSI_DOMAIN=y ++ ++# ++# Xilinx SoC drivers ++# ++CONFIG_ZYNQMP_POWER=y ++CONFIG_XLNX_EVENT_MANAGER=y ++# end of Xilinx SoC drivers ++# end of SOC (System On Chip) specific Drivers ++ ++# ++# PM Domains ++# ++CONFIG_OWL_PM_DOMAINS_HELPER=y ++CONFIG_OWL_PM_DOMAINS=y ++ ++# ++# Amlogic PM Domains ++# ++CONFIG_MESON_EE_PM_DOMAINS=y ++CONFIG_MESON_SECURE_PM_DOMAINS=y ++# end of Amlogic PM Domains ++ ++CONFIG_APPLE_PMGR_PWRSTATE=y ++CONFIG_ARM_SCMI_PERF_DOMAIN=y ++CONFIG_ARM_SCMI_POWER_DOMAIN=y ++CONFIG_ARM_SCPI_POWER_DOMAIN=y ++ ++# ++# Broadcom PM Domains ++# ++CONFIG_BCM2835_POWER=y ++CONFIG_RASPBERRYPI_POWER=y ++CONFIG_BCM_PMB=y ++# end of Broadcom PM Domains ++ ++# ++# i.MX PM Domains ++# ++CONFIG_IMX_GPCV2_PM_DOMAINS=y ++CONFIG_IMX8M_BLK_CTRL=y ++CONFIG_IMX9_BLK_CTRL=y ++CONFIG_IMX_SCU_PD=y ++# end of i.MX PM Domains ++ ++# ++# MediaTek PM Domains ++# ++CONFIG_MTK_SCPSYS=y ++CONFIG_MTK_SCPSYS_PM_DOMAINS=y ++# end of MediaTek PM Domains ++ ++# ++# Qualcomm PM Domains ++# ++CONFIG_QCOM_CPR=y ++CONFIG_QCOM_RPMHPD=y ++CONFIG_QCOM_RPMPD=y ++# end of Qualcomm PM Domains ++ ++CONFIG_SYSC_RCAR=y ++CONFIG_SYSC_RCAR_GEN4=y ++CONFIG_SYSC_R8A77995=y ++CONFIG_SYSC_R8A77990=y ++CONFIG_SYSC_R8A7795=y ++CONFIG_SYSC_R8A77965=y ++CONFIG_SYSC_R8A77960=y ++CONFIG_SYSC_R8A77961=y ++CONFIG_SYSC_R8A779F0=y ++CONFIG_SYSC_R8A77980=y ++CONFIG_SYSC_R8A77970=y ++CONFIG_SYSC_R8A779A0=y ++CONFIG_SYSC_R8A779G0=y ++CONFIG_SYSC_R8A774C0=y ++CONFIG_SYSC_R8A774E1=y ++CONFIG_SYSC_R8A774A1=y ++CONFIG_SYSC_R8A774B1=y ++CONFIG_ROCKCHIP_PM_DOMAINS=y ++CONFIG_EXYNOS_PM_DOMAINS=y ++# CONFIG_SUN20I_PPU is not set ++CONFIG_SOC_TEGRA_POWERGATE_BPMP=y ++CONFIG_TI_SCI_PM_DOMAINS=y ++CONFIG_ZYNQMP_PM_DOMAINS=y ++# end of PM Domains ++ ++CONFIG_PM_DEVFREQ=y ++ ++# ++# DEVFREQ Governors ++# ++CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y ++# CONFIG_DEVFREQ_GOV_PERFORMANCE is not set ++# CONFIG_DEVFREQ_GOV_POWERSAVE is not set ++CONFIG_DEVFREQ_GOV_USERSPACE=y ++# CONFIG_DEVFREQ_GOV_PASSIVE is not set ++ ++# ++# DEVFREQ Drivers ++# ++# CONFIG_ARM_EXYNOS_BUS_DEVFREQ is not set ++CONFIG_ARM_IMX_BUS_DEVFREQ=y ++# CONFIG_ARM_IMX8M_DDRC_DEVFREQ is not set ++# CONFIG_ARM_TEGRA_DEVFREQ is not set ++# CONFIG_ARM_MEDIATEK_CCI_DEVFREQ is not set ++# CONFIG_ARM_RK3399_DMC_DEVFREQ is not set ++# CONFIG_ARM_SUN8I_A33_MBUS_DEVFREQ is not set ++# CONFIG_PM_DEVFREQ_EVENT is not set ++CONFIG_EXTCON=y ++ ++# ++# Extcon Device Drivers ++# ++# CONFIG_EXTCON_ADC_JACK is not set ++# CONFIG_EXTCON_FSA9480 is not set ++# CONFIG_EXTCON_GPIO is not set ++# CONFIG_EXTCON_LC824206XA is not set ++# CONFIG_EXTCON_MAX3355 is not set ++# CONFIG_EXTCON_PTN5150 is not set ++# CONFIG_EXTCON_QCOM_SPMI_MISC is not set ++# CONFIG_EXTCON_RT8973A is not set ++# CONFIG_EXTCON_SM5502 is not set ++CONFIG_EXTCON_USB_GPIO=y ++CONFIG_EXTCON_USBC_CROS_EC=y ++CONFIG_MEMORY=y ++# CONFIG_ARM_PL172_MPMC is not set ++CONFIG_BRCMSTB_DPFE=y ++CONFIG_BRCMSTB_MEMC=y ++# CONFIG_OMAP_GPMC is not set ++CONFIG_FSL_IFC=y ++CONFIG_MTK_SMI=y ++# CONFIG_RENESAS_RPCIF is not set ++# CONFIG_STM32_FMC2_EBI is not set ++CONFIG_TEGRA_MC=y ++# CONFIG_TEGRA210_EMC is not set ++CONFIG_IIO=y ++CONFIG_IIO_BUFFER=y ++# CONFIG_IIO_BUFFER_CB is not set ++# CONFIG_IIO_BUFFER_DMA is not set ++# CONFIG_IIO_BUFFER_DMAENGINE is not set ++# CONFIG_IIO_BUFFER_HW_CONSUMER is not set ++# CONFIG_IIO_KFIFO_BUF is not set ++# CONFIG_IIO_TRIGGERED_BUFFER is not set ++# CONFIG_IIO_CONFIGFS is not set ++CONFIG_IIO_TRIGGER=y ++CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 ++# CONFIG_IIO_SW_DEVICE is not set ++# CONFIG_IIO_SW_TRIGGER is not set ++# CONFIG_IIO_TRIGGERED_EVENT is not set ++ ++# ++# Accelerometers ++# ++# CONFIG_ADIS16201 is not set ++# CONFIG_ADIS16209 is not set ++# CONFIG_ADXL313_I2C is not set ++# CONFIG_ADXL313_SPI is not set ++# CONFIG_ADXL345_I2C is not set ++# CONFIG_ADXL345_SPI is not set ++# CONFIG_ADXL355_I2C is not set ++# CONFIG_ADXL355_SPI is not set ++# CONFIG_ADXL367_SPI is not set ++# CONFIG_ADXL367_I2C is not set ++# CONFIG_ADXL372_SPI is not set ++# CONFIG_ADXL372_I2C is not set ++# CONFIG_ADXL380_SPI is not set ++# CONFIG_ADXL380_I2C is not set ++# CONFIG_BMA180 is not set ++# CONFIG_BMA220 is not set ++# CONFIG_BMA400 is not set ++# CONFIG_BMC150_ACCEL is not set ++# CONFIG_BMI088_ACCEL is not set ++# CONFIG_DA280 is not set ++# CONFIG_DA311 is not set ++# CONFIG_DMARD06 is not set ++# CONFIG_DMARD09 is not set ++# CONFIG_DMARD10 is not set ++# CONFIG_FXLS8962AF_I2C is not set ++# CONFIG_FXLS8962AF_SPI is not set ++# CONFIG_IIO_ST_ACCEL_3AXIS is not set ++# CONFIG_IIO_KX022A_SPI is not set ++# CONFIG_IIO_KX022A_I2C is not set ++# CONFIG_KXSD9 is not set ++# CONFIG_KXCJK1013 is not set ++# CONFIG_MC3230 is not set ++# CONFIG_MMA7455_I2C is not set ++# CONFIG_MMA7455_SPI is not set ++# CONFIG_MMA7660 is not set ++# CONFIG_MMA8452 is not set ++# CONFIG_MMA9551 is not set ++# CONFIG_MMA9553 is not set ++# CONFIG_MSA311 is not set ++# CONFIG_MXC4005 is not set ++# CONFIG_MXC6255 is not set ++# CONFIG_SCA3000 is not set ++# CONFIG_SCA3300 is not set ++# CONFIG_STK8312 is not set ++# CONFIG_STK8BA50 is not set ++# end of Accelerometers ++ ++# ++# Analog to digital converters ++# ++# CONFIG_AD4000 is not set ++# CONFIG_AD4130 is not set ++# CONFIG_AD4695 is not set ++# CONFIG_AD7091R5 is not set ++# CONFIG_AD7091R8 is not set ++# CONFIG_AD7124 is not set ++# CONFIG_AD7173 is not set ++# CONFIG_AD7192 is not set ++# CONFIG_AD7266 is not set ++# CONFIG_AD7280 is not set ++# CONFIG_AD7291 is not set ++# CONFIG_AD7292 is not set ++# CONFIG_AD7298 is not set ++# CONFIG_AD7380 is not set ++# CONFIG_AD7476 is not set ++# CONFIG_AD7606_IFACE_PARALLEL is not set ++# CONFIG_AD7606_IFACE_SPI is not set ++# CONFIG_AD7766 is not set ++# CONFIG_AD7768_1 is not set ++# CONFIG_AD7780 is not set ++# CONFIG_AD7791 is not set ++# CONFIG_AD7793 is not set ++# CONFIG_AD7887 is not set ++# CONFIG_AD7923 is not set ++# CONFIG_AD7944 is not set ++# CONFIG_AD7949 is not set ++# CONFIG_AD799X is not set ++# CONFIG_AD9467 is not set ++# CONFIG_ADI_AXI_ADC is not set ++# CONFIG_AXP20X_ADC is not set ++# CONFIG_AXP288_ADC is not set ++# CONFIG_BCM_IPROC_ADC is not set ++# CONFIG_BERLIN2_ADC is not set ++# CONFIG_CC10001_ADC is not set ++# CONFIG_ENVELOPE_DETECTOR is not set ++CONFIG_EXYNOS_ADC=y ++# CONFIG_HI8435 is not set ++# CONFIG_HX711 is not set ++# CONFIG_INA2XX_ADC is not set ++# CONFIG_IMX7D_ADC is not set ++# CONFIG_IMX8QXP_ADC is not set ++# CONFIG_IMX93_ADC is not set ++# CONFIG_LTC2309 is not set ++# CONFIG_LTC2471 is not set ++# CONFIG_LTC2485 is not set ++# CONFIG_LTC2496 is not set ++# CONFIG_LTC2497 is not set ++# CONFIG_MAX1027 is not set ++# CONFIG_MAX11100 is not set ++# CONFIG_MAX1118 is not set ++# CONFIG_MAX11205 is not set ++# CONFIG_MAX11410 is not set ++# CONFIG_MAX1241 is not set ++# CONFIG_MAX1363 is not set ++# CONFIG_MAX34408 is not set ++# CONFIG_MAX9611 is not set ++# CONFIG_MCP320X is not set ++# CONFIG_MCP3422 is not set ++# CONFIG_MCP3564 is not set ++# CONFIG_MCP3911 is not set ++# CONFIG_MEDIATEK_MT6359_AUXADC is not set ++# CONFIG_MEDIATEK_MT6360_ADC is not set ++# CONFIG_MEDIATEK_MT6577_AUXADC is not set ++CONFIG_MESON_SARADC=y ++# CONFIG_NAU7802 is not set ++# CONFIG_NPCM_ADC is not set ++# CONFIG_PAC1921 is not set ++# CONFIG_PAC1934 is not set ++# CONFIG_QCOM_SPMI_RRADC is not set ++# CONFIG_QCOM_SPMI_IADC is not set ++# CONFIG_QCOM_SPMI_VADC is not set ++# CONFIG_QCOM_SPMI_ADC5 is not set ++# CONFIG_ROCKCHIP_SARADC is not set ++# CONFIG_RICHTEK_RTQ6056 is not set ++# CONFIG_RZG2L_ADC is not set ++# CONFIG_SD_ADC_MODULATOR is not set ++# CONFIG_STM32_ADC_CORE is not set ++# CONFIG_STM32_DFSDM_CORE is not set ++# CONFIG_STM32_DFSDM_ADC is not set ++# CONFIG_SUN20I_GPADC is not set ++# CONFIG_TI_ADC081C is not set ++# CONFIG_TI_ADC0832 is not set ++# CONFIG_TI_ADC084S021 is not set ++# CONFIG_TI_ADC12138 is not set ++# CONFIG_TI_ADC108S102 is not set ++# CONFIG_TI_ADC128S052 is not set ++# CONFIG_TI_ADC161S626 is not set ++# CONFIG_TI_ADS1015 is not set ++# CONFIG_TI_ADS1119 is not set ++# CONFIG_TI_ADS7924 is not set ++# CONFIG_TI_ADS1100 is not set ++# CONFIG_TI_ADS1298 is not set ++# CONFIG_TI_ADS7950 is not set ++# CONFIG_TI_ADS8344 is not set ++# CONFIG_TI_ADS8688 is not set ++# CONFIG_TI_ADS124S08 is not set ++# CONFIG_TI_ADS131E08 is not set ++# CONFIG_TI_LMP92064 is not set ++# CONFIG_TI_TLC4541 is not set ++# CONFIG_TI_TSC2046 is not set ++# CONFIG_VF610_ADC is not set ++# CONFIG_XILINX_XADC is not set ++# CONFIG_XILINX_AMS is not set ++# end of Analog to digital converters ++ ++# ++# Analog to digital and digital to analog converters ++# ++# CONFIG_AD74115 is not set ++# CONFIG_AD74413R is not set ++# end of Analog to digital and digital to analog converters ++ ++# ++# Analog Front Ends ++# ++# CONFIG_IIO_RESCALE is not set ++# end of Analog Front Ends ++ ++# ++# Amplifiers ++# ++# CONFIG_AD8366 is not set ++# CONFIG_ADA4250 is not set ++# CONFIG_HMC425 is not set ++# end of Amplifiers ++ ++# ++# Capacitance to digital converters ++# ++# CONFIG_AD7150 is not set ++# CONFIG_AD7746 is not set ++# end of Capacitance to digital converters ++ ++# ++# Chemical Sensors ++# ++# CONFIG_AOSONG_AGS02MA is not set ++# CONFIG_ATLAS_PH_SENSOR is not set ++# CONFIG_ATLAS_EZO_SENSOR is not set ++# CONFIG_BME680 is not set ++# CONFIG_CCS811 is not set ++# CONFIG_ENS160 is not set ++# CONFIG_IAQCORE is not set ++# CONFIG_PMS7003 is not set ++# CONFIG_SCD30_CORE is not set ++# CONFIG_SCD4X is not set ++# CONFIG_SENSIRION_SGP30 is not set ++# CONFIG_SENSIRION_SGP40 is not set ++# CONFIG_SPS30_I2C is not set ++# CONFIG_SPS30_SERIAL is not set ++# CONFIG_SENSEAIR_SUNRISE_CO2 is not set ++# CONFIG_VZ89X is not set ++# end of Chemical Sensors ++ ++# CONFIG_IIO_CROS_EC_SENSORS_CORE is not set ++ ++# ++# Hid Sensor IIO Common ++# ++# end of Hid Sensor IIO Common ++ ++# ++# IIO SCMI Sensors ++# ++# CONFIG_IIO_SCMI is not set ++# end of IIO SCMI Sensors ++ ++# ++# SSP Sensor Common ++# ++# CONFIG_IIO_SSP_SENSORHUB is not set ++# end of SSP Sensor Common ++ ++# ++# Digital to analog converters ++# ++# CONFIG_AD3552R is not set ++# CONFIG_AD5064 is not set ++# CONFIG_AD5360 is not set ++# CONFIG_AD5380 is not set ++# CONFIG_AD5421 is not set ++# CONFIG_AD5446 is not set ++# CONFIG_AD5449 is not set ++# CONFIG_AD5592R is not set ++# CONFIG_AD5593R is not set ++# CONFIG_AD5504 is not set ++# CONFIG_AD5624R_SPI is not set ++# CONFIG_AD9739A is not set ++# CONFIG_ADI_AXI_DAC is not set ++# CONFIG_LTC2688 is not set ++# CONFIG_AD5686_SPI is not set ++# CONFIG_AD5696_I2C is not set ++# CONFIG_AD5755 is not set ++# CONFIG_AD5758 is not set ++# CONFIG_AD5761 is not set ++# CONFIG_AD5764 is not set ++# CONFIG_AD5766 is not set ++# CONFIG_AD5770R is not set ++# CONFIG_AD5791 is not set ++# CONFIG_AD7293 is not set ++# CONFIG_AD7303 is not set ++# CONFIG_AD8801 is not set ++# CONFIG_DPOT_DAC is not set ++# CONFIG_DS4424 is not set ++# CONFIG_LTC1660 is not set ++# CONFIG_LTC2632 is not set ++# CONFIG_LTC2664 is not set ++# CONFIG_M62332 is not set ++# CONFIG_MAX517 is not set ++# CONFIG_MAX5522 is not set ++# CONFIG_MAX5821 is not set ++# CONFIG_MCP4725 is not set ++# CONFIG_MCP4728 is not set ++# CONFIG_MCP4821 is not set ++# CONFIG_MCP4922 is not set ++# CONFIG_STM32_DAC is not set ++# CONFIG_TI_DAC082S085 is not set ++# CONFIG_TI_DAC5571 is not set ++# CONFIG_TI_DAC7311 is not set ++# CONFIG_TI_DAC7612 is not set ++# CONFIG_VF610_DAC is not set ++# end of Digital to analog converters ++ ++# ++# IIO dummy driver ++# ++# end of IIO dummy driver ++ ++# ++# Filters ++# ++# CONFIG_ADMV8818 is not set ++# end of Filters ++ ++# ++# Frequency Synthesizers DDS/PLL ++# ++ ++# ++# Clock Generator/Distribution ++# ++# CONFIG_AD9523 is not set ++# end of Clock Generator/Distribution ++ ++# ++# Phase-Locked Loop (PLL) frequency synthesizers ++# ++# CONFIG_ADF4350 is not set ++# CONFIG_ADF4371 is not set ++# CONFIG_ADF4377 is not set ++# CONFIG_ADMFM2000 is not set ++# CONFIG_ADMV1013 is not set ++# CONFIG_ADMV1014 is not set ++# CONFIG_ADMV4420 is not set ++# CONFIG_ADRF6780 is not set ++# end of Phase-Locked Loop (PLL) frequency synthesizers ++# end of Frequency Synthesizers DDS/PLL ++ ++# ++# Digital gyroscope sensors ++# ++# CONFIG_ADIS16080 is not set ++# CONFIG_ADIS16130 is not set ++# CONFIG_ADIS16136 is not set ++# CONFIG_ADIS16260 is not set ++# CONFIG_ADXRS290 is not set ++# CONFIG_ADXRS450 is not set ++# CONFIG_BMG160 is not set ++# CONFIG_FXAS21002C is not set ++# CONFIG_MPU3050_I2C is not set ++# CONFIG_IIO_ST_GYRO_3AXIS is not set ++# CONFIG_ITG3200 is not set ++# end of Digital gyroscope sensors ++ ++# ++# Health Sensors ++# ++ ++# ++# Heart Rate Monitors ++# ++# CONFIG_AFE4403 is not set ++# CONFIG_AFE4404 is not set ++# CONFIG_MAX30100 is not set ++# CONFIG_MAX30102 is not set ++# end of Heart Rate Monitors ++# end of Health Sensors ++ ++# ++# Humidity sensors ++# ++# CONFIG_AM2315 is not set ++# CONFIG_DHT11 is not set ++# CONFIG_ENS210 is not set ++# CONFIG_HDC100X is not set ++# CONFIG_HDC2010 is not set ++# CONFIG_HDC3020 is not set ++# CONFIG_HTS221 is not set ++# CONFIG_HTU21 is not set ++# CONFIG_SI7005 is not set ++# CONFIG_SI7020 is not set ++# end of Humidity sensors ++ ++# ++# Inertial measurement units ++# ++# CONFIG_ADIS16400 is not set ++# CONFIG_ADIS16460 is not set ++# CONFIG_ADIS16475 is not set ++# CONFIG_ADIS16480 is not set ++# CONFIG_BMI160_I2C is not set ++# CONFIG_BMI160_SPI is not set ++# CONFIG_BMI323_I2C is not set ++# CONFIG_BMI323_SPI is not set ++# CONFIG_BOSCH_BNO055_SERIAL is not set ++# CONFIG_BOSCH_BNO055_I2C is not set ++# CONFIG_FXOS8700_I2C is not set ++# CONFIG_FXOS8700_SPI is not set ++# CONFIG_KMX61 is not set ++# CONFIG_INV_ICM42600_I2C is not set ++# CONFIG_INV_ICM42600_SPI is not set ++# CONFIG_INV_MPU6050_I2C is not set ++# CONFIG_INV_MPU6050_SPI is not set ++# CONFIG_IIO_ST_LSM6DSX is not set ++# CONFIG_IIO_ST_LSM9DS0 is not set ++# end of Inertial measurement units ++ ++# ++# Light sensors ++# ++# CONFIG_ACPI_ALS is not set ++# CONFIG_ADJD_S311 is not set ++# CONFIG_ADUX1020 is not set ++# CONFIG_AL3010 is not set ++# CONFIG_AL3320A is not set ++# CONFIG_APDS9300 is not set ++# CONFIG_APDS9306 is not set ++# CONFIG_APDS9960 is not set ++# CONFIG_AS73211 is not set ++# CONFIG_BH1745 is not set ++# CONFIG_BH1750 is not set ++# CONFIG_BH1780 is not set ++# CONFIG_CM32181 is not set ++# CONFIG_CM3232 is not set ++# CONFIG_CM3323 is not set ++# CONFIG_CM3605 is not set ++# CONFIG_CM36651 is not set ++# CONFIG_GP2AP002 is not set ++# CONFIG_GP2AP020A00F is not set ++# CONFIG_SENSORS_ISL29018 is not set ++# CONFIG_SENSORS_ISL29028 is not set ++# CONFIG_ISL29125 is not set ++# CONFIG_ISL76682 is not set ++# CONFIG_JSA1212 is not set ++# CONFIG_ROHM_BU27008 is not set ++# CONFIG_ROHM_BU27034 is not set ++# CONFIG_RPR0521 is not set ++# CONFIG_LTR390 is not set ++# CONFIG_LTR501 is not set ++# CONFIG_LTRF216A is not set ++# CONFIG_LV0104CS is not set ++# CONFIG_MAX44000 is not set ++# CONFIG_MAX44009 is not set ++# CONFIG_NOA1305 is not set ++# CONFIG_OPT3001 is not set ++# CONFIG_OPT4001 is not set ++# CONFIG_PA12203001 is not set ++# CONFIG_SI1133 is not set ++# CONFIG_SI1145 is not set ++# CONFIG_STK3310 is not set ++# CONFIG_ST_UVIS25 is not set ++# CONFIG_TCS3414 is not set ++# CONFIG_TCS3472 is not set ++# CONFIG_SENSORS_TSL2563 is not set ++# CONFIG_TSL2583 is not set ++# CONFIG_TSL2591 is not set ++# CONFIG_TSL2772 is not set ++# CONFIG_TSL4531 is not set ++# CONFIG_US5182D is not set ++# CONFIG_VCNL4000 is not set ++# CONFIG_VCNL4035 is not set ++# CONFIG_VEML6030 is not set ++# CONFIG_VEML6040 is not set ++# CONFIG_VEML6070 is not set ++# CONFIG_VEML6075 is not set ++# CONFIG_VL6180 is not set ++# CONFIG_ZOPT2201 is not set ++# end of Light sensors ++ ++# ++# Magnetometer sensors ++# ++# CONFIG_AF8133J is not set ++# CONFIG_AK8974 is not set ++# CONFIG_AK8975 is not set ++# CONFIG_AK09911 is not set ++# CONFIG_BMC150_MAGN_I2C is not set ++# CONFIG_BMC150_MAGN_SPI is not set ++# CONFIG_MAG3110 is not set ++# CONFIG_MMC35240 is not set ++# CONFIG_IIO_ST_MAGN_3AXIS is not set ++# CONFIG_SENSORS_HMC5843_I2C is not set ++# CONFIG_SENSORS_HMC5843_SPI is not set ++# CONFIG_SENSORS_RM3100_I2C is not set ++# CONFIG_SENSORS_RM3100_SPI is not set ++# CONFIG_TI_TMAG5273 is not set ++# CONFIG_YAMAHA_YAS530 is not set ++# end of Magnetometer sensors ++ ++# ++# Multiplexers ++# ++# CONFIG_IIO_MUX is not set ++# end of Multiplexers ++ ++# ++# Inclinometer sensors ++# ++# end of Inclinometer sensors ++ ++# ++# Triggers - standalone ++# ++# CONFIG_IIO_INTERRUPT_TRIGGER is not set ++# CONFIG_IIO_SYSFS_TRIGGER is not set ++# end of Triggers - standalone ++ ++# ++# Linear and angular position sensors ++# ++# end of Linear and angular position sensors ++ ++# ++# Digital potentiometers ++# ++# CONFIG_AD5110 is not set ++# CONFIG_AD5272 is not set ++# CONFIG_DS1803 is not set ++# CONFIG_MAX5432 is not set ++# CONFIG_MAX5481 is not set ++# CONFIG_MAX5487 is not set ++# CONFIG_MCP4018 is not set ++# CONFIG_MCP4131 is not set ++# CONFIG_MCP4531 is not set ++# CONFIG_MCP41010 is not set ++# CONFIG_TPL0102 is not set ++# CONFIG_X9250 is not set ++# end of Digital potentiometers ++ ++# ++# Digital potentiostats ++# ++# CONFIG_LMP91000 is not set ++# end of Digital potentiostats ++ ++# ++# Pressure sensors ++# ++# CONFIG_ABP060MG is not set ++# CONFIG_ROHM_BM1390 is not set ++# CONFIG_BMP280 is not set ++# CONFIG_DLHL60D is not set ++# CONFIG_DPS310 is not set ++# CONFIG_HP03 is not set ++# CONFIG_HSC030PA is not set ++# CONFIG_ICP10100 is not set ++# CONFIG_MPL115_I2C is not set ++# CONFIG_MPL115_SPI is not set ++# CONFIG_MPL3115 is not set ++# CONFIG_MPRLS0025PA is not set ++# CONFIG_MS5611 is not set ++# CONFIG_MS5637 is not set ++# CONFIG_SDP500 is not set ++# CONFIG_IIO_ST_PRESS is not set ++# CONFIG_T5403 is not set ++# CONFIG_HP206C is not set ++# CONFIG_ZPA2326 is not set ++# end of Pressure sensors ++ ++# ++# Lightning sensors ++# ++# CONFIG_AS3935 is not set ++# end of Lightning sensors ++ ++# ++# Proximity and distance sensors ++# ++# CONFIG_CROS_EC_MKBP_PROXIMITY is not set ++# CONFIG_HX9023S is not set ++# CONFIG_IRSD200 is not set ++# CONFIG_ISL29501 is not set ++# CONFIG_LIDAR_LITE_V2 is not set ++# CONFIG_MB1232 is not set ++# CONFIG_PING is not set ++# CONFIG_RFD77402 is not set ++# CONFIG_SRF04 is not set ++# CONFIG_SX9310 is not set ++# CONFIG_SX9324 is not set ++# CONFIG_SX9360 is not set ++# CONFIG_SX9500 is not set ++# CONFIG_SRF08 is not set ++# CONFIG_VCNL3020 is not set ++# CONFIG_VL53L0X_I2C is not set ++# CONFIG_AW96103 is not set ++# end of Proximity and distance sensors ++ ++# ++# Resolver to digital converters ++# ++# CONFIG_AD2S90 is not set ++# CONFIG_AD2S1200 is not set ++# CONFIG_AD2S1210 is not set ++# end of Resolver to digital converters ++ ++# ++# Temperature sensors ++# ++# CONFIG_LTC2983 is not set ++# CONFIG_MAXIM_THERMOCOUPLE is not set ++# CONFIG_MLX90614 is not set ++# CONFIG_MLX90632 is not set ++# CONFIG_MLX90635 is not set ++# CONFIG_TMP006 is not set ++# CONFIG_TMP007 is not set ++# CONFIG_TMP117 is not set ++# CONFIG_TSYS01 is not set ++# CONFIG_TSYS02D is not set ++# CONFIG_MAX30208 is not set ++# CONFIG_MAX31856 is not set ++# CONFIG_MAX31865 is not set ++# CONFIG_MCP9600 is not set ++# end of Temperature sensors ++ ++# CONFIG_NTB is not set ++CONFIG_PWM=y ++# CONFIG_PWM_DEBUG is not set ++# CONFIG_PWM_APPLE is not set ++# CONFIG_PWM_ATMEL_TCB is not set ++# CONFIG_PWM_AXI_PWMGEN is not set ++CONFIG_PWM_BCM_IPROC=y ++# CONFIG_PWM_BCM2835 is not set ++# CONFIG_PWM_BERLIN is not set ++# CONFIG_PWM_BRCMSTB is not set ++# CONFIG_PWM_CLK is not set ++# CONFIG_PWM_CROS_EC is not set ++# CONFIG_PWM_DWC is not set ++# CONFIG_PWM_FSL_FTM is not set ++# CONFIG_PWM_GPIO is not set ++# CONFIG_PWM_HIBVT is not set ++# CONFIG_PWM_IMX1 is not set ++# CONFIG_PWM_IMX27 is not set ++# CONFIG_PWM_IMX_TPM is not set ++# CONFIG_PWM_KEEMBAY is not set ++# CONFIG_PWM_MESON is not set ++# CONFIG_PWM_MTK_DISP is not set ++# CONFIG_PWM_MEDIATEK is not set ++# CONFIG_PWM_OMAP_DMTIMER is not set ++# CONFIG_PWM_PCA9685 is not set ++# CONFIG_PWM_RASPBERRYPI_POE is not set ++# CONFIG_PWM_RCAR is not set ++# CONFIG_PWM_RENESAS_TPU is not set ++CONFIG_PWM_ROCKCHIP=y ++# CONFIG_PWM_RZ_MTU3 is not set ++CONFIG_PWM_SAMSUNG=y ++# CONFIG_PWM_SL28CPLD is not set ++# CONFIG_PWM_SPRD is not set ++# CONFIG_PWM_SUN4I is not set ++# CONFIG_PWM_TEGRA is not set ++# CONFIG_PWM_TIECAP is not set ++# CONFIG_PWM_TIEHRPWM is not set ++# CONFIG_PWM_VISCONTI is not set ++# CONFIG_PWM_XILINX is not set ++ ++# ++# IRQ chip support ++# ++CONFIG_IRQCHIP=y ++CONFIG_ARM_GIC=y ++CONFIG_ARM_GIC_PM=y ++CONFIG_ARM_GIC_MAX_NR=1 ++CONFIG_ARM_GIC_V2M=y ++CONFIG_ARM_GIC_V3=y ++CONFIG_ARM_GIC_V3_ITS=y ++CONFIG_ARM_GIC_V3_ITS_FSL_MC=y ++CONFIG_IRQ_MSI_LIB=y ++CONFIG_ALPINE_MSI=y ++# CONFIG_AL_FIC is not set ++CONFIG_BCM7038_L1_IRQ=y ++CONFIG_BCM7120_L2_IRQ=y ++CONFIG_BRCMSTB_L2_IRQ=y ++CONFIG_DW_APB_ICTL=y ++CONFIG_HISILICON_IRQ_MBIGEN=y ++# CONFIG_LAN966X_OIC is not set ++CONFIG_RENESAS_IRQC=y ++CONFIG_RENESAS_RZG2L_IRQC=y ++CONFIG_SL28CPLD_INTC=y ++CONFIG_SUN6I_R_INTC=y ++CONFIG_SUNXI_NMI_INTC=y ++# CONFIG_XILINX_INTC is not set ++CONFIG_IMX_GPCV2=y ++CONFIG_MVEBU_GICP=y ++CONFIG_MVEBU_ICU=y ++CONFIG_MVEBU_ODMI=y ++CONFIG_MVEBU_PIC=y ++CONFIG_MVEBU_SEI=y ++CONFIG_LS_EXTIRQ=y ++CONFIG_LS_SCFG_MSI=y ++CONFIG_PARTITION_PERCPU=y ++CONFIG_STM32MP_EXTI=y ++CONFIG_QCOM_IRQ_COMBINER=y ++CONFIG_IRQ_UNIPHIER_AIDET=y ++CONFIG_MESON_IRQ_GPIO=y ++CONFIG_QCOM_PDC=y ++CONFIG_QCOM_MPM=y ++CONFIG_IMX_IRQSTEER=y ++CONFIG_IMX_INTMUX=y ++# CONFIG_IMX_MU_MSI is not set ++CONFIG_TI_SCI_INTR_IRQCHIP=y ++CONFIG_TI_SCI_INTA_IRQCHIP=y ++CONFIG_MST_IRQ=y ++CONFIG_APPLE_AIC=y ++# end of IRQ chip support ++ ++# CONFIG_IPACK_BUS is not set ++CONFIG_ARCH_HAS_RESET_CONTROLLER=y ++CONFIG_RESET_CONTROLLER=y ++# CONFIG_RESET_BERLIN is not set ++CONFIG_RESET_BRCMSTB=y ++CONFIG_RESET_BRCMSTB_RESCAL=y ++# CONFIG_RESET_GPIO is not set ++CONFIG_RESET_IMX7=y ++CONFIG_RESET_IMX8MP_AUDIOMIX=y ++# CONFIG_RESET_MCHP_SPARX5 is not set ++CONFIG_RESET_MESON=y ++# CONFIG_RESET_MESON_AUDIO_ARB is not set ++CONFIG_RESET_NPCM=y ++CONFIG_RESET_NUVOTON_MA35D1=y ++CONFIG_RESET_QCOM_AOSS=y ++# CONFIG_RESET_QCOM_PDC is not set ++# CONFIG_RESET_RASPBERRYPI is not set ++CONFIG_RESET_RZG2L_USBPHY_CTRL=y ++CONFIG_RESET_SCMI=y ++CONFIG_RESET_SIMPLE=y ++CONFIG_RESET_SUNXI=y ++CONFIG_RESET_TI_SCI=y ++# CONFIG_RESET_TI_SYSCON is not set ++# CONFIG_RESET_TI_TPS380X is not set ++CONFIG_RESET_UNIPHIER=y ++CONFIG_RESET_UNIPHIER_GLUE=y ++CONFIG_RESET_ZYNQMP=y ++CONFIG_COMMON_RESET_HI3660=y ++CONFIG_COMMON_RESET_HI6220=y ++CONFIG_RESET_TEGRA_BPMP=y ++ ++# ++# PHY Subsystem ++# ++CONFIG_GENERIC_PHY=y ++CONFIG_GENERIC_PHY_MIPI_DPHY=y ++CONFIG_PHY_XGENE=y ++# CONFIG_PHY_CAN_TRANSCEIVER is not set ++CONFIG_PHY_SUN4I_USB=y ++# CONFIG_PHY_SUN6I_MIPI_DPHY is not set ++# CONFIG_PHY_SUN9I_USB is not set ++# CONFIG_PHY_SUN50I_USB3 is not set ++CONFIG_PHY_MESON8B_USB2=y ++CONFIG_PHY_MESON_GXL_USB2=y ++CONFIG_PHY_MESON_G12A_MIPI_DPHY_ANALOG=y ++CONFIG_PHY_MESON_G12A_USB2=y ++CONFIG_PHY_MESON_G12A_USB3_PCIE=y ++CONFIG_PHY_MESON_AXG_PCIE=y ++CONFIG_PHY_MESON_AXG_MIPI_PCIE_ANALOG=y ++CONFIG_PHY_MESON_AXG_MIPI_DPHY=y ++ ++# ++# PHY drivers for Broadcom platforms ++# ++CONFIG_PHY_BCM_SR_USB=y ++# CONFIG_BCM_KONA_USB2_PHY is not set ++# CONFIG_PHY_BCM_NS_USB2 is not set ++# CONFIG_PHY_BCM_NS_USB3 is not set ++CONFIG_PHY_NS2_PCIE=y ++CONFIG_PHY_NS2_USB_DRD=y ++CONFIG_PHY_BRCM_SATA=y ++CONFIG_PHY_BRCM_USB=y ++CONFIG_PHY_BCM_SR_PCIE=y ++# end of PHY drivers for Broadcom platforms ++ ++# CONFIG_PHY_CADENCE_TORRENT is not set ++# CONFIG_PHY_CADENCE_DPHY is not set ++# CONFIG_PHY_CADENCE_DPHY_RX is not set ++# CONFIG_PHY_CADENCE_SIERRA is not set ++# CONFIG_PHY_CADENCE_SALVO is not set ++CONFIG_PHY_FSL_IMX8MQ_USB=y ++# CONFIG_PHY_MIXEL_LVDS_PHY is not set ++# CONFIG_PHY_MIXEL_MIPI_DPHY is not set ++CONFIG_PHY_FSL_IMX8M_PCIE=y ++# CONFIG_PHY_FSL_IMX8QM_HSIO is not set ++# CONFIG_PHY_FSL_SAMSUNG_HDMI_PHY is not set ++# CONFIG_PHY_FSL_LYNX_28G is not set ++CONFIG_PHY_HI6220_USB=y ++# CONFIG_PHY_HI3660_USB is not set ++# CONFIG_PHY_HI3670_USB is not set ++# CONFIG_PHY_HI3670_PCIE is not set ++CONFIG_PHY_HISTB_COMBPHY=y ++CONFIG_PHY_HISI_INNO_USB2=y ++# CONFIG_PHY_BERLIN_SATA is not set ++# CONFIG_PHY_BERLIN_USB is not set ++CONFIG_PHY_MVEBU_A3700_COMPHY=y ++CONFIG_PHY_MVEBU_A3700_UTMI=y ++# CONFIG_PHY_MVEBU_A38X_COMPHY is not set ++CONFIG_PHY_MVEBU_CP110_COMPHY=y ++# CONFIG_PHY_MVEBU_CP110_UTMI is not set ++# CONFIG_PHY_PXA_28NM_HSIC is not set ++# CONFIG_PHY_PXA_28NM_USB2 is not set ++# CONFIG_PHY_MTK_PCIE is not set ++# CONFIG_PHY_MTK_XFI_TPHY is not set ++CONFIG_PHY_MTK_TPHY=y ++# CONFIG_PHY_MTK_UFS is not set ++# CONFIG_PHY_MTK_XSPHY is not set ++# CONFIG_PHY_MTK_HDMI is not set ++# CONFIG_PHY_MTK_MIPI_CSI_0_5 is not set ++# CONFIG_PHY_MTK_MIPI_DSI is not set ++# CONFIG_PHY_MTK_DP is not set ++# CONFIG_PHY_SPARX5_SERDES is not set ++# CONFIG_PHY_LAN966X_SERDES is not set ++# CONFIG_PHY_CPCAP_USB is not set ++# CONFIG_PHY_MAPPHONE_MDM6600 is not set ++# CONFIG_PHY_OCELOT_SERDES is not set ++# CONFIG_PHY_MA35_USB is not set ++# CONFIG_PHY_QCOM_APQ8064_SATA is not set ++# CONFIG_PHY_QCOM_EDP is not set ++# CONFIG_PHY_QCOM_IPQ4019_USB is not set ++# CONFIG_PHY_QCOM_IPQ806X_SATA is not set ++# CONFIG_PHY_QCOM_PCIE2 is not set ++# CONFIG_PHY_QCOM_QMP is not set ++# CONFIG_PHY_QCOM_QUSB2 is not set ++# CONFIG_PHY_QCOM_SNPS_EUSB2 is not set ++# CONFIG_PHY_QCOM_EUSB2_REPEATER is not set ++# CONFIG_PHY_QCOM_M31_USB is not set ++# CONFIG_PHY_QCOM_USB_HS is not set ++# CONFIG_PHY_QCOM_USB_SNPS_FEMTO_V2 is not set ++# CONFIG_PHY_QCOM_USB_HSIC is not set ++# CONFIG_PHY_QCOM_USB_HS_28NM is not set ++# CONFIG_PHY_QCOM_USB_SS is not set ++# CONFIG_PHY_QCOM_IPQ806X_USB is not set ++# CONFIG_PHY_QCOM_SGMII_ETH is not set ++# CONFIG_PHY_RTK_RTD_USB2PHY is not set ++# CONFIG_PHY_RTK_RTD_USB3PHY is not set ++CONFIG_PHY_R8A779F0_ETHERNET_SERDES=y ++# CONFIG_PHY_RCAR_GEN2 is not set ++CONFIG_PHY_RCAR_GEN3_PCIE=y ++CONFIG_PHY_RCAR_GEN3_USB2=y ++# CONFIG_PHY_RCAR_GEN3_USB3 is not set ++# CONFIG_PHY_ROCKCHIP_DP is not set ++# CONFIG_PHY_ROCKCHIP_DPHY_RX0 is not set ++CONFIG_PHY_ROCKCHIP_EMMC=y ++# CONFIG_PHY_ROCKCHIP_INNO_HDMI is not set ++CONFIG_PHY_ROCKCHIP_INNO_USB2=y ++# CONFIG_PHY_ROCKCHIP_INNO_CSIDPHY is not set ++# CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY is not set ++# CONFIG_PHY_ROCKCHIP_NANENG_COMBO_PHY is not set ++# CONFIG_PHY_ROCKCHIP_PCIE is not set ++# CONFIG_PHY_ROCKCHIP_SAMSUNG_HDPTX is not set ++CONFIG_PHY_ROCKCHIP_SNPS_PCIE3=y ++CONFIG_PHY_ROCKCHIP_TYPEC=y ++# CONFIG_PHY_ROCKCHIP_USB is not set ++CONFIG_PHY_EXYNOS_DP_VIDEO=y ++CONFIG_PHY_EXYNOS_MIPI_VIDEO=y ++# CONFIG_PHY_EXYNOS_PCIE is not set ++CONFIG_PHY_SAMSUNG_UFS=y ++CONFIG_PHY_SAMSUNG_USB2=y ++CONFIG_PHY_EXYNOS5_USBDRD=y ++CONFIG_PHY_UNIPHIER_USB2=y ++CONFIG_PHY_UNIPHIER_USB3=y ++# CONFIG_PHY_UNIPHIER_PCIE is not set ++CONFIG_PHY_UNIPHIER_AHCI=y ++# CONFIG_PHY_STM32_USBPHYC is not set ++CONFIG_PHY_TEGRA_XUSB=y ++# CONFIG_PHY_TEGRA194_P2U is not set ++# CONFIG_PHY_AM654_SERDES is not set ++# CONFIG_PHY_J721E_WIZ is not set ++# CONFIG_OMAP_USB2 is not set ++# CONFIG_PHY_TUSB1210 is not set ++CONFIG_PHY_TI_GMII_SEL=y ++# CONFIG_PHY_INTEL_KEEMBAY_EMMC is not set ++# CONFIG_PHY_INTEL_KEEMBAY_USB is not set ++# CONFIG_PHY_XILINX_ZYNQMP is not set ++# end of PHY Subsystem ++ ++# CONFIG_POWERCAP is not set ++# CONFIG_MCB is not set ++ ++# ++# Performance monitor support ++# ++# CONFIG_ARM_CCI_PMU is not set ++# CONFIG_ARM_CCN is not set ++# CONFIG_ARM_CMN is not set ++# CONFIG_ARM_NI is not set ++CONFIG_ARM_PMU=y ++CONFIG_ARM_PMU_ACPI=y ++# CONFIG_ARM_SMMU_V3_PMU is not set ++CONFIG_ARM_PMUV3=y ++# CONFIG_ARM_DSU_PMU is not set ++# CONFIG_FSL_IMX8_DDR_PMU is not set ++# CONFIG_FSL_IMX9_DDR_PMU is not set ++CONFIG_QCOM_L2_PMU=y ++CONFIG_QCOM_L3_PMU=y ++# CONFIG_THUNDERX2_PMU is not set ++# CONFIG_XGENE_PMU is not set ++# CONFIG_ARM_SPE_PMU is not set ++# CONFIG_ARM_DMC620_PMU is not set ++# CONFIG_MARVELL_CN10K_TAD_PMU is not set ++# CONFIG_APPLE_M1_CPU_PMU is not set ++# CONFIG_ALIBABA_UNCORE_DRW_PMU is not set ++CONFIG_HISI_PMU=y ++# CONFIG_HISI_PCIE_PMU is not set ++# CONFIG_HNS3_PMU is not set ++# CONFIG_MARVELL_CN10K_DDR_PMU is not set ++# CONFIG_DWC_PCIE_PMU is not set ++# CONFIG_ARM_CORESIGHT_PMU_ARCH_SYSTEM_PMU is not set ++# CONFIG_MESON_DDR_PMU is not set ++# end of Performance monitor support ++ ++CONFIG_RAS=y ++# CONFIG_USB4 is not set ++ ++# ++# Android ++# ++# CONFIG_ANDROID_BINDER_IPC is not set ++# end of Android ++ ++# CONFIG_LIBNVDIMM is not set ++# CONFIG_DAX is not set ++CONFIG_NVMEM=y ++CONFIG_NVMEM_SYSFS=y ++CONFIG_NVMEM_LAYOUTS=y ++ ++# ++# Layout Types ++# ++# CONFIG_NVMEM_LAYOUT_SL28_VPD is not set ++# CONFIG_NVMEM_LAYOUT_ONIE_TLV is not set ++# CONFIG_NVMEM_LAYOUT_U_BOOT_ENV is not set ++# end of Layout Types ++ ++CONFIG_NVMEM_APPLE_EFUSES=y ++CONFIG_NVMEM_BCM_OCOTP=y ++# CONFIG_NVMEM_IMX_IIM is not set ++CONFIG_NVMEM_IMX_OCOTP=y ++# CONFIG_NVMEM_IMX_OCOTP_ELE is not set ++CONFIG_NVMEM_IMX_OCOTP_SCU=y ++# CONFIG_NVMEM_LAYERSCAPE_SFP is not set ++# CONFIG_NVMEM_MESON_EFUSE is not set ++# CONFIG_NVMEM_MESON_MX_EFUSE is not set ++CONFIG_NVMEM_MTK_EFUSE=y ++CONFIG_NVMEM_QCOM_QFPROM=y ++# CONFIG_NVMEM_QCOM_SEC_QFPROM is not set ++# CONFIG_NVMEM_RMEM is not set ++CONFIG_NVMEM_ROCKCHIP_EFUSE=y ++CONFIG_NVMEM_ROCKCHIP_OTP=y ++CONFIG_NVMEM_SNVS_LPGPR=y ++# CONFIG_NVMEM_SPMI_SDAM is not set ++# CONFIG_NVMEM_SPRD_EFUSE is not set ++# CONFIG_NVMEM_STM32_ROMEM is not set ++CONFIG_NVMEM_SUNXI_SID=y ++# CONFIG_NVMEM_U_BOOT_ENV is not set ++CONFIG_NVMEM_UNIPHIER_EFUSE=y ++# CONFIG_NVMEM_ZYNQMP is not set ++ ++# ++# HW tracing support ++# ++# CONFIG_STM is not set ++# CONFIG_INTEL_TH is not set ++# CONFIG_HISI_PTT is not set ++# end of HW tracing support ++ ++CONFIG_FPGA=y ++# CONFIG_FPGA_MGR_SOCFPGA is not set ++# CONFIG_FPGA_MGR_SOCFPGA_A10 is not set ++# CONFIG_ALTERA_PR_IP_CORE is not set ++# CONFIG_FPGA_MGR_ALTERA_PS_SPI is not set ++# CONFIG_FPGA_MGR_ALTERA_CVP is not set ++# CONFIG_FPGA_MGR_STRATIX10_SOC is not set ++# CONFIG_FPGA_MGR_XILINX_SELECTMAP is not set ++# CONFIG_FPGA_MGR_XILINX_SPI is not set ++# CONFIG_FPGA_MGR_ICE40_SPI is not set ++# CONFIG_FPGA_MGR_MACHXO2_SPI is not set ++# CONFIG_FPGA_BRIDGE is not set ++# CONFIG_FPGA_DFL is not set ++# CONFIG_FPGA_MGR_ZYNQMP_FPGA is not set ++# CONFIG_FPGA_MGR_VERSAL_FPGA is not set ++# CONFIG_FPGA_MGR_MICROCHIP_SPI is not set ++# CONFIG_FPGA_MGR_LATTICE_SYSCONFIG_SPI is not set ++# CONFIG_FSI is not set ++CONFIG_TEE=y ++CONFIG_OPTEE=y ++# CONFIG_OPTEE_INSECURE_LOAD_IMAGE is not set ++CONFIG_MULTIPLEXER=y ++ ++# ++# Multiplexer drivers ++# ++# CONFIG_MUX_ADG792A is not set ++# CONFIG_MUX_ADGS1408 is not set ++# CONFIG_MUX_GPIO is not set ++CONFIG_MUX_MMIO=y ++# end of Multiplexer drivers ++ ++CONFIG_PM_OPP=y ++# CONFIG_SIOX is not set ++# CONFIG_SLIMBUS is not set ++CONFIG_INTERCONNECT=y ++CONFIG_INTERCONNECT_IMX=y ++# CONFIG_INTERCONNECT_IMX8MM is not set ++# CONFIG_INTERCONNECT_IMX8MN is not set ++# CONFIG_INTERCONNECT_IMX8MQ is not set ++CONFIG_INTERCONNECT_IMX8MP=y ++# CONFIG_INTERCONNECT_MTK is not set ++CONFIG_INTERCONNECT_QCOM=y ++CONFIG_INTERCONNECT_QCOM_BCM_VOTER=y ++# CONFIG_INTERCONNECT_QCOM_MSM8909 is not set ++# CONFIG_INTERCONNECT_QCOM_MSM8916 is not set ++# CONFIG_INTERCONNECT_QCOM_MSM8937 is not set ++# CONFIG_INTERCONNECT_QCOM_MSM8939 is not set ++# CONFIG_INTERCONNECT_QCOM_MSM8953 is not set ++# CONFIG_INTERCONNECT_QCOM_MSM8974 is not set ++# CONFIG_INTERCONNECT_QCOM_MSM8976 is not set ++# CONFIG_INTERCONNECT_QCOM_MSM8996 is not set ++# CONFIG_INTERCONNECT_QCOM_OSM_L3 is not set ++# CONFIG_INTERCONNECT_QCOM_QCM2290 is not set ++# CONFIG_INTERCONNECT_QCOM_QCS404 is not set ++# CONFIG_INTERCONNECT_QCOM_QDU1000 is not set ++CONFIG_INTERCONNECT_QCOM_RPMH_POSSIBLE=y ++CONFIG_INTERCONNECT_QCOM_RPMH=y ++CONFIG_INTERCONNECT_QCOM_SA8775P=y ++CONFIG_INTERCONNECT_QCOM_SC7180=y ++CONFIG_INTERCONNECT_QCOM_SC7280=y ++CONFIG_INTERCONNECT_QCOM_SC8180X=y ++CONFIG_INTERCONNECT_QCOM_SC8280XP=y ++# CONFIG_INTERCONNECT_QCOM_SDM660 is not set ++# CONFIG_INTERCONNECT_QCOM_SDM670 is not set ++CONFIG_INTERCONNECT_QCOM_SDM845=y ++# CONFIG_INTERCONNECT_QCOM_SDX55 is not set ++# CONFIG_INTERCONNECT_QCOM_SDX65 is not set ++# CONFIG_INTERCONNECT_QCOM_SDX75 is not set ++# CONFIG_INTERCONNECT_QCOM_SM6115 is not set ++# CONFIG_INTERCONNECT_QCOM_SM6350 is not set ++# CONFIG_INTERCONNECT_QCOM_SM7150 is not set ++# CONFIG_INTERCONNECT_QCOM_SM8150 is not set ++# CONFIG_INTERCONNECT_QCOM_SM8250 is not set ++# CONFIG_INTERCONNECT_QCOM_SM8350 is not set ++CONFIG_INTERCONNECT_QCOM_SM8450=y ++CONFIG_INTERCONNECT_QCOM_SM8550=y ++# CONFIG_INTERCONNECT_QCOM_SM8650 is not set ++# CONFIG_INTERCONNECT_QCOM_X1E80100 is not set ++# CONFIG_INTERCONNECT_SAMSUNG is not set ++CONFIG_INTERCONNECT_CLK=y ++# CONFIG_COUNTER is not set ++# CONFIG_MOST is not set ++# CONFIG_PECI is not set ++CONFIG_HTE=y ++CONFIG_HTE_TEGRA194=y ++# CONFIG_HTE_TEGRA194_TEST is not set ++# CONFIG_CDX_BUS is not set ++# end of Device Drivers ++ ++# ++# File systems ++# ++CONFIG_DCACHE_WORD_ACCESS=y ++# CONFIG_VALIDATE_FS_PARSER is not set ++CONFIG_FS_IOMAP=y ++CONFIG_BUFFER_HEAD=y ++CONFIG_LEGACY_DIRECT_IO=y ++CONFIG_EXT2_FS=y ++# CONFIG_EXT2_FS_XATTR is not set ++CONFIG_EXT3_FS=y ++# CONFIG_EXT3_FS_POSIX_ACL is not set ++# CONFIG_EXT3_FS_SECURITY is not set ++CONFIG_EXT4_FS=y ++CONFIG_EXT4_FS_POSIX_ACL=y ++# CONFIG_EXT4_FS_SECURITY is not set ++# CONFIG_EXT4_DEBUG is not set ++CONFIG_JBD2=y ++# CONFIG_JBD2_DEBUG is not set ++CONFIG_FS_MBCACHE=y ++# CONFIG_REISERFS_FS is not set ++# CONFIG_JFS_FS is not set ++# CONFIG_XFS_FS is not set ++# CONFIG_GFS2_FS is not set ++# CONFIG_OCFS2_FS is not set ++# CONFIG_BTRFS_FS is not set ++# CONFIG_NILFS2_FS is not set ++# CONFIG_F2FS_FS is not set ++# CONFIG_BCACHEFS_FS is not set ++CONFIG_FS_POSIX_ACL=y ++CONFIG_EXPORTFS=y ++# CONFIG_EXPORTFS_BLOCK_OPS is not set ++CONFIG_FILE_LOCKING=y ++# CONFIG_FS_ENCRYPTION is not set ++# CONFIG_FS_VERITY is not set ++CONFIG_FSNOTIFY=y ++CONFIG_DNOTIFY=y ++CONFIG_INOTIFY_USER=y ++CONFIG_FANOTIFY=y ++CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y ++CONFIG_QUOTA=y ++# CONFIG_QUOTA_NETLINK_INTERFACE is not set ++# CONFIG_QUOTA_DEBUG is not set ++# CONFIG_QFMT_V1 is not set ++# CONFIG_QFMT_V2 is not set ++CONFIG_QUOTACTL=y ++CONFIG_AUTOFS_FS=y ++# CONFIG_FUSE_FS is not set ++# CONFIG_OVERLAY_FS is not set ++ ++# ++# Caches ++# ++CONFIG_NETFS_SUPPORT=y ++# CONFIG_NETFS_STATS is not set ++# CONFIG_NETFS_DEBUG is not set ++# CONFIG_FSCACHE is not set ++# end of Caches ++ ++# ++# CD-ROM/DVD Filesystems ++# ++# CONFIG_ISO9660_FS is not set ++# CONFIG_UDF_FS is not set ++# end of CD-ROM/DVD Filesystems ++ ++# ++# DOS/FAT/EXFAT/NT Filesystems ++# ++CONFIG_FAT_FS=y ++# CONFIG_MSDOS_FS is not set ++CONFIG_VFAT_FS=y ++CONFIG_FAT_DEFAULT_CODEPAGE=437 ++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" ++# CONFIG_FAT_DEFAULT_UTF8 is not set ++# CONFIG_EXFAT_FS is not set ++# CONFIG_NTFS3_FS is not set ++# CONFIG_NTFS_FS is not set ++# end of DOS/FAT/EXFAT/NT Filesystems ++ ++# ++# Pseudo filesystems ++# ++CONFIG_PROC_FS=y ++# CONFIG_PROC_KCORE is not set ++CONFIG_PROC_VMCORE=y ++# CONFIG_PROC_VMCORE_DEVICE_DUMP is not set ++CONFIG_PROC_SYSCTL=y ++CONFIG_PROC_PAGE_MONITOR=y ++# CONFIG_PROC_CHILDREN is not set ++CONFIG_KERNFS=y ++CONFIG_SYSFS=y ++CONFIG_TMPFS=y ++CONFIG_TMPFS_POSIX_ACL=y ++CONFIG_TMPFS_XATTR=y ++# CONFIG_TMPFS_INODE64 is not set ++# CONFIG_TMPFS_QUOTA is not set ++CONFIG_ARCH_SUPPORTS_HUGETLBFS=y ++CONFIG_HUGETLBFS=y ++CONFIG_HUGETLB_PAGE=y ++CONFIG_HUGETLB_PMD_PAGE_TABLE_SHARING=y ++CONFIG_ARCH_HAS_GIGANTIC_PAGE=y ++CONFIG_CONFIGFS_FS=y ++CONFIG_EFIVAR_FS=y ++# end of Pseudo filesystems ++ ++CONFIG_MISC_FILESYSTEMS=y ++# CONFIG_ORANGEFS_FS is not set ++# CONFIG_ADFS_FS is not set ++# CONFIG_AFFS_FS is not set ++# CONFIG_ECRYPT_FS is not set ++# CONFIG_HFS_FS is not set ++# CONFIG_HFSPLUS_FS is not set ++# CONFIG_BEFS_FS is not set ++# CONFIG_BFS_FS is not set ++# CONFIG_EFS_FS is not set ++# CONFIG_JFFS2_FS is not set ++# CONFIG_CRAMFS is not set ++CONFIG_SQUASHFS=y ++CONFIG_SQUASHFS_FILE_CACHE=y ++# CONFIG_SQUASHFS_FILE_DIRECT is not set ++CONFIG_SQUASHFS_DECOMP_SINGLE=y ++# CONFIG_SQUASHFS_CHOICE_DECOMP_BY_MOUNT is not set ++CONFIG_SQUASHFS_COMPILE_DECOMP_SINGLE=y ++# CONFIG_SQUASHFS_COMPILE_DECOMP_MULTI is not set ++# CONFIG_SQUASHFS_COMPILE_DECOMP_MULTI_PERCPU is not set ++# CONFIG_SQUASHFS_XATTR is not set ++CONFIG_SQUASHFS_ZLIB=y ++# CONFIG_SQUASHFS_LZ4 is not set ++# CONFIG_SQUASHFS_LZO is not set ++# CONFIG_SQUASHFS_XZ is not set ++# CONFIG_SQUASHFS_ZSTD is not set ++# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set ++# CONFIG_SQUASHFS_EMBEDDED is not set ++CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 ++# CONFIG_VXFS_FS is not set ++# CONFIG_MINIX_FS is not set ++# CONFIG_OMFS_FS is not set ++# CONFIG_HPFS_FS is not set ++# CONFIG_QNX4FS_FS is not set ++# CONFIG_QNX6FS_FS is not set ++# CONFIG_ROMFS_FS is not set ++CONFIG_PSTORE=y ++CONFIG_PSTORE_DEFAULT_KMSG_BYTES=10240 ++CONFIG_PSTORE_COMPRESS=y ++# CONFIG_PSTORE_CONSOLE is not set ++# CONFIG_PSTORE_PMSG is not set ++# CONFIG_PSTORE_RAM is not set ++# CONFIG_PSTORE_BLK is not set ++# CONFIG_SYSV_FS is not set ++# CONFIG_UFS_FS is not set ++# CONFIG_EROFS_FS is not set ++CONFIG_NETWORK_FILESYSTEMS=y ++CONFIG_NFS_FS=y ++CONFIG_NFS_V2=y ++CONFIG_NFS_V3=y ++# CONFIG_NFS_V3_ACL is not set ++CONFIG_NFS_V4=y ++# CONFIG_NFS_SWAP is not set ++CONFIG_NFS_V4_1=y ++CONFIG_NFS_V4_2=y ++CONFIG_PNFS_FILE_LAYOUT=y ++CONFIG_PNFS_FLEXFILE_LAYOUT=y ++CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" ++# CONFIG_NFS_V4_1_MIGRATION is not set ++CONFIG_NFS_V4_SECURITY_LABEL=y ++CONFIG_ROOT_NFS=y ++# CONFIG_NFS_FSCACHE is not set ++# CONFIG_NFS_USE_LEGACY_DNS is not set ++CONFIG_NFS_USE_KERNEL_DNS=y ++CONFIG_NFS_DISABLE_UDP_SUPPORT=y ++CONFIG_NFS_V4_2_READ_PLUS=y ++# CONFIG_NFSD is not set ++CONFIG_GRACE_PERIOD=y ++CONFIG_LOCKD=y ++CONFIG_LOCKD_V4=y ++CONFIG_NFS_COMMON=y ++CONFIG_NFS_V4_2_SSC_HELPER=y ++CONFIG_SUNRPC=y ++CONFIG_SUNRPC_GSS=y ++CONFIG_SUNRPC_BACKCHANNEL=y ++CONFIG_RPCSEC_GSS_KRB5=y ++# CONFIG_SUNRPC_DEBUG is not set ++# CONFIG_CEPH_FS is not set ++# CONFIG_CIFS is not set ++# CONFIG_SMB_SERVER is not set ++# CONFIG_CODA_FS is not set ++# CONFIG_AFS_FS is not set ++CONFIG_9P_FS=y ++# CONFIG_9P_FS_POSIX_ACL is not set ++# CONFIG_9P_FS_SECURITY is not set ++CONFIG_NLS=y ++CONFIG_NLS_DEFAULT="iso8859-1" ++CONFIG_NLS_CODEPAGE_437=y ++# CONFIG_NLS_CODEPAGE_737 is not set ++# CONFIG_NLS_CODEPAGE_775 is not set ++# CONFIG_NLS_CODEPAGE_850 is not set ++# CONFIG_NLS_CODEPAGE_852 is not set ++# CONFIG_NLS_CODEPAGE_855 is not set ++# CONFIG_NLS_CODEPAGE_857 is not set ++# CONFIG_NLS_CODEPAGE_860 is not set ++# CONFIG_NLS_CODEPAGE_861 is not set ++# CONFIG_NLS_CODEPAGE_862 is not set ++# CONFIG_NLS_CODEPAGE_863 is not set ++# CONFIG_NLS_CODEPAGE_864 is not set ++# CONFIG_NLS_CODEPAGE_865 is not set ++# CONFIG_NLS_CODEPAGE_866 is not set ++# CONFIG_NLS_CODEPAGE_869 is not set ++# CONFIG_NLS_CODEPAGE_936 is not set ++# CONFIG_NLS_CODEPAGE_950 is not set ++# CONFIG_NLS_CODEPAGE_932 is not set ++# CONFIG_NLS_CODEPAGE_949 is not set ++# CONFIG_NLS_CODEPAGE_874 is not set ++# CONFIG_NLS_ISO8859_8 is not set ++# CONFIG_NLS_CODEPAGE_1250 is not set ++# CONFIG_NLS_CODEPAGE_1251 is not set ++# CONFIG_NLS_ASCII is not set ++CONFIG_NLS_ISO8859_1=y ++# CONFIG_NLS_ISO8859_2 is not set ++# CONFIG_NLS_ISO8859_3 is not set ++# CONFIG_NLS_ISO8859_4 is not set ++# CONFIG_NLS_ISO8859_5 is not set ++# CONFIG_NLS_ISO8859_6 is not set ++# CONFIG_NLS_ISO8859_7 is not set ++# CONFIG_NLS_ISO8859_9 is not set ++# CONFIG_NLS_ISO8859_13 is not set ++# CONFIG_NLS_ISO8859_14 is not set ++# CONFIG_NLS_ISO8859_15 is not set ++# CONFIG_NLS_KOI8_R is not set ++# CONFIG_NLS_KOI8_U is not set ++# CONFIG_NLS_MAC_ROMAN is not set ++# CONFIG_NLS_MAC_CELTIC is not set ++# CONFIG_NLS_MAC_CENTEURO is not set ++# CONFIG_NLS_MAC_CROATIAN is not set ++# CONFIG_NLS_MAC_CYRILLIC is not set ++# CONFIG_NLS_MAC_GAELIC is not set ++# CONFIG_NLS_MAC_GREEK is not set ++# CONFIG_NLS_MAC_ICELAND is not set ++# CONFIG_NLS_MAC_INUIT is not set ++# CONFIG_NLS_MAC_ROMANIAN is not set ++# CONFIG_NLS_MAC_TURKISH is not set ++# CONFIG_NLS_UTF8 is not set ++# CONFIG_DLM is not set ++# CONFIG_UNICODE is not set ++CONFIG_IO_WQ=y ++# end of File systems ++ ++# ++# Security options ++# ++CONFIG_KEYS=y ++# CONFIG_KEYS_REQUEST_CACHE is not set ++# CONFIG_PERSISTENT_KEYRINGS is not set ++# CONFIG_TRUSTED_KEYS is not set ++# CONFIG_ENCRYPTED_KEYS is not set ++# CONFIG_KEY_DH_OPERATIONS is not set ++# CONFIG_SECURITY_DMESG_RESTRICT is not set ++CONFIG_PROC_MEM_ALWAYS_FORCE=y ++# CONFIG_PROC_MEM_FORCE_PTRACE is not set ++# CONFIG_PROC_MEM_NO_FORCE is not set ++CONFIG_SECURITY=y ++CONFIG_SECURITYFS=y ++# CONFIG_SECURITY_NETWORK is not set ++# CONFIG_SECURITY_PATH is not set ++# CONFIG_HARDENED_USERCOPY is not set ++# CONFIG_FORTIFY_SOURCE is not set ++# CONFIG_STATIC_USERMODEHELPER is not set ++# CONFIG_SECURITY_SMACK is not set ++# CONFIG_SECURITY_TOMOYO is not set ++# CONFIG_SECURITY_APPARMOR is not set ++# CONFIG_SECURITY_LOADPIN is not set ++# CONFIG_SECURITY_YAMA is not set ++# CONFIG_SECURITY_SAFESETID is not set ++# CONFIG_SECURITY_LOCKDOWN_LSM is not set ++# CONFIG_SECURITY_LANDLOCK is not set ++# CONFIG_SECURITY_IPE is not set ++CONFIG_INTEGRITY=y ++# CONFIG_INTEGRITY_SIGNATURE is not set ++CONFIG_INTEGRITY_AUDIT=y ++# CONFIG_IMA is not set ++# CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT is not set ++# CONFIG_EVM is not set ++CONFIG_DEFAULT_SECURITY_DAC=y ++CONFIG_LSM="landlock,lockdown,yama,loadpin,safesetid,bpf" ++ ++# ++# Kernel hardening options ++# ++ ++# ++# Memory initialization ++# ++CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y ++CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_BARE=y ++CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y ++# CONFIG_INIT_STACK_NONE is not set ++# CONFIG_INIT_STACK_ALL_PATTERN is not set ++CONFIG_INIT_STACK_ALL_ZERO=y ++# CONFIG_GCC_PLUGIN_STACKLEAK is not set ++# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set ++# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set ++CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y ++# CONFIG_ZERO_CALL_USED_REGS is not set ++# end of Memory initialization ++ ++# ++# Hardening of kernel data structures ++# ++# CONFIG_LIST_HARDENED is not set ++# CONFIG_BUG_ON_DATA_CORRUPTION is not set ++# end of Hardening of kernel data structures ++ ++CONFIG_RANDSTRUCT_NONE=y ++# CONFIG_RANDSTRUCT_FULL is not set ++# CONFIG_RANDSTRUCT_PERFORMANCE is not set ++# end of Kernel hardening options ++# end of Security options ++ ++CONFIG_CRYPTO=y ++ ++# ++# Crypto core or helper ++# ++CONFIG_CRYPTO_ALGAPI=y ++CONFIG_CRYPTO_ALGAPI2=y ++CONFIG_CRYPTO_AEAD=y ++CONFIG_CRYPTO_AEAD2=y ++CONFIG_CRYPTO_SIG=y ++CONFIG_CRYPTO_SIG2=y ++CONFIG_CRYPTO_SKCIPHER=y ++CONFIG_CRYPTO_SKCIPHER2=y ++CONFIG_CRYPTO_HASH=y ++CONFIG_CRYPTO_HASH2=y ++CONFIG_CRYPTO_RNG=y ++CONFIG_CRYPTO_RNG2=y ++CONFIG_CRYPTO_RNG_DEFAULT=y ++CONFIG_CRYPTO_AKCIPHER2=y ++CONFIG_CRYPTO_AKCIPHER=y ++CONFIG_CRYPTO_KPP2=y ++CONFIG_CRYPTO_ACOMP2=y ++CONFIG_CRYPTO_MANAGER=y ++CONFIG_CRYPTO_MANAGER2=y ++CONFIG_CRYPTO_USER=y ++CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y ++CONFIG_CRYPTO_NULL=y ++CONFIG_CRYPTO_NULL2=y ++# CONFIG_CRYPTO_PCRYPT is not set ++# CONFIG_CRYPTO_CRYPTD is not set ++# CONFIG_CRYPTO_AUTHENC is not set ++# CONFIG_CRYPTO_TEST is not set ++# end of Crypto core or helper ++ ++# ++# Public-key cryptography ++# ++CONFIG_CRYPTO_RSA=y ++# CONFIG_CRYPTO_DH is not set ++# CONFIG_CRYPTO_ECDH is not set ++# CONFIG_CRYPTO_ECDSA is not set ++# CONFIG_CRYPTO_ECRDSA is not set ++# CONFIG_CRYPTO_CURVE25519 is not set ++# end of Public-key cryptography ++ ++# ++# Block ciphers ++# ++CONFIG_CRYPTO_AES=y ++# CONFIG_CRYPTO_AES_TI is not set ++# CONFIG_CRYPTO_ARIA is not set ++# CONFIG_CRYPTO_BLOWFISH is not set ++# CONFIG_CRYPTO_CAMELLIA is not set ++# CONFIG_CRYPTO_CAST5 is not set ++# CONFIG_CRYPTO_CAST6 is not set ++# CONFIG_CRYPTO_DES is not set ++# CONFIG_CRYPTO_FCRYPT is not set ++# CONFIG_CRYPTO_SERPENT is not set ++# CONFIG_CRYPTO_SM4_GENERIC is not set ++# CONFIG_CRYPTO_TWOFISH is not set ++# end of Block ciphers ++ ++# ++# Length-preserving ciphers and modes ++# ++# CONFIG_CRYPTO_ADIANTUM is not set ++# CONFIG_CRYPTO_CHACHA20 is not set ++# CONFIG_CRYPTO_CBC is not set ++# CONFIG_CRYPTO_CTR is not set ++# CONFIG_CRYPTO_CTS is not set ++CONFIG_CRYPTO_ECB=y ++# CONFIG_CRYPTO_HCTR2 is not set ++# CONFIG_CRYPTO_KEYWRAP is not set ++# CONFIG_CRYPTO_LRW is not set ++# CONFIG_CRYPTO_PCBC is not set ++# CONFIG_CRYPTO_XTS is not set ++# end of Length-preserving ciphers and modes ++ ++# ++# AEAD (authenticated encryption with associated data) ciphers ++# ++# CONFIG_CRYPTO_AEGIS128 is not set ++# CONFIG_CRYPTO_CHACHA20POLY1305 is not set ++# CONFIG_CRYPTO_CCM is not set ++# CONFIG_CRYPTO_GCM is not set ++CONFIG_CRYPTO_GENIV=y ++# CONFIG_CRYPTO_SEQIV is not set ++CONFIG_CRYPTO_ECHAINIV=y ++# CONFIG_CRYPTO_ESSIV is not set ++# end of AEAD (authenticated encryption with associated data) ciphers ++ ++# ++# Hashes, digests, and MACs ++# ++# CONFIG_CRYPTO_BLAKE2B is not set ++# CONFIG_CRYPTO_CMAC is not set ++# CONFIG_CRYPTO_GHASH is not set ++CONFIG_CRYPTO_HMAC=y ++# CONFIG_CRYPTO_MD4 is not set ++# CONFIG_CRYPTO_MD5 is not set ++# CONFIG_CRYPTO_MICHAEL_MIC is not set ++# CONFIG_CRYPTO_POLY1305 is not set ++# CONFIG_CRYPTO_RMD160 is not set ++CONFIG_CRYPTO_SHA1=y ++CONFIG_CRYPTO_SHA256=y ++CONFIG_CRYPTO_SHA512=y ++CONFIG_CRYPTO_SHA3=y ++# CONFIG_CRYPTO_SM3_GENERIC is not set ++# CONFIG_CRYPTO_STREEBOG is not set ++# CONFIG_CRYPTO_VMAC is not set ++# CONFIG_CRYPTO_WP512 is not set ++# CONFIG_CRYPTO_XCBC is not set ++# CONFIG_CRYPTO_XXHASH is not set ++# end of Hashes, digests, and MACs ++ ++# ++# CRCs (cyclic redundancy checks) ++# ++CONFIG_CRYPTO_CRC32C=y ++# CONFIG_CRYPTO_CRC32 is not set ++CONFIG_CRYPTO_CRCT10DIF=y ++CONFIG_CRYPTO_CRC64_ROCKSOFT=y ++# end of CRCs (cyclic redundancy checks) ++ ++# ++# Compression ++# ++# CONFIG_CRYPTO_DEFLATE is not set ++CONFIG_CRYPTO_LZO=y ++# CONFIG_CRYPTO_842 is not set ++# CONFIG_CRYPTO_LZ4 is not set ++# CONFIG_CRYPTO_LZ4HC is not set ++# CONFIG_CRYPTO_ZSTD is not set ++# end of Compression ++ ++# ++# Random number generation ++# ++CONFIG_CRYPTO_ANSI_CPRNG=y ++CONFIG_CRYPTO_DRBG_MENU=y ++CONFIG_CRYPTO_DRBG_HMAC=y ++# CONFIG_CRYPTO_DRBG_HASH is not set ++# CONFIG_CRYPTO_DRBG_CTR is not set ++CONFIG_CRYPTO_DRBG=y ++CONFIG_CRYPTO_JITTERENTROPY=y ++CONFIG_CRYPTO_JITTERENTROPY_MEMORY_BLOCKS=64 ++CONFIG_CRYPTO_JITTERENTROPY_MEMORY_BLOCKSIZE=32 ++CONFIG_CRYPTO_JITTERENTROPY_OSR=1 ++# end of Random number generation ++ ++# ++# Userspace interface ++# ++# CONFIG_CRYPTO_USER_API_HASH is not set ++# CONFIG_CRYPTO_USER_API_SKCIPHER is not set ++# CONFIG_CRYPTO_USER_API_RNG is not set ++# CONFIG_CRYPTO_USER_API_AEAD is not set ++# end of Userspace interface ++ ++CONFIG_CRYPTO_HASH_INFO=y ++# CONFIG_CRYPTO_NHPOLY1305_NEON is not set ++# CONFIG_CRYPTO_CHACHA20_NEON is not set ++ ++# ++# Accelerated Cryptographic Algorithms for CPU (arm64) ++# ++CONFIG_CRYPTO_GHASH_ARM64_CE=y ++# CONFIG_CRYPTO_POLY1305_NEON is not set ++CONFIG_CRYPTO_SHA1_ARM64_CE=y ++CONFIG_CRYPTO_SHA256_ARM64=y ++CONFIG_CRYPTO_SHA2_ARM64_CE=y ++# CONFIG_CRYPTO_SHA512_ARM64 is not set ++# CONFIG_CRYPTO_SHA512_ARM64_CE is not set ++# CONFIG_CRYPTO_SHA3_ARM64 is not set ++# CONFIG_CRYPTO_SM3_NEON is not set ++# CONFIG_CRYPTO_SM3_ARM64_CE is not set ++# CONFIG_CRYPTO_POLYVAL_ARM64_CE is not set ++# CONFIG_CRYPTO_AES_ARM64 is not set ++CONFIG_CRYPTO_AES_ARM64_CE=y ++CONFIG_CRYPTO_AES_ARM64_CE_BLK=y ++# CONFIG_CRYPTO_AES_ARM64_NEON_BLK is not set ++# CONFIG_CRYPTO_AES_ARM64_BS is not set ++# CONFIG_CRYPTO_SM4_ARM64_CE is not set ++# CONFIG_CRYPTO_SM4_ARM64_CE_BLK is not set ++# CONFIG_CRYPTO_SM4_ARM64_NEON_BLK is not set ++CONFIG_CRYPTO_AES_ARM64_CE_CCM=y ++# CONFIG_CRYPTO_SM4_ARM64_CE_CCM is not set ++# CONFIG_CRYPTO_SM4_ARM64_CE_GCM is not set ++# CONFIG_CRYPTO_CRCT10DIF_ARM64_CE is not set ++# end of Accelerated Cryptographic Algorithms for CPU (arm64) ++ ++CONFIG_CRYPTO_HW=y ++CONFIG_CRYPTO_DEV_ALLWINNER=y ++# CONFIG_CRYPTO_DEV_SUN4I_SS is not set ++# CONFIG_CRYPTO_DEV_SUN8I_CE is not set ++# CONFIG_CRYPTO_DEV_SUN8I_SS is not set ++# CONFIG_CRYPTO_DEV_FSL_CAAM is not set ++# CONFIG_CRYPTO_DEV_FSL_DPAA2_CAAM is not set ++# CONFIG_CRYPTO_DEV_SAHARA is not set ++# CONFIG_CRYPTO_DEV_EXYNOS_RNG is not set ++# CONFIG_CRYPTO_DEV_S5P is not set ++# CONFIG_CRYPTO_DEV_ATMEL_ECC is not set ++# CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set ++# CONFIG_CRYPTO_DEV_CCP is not set ++# CONFIG_CRYPTO_DEV_MXS_DCP is not set ++# CONFIG_CAVIUM_CPT is not set ++# CONFIG_CRYPTO_DEV_NITROX_CNN55XX is not set ++# CONFIG_CRYPTO_DEV_MARVELL_CESA is not set ++# CONFIG_CRYPTO_DEV_OCTEONTX_CPT is not set ++# CONFIG_CRYPTO_DEV_OCTEONTX2_CPT is not set ++# CONFIG_CRYPTO_DEV_KEEMBAY_OCS_AES_SM4 is not set ++# CONFIG_CRYPTO_DEV_KEEMBAY_OCS_ECC is not set ++# CONFIG_CRYPTO_DEV_KEEMBAY_OCS_HCU is not set ++# CONFIG_CRYPTO_DEV_QAT_DH895xCC is not set ++# CONFIG_CRYPTO_DEV_QAT_C3XXX is not set ++# CONFIG_CRYPTO_DEV_QAT_C62X is not set ++# CONFIG_CRYPTO_DEV_QAT_4XXX is not set ++# CONFIG_CRYPTO_DEV_QAT_420XX is not set ++# CONFIG_CRYPTO_DEV_QAT_DH895xCCVF is not set ++# CONFIG_CRYPTO_DEV_QAT_C3XXXVF is not set ++# CONFIG_CRYPTO_DEV_QAT_C62XVF is not set ++# CONFIG_CRYPTO_DEV_CAVIUM_ZIP is not set ++# CONFIG_CRYPTO_DEV_QCE is not set ++# CONFIG_CRYPTO_DEV_QCOM_RNG is not set ++# CONFIG_CRYPTO_DEV_ROCKCHIP is not set ++# CONFIG_CRYPTO_DEV_ZYNQMP_AES is not set ++# CONFIG_CRYPTO_DEV_ZYNQMP_SHA3 is not set ++# CONFIG_CRYPTO_DEV_VIRTIO is not set ++# CONFIG_CRYPTO_DEV_BCM_SPU is not set ++# CONFIG_CRYPTO_DEV_STM32_CRC is not set ++# CONFIG_CRYPTO_DEV_STM32_HASH is not set ++# CONFIG_CRYPTO_DEV_STM32_CRYP is not set ++# CONFIG_CRYPTO_DEV_SAFEXCEL is not set ++# CONFIG_CRYPTO_DEV_CCREE is not set ++# CONFIG_CRYPTO_DEV_HISI_SEC is not set ++# CONFIG_CRYPTO_DEV_HISI_SEC2 is not set ++# CONFIG_CRYPTO_DEV_HISI_ZIP is not set ++# CONFIG_CRYPTO_DEV_HISI_HPRE is not set ++# CONFIG_CRYPTO_DEV_HISI_TRNG is not set ++# CONFIG_CRYPTO_DEV_AMLOGIC_GXL is not set ++# CONFIG_CRYPTO_DEV_SA2UL is not set ++CONFIG_ASYMMETRIC_KEY_TYPE=y ++CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y ++CONFIG_X509_CERTIFICATE_PARSER=y ++# CONFIG_PKCS8_PRIVATE_KEY_PARSER is not set ++CONFIG_PKCS7_MESSAGE_PARSER=y ++# CONFIG_FIPS_SIGNATURE_SELFTEST is not set ++ ++# ++# Certificates for signature checking ++# ++CONFIG_SYSTEM_TRUSTED_KEYRING=y ++CONFIG_SYSTEM_TRUSTED_KEYS="" ++# CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set ++# CONFIG_SECONDARY_TRUSTED_KEYRING is not set ++# CONFIG_SYSTEM_BLACKLIST_KEYRING is not set ++# end of Certificates for signature checking ++ ++CONFIG_BINARY_PRINTF=y ++ ++# ++# Library routines ++# ++CONFIG_LINEAR_RANGES=y ++CONFIG_PACKING=y ++CONFIG_BITREVERSE=y ++CONFIG_HAVE_ARCH_BITREVERSE=y ++CONFIG_GENERIC_STRNCPY_FROM_USER=y ++CONFIG_GENERIC_STRNLEN_USER=y ++CONFIG_GENERIC_NET_UTILS=y ++# CONFIG_CORDIC is not set ++# CONFIG_PRIME_NUMBERS is not set ++CONFIG_RATIONAL=y ++CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y ++CONFIG_ARCH_HAS_FAST_MULTIPLIER=y ++CONFIG_ARCH_USE_SYM_ANNOTATIONS=y ++CONFIG_INDIRECT_PIO=y ++ ++# ++# Crypto library routines ++# ++CONFIG_CRYPTO_LIB_UTILS=y ++CONFIG_CRYPTO_LIB_AES=y ++CONFIG_CRYPTO_LIB_GF128MUL=y ++CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y ++# CONFIG_CRYPTO_LIB_CHACHA is not set ++# CONFIG_CRYPTO_LIB_CURVE25519 is not set ++CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 ++# CONFIG_CRYPTO_LIB_POLY1305 is not set ++# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set ++CONFIG_CRYPTO_LIB_SHA1=y ++CONFIG_CRYPTO_LIB_SHA256=y ++# end of Crypto library routines ++ ++# CONFIG_CRC_CCITT is not set ++CONFIG_CRC16=y ++CONFIG_CRC_T10DIF=y ++CONFIG_CRC64_ROCKSOFT=y ++CONFIG_CRC_ITU_T=y ++CONFIG_CRC32=y ++# CONFIG_CRC32_SELFTEST is not set ++CONFIG_CRC32_SLICEBY8=y ++# CONFIG_CRC32_SLICEBY4 is not set ++# CONFIG_CRC32_SARWATE is not set ++# CONFIG_CRC32_BIT is not set ++CONFIG_CRC64=y ++# CONFIG_CRC4 is not set ++CONFIG_CRC7=y ++# CONFIG_LIBCRC32C is not set ++CONFIG_CRC8=y ++CONFIG_XXHASH=y ++CONFIG_AUDIT_GENERIC=y ++CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y ++CONFIG_AUDIT_COMPAT_GENERIC=y ++# CONFIG_RANDOM32_SELFTEST is not set ++CONFIG_ZLIB_INFLATE=y ++CONFIG_ZLIB_DEFLATE=y ++CONFIG_LZO_COMPRESS=y ++CONFIG_LZO_DECOMPRESS=y ++CONFIG_LZ4_DECOMPRESS=y ++CONFIG_ZSTD_COMMON=y ++CONFIG_ZSTD_DECOMPRESS=y ++CONFIG_XZ_DEC=y ++CONFIG_XZ_DEC_X86=y ++CONFIG_XZ_DEC_POWERPC=y ++CONFIG_XZ_DEC_ARM=y ++CONFIG_XZ_DEC_ARMTHUMB=y ++CONFIG_XZ_DEC_ARM64=y ++CONFIG_XZ_DEC_SPARC=y ++CONFIG_XZ_DEC_RISCV=y ++# CONFIG_XZ_DEC_MICROLZMA is not set ++CONFIG_XZ_DEC_BCJ=y ++# CONFIG_XZ_DEC_TEST is not set ++CONFIG_DECOMPRESS_GZIP=y ++CONFIG_DECOMPRESS_BZIP2=y ++CONFIG_DECOMPRESS_LZMA=y ++CONFIG_DECOMPRESS_XZ=y ++CONFIG_DECOMPRESS_LZO=y ++CONFIG_DECOMPRESS_LZ4=y ++CONFIG_DECOMPRESS_ZSTD=y ++CONFIG_GENERIC_ALLOCATOR=y ++CONFIG_INTERVAL_TREE=y ++CONFIG_XARRAY_MULTI=y ++CONFIG_ASSOCIATIVE_ARRAY=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_IOPORT=y ++CONFIG_HAS_IOPORT_MAP=y ++CONFIG_HAS_DMA=y ++CONFIG_DMA_OPS_HELPERS=y ++CONFIG_NEED_SG_DMA_FLAGS=y ++CONFIG_NEED_SG_DMA_LENGTH=y ++CONFIG_NEED_DMA_MAP_STATE=y ++CONFIG_ARCH_DMA_ADDR_T_64BIT=y ++CONFIG_DMA_DECLARE_COHERENT=y ++CONFIG_ARCH_HAS_SETUP_DMA_OPS=y ++CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE=y ++CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU=y ++CONFIG_ARCH_HAS_DMA_PREP_COHERENT=y ++CONFIG_SWIOTLB=y ++# CONFIG_SWIOTLB_DYNAMIC is not set ++CONFIG_DMA_BOUNCE_UNALIGNED_KMALLOC=y ++CONFIG_DMA_NEED_SYNC=y ++CONFIG_DMA_RESTRICTED_POOL=y ++CONFIG_DMA_NONCOHERENT_MMAP=y ++CONFIG_DMA_COHERENT_POOL=y ++CONFIG_DMA_DIRECT_REMAP=y ++CONFIG_DMA_CMA=y ++# CONFIG_DMA_NUMA_CMA is not set ++ ++# ++# Default contiguous memory area size: ++# ++CONFIG_CMA_SIZE_MBYTES=32 ++CONFIG_CMA_SIZE_SEL_MBYTES=y ++# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set ++# CONFIG_CMA_SIZE_SEL_MIN is not set ++# CONFIG_CMA_SIZE_SEL_MAX is not set ++CONFIG_CMA_ALIGNMENT=8 ++# CONFIG_DMA_API_DEBUG is not set ++# CONFIG_DMA_MAP_BENCHMARK is not set ++CONFIG_SGL_ALLOC=y ++CONFIG_CPU_RMAP=y ++CONFIG_DQL=y ++CONFIG_GLOB=y ++# CONFIG_GLOB_SELFTEST is not set ++CONFIG_NLATTR=y ++CONFIG_CLZ_TAB=y ++CONFIG_IRQ_POLL=y ++CONFIG_MPILIB=y ++CONFIG_DIMLIB=y ++CONFIG_LIBFDT=y ++CONFIG_OID_REGISTRY=y ++CONFIG_UCS2_STRING=y ++CONFIG_HAVE_GENERIC_VDSO=y ++CONFIG_GENERIC_GETTIMEOFDAY=y ++CONFIG_GENERIC_VDSO_TIME_NS=y ++CONFIG_VDSO_GETRANDOM=y ++CONFIG_FONT_SUPPORT=y ++# CONFIG_FONTS is not set ++CONFIG_FONT_8x8=y ++CONFIG_FONT_8x16=y ++CONFIG_SG_POOL=y ++CONFIG_MEMREGION=y ++CONFIG_ARCH_STACKWALK=y ++CONFIG_STACKDEPOT=y ++CONFIG_STACKDEPOT_MAX_FRAMES=64 ++CONFIG_SBITMAP=y ++# CONFIG_LWQ_TEST is not set ++# end of Library routines ++ ++CONFIG_GENERIC_IOREMAP=y ++CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y ++CONFIG_FIRMWARE_TABLE=y ++ ++# ++# Kernel hacking ++# ++ ++# ++# printk and dmesg options ++# ++CONFIG_PRINTK_TIME=y ++# CONFIG_PRINTK_CALLER is not set ++# CONFIG_STACKTRACE_BUILD_ID is not set ++CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 ++CONFIG_CONSOLE_LOGLEVEL_QUIET=4 ++CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 ++# CONFIG_BOOT_PRINTK_DELAY is not set ++# CONFIG_DYNAMIC_DEBUG is not set ++# CONFIG_DYNAMIC_DEBUG_CORE is not set ++CONFIG_SYMBOLIC_ERRNAME=y ++CONFIG_DEBUG_BUGVERBOSE=y ++# end of printk and dmesg options ++ ++CONFIG_DEBUG_KERNEL=y ++CONFIG_DEBUG_MISC=y ++ ++# ++# Compile-time checks and compiler options ++# ++CONFIG_DEBUG_INFO=y ++CONFIG_AS_HAS_NON_CONST_ULEB128=y ++# CONFIG_DEBUG_INFO_NONE is not set ++CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y ++# CONFIG_DEBUG_INFO_DWARF4 is not set ++# CONFIG_DEBUG_INFO_DWARF5 is not set ++CONFIG_DEBUG_INFO_REDUCED=y ++CONFIG_DEBUG_INFO_COMPRESSED_NONE=y ++# CONFIG_DEBUG_INFO_COMPRESSED_ZLIB is not set ++# CONFIG_DEBUG_INFO_SPLIT is not set ++# CONFIG_GDB_SCRIPTS is not set ++CONFIG_FRAME_WARN=2048 ++# CONFIG_STRIP_ASM_SYMS is not set ++# CONFIG_READABLE_ASM is not set ++# CONFIG_HEADERS_INSTALL is not set ++# CONFIG_DEBUG_SECTION_MISMATCH is not set ++CONFIG_SECTION_MISMATCH_WARN_ONLY=y ++CONFIG_ARCH_WANT_FRAME_POINTERS=y ++CONFIG_FRAME_POINTER=y ++# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set ++# end of Compile-time checks and compiler options ++ ++# ++# Generic Kernel Debugging Instruments ++# ++CONFIG_MAGIC_SYSRQ=y ++CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 ++CONFIG_MAGIC_SYSRQ_SERIAL=y ++CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" ++CONFIG_DEBUG_FS=y ++CONFIG_DEBUG_FS_ALLOW_ALL=y ++# CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set ++# CONFIG_DEBUG_FS_ALLOW_NONE is not set ++CONFIG_HAVE_ARCH_KGDB=y ++# CONFIG_KGDB is not set ++CONFIG_ARCH_HAS_UBSAN=y ++# CONFIG_UBSAN is not set ++CONFIG_HAVE_KCSAN_COMPILER=y ++# end of Generic Kernel Debugging Instruments ++ ++# ++# Networking Debugging ++# ++# CONFIG_NET_DEV_REFCNT_TRACKER is not set ++# CONFIG_NET_NS_REFCNT_TRACKER is not set ++# CONFIG_DEBUG_NET is not set ++# end of Networking Debugging ++ ++# ++# Memory Debugging ++# ++# CONFIG_PAGE_EXTENSION is not set ++# CONFIG_DEBUG_PAGEALLOC is not set ++CONFIG_SLUB_DEBUG=y ++# CONFIG_SLUB_DEBUG_ON is not set ++# CONFIG_PAGE_OWNER is not set ++# CONFIG_PAGE_TABLE_CHECK is not set ++# CONFIG_PAGE_POISONING is not set ++# CONFIG_DEBUG_RODATA_TEST is not set ++CONFIG_ARCH_HAS_DEBUG_WX=y ++# CONFIG_DEBUG_WX is not set ++CONFIG_GENERIC_PTDUMP=y ++# CONFIG_PTDUMP_DEBUGFS is not set ++CONFIG_HAVE_DEBUG_KMEMLEAK=y ++# CONFIG_DEBUG_KMEMLEAK is not set ++# CONFIG_PER_VMA_LOCK_STATS is not set ++# CONFIG_DEBUG_OBJECTS is not set ++# CONFIG_SHRINKER_DEBUG is not set ++# CONFIG_DEBUG_STACK_USAGE is not set ++# CONFIG_SCHED_STACK_END_CHECK is not set ++CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y ++# CONFIG_DEBUG_VM is not set ++# CONFIG_DEBUG_VM_PGTABLE is not set ++CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y ++# CONFIG_DEBUG_VIRTUAL is not set ++CONFIG_DEBUG_MEMORY_INIT=y ++# CONFIG_DEBUG_PER_CPU_MAPS is not set ++# CONFIG_MEM_ALLOC_PROFILING is not set ++CONFIG_HAVE_ARCH_KASAN=y ++CONFIG_HAVE_ARCH_KASAN_SW_TAGS=y ++CONFIG_HAVE_ARCH_KASAN_HW_TAGS=y ++CONFIG_HAVE_ARCH_KASAN_VMALLOC=y ++CONFIG_CC_HAS_KASAN_GENERIC=y ++CONFIG_CC_HAS_KASAN_SW_TAGS=y ++CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y ++# CONFIG_KASAN is not set ++CONFIG_HAVE_ARCH_KFENCE=y ++# CONFIG_KFENCE is not set ++# end of Memory Debugging ++ ++# CONFIG_DEBUG_SHIRQ is not set ++ ++# ++# Debug Oops, Lockups and Hangs ++# ++# CONFIG_PANIC_ON_OOPS is not set ++CONFIG_PANIC_ON_OOPS_VALUE=0 ++CONFIG_PANIC_TIMEOUT=0 ++CONFIG_LOCKUP_DETECTOR=y ++CONFIG_SOFTLOCKUP_DETECTOR=y ++CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC=0 ++CONFIG_HAVE_HARDLOCKUP_DETECTOR_BUDDY=y ++CONFIG_HARDLOCKUP_DETECTOR_BUDDY=y ++CONFIG_HARDLOCKUP_DETECTOR=y ++CONFIG_HARDLOCKUP_DETECTOR_COUNTS_HRTIMER=y ++CONFIG_BOOTPARAM_HARDLOCKUP_PANIC=0 ++CONFIG_DETECT_HUNG_TASK=y ++CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=10 ++CONFIG_BOOTPARAM_HUNG_TASK_PANIC=0 ++# CONFIG_WQ_WATCHDOG is not set ++# CONFIG_WQ_CPU_INTENSIVE_REPORT is not set ++# CONFIG_TEST_LOCKUP is not set ++# end of Debug Oops, Lockups and Hangs ++ ++# ++# Scheduler Debugging ++# ++# CONFIG_SCHED_DEBUG is not set ++CONFIG_SCHED_INFO=y ++# CONFIG_SCHEDSTATS is not set ++# end of Scheduler Debugging ++ ++# CONFIG_DEBUG_TIMEKEEPING is not set ++# CONFIG_DEBUG_PREEMPT is not set ++ ++# ++# Lock Debugging (spinlocks, mutexes, etc...) ++# ++CONFIG_LOCK_DEBUGGING_SUPPORT=y ++# CONFIG_PROVE_LOCKING is not set ++# CONFIG_LOCK_STAT is not set ++# CONFIG_DEBUG_RT_MUTEXES is not set ++# CONFIG_DEBUG_SPINLOCK is not set ++# CONFIG_DEBUG_MUTEXES is not set ++# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set ++# CONFIG_DEBUG_RWSEMS is not set ++# CONFIG_DEBUG_LOCK_ALLOC is not set ++# CONFIG_DEBUG_ATOMIC_SLEEP is not set ++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set ++# CONFIG_LOCK_TORTURE_TEST is not set ++# CONFIG_WW_MUTEX_SELFTEST is not set ++# CONFIG_SCF_TORTURE_TEST is not set ++# CONFIG_CSD_LOCK_WAIT_DEBUG is not set ++# end of Lock Debugging (spinlocks, mutexes, etc...) ++ ++# CONFIG_DEBUG_IRQFLAGS is not set ++CONFIG_STACKTRACE=y ++# CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set ++# CONFIG_DEBUG_KOBJECT is not set ++ ++# ++# Debug kernel data structures ++# ++# CONFIG_DEBUG_LIST is not set ++# CONFIG_DEBUG_PLIST is not set ++# CONFIG_DEBUG_SG is not set ++# CONFIG_DEBUG_NOTIFIERS is not set ++# CONFIG_DEBUG_MAPLE_TREE is not set ++# end of Debug kernel data structures ++ ++# ++# RCU Debugging ++# ++# CONFIG_RCU_SCALE_TEST is not set ++# CONFIG_RCU_TORTURE_TEST is not set ++# CONFIG_RCU_REF_SCALE_TEST is not set ++CONFIG_RCU_CPU_STALL_TIMEOUT=21 ++CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 ++# CONFIG_RCU_CPU_STALL_CPUTIME is not set ++CONFIG_RCU_TRACE=y ++# CONFIG_RCU_EQS_DEBUG is not set ++# end of RCU Debugging ++ ++# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set ++# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set ++# CONFIG_LATENCYTOP is not set ++CONFIG_USER_STACKTRACE_SUPPORT=y ++CONFIG_HAVE_FUNCTION_TRACER=y ++CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y ++CONFIG_HAVE_FUNCTION_GRAPH_RETVAL=y ++CONFIG_HAVE_DYNAMIC_FTRACE=y ++CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y ++CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y ++CONFIG_HAVE_SYSCALL_TRACEPOINTS=y ++CONFIG_HAVE_C_RECORDMCOUNT=y ++CONFIG_TRACE_CLOCK=y ++CONFIG_TRACING_SUPPORT=y ++# CONFIG_FTRACE is not set ++# CONFIG_SAMPLES is not set ++CONFIG_HAVE_SAMPLE_FTRACE_DIRECT=y ++CONFIG_HAVE_SAMPLE_FTRACE_DIRECT_MULTI=y ++CONFIG_STRICT_DEVMEM=y ++# CONFIG_IO_STRICT_DEVMEM is not set ++ ++# ++# arm64 Debugging ++# ++# CONFIG_PID_IN_CONTEXTIDR is not set ++# CONFIG_DEBUG_EFI is not set ++# CONFIG_ARM64_RELOC_TEST is not set ++# CONFIG_CORESIGHT is not set ++# end of arm64 Debugging ++ ++# ++# Kernel Testing and Coverage ++# ++# CONFIG_KUNIT is not set ++# CONFIG_NOTIFIER_ERROR_INJECTION is not set ++# CONFIG_FAULT_INJECTION is not set ++CONFIG_ARCH_HAS_KCOV=y ++CONFIG_CC_HAS_SANCOV_TRACE_PC=y ++# CONFIG_KCOV is not set ++CONFIG_RUNTIME_TESTING_MENU=y ++# CONFIG_TEST_DHRY is not set ++# CONFIG_LKDTM is not set ++# CONFIG_TEST_MIN_HEAP is not set ++# CONFIG_TEST_DIV64 is not set ++# CONFIG_TEST_MULDIV64 is not set ++# CONFIG_BACKTRACE_SELF_TEST is not set ++# CONFIG_TEST_REF_TRACKER is not set ++# CONFIG_RBTREE_TEST is not set ++# CONFIG_REED_SOLOMON_TEST is not set ++# CONFIG_INTERVAL_TREE_TEST is not set ++# CONFIG_PERCPU_TEST is not set ++# CONFIG_ATOMIC64_SELFTEST is not set ++# CONFIG_TEST_HEXDUMP is not set ++# CONFIG_TEST_KSTRTOX is not set ++# CONFIG_TEST_PRINTF is not set ++# CONFIG_TEST_SCANF is not set ++# CONFIG_TEST_BITMAP is not set ++# CONFIG_TEST_UUID is not set ++# CONFIG_TEST_XARRAY is not set ++# CONFIG_TEST_MAPLE_TREE is not set ++# CONFIG_TEST_RHASHTABLE is not set ++# CONFIG_TEST_IDA is not set ++# CONFIG_TEST_LKM is not set ++# CONFIG_TEST_BITOPS is not set ++# CONFIG_TEST_VMALLOC is not set ++# CONFIG_TEST_BPF is not set ++# CONFIG_TEST_BLACKHOLE_DEV is not set ++# CONFIG_FIND_BIT_BENCHMARK is not set ++# CONFIG_TEST_FIRMWARE is not set ++# CONFIG_TEST_SYSCTL is not set ++# CONFIG_TEST_UDELAY is not set ++# CONFIG_TEST_STATIC_KEYS is not set ++# CONFIG_TEST_KMOD is not set ++# CONFIG_TEST_MEMCAT_P is not set ++# CONFIG_TEST_MEMINIT is not set ++# CONFIG_TEST_FREE_PAGES is not set ++# CONFIG_TEST_FPU is not set ++# CONFIG_TEST_OBJPOOL is not set ++CONFIG_ARCH_USE_MEMTEST=y ++CONFIG_MEMTEST=y ++# end of Kernel Testing and Coverage ++ ++# ++# Rust hacking ++# ++# end of Rust hacking diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0-patches.inc b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0-patches.inc index 5b26ee4..61e7018 100644 --- a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0-patches.inc +++ b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0-patches.inc @@ -1,6 +1,21 @@ -SRC_URI += "\ - file://0016-Makefile.patch \ - file://0005-bcm2711-rpi-4-b.dts.patch \ - file://0014-rpi4_64_defconfig.patch \ - file://0015-rpi4_64_nomodules_defconfig.patch \ -" +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + +SRC_URI += "\ + file://0012-bcm283x-rpi-i2c0mux_0_44.dtsi.patch \ + file://0008-bcm2835-rpi.dtsi.patch \ + file://0007-bcm271x-rpi-bt.dtsi.patch \ + file://0011-bcm283x-rpi-csi1-2lane.dtsi.patch \ + file://0006-bcm2711-rpi.dtsi.patch \ + file://0015-Makefile.patch \ + file://0010-bcm283x-rpi-cam1-regulator.dtsi.patch \ + file://0005-bcm2711-rpi-4-b.dts.patch \ + file://0009-bcm283x.dtsi.patch \ + file://0002-bcm270x.dtsi.patch \ + file://0001-bcm2711-rpi-4-b.dts.patch \ + file://0014-rpi4_64_defconfig.patch \ + file://0003-bcm270x-rpi.dtsi.patch \ + file://0004-bcm2711.dtsi.patch \ + file://0013-bcm283x-rpi-usb-peripheral.dtsi.patch \ + file://0016-rpi4_64_nomodules_defconfig.patch \ +" \ No newline at end of file diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0001-bcm2711-rpi-4-b.dts.patch b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0001-bcm2711-rpi-4-b.dts.patch new file mode 100644 index 0000000..98e6ac6 --- /dev/null +++ b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0001-bcm2711-rpi-4-b.dts.patch @@ -0,0 +1,16 @@ +--- /home/rossierd/soo/infrabase/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm/boot/dts/broadcom/bcm2711-rpi-4-b.dts 2025-09-03 20:23:08.000000000 +0200 ++++ ./arch/arm/boot/dts/broadcom/bcm2711-rpi-4-b.dts 2025-09-04 17:36:47.567576517 +0200 +@@ -19,11 +19,12 @@ + compatible = "raspberrypi,4-model-b", "brcm,bcm2711"; + model = "Raspberry Pi 4 Model B"; + ++#if 0 + chosen { + /* 8250 auxiliary UART instead of pl011 */ + stdout-path = "serial1:115200n8"; + }; +- ++#endif + cam1_reg: regulator-cam1 { + compatible = "regulator-fixed"; + regulator-name = "cam1-reg"; diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0002-bcm270x.dtsi.patch b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0002-bcm270x.dtsi.patch new file mode 100644 index 0000000..8ee5f97 --- /dev/null +++ b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0002-bcm270x.dtsi.patch @@ -0,0 +1,206 @@ +--- /home/rossierd/soo/infrabase/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/boot/dts/broadcom/bcm270x.dtsi 1970-01-01 01:00:00.000000000 +0100 ++++ ./arch/arm64/boot/dts/broadcom/bcm270x.dtsi 2025-05-05 20:19:23.871333855 +0200 +@@ -0,0 +1,203 @@ ++/* Downstream bcm283x.dtsi diff */ ++#include ++ ++/ { ++ chosen { ++ bootargs = "coherent_pool=1M snd_bcm2835.enable_compat_alsa=0 snd_bcm2835.enable_hdmi=1"; ++ /delete-property/ stdout-path; ++ }; ++ ++ soc: soc { ++ ++ watchdog: watchdog@7e100000 { ++ /* Add label */ ++ }; ++ ++ random: rng@7e104000 { ++ /* Add label */ ++ }; ++ ++ spi0: spi@7e204000 { ++ /* Add label */ ++ }; ++ ++#ifndef BCM2711 ++ pixelvalve0: pixelvalve@7e206000 { ++ /* Add label */ ++ status = "disabled"; ++ }; ++ ++ pixelvalve1: pixelvalve@7e207000 { ++ /* Add label */ ++ status = "disabled"; ++ }; ++#endif ++ ++ /delete-node/ sdhci@7e300000; ++ ++ sdhci: mmc: mmc@7e300000 { ++ compatible = "brcm,bcm2835-mmc", "brcm,bcm2835-sdhci"; ++ reg = <0x7e300000 0x100>; ++ interrupts = <2 30>; ++ clocks = <&clocks BCM2835_CLOCK_EMMC>; ++ dmas = <&dma 11>; ++ dma-names = "rx-tx"; ++ brcm,overclock-50 = <0>; ++ status = "disabled"; ++ }; ++ ++ /* A clone of mmc but with non-removable set */ ++ mmcnr: mmcnr@7e300000 { ++ compatible = "brcm,bcm2835-mmc", "brcm,bcm2835-sdhci"; ++ reg = <0x7e300000 0x100>; ++ interrupts = <2 30>; ++ clocks = <&clocks BCM2835_CLOCK_EMMC>; ++ dmas = <&dma 11>; ++ dma-names = "rx-tx"; ++ brcm,overclock-50 = <0>; ++ non-removable; ++ status = "disabled"; ++ }; ++ ++ hvs: hvs@7e400000 { ++ /* Add label */ ++ status = "disabled"; ++ }; ++ ++ firmwarekms: firmwarekms@7e600000 { ++ compatible = "raspberrypi,rpi-firmware-kms"; ++ /* SMI interrupt reg */ ++ reg = <0x7e600000 0x100>; ++ interrupts = <2 16>; ++ brcm,firmware = <&firmware>; ++ status = "disabled"; ++ }; ++ ++ smi: smi@7e600000 { ++ compatible = "brcm,bcm2835-smi"; ++ reg = <0x7e600000 0x100>; ++ interrupts = <2 16>; ++ clocks = <&clocks BCM2835_CLOCK_SMI>; ++ assigned-clocks = <&clocks BCM2835_CLOCK_SMI>; ++ assigned-clock-rates = <125000000>; ++ dmas = <&dma 4>; ++ dma-names = "rx-tx"; ++ status = "disabled"; ++ }; ++ ++ csi0: csi@7e800000 { ++ compatible = "brcm,bcm2835-unicam"; ++ reg = <0x7e800000 0x800>, ++ <0x7e802000 0x4>; ++ interrupts = <2 6>; ++ clocks = <&clocks BCM2835_CLOCK_CAM0>, ++ <&firmware_clocks 4>; ++ clock-names = "lp", "vpu"; ++ power-domains = <&power RPI_POWER_DOMAIN_UNICAM0>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ #clock-cells = <1>; ++ status = "disabled"; ++ }; ++ ++ csi1: csi@7e801000 { ++ compatible = "brcm,bcm2835-unicam"; ++ reg = <0x7e801000 0x800>, ++ <0x7e802004 0x4>; ++ interrupts = <2 7>; ++ clocks = <&clocks BCM2835_CLOCK_CAM1>, ++ <&firmware_clocks 4>; ++ clock-names = "lp", "vpu"; ++ power-domains = <&power RPI_POWER_DOMAIN_UNICAM1>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ #clock-cells = <1>; ++ status = "disabled"; ++ }; ++ ++#ifndef BCM2711 ++ pixelvalve2: pixelvalve@7e807000 { ++ /* Add label */ ++ status = "disabled"; ++ }; ++#endif ++ ++ hdmi@7e902000 { /* hdmi */ ++ status = "disabled"; ++ }; ++ ++ usb@7e980000 { /* usb */ ++ compatible = "brcm,bcm2708-usb"; ++ reg = <0x7e980000 0x10000>, ++ <0x7e006000 0x1000>; ++ interrupt-names = "usb", ++ "soft"; ++ interrupts = <1 9>, ++ <2 0>; ++ }; ++ ++#ifndef BCM2711 ++ v3d@7ec00000 { /* vd3 */ ++ compatible = "brcm,vc4-v3d"; ++ power-domains = <&power RPI_POWER_DOMAIN_V3D>; ++ status = "disabled"; ++ }; ++#endif ++ ++ axiperf: axiperf { ++ compatible = "brcm,bcm2835-axiperf"; ++ reg = <0x7e009800 0x100>, ++ <0x7ee08000 0x100>; ++ firmware = <&firmware>; ++ status = "disabled"; ++ }; ++ }; ++ ++ __overrides__ { ++ cam0-pwdn-ctrl; ++ cam0-pwdn; ++ cam0-led-ctrl; ++ cam0-led; ++ }; ++}; ++ ++&gpio { ++ interrupts = <2 17>, <2 18>; ++ ++ dpi_18bit_gpio0: dpi_18bit_gpio0 { ++ brcm,pins = <0 1 2 3 4 5 6 7 8 9 10 11 ++ 12 13 14 15 16 17 18 19 ++ 20 21>; ++ brcm,function = ; ++ }; ++ dpi_18bit_gpio2: dpi_18bit_gpio2 { ++ brcm,pins = <2 3 4 5 6 7 8 9 10 11 ++ 12 13 14 15 16 17 18 19 ++ 20 21>; ++ brcm,function = ; ++ }; ++}; ++ ++&uart0 { ++ /* Enable CTS bug workaround */ ++ cts-event-workaround; ++}; ++ ++&i2s { ++ #sound-dai-cells = <0>; ++ dmas = <&dma 2>, <&dma 3>; ++ dma-names = "tx", "rx"; ++}; ++ ++&sdhost { ++ dmas = <&dma (13|(1<<29))>; ++ dma-names = "rx-tx"; ++ bus-width = <4>; ++ brcm,overclock-50 = <0>; ++ brcm,pio-limit = <1>; ++}; ++ ++&spi0 { ++ dmas = <&dma 6>, <&dma 7>; ++ dma-names = "tx", "rx"; ++}; diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0003-bcm270x-rpi.dtsi.patch b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0003-bcm270x-rpi.dtsi.patch new file mode 100644 index 0000000..b8149c2 --- /dev/null +++ b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0003-bcm270x-rpi.dtsi.patch @@ -0,0 +1,160 @@ +--- /home/rossierd/soo/infrabase/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/boot/dts/broadcom/bcm270x-rpi.dtsi 1970-01-01 01:00:00.000000000 +0100 ++++ ./arch/arm64/boot/dts/broadcom/bcm270x-rpi.dtsi 2025-05-05 20:19:23.871333855 +0200 +@@ -0,0 +1,157 @@ ++/* Downstream modifications to bcm2835-rpi.dtsi */ ++ ++/ { ++ aliases { ++ audio = &audio; ++ aux = &aux; ++ sound = &sound; ++ soc = &soc; ++ dma = &dma; ++ intc = &intc; ++ watchdog = &watchdog; ++ random = &random; ++ mailbox = &mailbox; ++ ++ /* SOO.tech - avoid a compilation warning */ ++ /*gpio = &gpio;*/ ++ ++ uart0 = &uart0; ++ uart1 = &uart1; ++ sdhost = &sdhost; ++ mmc = &mmc; ++ mmc1 = &mmc; ++ mmc0 = &sdhost; ++ i2s = &i2s; ++ i2c0 = &i2c0; ++ i2c1 = &i2c1; ++ i2c10 = &i2c_csi_dsi; ++ spi0 = &spi0; ++ spi1 = &spi1; ++ spi2 = &spi2; ++ usb = &usb; ++ leds = &leds; ++ fb = &fb; ++ thermal = &thermal; ++ axiperf = &axiperf; ++ }; ++ ++ /* Define these notional regulators for use by overlays */ ++ vdd_3v3_reg: fixedregulator_3v3 { ++ compatible = "regulator-fixed"; ++ regulator-always-on; ++ regulator-max-microvolt = <3300000>; ++ regulator-min-microvolt = <3300000>; ++ regulator-name = "3v3"; ++ }; ++ ++ vdd_5v0_reg: fixedregulator_5v0 { ++ compatible = "regulator-fixed"; ++ regulator-always-on; ++ regulator-max-microvolt = <5000000>; ++ regulator-min-microvolt = <5000000>; ++ regulator-name = "5v0"; ++ }; ++ ++ leds: leds { ++ compatible = "gpio-leds"; ++ }; ++ ++ soc { ++ gpiomem { ++ compatible = "brcm,bcm2835-gpiomem"; ++ reg = <0x7e200000 0x1000>; ++ }; ++ ++ fb: fb { ++ compatible = "brcm,bcm2708-fb"; ++ firmware = <&firmware>; ++ status = "okay"; ++ }; ++ ++ vcsm: vcsm { ++ compatible = "raspberrypi,bcm2835-vcsm"; ++ firmware = <&firmware>; ++ status = "okay"; ++ }; ++ ++ /* External sound card */ ++ sound: sound { ++ status = "disabled"; ++ }; ++ }; ++ ++ __overrides__ { ++ cache_line_size; ++ ++ uart0 = <&uart0>,"status"; ++ uart1 = <&uart1>,"status"; ++ i2s = <&i2s>,"status"; ++ spi = <&spi0>,"status"; ++ i2c0 = <&i2c0if>,"status",<&i2c0mux>,"status"; ++ i2c1 = <&i2c1>,"status"; ++ i2c0_baudrate = <&i2c0if>,"clock-frequency:0"; ++ i2c1_baudrate = <&i2c1>,"clock-frequency:0"; ++ ++ audio = <&audio>,"status"; ++ watchdog = <&watchdog>,"status"; ++ random = <&random>,"status"; ++ sd_overclock = <&sdhost>,"brcm,overclock-50:0"; ++ sd_force_pio = <&sdhost>,"brcm,force-pio?"; ++ sd_pio_limit = <&sdhost>,"brcm,pio-limit:0"; ++ sd_debug = <&sdhost>,"brcm,debug"; ++ sdio_overclock = <&mmc>,"brcm,overclock-50:0", ++ <&mmcnr>,"brcm,overclock-50:0"; ++ axiperf = <&axiperf>,"status"; ++ }; ++}; ++ ++&uart0 { ++ skip-init; ++}; ++ ++&uart1 { ++ skip-init; ++}; ++ ++&txp { ++ status = "disabled"; ++}; ++ ++&i2c0if { ++ status = "disabled"; ++}; ++ ++&i2c0mux { ++ status = "disabled"; ++}; ++ ++&i2c1 { ++ status = "disabled"; ++}; ++ ++&clocks { ++ firmware = <&firmware>; ++}; ++ ++&sdhci { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&emmc_gpio48>; ++ bus-width = <4>; ++}; ++ ++&cpu_thermal { ++ /delete-node/ trips; ++}; ++ ++&vec { ++ status = "disabled"; ++}; ++ ++&vchiq { ++ /* Onboard audio */ ++ audio: bcm2835_audio { ++ compatible = "brcm,bcm2835-audio"; ++ brcm,pwm-channels = <8>; ++ status = "disabled"; ++ }; ++}; diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0004-bcm2711.dtsi.patch b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0004-bcm2711.dtsi.patch new file mode 100644 index 0000000..30cc855 --- /dev/null +++ b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0004-bcm2711.dtsi.patch @@ -0,0 +1,1164 @@ +--- /home/rossierd/soo/infrabase/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/boot/dts/broadcom/bcm2711.dtsi 1970-01-01 01:00:00.000000000 +0100 ++++ ./arch/arm64/boot/dts/broadcom/bcm2711.dtsi 2025-05-05 20:19:23.871333855 +0200 +@@ -0,0 +1,1161 @@ ++// SPDX-License-Identifier: GPL-2.0 ++#include "bcm283x.dtsi" ++ ++#include ++#include ++ ++/ { ++ compatible = "brcm,bcm2711"; ++ ++ #address-cells = <2>; ++ #size-cells = <1>; ++ ++ interrupt-parent = <&gicv2>; ++ ++ vc4: gpu { ++ compatible = "brcm,bcm2711-vc5"; ++ status = "disabled"; ++ }; ++ ++ clk_27MHz: clk-27M { ++ #clock-cells = <0>; ++ compatible = "fixed-clock"; ++ clock-frequency = <27000000>; ++ clock-output-names = "27MHz-clock"; ++ }; ++ ++ clk_108MHz: clk-108M { ++ #clock-cells = <0>; ++ compatible = "fixed-clock"; ++ clock-frequency = <108000000>; ++ clock-output-names = "108MHz-clock"; ++ }; ++ ++ soc { ++ /* ++ * Defined ranges: ++ * Common BCM283x peripherals ++ * BCM2711-specific peripherals ++ * ARM-local peripherals ++ */ ++ ranges = <0x7e000000 0x0 0xfe000000 0x01800000>, ++ <0x7c000000 0x0 0xfc000000 0x02000000>, ++ <0x40000000 0x0 0xff800000 0x00800000>; ++ /* Emulate a contiguous 30-bit address range for DMA */ ++ dma-ranges = <0xc0000000 0x0 0x00000000 0x40000000>; ++ ++ /* ++ * This node is the provider for the enable-method for ++ * bringing up secondary cores. ++ */ ++ local_intc: local_intc@40000000 { ++ compatible = "brcm,bcm2836-l1-intc"; ++ reg = <0x40000000 0x100>; ++ }; ++ ++ gicv2: interrupt-controller@40041000 { ++ interrupt-controller; ++ #interrupt-cells = <3>; ++ compatible = "arm,gic-400"; ++ reg = <0x40041000 0x1000>, ++ <0x40042000 0x2000>, ++ <0x40044000 0x2000>, ++ <0x40046000 0x2000>; ++ interrupts = ; ++ }; ++ ++ avs_monitor: avs-monitor@7d5d2000 { ++ compatible = "brcm,bcm2711-avs-monitor", ++ "syscon", "simple-mfd"; ++ reg = <0x7d5d2000 0xf00>; ++ ++ thermal: thermal { ++ compatible = "brcm,bcm2711-thermal"; ++ #thermal-sensor-cells = <0>; ++ }; ++ }; ++ ++ dma: dma@7e007000 { ++ compatible = "brcm,bcm2835-dma"; ++ reg = <0x7e007000 0xb00>; ++ interrupts = , ++ , ++ , ++ , ++ , ++ , ++ , ++ /* DMA lite 7 - 10 */ ++ , ++ , ++ , ++ ; ++ interrupt-names = "dma0", ++ "dma1", ++ "dma2", ++ "dma3", ++ "dma4", ++ "dma5", ++ "dma6", ++ "dma7", ++ "dma8", ++ "dma9", ++ "dma10"; ++ #dma-cells = <1>; ++ brcm,dma-channel-mask = <0x07f5>; ++ }; ++ ++ pm: watchdog@7e100000 { ++ compatible = "brcm,bcm2835-pm", "brcm,bcm2835-pm-wdt"; ++ #power-domain-cells = <1>; ++ #reset-cells = <1>; ++ reg = <0x7e100000 0x114>, ++ <0x7e00a000 0x24>, ++ <0x7ec11000 0x20>; ++ clocks = <&clocks BCM2835_CLOCK_V3D>, ++ <&clocks BCM2835_CLOCK_PERI_IMAGE>, ++ <&clocks BCM2835_CLOCK_H264>, ++ <&clocks BCM2835_CLOCK_ISP>; ++ clock-names = "v3d", "peri_image", "h264", "isp"; ++ system-power-controller; ++ }; ++ ++ rng@7e104000 { ++ compatible = "brcm,bcm2711-rng200"; ++ reg = <0x7e104000 0x28>; ++ }; ++ ++ uart2: serial@7e201400 { ++ compatible = "arm,pl011", "arm,primecell"; ++ reg = <0x7e201400 0x200>; ++ interrupts = ; ++ clocks = <&clocks BCM2835_CLOCK_UART>, ++ <&clocks BCM2835_CLOCK_VPU>; ++ clock-names = "uartclk", "apb_pclk"; ++ arm,primecell-periphid = <0x00241011>; ++ status = "disabled"; ++ }; ++ ++ uart3: serial@7e201600 { ++ compatible = "arm,pl011", "arm,primecell"; ++ reg = <0x7e201600 0x200>; ++ interrupts = ; ++ clocks = <&clocks BCM2835_CLOCK_UART>, ++ <&clocks BCM2835_CLOCK_VPU>; ++ clock-names = "uartclk", "apb_pclk"; ++ arm,primecell-periphid = <0x00241011>; ++ status = "disabled"; ++ }; ++ ++ uart4: serial@7e201800 { ++ compatible = "arm,pl011", "arm,primecell"; ++ reg = <0x7e201800 0x200>; ++ interrupts = ; ++ clocks = <&clocks BCM2835_CLOCK_UART>, ++ <&clocks BCM2835_CLOCK_VPU>; ++ clock-names = "uartclk", "apb_pclk"; ++ arm,primecell-periphid = <0x00241011>; ++ status = "disabled"; ++ }; ++ ++ uart5: serial@7e201a00 { ++ compatible = "arm,pl011", "arm,primecell"; ++ reg = <0x7e201a00 0x200>; ++ interrupts = ; ++ clocks = <&clocks BCM2835_CLOCK_UART>, ++ <&clocks BCM2835_CLOCK_VPU>; ++ clock-names = "uartclk", "apb_pclk"; ++ arm,primecell-periphid = <0x00241011>; ++ status = "disabled"; ++ }; ++ ++ spi3: spi@7e204600 { ++ compatible = "brcm,bcm2835-spi"; ++ reg = <0x7e204600 0x0200>; ++ interrupts = ; ++ clocks = <&clocks BCM2835_CLOCK_VPU>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "disabled"; ++ }; ++ ++ spi4: spi@7e204800 { ++ compatible = "brcm,bcm2835-spi"; ++ reg = <0x7e204800 0x0200>; ++ interrupts = ; ++ clocks = <&clocks BCM2835_CLOCK_VPU>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "disabled"; ++ }; ++ ++ spi5: spi@7e204a00 { ++ compatible = "brcm,bcm2835-spi"; ++ reg = <0x7e204a00 0x0200>; ++ interrupts = ; ++ clocks = <&clocks BCM2835_CLOCK_VPU>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "disabled"; ++ }; ++ ++ spi6: spi@7e204c00 { ++ compatible = "brcm,bcm2835-spi"; ++ reg = <0x7e204c00 0x0200>; ++ interrupts = ; ++ clocks = <&clocks BCM2835_CLOCK_VPU>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "disabled"; ++ }; ++ ++ i2c3: i2c@7e205600 { ++ compatible = "brcm,bcm2711-i2c", "brcm,bcm2835-i2c"; ++ reg = <0x7e205600 0x200>; ++ interrupts = ; ++ clocks = <&clocks BCM2835_CLOCK_VPU>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "disabled"; ++ }; ++ ++ i2c4: i2c@7e205800 { ++ compatible = "brcm,bcm2711-i2c", "brcm,bcm2835-i2c"; ++ reg = <0x7e205800 0x200>; ++ interrupts = ; ++ clocks = <&clocks BCM2835_CLOCK_VPU>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "disabled"; ++ }; ++ ++ i2c5: i2c@7e205a00 { ++ compatible = "brcm,bcm2711-i2c", "brcm,bcm2835-i2c"; ++ reg = <0x7e205a00 0x200>; ++ interrupts = ; ++ clocks = <&clocks BCM2835_CLOCK_VPU>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "disabled"; ++ }; ++ ++ i2c6: i2c@7e205c00 { ++ compatible = "brcm,bcm2711-i2c", "brcm,bcm2835-i2c"; ++ reg = <0x7e205c00 0x200>; ++ interrupts = ; ++ clocks = <&clocks BCM2835_CLOCK_VPU>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "disabled"; ++ }; ++ ++ pixelvalve0: pixelvalve@7e206000 { ++ compatible = "brcm,bcm2711-pixelvalve0"; ++ reg = <0x7e206000 0x100>; ++ interrupts = ; ++ status = "disabled"; ++ }; ++ ++ pixelvalve1: pixelvalve@7e207000 { ++ compatible = "brcm,bcm2711-pixelvalve1"; ++ reg = <0x7e207000 0x100>; ++ interrupts = ; ++ status = "disabled"; ++ }; ++ ++ pixelvalve2: pixelvalve@7e20a000 { ++ compatible = "brcm,bcm2711-pixelvalve2"; ++ reg = <0x7e20a000 0x100>; ++ interrupts = ; ++ status = "disabled"; ++ }; ++ ++ pwm1: pwm@7e20c800 { ++ compatible = "brcm,bcm2835-pwm"; ++ reg = <0x7e20c800 0x28>; ++ clocks = <&clocks BCM2835_CLOCK_PWM>; ++ assigned-clocks = <&clocks BCM2835_CLOCK_PWM>; ++ assigned-clock-rates = <10000000>; ++ #pwm-cells = <2>; ++ status = "disabled"; ++ }; ++ ++ pixelvalve4: pixelvalve@7e216000 { ++ compatible = "brcm,bcm2711-pixelvalve4"; ++ reg = <0x7e216000 0x100>; ++ interrupts = ; ++ status = "disabled"; ++ }; ++ ++ hvs: hvs@7e400000 { ++ compatible = "brcm,bcm2711-hvs"; ++ interrupts = ; ++ }; ++ ++ pixelvalve3: pixelvalve@7ec12000 { ++ compatible = "brcm,bcm2711-pixelvalve3"; ++ reg = <0x7ec12000 0x100>; ++ interrupts = ; ++ status = "disabled"; ++ }; ++ ++ dvp: clock@7ef00000 { ++ compatible = "brcm,brcm2711-dvp"; ++ reg = <0x7ef00000 0x10>; ++ clocks = <&clk_108MHz>; ++ #clock-cells = <1>; ++ #reset-cells = <1>; ++ }; ++ ++ aon_intr: interrupt-controller@7ef00100 { ++ compatible = "brcm,bcm2711-l2-intc", "brcm,l2-intc"; ++ reg = <0x7ef00100 0x30>; ++ interrupts = ; ++ interrupt-controller; ++ #interrupt-cells = <1>; ++ status = "disabled"; ++ }; ++ ++ hdmi0: hdmi@7ef00700 { ++ compatible = "brcm,bcm2711-hdmi0"; ++ reg = <0x7ef00700 0x300>, ++ <0x7ef00300 0x200>, ++ <0x7ef00f00 0x80>, ++ <0x7ef00f80 0x80>, ++ <0x7ef01b00 0x200>, ++ <0x7ef01f00 0x400>, ++ <0x7ef00200 0x80>, ++ <0x7ef04300 0x100>, ++ <0x7ef20000 0x100>, ++ <0x7ef00100 0x30>; ++ reg-names = "hdmi", ++ "dvp", ++ "phy", ++ "rm", ++ "packet", ++ "metadata", ++ "csc", ++ "cec", ++ "hd", ++ "intr2"; ++ clocks = <&firmware_clocks 13>, ++ <&firmware_clocks 14>, ++ <&dvp 0>, ++ <&clk_27MHz>; ++ clock-names = "hdmi", "bvb", "audio", "cec"; ++ resets = <&dvp 0>; ++ interrupt-parent = <&aon_intr>; ++ interrupts = <0>, <1>, <2>, ++ <3>, <4>, <5>; ++ interrupt-names = "cec-tx", "cec-rx", "cec-low", ++ "wakeup", "hpd-connected", "hpd-removed"; ++ ddc = <&ddc0>; ++ dmas = <&dma 10>; ++ dma-names = "audio-rx"; ++ status = "disabled"; ++ }; ++ ++ ddc0: i2c@7ef04500 { ++ compatible = "brcm,bcm2711-hdmi-i2c"; ++ reg = <0x7ef04500 0x100>, <0x7ef00b00 0x300>; ++ reg-names = "bsc", "auto-i2c"; ++ clock-frequency = <97500>; ++ status = "disabled"; ++ }; ++ ++ hdmi1: hdmi@7ef05700 { ++ compatible = "brcm,bcm2711-hdmi1"; ++ reg = <0x7ef05700 0x300>, ++ <0x7ef05300 0x200>, ++ <0x7ef05f00 0x80>, ++ <0x7ef05f80 0x80>, ++ <0x7ef06b00 0x200>, ++ <0x7ef06f00 0x400>, ++ <0x7ef00280 0x80>, ++ <0x7ef09300 0x100>, ++ <0x7ef20000 0x100>, ++ <0x7ef00100 0x30>; ++ reg-names = "hdmi", ++ "dvp", ++ "phy", ++ "rm", ++ "packet", ++ "metadata", ++ "csc", ++ "cec", ++ "hd", ++ "intr2"; ++ ddc = <&ddc1>; ++ clock-names = "hdmi", "bvb", "audio", "cec"; ++ clocks = <&firmware_clocks 13>, ++ <&firmware_clocks 14>, ++ <&dvp 0>, ++ <&clk_27MHz>; ++ resets = <&dvp 1>; ++ interrupt-parent = <&aon_intr>; ++ interrupts = <8>, <7>, <6>, ++ <9>, <10>, <11>; ++ interrupt-names = "cec-tx", "cec-rx", "cec-low", ++ "wakeup", "hpd-connected", "hpd-removed"; ++ dmas = <&dma 17>; ++ dma-names = "audio-rx"; ++ status = "disabled"; ++ }; ++ ++ ddc1: i2c@7ef09500 { ++ compatible = "brcm,bcm2711-hdmi-i2c"; ++ reg = <0x7ef09500 0x100>, <0x7ef05b00 0x300>; ++ reg-names = "bsc", "auto-i2c"; ++ clock-frequency = <97500>; ++ status = "disabled"; ++ }; ++ }; ++ ++ /* ++ * emmc2 has different DMA constraints based on SoC revisions. It was ++ * moved into its own bus, so as for RPi4's firmware to update them. ++ * The firmware will find whether the emmc2bus alias is defined, and if ++ * so, it'll edit the dma-ranges property below accordingly. ++ */ ++ emmc2bus: emmc2bus { ++ compatible = "simple-bus"; ++ #address-cells = <2>; ++ #size-cells = <1>; ++ ++ ranges = <0x0 0x7e000000 0x0 0xfe000000 0x01800000>; ++ dma-ranges = <0x0 0xc0000000 0x0 0x00000000 0x40000000>; ++ ++ emmc2: emmc2@7e340000 { ++ compatible = "brcm,bcm2711-emmc2"; ++ reg = <0x0 0x7e340000 0x100>; ++ interrupts = ; ++ clocks = <&clocks BCM2711_CLOCK_EMMC2>; ++ status = "disabled"; ++ }; ++ }; ++ ++ arm-pmu { ++ compatible = "arm,cortex-a72-pmu", "arm,armv8-pmuv3"; ++ interrupts = , ++ , ++ , ++ ; ++ interrupt-affinity = <&cpu0>, <&cpu1>, <&cpu2>, <&cpu3>; ++ }; ++ ++ timer { ++ compatible = "arm,armv8-timer"; ++ interrupts = , ++ , ++ , ++ ; ++ /* This only applies to the ARMv7 stub */ ++ arm,cpu-registers-not-fw-configured; ++ }; ++ ++ cpus: cpus { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ enable-method = "brcm,bcm2836-smp"; // for ARM 32-bit ++ ++ cpu0: cpu@0 { ++ device_type = "cpu"; ++ compatible = "arm,cortex-a72"; ++ reg = <0>; ++ enable-method = "spin-table"; ++ cpu-release-addr = <0x0 0x000000d8>; ++ }; ++ ++ cpu1: cpu@1 { ++ device_type = "cpu"; ++ compatible = "arm,cortex-a72"; ++ reg = <1>; ++ enable-method = "spin-table"; ++ cpu-release-addr = <0x0 0x000000e0>; ++ }; ++ ++ cpu2: cpu@2 { ++ device_type = "cpu"; ++ compatible = "arm,cortex-a72"; ++ reg = <2>; ++ enable-method = "spin-table"; ++ cpu-release-addr = <0x0 0x000000e8>; ++ }; ++ ++ cpu3: cpu@3 { ++ device_type = "cpu"; ++ compatible = "arm,cortex-a72"; ++ reg = <3>; ++ enable-method = "spin-table"; ++ cpu-release-addr = <0x0 0x000000f0>; ++ }; ++ }; ++ ++ scb { ++ compatible = "simple-bus"; ++ #address-cells = <2>; ++ #size-cells = <2>; ++ ++ ranges = <0x0 0x7c000000 0x0 0xfc000000 0x0 0x03800000>, ++ <0x6 0x00000000 0x6 0x00000000 0x0 0x40000000>; ++ ++ pcie0: pcie@7d500000 { ++ compatible = "brcm,bcm2711-pcie"; ++ reg = <0x0 0x7d500000 0x0 0x9310>; ++ device_type = "pci"; ++ #address-cells = <3>; ++ #interrupt-cells = <1>; ++ #size-cells = <2>; ++ interrupts = , ++ ; ++ interrupt-names = "pcie", "msi"; ++ interrupt-map-mask = <0x0 0x0 0x0 0x7>; ++ interrupt-map = <0 0 0 1 &gicv2 GIC_SPI 143 ++ IRQ_TYPE_LEVEL_HIGH>; ++ msi-controller; ++ msi-parent = <&pcie0>; ++ ++ ranges = <0x02000000 0x0 0xc0000000 0x6 0x00000000 ++ 0x0 0x40000000>; ++ /* ++ * The wrapper around the PCIe block has a bug ++ * preventing it from accessing beyond the first 3GB of ++ * memory. ++ */ ++ dma-ranges = <0x02000000 0x0 0x00000000 0x0 0x00000000 ++ 0x0 0xc0000000>; ++ brcm,enable-ssc; ++ }; ++ ++#if 1 /* OpenCN */ ++ genet: ethernet@7d580000 { ++ compatible = "brcm,bcm2711-genet-v5"; ++ reg = <0x00 0x7d580000 0x00 0x10000>; ++ #address-cells = <0x01>; ++ #size-cells = <0x01>; ++ interrupts = <0x00 0x9d 0x04 0x00 0x9e 0x04>; ++ status = "okay"; ++ phy-handle = <&phy1>; ++ phy-mode = "rgmii-rxid"; ++ ++ genet_mdio: mdio@e14 { ++ compatible = "brcm,genet-mdio-v5"; ++ reg = <0xe14 0x08>; ++ reg-names = "mdio"; ++ #address-cells = <0x00>; ++ #size-cells = <0x01>; ++ ++ phy1: genet-phy@0 { ++ ++ reg = <0x01>; ++ led-modes = <0x00 0x08>; ++ ++ ++ }; ++ }; ++ }; ++#if 0 ++ genet: ethernet@7d580000 { ++ compatible = "brcm,bcm2711-genet-v5"; ++ reg = <0x0 0x7d580000 0x0 0x10000>; ++ #address-cells = <0x1>; ++ #size-cells = <0x1>; ++ interrupts = , ++ ; ++ status = "okay"; ++ ++ genet_mdio: mdio@e14 { ++ compatible = "brcm,genet-mdio-v5"; ++ reg = <0xe14 0x8>; ++ reg-names = "mdio"; ++ #address-cells = <0x0>; ++ #size-cells = <0x1>; ++ }; ++ }; ++#endif ++#else ++ genet: genet@7d580000 { ++ compatible = "brcm,bcm2711-genet-v5"; ++ reg = <0x0 0x7d580000 0x0 0x10000>; ++ #address-cells = <0x1>; ++ #size-cells = <0x1>; ++ interrupts = , ++ ; ++ status = "okay"; ++ ++ phy-handle = <&phy1>; ++ phy-mode = "rgmii"; ++ mdio@e14 { ++ #address-cells = <0x0>; ++ #size-cells = <0x1>; ++ compatible = "brcm,genet-mdio-v5"; ++ reg = <0xe14 0x8>; ++ reg-names = "mdio"; ++ phy1: genet-phy@0 { ++ compatible = "ethernet-phy-ieee802.3-c22"; ++ /* No interrupts - use PHY_POLL */ ++ max-speed = <1000>; ++ reg = <0x1>; ++ led-modes = <0x00 0x08>; /* link/activity link */ ++ }; ++ }; ++ }; ++#endif ++ }; ++}; ++ ++&clk_osc { ++ clock-frequency = <54000000>; ++}; ++ ++&clocks { ++ compatible = "brcm,bcm2711-cprman"; ++}; ++ ++&cpu_thermal { ++ coefficients = <(-487) 410040>; ++ thermal-sensors = <&thermal>; ++}; ++ ++&dsi0 { ++ interrupts = ; ++}; ++ ++&dsi1 { ++ interrupts = ; ++ compatible = "brcm,bcm2711-dsi1"; ++}; ++ ++&gpio { ++ compatible = "brcm,bcm2711-gpio"; ++ interrupts = , ++ , ++ , ++ ; ++ ++ gpclk0_gpio49: gpclk0_gpio49 { ++ pin-gpclk { ++ pins = "gpio49"; ++ function = "alt1"; ++ bias-disable; ++ }; ++ }; ++ gpclk1_gpio50: gpclk1_gpio50 { ++ pin-gpclk { ++ pins = "gpio50"; ++ function = "alt1"; ++ bias-disable; ++ }; ++ }; ++ gpclk2_gpio51: gpclk2_gpio51 { ++ pin-gpclk { ++ pins = "gpio51"; ++ function = "alt1"; ++ bias-disable; ++ }; ++ }; ++ ++ i2c0_gpio46: i2c0_gpio46 { ++ pin-sda { ++ function = "alt0"; ++ pins = "gpio46"; ++ bias-pull-up; ++ }; ++ pin-scl { ++ function = "alt0"; ++ pins = "gpio47"; ++ bias-disable; ++ }; ++ }; ++ i2c1_gpio46: i2c1_gpio46 { ++ pin-sda { ++ function = "alt1"; ++ pins = "gpio46"; ++ bias-pull-up; ++ }; ++ pin-scl { ++ function = "alt1"; ++ pins = "gpio47"; ++ bias-disable; ++ }; ++ }; ++ i2c3_gpio2: i2c3_gpio2 { ++ pin-sda { ++ function = "alt5"; ++ pins = "gpio2"; ++ bias-pull-up; ++ }; ++ pin-scl { ++ function = "alt5"; ++ pins = "gpio3"; ++ bias-disable; ++ }; ++ }; ++ i2c3_gpio4: i2c3_gpio4 { ++ pin-sda { ++ function = "alt5"; ++ pins = "gpio4"; ++ bias-pull-up; ++ }; ++ pin-scl { ++ function = "alt5"; ++ pins = "gpio5"; ++ bias-disable; ++ }; ++ }; ++ i2c4_gpio6: i2c4_gpio6 { ++ pin-sda { ++ function = "alt5"; ++ pins = "gpio6"; ++ bias-pull-up; ++ }; ++ pin-scl { ++ function = "alt5"; ++ pins = "gpio7"; ++ bias-disable; ++ }; ++ }; ++ i2c4_gpio8: i2c4_gpio8 { ++ pin-sda { ++ function = "alt5"; ++ pins = "gpio8"; ++ bias-pull-up; ++ }; ++ pin-scl { ++ function = "alt5"; ++ pins = "gpio9"; ++ bias-disable; ++ }; ++ }; ++ i2c5_gpio10: i2c5_gpio10 { ++ pin-sda { ++ function = "alt5"; ++ pins = "gpio10"; ++ bias-pull-up; ++ }; ++ pin-scl { ++ function = "alt5"; ++ pins = "gpio11"; ++ bias-disable; ++ }; ++ }; ++ i2c5_gpio12: i2c5_gpio12 { ++ pin-sda { ++ function = "alt5"; ++ pins = "gpio12"; ++ bias-pull-up; ++ }; ++ pin-scl { ++ function = "alt5"; ++ pins = "gpio13"; ++ bias-disable; ++ }; ++ }; ++ i2c6_gpio0: i2c6_gpio0 { ++ pin-sda { ++ function = "alt5"; ++ pins = "gpio0"; ++ bias-pull-up; ++ }; ++ pin-scl { ++ function = "alt5"; ++ pins = "gpio1"; ++ bias-disable; ++ }; ++ }; ++ i2c6_gpio22: i2c6_gpio22 { ++ pin-sda { ++ function = "alt5"; ++ pins = "gpio22"; ++ bias-pull-up; ++ }; ++ pin-scl { ++ function = "alt5"; ++ pins = "gpio23"; ++ bias-disable; ++ }; ++ }; ++ i2c_slave_gpio8: i2c_slave_gpio8 { ++ pins-i2c-slave { ++ pins = "gpio8", ++ "gpio9", ++ "gpio10", ++ "gpio11"; ++ function = "alt3"; ++ }; ++ }; ++ ++ jtag_gpio48: jtag_gpio48 { ++ pins-jtag { ++ pins = "gpio48", ++ "gpio49", ++ "gpio50", ++ "gpio51", ++ "gpio52", ++ "gpio53"; ++ function = "alt4"; ++ }; ++ }; ++ ++ mii_gpio28: mii_gpio28 { ++ pins-mii { ++ pins = "gpio28", ++ "gpio29", ++ "gpio30", ++ "gpio31"; ++ function = "alt4"; ++ }; ++ }; ++ mii_gpio36: mii_gpio36 { ++ pins-mii { ++ pins = "gpio36", ++ "gpio37", ++ "gpio38", ++ "gpio39"; ++ function = "alt5"; ++ }; ++ }; ++ ++ pcm_gpio50: pcm_gpio50 { ++ pins-pcm { ++ pins = "gpio50", ++ "gpio51", ++ "gpio52", ++ "gpio53"; ++ function = "alt2"; ++ }; ++ }; ++ ++ pwm0_0_gpio12: pwm0_0_gpio12 { ++ pin-pwm { ++ pins = "gpio12"; ++ function = "alt0"; ++ bias-disable; ++ }; ++ }; ++ pwm0_0_gpio18: pwm0_0_gpio18 { ++ pin-pwm { ++ pins = "gpio18"; ++ function = "alt5"; ++ bias-disable; ++ }; ++ }; ++ pwm1_0_gpio40: pwm1_0_gpio40 { ++ pin-pwm { ++ pins = "gpio40"; ++ function = "alt0"; ++ bias-disable; ++ }; ++ }; ++ pwm0_1_gpio13: pwm0_1_gpio13 { ++ pin-pwm { ++ pins = "gpio13"; ++ function = "alt0"; ++ bias-disable; ++ }; ++ }; ++ pwm0_1_gpio19: pwm0_1_gpio19 { ++ pin-pwm { ++ pins = "gpio19"; ++ function = "alt5"; ++ bias-disable; ++ }; ++ }; ++ pwm1_1_gpio41: pwm1_1_gpio41 { ++ pin-pwm { ++ pins = "gpio41"; ++ function = "alt0"; ++ bias-disable; ++ }; ++ }; ++ pwm0_1_gpio45: pwm0_1_gpio45 { ++ pin-pwm { ++ pins = "gpio45"; ++ function = "alt0"; ++ bias-disable; ++ }; ++ }; ++ pwm0_0_gpio52: pwm0_0_gpio52 { ++ pin-pwm { ++ pins = "gpio52"; ++ function = "alt1"; ++ bias-disable; ++ }; ++ }; ++ pwm0_1_gpio53: pwm0_1_gpio53 { ++ pin-pwm { ++ pins = "gpio53"; ++ function = "alt1"; ++ bias-disable; ++ }; ++ }; ++ ++ rgmii_gpio35: rgmii_gpio35 { ++ pin-start-stop { ++ pins = "gpio35"; ++ function = "alt4"; ++ }; ++ pin-rx-ok { ++ pins = "gpio36"; ++ function = "alt4"; ++ }; ++ }; ++ rgmii_irq_gpio34: rgmii_irq_gpio34 { ++ pin-irq { ++ pins = "gpio34"; ++ function = "alt5"; ++ }; ++ }; ++ rgmii_irq_gpio39: rgmii_irq_gpio39 { ++ pin-irq { ++ pins = "gpio39"; ++ function = "alt4"; ++ }; ++ }; ++ rgmii_mdio_gpio28: rgmii_mdio_gpio28 { ++ pins-mdio { ++ pins = "gpio28", ++ "gpio29"; ++ function = "alt5"; ++ }; ++ }; ++ rgmii_mdio_gpio37: rgmii_mdio_gpio37 { ++ pins-mdio { ++ pins = "gpio37", ++ "gpio38"; ++ function = "alt4"; ++ }; ++ }; ++ ++ spi0_gpio46: spi0_gpio46 { ++ pins-spi { ++ pins = "gpio46", ++ "gpio47", ++ "gpio48", ++ "gpio49"; ++ function = "alt2"; ++ }; ++ }; ++ spi2_gpio46: spi2_gpio46 { ++ pins-spi { ++ pins = "gpio46", ++ "gpio47", ++ "gpio48", ++ "gpio49", ++ "gpio50"; ++ function = "alt5"; ++ }; ++ }; ++ spi3_gpio0: spi3_gpio0 { ++ pins-spi { ++ pins = "gpio0", ++ "gpio1", ++ "gpio2", ++ "gpio3"; ++ function = "alt3"; ++ }; ++ }; ++ spi4_gpio4: spi4_gpio4 { ++ pins-spi { ++ pins = "gpio4", ++ "gpio5", ++ "gpio6", ++ "gpio7"; ++ function = "alt3"; ++ }; ++ }; ++ spi5_gpio12: spi5_gpio12 { ++ pins-spi { ++ pins = "gpio12", ++ "gpio13", ++ "gpio14", ++ "gpio15"; ++ function = "alt3"; ++ }; ++ }; ++ spi6_gpio18: spi6_gpio18 { ++ pins-spi { ++ pins = "gpio18", ++ "gpio19", ++ "gpio20", ++ "gpio21"; ++ function = "alt3"; ++ }; ++ }; ++ ++ uart2_gpio0: uart2_gpio0 { ++ pin-tx { ++ pins = "gpio0"; ++ function = "alt4"; ++ bias-disable; ++ }; ++ pin-rx { ++ pins = "gpio1"; ++ function = "alt4"; ++ bias-pull-up; ++ }; ++ }; ++ uart2_ctsrts_gpio2: uart2_ctsrts_gpio2 { ++ pin-cts { ++ pins = "gpio2"; ++ function = "alt4"; ++ bias-pull-up; ++ }; ++ pin-rts { ++ pins = "gpio3"; ++ function = "alt4"; ++ bias-disable; ++ }; ++ }; ++ uart3_gpio4: uart3_gpio4 { ++ pin-tx { ++ pins = "gpio4"; ++ function = "alt4"; ++ bias-disable; ++ }; ++ pin-rx { ++ pins = "gpio5"; ++ function = "alt4"; ++ bias-pull-up; ++ }; ++ }; ++ uart3_ctsrts_gpio6: uart3_ctsrts_gpio6 { ++ pin-cts { ++ pins = "gpio6"; ++ function = "alt4"; ++ bias-pull-up; ++ }; ++ pin-rts { ++ pins = "gpio7"; ++ function = "alt4"; ++ bias-disable; ++ }; ++ }; ++ uart4_gpio8: uart4_gpio8 { ++ pin-tx { ++ pins = "gpio8"; ++ function = "alt4"; ++ bias-disable; ++ }; ++ pin-rx { ++ pins = "gpio9"; ++ function = "alt4"; ++ bias-pull-up; ++ }; ++ }; ++ uart4_ctsrts_gpio10: uart4_ctsrts_gpio10 { ++ pin-cts { ++ pins = "gpio10"; ++ function = "alt4"; ++ bias-pull-up; ++ }; ++ pin-rts { ++ pins = "gpio11"; ++ function = "alt4"; ++ bias-disable; ++ }; ++ }; ++ uart5_gpio12: uart5_gpio12 { ++ pin-tx { ++ pins = "gpio12"; ++ function = "alt4"; ++ bias-disable; ++ }; ++ pin-rx { ++ pins = "gpio13"; ++ function = "alt4"; ++ bias-pull-up; ++ }; ++ }; ++ uart5_ctsrts_gpio14: uart5_ctsrts_gpio14 { ++ pin-cts { ++ pins = "gpio14"; ++ function = "alt4"; ++ bias-pull-up; ++ }; ++ pin-rts { ++ pins = "gpio15"; ++ function = "alt4"; ++ bias-disable; ++ }; ++ }; ++}; ++ ++&rmem { ++ #address-cells = <2>; ++}; ++ ++&cma { ++ /* ++ * arm64 reserves the CMA by default somewhere in ZONE_DMA32, ++ * that's not good enough for the BCM2711 as some devices can ++ * only address the lower 1G of memory (ZONE_DMA). ++ */ ++ alloc-ranges = <0x0 0x00000000 0x40000000>; ++}; ++ ++&i2c0if { ++ compatible = "brcm,bcm2711-i2c", "brcm,bcm2835-i2c"; ++ interrupts = ; ++}; ++ ++&i2c1 { ++ compatible = "brcm,bcm2711-i2c", "brcm,bcm2835-i2c"; ++ interrupts = ; ++}; ++ ++&mailbox { ++ interrupts = ; ++}; ++ ++&sdhci { ++ interrupts = ; ++}; ++ ++&sdhost { ++ interrupts = ; ++}; ++ ++&spi { ++ interrupts = ; ++}; ++ ++&spi1 { ++ interrupts = ; ++}; ++ ++&spi2 { ++ interrupts = ; ++}; ++ ++&system_timer { ++ interrupts = , ++ , ++ , ++ ; ++}; ++ ++&txp { ++ interrupts = ; ++}; ++ ++&uart0 { ++ interrupts = ; ++}; ++ ++&uart1 { ++ interrupts = ; ++}; ++ ++&usb { ++ interrupts = ; ++}; ++ ++&vec { ++ interrupts = ; ++}; diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0005-bcm2711-rpi-4-b.dts.patch b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0005-bcm2711-rpi-4-b.dts.patch index ba73f8c..255c160 100644 --- a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0005-bcm2711-rpi-4-b.dts.patch +++ b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0005-bcm2711-rpi-4-b.dts.patch @@ -1,39 +1,350 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dts 2026-02-08 10:06:33.373477030 +0100 -+++ ./arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dts 2026-02-08 09:43:34.340984648 +0100 -@@ -1,2 +1,87 @@ +--- /home/rossierd/soo/infrabase/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dts 2025-09-03 20:23:08.000000000 +0200 ++++ ./arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dts 2025-09-04 17:39:05.169281153 +0200 +@@ -1,2 +1,416 @@ // SPDX-License-Identifier: GPL-2.0 - #include "arm/broadcom/bcm2711-rpi-4-b.dts" +-#include "arm/broadcom/bcm2711-rpi-4-b.dts" ++/* SOO.tech */ ++ ++/dts-v1/; ++#include "bcm2711.dtsi" ++#include "bcm2835-rpi.dtsi" ++#include "bcm283x-rpi-usb-peripheral.dtsi" ++ ++#include + +/ { ++ compatible = "raspberrypi,4-model-b", "brcm,bcm2711"; ++ model = "Raspberry Pi 4 Model B"; ++ + chosen { -+ bootargs = "coherent_pool=1M 8250.nr_uarts=1 cma=64M smsc95xx.macaddr=DC:A6:32:18:DD:95 vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000 console=ttyS0,115200 root=/dev/ram fsck.repair=yes rootwait"; ++ /* bootargs = "console=ttyAMA0,115200n8 root=/dev/ram rw slub_debug=PUZ"; */ ++ /* bootargs = "coherent_pool=1M 8250.nr_uarts=1 cma=64M cma=256M smsc95xx.macaddr=DC:A6:32:18:DD:95 vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000 console=serial0,115200 console=tty1 root=/dev/ram elevator=deadline fsck.repair=yes rootwait"; */ ++ /* bootargs = "initcall_debug=1 ignore_loglevel coherent_pool=1M 8250.nr_uarts=1 cma=64M cma=256M smsc95xx.macaddr=DC:A6:32:18:DD:95 vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000 console=ttyS0,115200 root=/dev/ram fsck.repair=yes rootwait"; */ ++ ++ bootargs = "coherent_pool=1M 8250.nr_uarts=1 cma=64M cma=256M smsc95xx.macaddr=DC:A6:32:18:DD:95 vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000 console=ttyS0,115200 root=/dev/ram fsck.repair=yes rootwait"; ++ ++ /* 8250 auxiliary UART instead of pl011 */ ++ /* stdout-path = "serial1:115200n8"; */ ++ ++ }; ++ ++ /* Will be filled by the bootloader */ ++ memory@0 { ++ device_type = "memory"; ++ reg = <0 0 0x20000000>; ++ }; + -+ /delete-property/ stdout-path; ++ agency { ++ domain-size = <0x20000000>; ++ }; ++ ++ aliases { ++ serial0 = &uart1; ++ serial1 = &uart0; ++ mmc0 = &emmc2; ++ mmc2 = &sdhost; ++ i2c3 = &i2c3; ++ i2c4 = &i2c4; ++ i2c5 = &i2c5; ++ i2c6 = &i2c6; ++ /delete-property/ ethernet; ++ /delete-property/ intc; ++ ethernet0 = &genet; ++ pcie0 = &pcie0; + }; + -+ /* Normally filled by the bootloader, but AVZ doesn't */ -+ memory@0 { -+ device_type = "memory"; -+ reg = <0x0 0x10000000 0x20000000>; ++ leds { ++ act { ++ gpios = <&gpio 42 GPIO_ACTIVE_HIGH>; ++ }; ++ ++ pwr { ++ label = "PWR"; ++ gpios = <&expgpio 2 GPIO_ACTIVE_LOW>; ++ }; ++ }; ++ ++ wifi_pwrseq: wifi-pwrseq { ++ compatible = "mmc-pwrseq-simple"; ++ reset-gpios = <&expgpio 1 GPIO_ACTIVE_LOW>; ++ }; ++ ++ sd_io_1v8_reg: sd_io_1v8_reg { ++ compatible = "regulator-gpio"; ++ regulator-name = "vdd-sd-io"; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-boot-on; ++ regulator-always-on; ++ regulator-settling-time-us = <5000>; ++ gpios = <&expgpio 4 GPIO_ACTIVE_HIGH>; ++ states = <1800000 0x1 ++ 3300000 0x0>; ++ status = "okay"; + }; +}; + -+/* SOO.tech */ ++&pcie0 { ++ pci@1,0 { ++ #address-cells = <3>; ++ #size-cells = <2>; ++ ranges; ++ ++ reg = <0 0 0 0 0>; ++ ++ usb@1,0 { ++ reg = <0x10000 0 0 0 0>; ++ resets = <&reset RASPBERRYPI_FIRMWARE_RESET_ID_USB>; ++ }; ++ }; ++}; ++ ++&gpio { ++ spi0_pins: spi0_pins { ++ brcm,pins = <9 10 11>; ++ brcm,function = ; ++ }; ++ ++ spi0_cs_pins: spi0_cs_pins { ++ brcm,pins = <8 7>; ++ brcm,function = ; ++ }; ++ ++ spi3_pins: spi3_pins { ++ brcm,pins = <1 2 3>; ++ brcm,function = ; ++ }; ++ ++ spi3_cs_pins: spi3_cs_pins { ++ brcm,pins = <0 24>; ++ brcm,function = ; ++ }; ++ ++ spi4_pins: spi4_pins { ++ brcm,pins = <5 6 7>; ++ brcm,function = ; ++ }; ++ ++ spi4_cs_pins: spi4_cs_pins { ++ brcm,pins = <4 25>; ++ brcm,function = ; ++ }; ++ ++ spi5_pins: spi5_pins { ++ brcm,pins = <13 14 15>; ++ brcm,function = ; ++ }; ++ ++ spi5_cs_pins: spi5_cs_pins { ++ brcm,pins = <12 26>; ++ brcm,function = ; ++ }; ++ ++ spi6_pins: spi6_pins { ++ brcm,pins = <19 20 21>; ++ brcm,function = ; ++ }; ++ ++ spi6_cs_pins: spi6_cs_pins { ++ brcm,pins = <18 27>; ++ brcm,function = ; ++ }; ++ ++ i2c0_pins: i2c0 { ++ brcm,pins = <0 1>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2c1_pins: i2c1 { ++ brcm,pins = <2 3>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2c3_pins: i2c3 { ++ brcm,pins = <4 5>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2c4_pins: i2c4 { ++ brcm,pins = <8 9>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2c5_pins: i2c5 { ++ brcm,pins = <12 13>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2c6_pins: i2c6 { ++ brcm,pins = <22 23>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2s_pins: i2s { ++ brcm,pins = <18 19 20 21>; ++ brcm,function = ; ++ }; ++ ++ sdio_pins: sdio_pins { ++ brcm,pins = <34 35 36 37 38 39>; ++ brcm,function = ; // alt3 = SD1 ++ brcm,pull = <0 2 2 2 2 2>; ++ }; ++ ++ bt_pins: bt_pins { ++ brcm,pins = "-"; // non-empty to keep btuart happy, //4 = 0 ++ // to fool pinctrl ++ brcm,function = <0>; ++ brcm,pull = <2>; ++ }; ++ ++ uart0_pins: uart0_pins { ++ brcm,pins = <32 33>; ++ brcm,function = ; ++ brcm,pull = <0 2>; ++ }; ++ ++ uart1_pins: uart1_pins { ++ brcm,pins; ++ brcm,function; ++ brcm,pull; ++ }; ++ ++ uart2_pins: uart2_pins { ++ brcm,pins = <0 1>; ++ brcm,function = ; ++ brcm,pull = <0 2>; ++ }; ++ ++ uart3_pins: uart3_pins { ++ brcm,pins = <4 5>; ++ brcm,function = ; ++ brcm,pull = <0 2>; ++ }; ++ ++ uart4_pins: uart4_pins { ++ brcm,pins = <8 9>; ++ brcm,function = ; ++ brcm,pull = <0 2>; ++ }; ++ ++ uart5_pins: uart5_pins { ++ brcm,pins = <12 13>; ++ brcm,function = ; ++ brcm,pull = <0 2>; ++ }; ++ ++ audio_pins: audio_pins { ++ brcm,pins = <40 41>; ++ brcm,function = <4>; ++ }; ++}; ++ ++/* +&soc { -+ virtgpio: virtgpio { -+ compatible = "brcm,bcm2835-virtgpio"; ++ virtgpio: virtgpio { ++ compatible = "brcm,bcm2835-virtgpio"; ++ gpio-controller; ++ #gpio-cells = <2>; ++ firmware = <&firmware>; ++ status = "okay"; ++ }; ++}; ++*/ ++/* ++&mmcnr { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sdio_pins>; ++ bus-width = <4>; ++ status = "disabled"; ++};*/ ++ ++&firmware { ++ expgpio: gpio { ++ compatible = "raspberrypi,firmware-gpio"; + gpio-controller; + #gpio-cells = <2>; -+ firmware = <&firmware>; ++ gpio-line-names = "BT_ON", ++ "WL_ON", ++ "PWR_LED_OFF", ++ "GLOBAL_RESET", ++ "VDD_SD_IO_SEL", ++ "CAM_GPIO", ++ "", ++ ""; + status = "okay"; + }; ++ ++ reset: reset { ++ compatible = "raspberrypi,firmware-reset"; ++ #reset-cells = <1>; ++ }; ++}; ++ ++&pwm1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pwm1_0_gpio40 &pwm1_1_gpio41>; ++ status = "okay"; ++}; ++ ++/* SDHCI is used to control the SDIO for wireless */ ++&sdhci { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&emmc_gpio34>; ++ bus-width = <4>; ++ non-removable; ++ mmc-pwrseq = <&wifi_pwrseq>; ++ status = "okay"; ++ ++ brcmf: wifi@1 { ++ reg = <1>; ++ compatible = "brcm,bcm4329-fmac"; ++ }; +}; + ++/* EMMC2 is used to drive the SD card */ ++&emmc2 { ++ vqmmc-supply = <&sd_io_1v8_reg>; ++ broken-cd; ++ status = "okay"; ++}; ++ ++/* uart0 communicates with the BT module */ ++&uart0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart0_ctsrts_gpio30 &uart0_gpio32>; ++ uart-has-rtscts; ++ status = "okay"; ++ ++ bluetooth { ++ compatible = "brcm,bcm43438-bt"; ++ max-speed = <2000000>; ++ shutdown-gpios = <&expgpio 0 GPIO_ACTIVE_HIGH>; ++ }; ++}; ++ ++/* uart1 is mapped to the pin header */ ++&uart1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart1_gpio14>; ++ status = "okay"; ++}; ++ ++ +&spi1 { + status = "okay"; + cs-gpios = <&gpio 18 GPIO_ACTIVE_LOW>; + num-cs = <1>; + ++ /* SOO.tech */ + drv8703q1@0 { + compatible = "ti,drv8703q1"; + status = "okay"; @@ -44,8 +355,33 @@ + }; +}; + ++/* SOO.tech */ ++&i2c4 { ++ status = "okay"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2c4_pins>; ++ clock-frequency = <100000>; ++ ++ ds1050@28 { ++ compatible = "maxim,ds1050"; ++ reg = <0x28>; /* This is due to the control byte (101) + A2, A1, A0 (000) combination (101000 = 0x28) */ ++ }; ++}; ++ ++ ++ +&i2c1 { ++ compatible = "brcm,bcm2711-i2c", "brcm,bcm2835-i2c"; ++ interrupts = ; ++ + status = "okay"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2c1_pins>; ++ clock-frequency = <100000>; ++ ++ ++ #address-cells = <1>; ++ #size-cells = <0>; + + rpi-sense@46 { + compatible = "rpi,rpi-sense"; @@ -79,12 +415,6 @@ + }; +}; + -+&i2c4 { -+ status = "okay"; -+ clock-frequency = <100000>; -+ -+ ds1050@28 { -+ compatible = "maxim,ds1050"; -+ reg = <0x28>; /* This is due to the control byte (101) + A2, A1, A0 (000) combination (101000 = 0x28) */ -+ }; ++&vchiq { ++ interrupts = ; +}; diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0006-bcm2711-rpi.dtsi.patch b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0006-bcm2711-rpi.dtsi.patch new file mode 100644 index 0000000..1f2f32c --- /dev/null +++ b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0006-bcm2711-rpi.dtsi.patch @@ -0,0 +1,204 @@ +--- /home/rossierd/soo/infrabase/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/boot/dts/broadcom/bcm2711-rpi.dtsi 1970-01-01 01:00:00.000000000 +0100 ++++ ./arch/arm64/boot/dts/broadcom/bcm2711-rpi.dtsi 2025-05-05 20:19:23.871333855 +0200 +@@ -0,0 +1,201 @@ ++// SPDX-License-Identifier: GPL-2.0 ++#include "bcm270x-rpi.dtsi" ++ ++/ { ++ __overrides__ { ++ arm_freq; ++ }; ++ ++ v3dbus: v3dbus { ++ compatible = "simple-bus"; ++ #address-cells = <1>; ++ #size-cells = <2>; ++ ranges = <0x7c500000 0x0 0xfc500000 0x0 0x03300000>, ++ <0x40000000 0x0 0xff800000 0x0 0x00800000>; ++ dma-ranges = <0x00000000 0x0 0x00000000 0x4 0x00000000>; ++ ++ v3d: v3d@7ec04000 { ++ compatible = "brcm,2711-v3d"; ++ reg = ++ <0x7ec00000 0x0 0x4000>, ++ <0x7ec04000 0x0 0x4000>; ++ reg-names = "hub", "core0"; ++ ++ power-domains = <&pm BCM2835_POWER_DOMAIN_GRAFX_V3D>; ++ resets = <&pm BCM2835_RESET_V3D>; ++ clocks = <&firmware_clocks 5>; ++ clocks-names = "v3d"; ++ interrupts = ; ++ status = "disabled"; ++ }; ++ }; ++ ++ scb: scb { ++ /* Add a label */ ++ }; ++}; ++ ++&cma { ++ /* Limit cma to the lower 768MB to allow room for HIGHMEM on 32-bit */ ++ alloc-ranges = <0x0 0x00000000 0x30000000>; ++}; ++ ++&scb { ++ ranges = <0x0 0x7c000000 0x0 0xfc000000 0x0 0x03800000>, ++ <0x0 0x40000000 0x0 0xff800000 0x0 0x00800000>, ++ <0x6 0x00000000 0x6 0x00000000 0x0 0x40000000>, ++ <0x0 0x00000000 0x0 0x00000000 0x0 0xfc000000>; ++ dma-ranges = <0x0 0x00000000 0x0 0x00000000 0x4 0x00000000>; ++ ++ dma40: dma@7e007b00 { ++ compatible = "brcm,bcm2711-dma"; ++ reg = <0x0 0x7e007b00 0x0 0x400>; ++ interrupts = ++ , /* dma4 11 */ ++ , /* dma4 12 */ ++ , /* dma4 13 */ ++ ; /* dma4 14 */ ++ interrupt-names = "dma11", ++ "dma12", ++ "dma13", ++ "dma14"; ++ #dma-cells = <1>; ++ brcm,dma-channel-mask = <0x7800>; ++ }; ++ ++ xhci: xhci@7e9c0000 { ++ compatible = "generic-xhci"; ++ status = "disabled"; ++ reg = <0x0 0x7e9c0000 0x0 0x100000>; ++ interrupts = ; ++ power-domains = <&power RPI_POWER_DOMAIN_USB>; ++ }; ++ ++ hevc-decoder@7eb00000 { ++ compatible = "raspberrypi,rpivid-hevc-decoder"; ++ reg = <0x0 0x7eb00000 0x0 0x10000>; ++ status = "okay"; ++ }; ++ ++ rpivid-local-intc@7eb10000 { ++ compatible = "raspberrypi,rpivid-local-intc"; ++ reg = <0x0 0x7eb10000 0x0 0x1000>; ++ status = "okay"; ++ interrupts = ; ++ }; ++ ++ h264-decoder@7eb20000 { ++ compatible = "raspberrypi,rpivid-h264-decoder"; ++ reg = <0x0 0x7eb20000 0x0 0x10000>; ++ status = "okay"; ++ }; ++ ++ vp9-decoder@7eb30000 { ++ compatible = "raspberrypi,rpivid-vp9-decoder"; ++ reg = <0x0 0x7eb30000 0x0 0x10000>; ++ status = "okay"; ++ }; ++}; ++ ++&dma40 { ++ /* The VPU firmware uses DMA channel 11 for VCHIQ */ ++ brcm,dma-channel-mask = <0x7000>; ++}; ++ ++&vchiq { ++ compatible = "brcm,bcm2711-vchiq"; ++}; ++ ++&firmwarekms { ++ compatible = "raspberrypi,rpi-firmware-kms-2711"; ++ interrupts = ; ++}; ++ ++&smi { ++ interrupts = ; ++}; ++ ++&mmc { ++ interrupts = ; ++}; ++ ++&mmcnr { ++ interrupts = ; ++}; ++ ++&csi0 { ++ interrupts = ; ++}; ++ ++&csi1 { ++ interrupts = ; ++}; ++ ++&random { ++ compatible = "brcm,bcm2711-rng200"; ++ status = "okay"; ++}; ++ ++&usb { ++ /* Enable the FIQ support */ ++ reg = <0x7e980000 0x10000>, ++ <0x7e00b200 0x200>; ++ interrupts = , ++ ; ++ status = "disabled"; ++}; ++ ++&gpio { ++ interrupts = , ++ ; ++}; ++ ++&emmc2 { ++ mmc-ddr-3_3v; ++}; ++ ++&vc4 { ++ status = "disabled"; ++}; ++ ++&pixelvalve0 { ++ status = "disabled"; ++}; ++ ++&pixelvalve1 { ++ status = "disabled"; ++}; ++ ++&pixelvalve2 { ++ status = "disabled"; ++}; ++ ++&pixelvalve3 { ++ status = "disabled"; ++}; ++ ++&pixelvalve4 { ++ status = "disabled"; ++}; ++ ++&hdmi0 { ++ dmas = <&dma (10|(1<<27)|(1<<24)|(10<<16)|(15<<20))>; ++ status = "disabled"; ++}; ++ ++&ddc0 { ++ status = "disabled"; ++}; ++ ++&hdmi1 { ++ dmas = <&dma (17|(1<<27)|(1<<24)|(10<<16)|(15<<20))>; ++ status = "disabled"; ++}; ++ ++&ddc1 { ++ status = "disabled"; ++}; ++ ++&dvp { ++ status = "disabled"; ++}; diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0007-bcm271x-rpi-bt.dtsi.patch b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0007-bcm271x-rpi-bt.dtsi.patch new file mode 100644 index 0000000..fad7b39 --- /dev/null +++ b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0007-bcm271x-rpi-bt.dtsi.patch @@ -0,0 +1,29 @@ +--- /home/rossierd/soo/infrabase/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/boot/dts/broadcom/bcm271x-rpi-bt.dtsi 1970-01-01 01:00:00.000000000 +0100 ++++ ./arch/arm64/boot/dts/broadcom/bcm271x-rpi-bt.dtsi 2025-05-05 20:19:23.871333855 +0200 +@@ -0,0 +1,26 @@ ++// SPDX-License-Identifier: GPL-2.0 ++ ++&uart0 { ++ bt: bluetooth { ++ compatible = "brcm,bcm43438-bt"; ++ max-speed = <3000000>; ++ shutdown-gpios = <&expgpio 0 GPIO_ACTIVE_HIGH>; ++ status = "disabled"; ++ }; ++}; ++ ++&uart1 { ++ minibt: bluetooth { ++ compatible = "brcm,bcm43438-bt"; ++ max-speed = <460800>; ++ shutdown-gpios = <&expgpio 0 GPIO_ACTIVE_HIGH>; ++ status = "disabled"; ++ }; ++}; ++ ++/ { ++ __overrides__ { ++ krnbt = <&bt>,"status"; ++ krnbt_baudrate = <&bt>,"max-speed:0"; ++ }; ++}; diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0008-bcm2835-rpi.dtsi.patch b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0008-bcm2835-rpi.dtsi.patch new file mode 100644 index 0000000..dd0f892 --- /dev/null +++ b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0008-bcm2835-rpi.dtsi.patch @@ -0,0 +1,93 @@ +--- /home/rossierd/soo/infrabase/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/boot/dts/broadcom/bcm2835-rpi.dtsi 1970-01-01 01:00:00.000000000 +0100 ++++ ./arch/arm64/boot/dts/broadcom/bcm2835-rpi.dtsi 2025-05-05 20:19:23.871333855 +0200 +@@ -0,0 +1,90 @@ ++#include ++ ++/ { ++ leds { ++ compatible = "gpio-leds"; ++ ++ act { ++ label = "ACT"; ++ default-state = "keep"; ++ linux,default-trigger = "heartbeat"; ++ }; ++ }; ++ ++ soc { ++ firmware: firmware { ++ compatible = "raspberrypi,bcm2835-firmware", "simple-mfd"; ++ #address-cells = <1>; ++ #size-cells = <1>; ++ ++ mboxes = <&mailbox>; ++ dma-ranges; ++ ++ firmware_clocks: clocks { ++ compatible = "raspberrypi,firmware-clocks"; ++ #clock-cells = <1>; ++ }; ++ }; ++ ++ power: power { ++ compatible = "raspberrypi,bcm2835-power"; ++ firmware = <&firmware>; ++ #power-domain-cells = <1>; ++ }; ++ ++ vchiq: mailbox@7e00b840 { ++ compatible = "brcm,bcm2835-vchiq"; ++ reg = <0x7e00b840 0x3c>; ++ interrupts = <0 2>; ++ }; ++ }; ++}; ++ ++&gpio { ++ pinctrl-names = "default"; ++ ++ gpioout: gpioout { ++ brcm,pins = <6>; ++ brcm,function = ; ++ }; ++ ++ alt0: alt0 { ++ brcm,pins = <4 5 7 8 9 10 11>; ++ brcm,function = ; ++ }; ++}; ++ ++&i2c0if { ++ status = "okay"; ++ clock-frequency = <100000>; ++}; ++ ++&i2c0mux { ++ pinctrl-0 = <&i2c0_gpio0>; ++ /* pinctrl-1 varies based on platform */ ++ status = "okay"; ++}; ++ ++&i2c1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2c1_gpio2>; ++ status = "okay"; ++ clock-frequency = <100000>; ++}; ++ ++&usb { ++ power-domains = <&power RPI_POWER_DOMAIN_USB>; ++}; ++ ++&vec { ++ power-domains = <&power RPI_POWER_DOMAIN_VEC>; ++ status = "okay"; ++}; ++ ++&dsi0 { ++ power-domains = <&power RPI_POWER_DOMAIN_DSI0>; ++}; ++ ++&dsi1 { ++ power-domains = <&power RPI_POWER_DOMAIN_DSI1>; ++}; diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0009-bcm283x.dtsi.patch b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0009-bcm283x.dtsi.patch new file mode 100644 index 0000000..8f5b057 --- /dev/null +++ b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0009-bcm283x.dtsi.patch @@ -0,0 +1,536 @@ +--- /home/rossierd/soo/infrabase/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/boot/dts/broadcom/bcm283x.dtsi 1970-01-01 01:00:00.000000000 +0100 ++++ ./arch/arm64/boot/dts/broadcom/bcm283x.dtsi 2025-05-05 20:19:23.872333877 +0200 +@@ -0,0 +1,533 @@ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++/* firmware-provided startup stubs live here, where the secondary CPUs are ++ * spinning. ++ */ ++/memreserve/ 0x00000000 0x00001000; ++ ++/* This include file covers the common peripherals and configuration between ++ * bcm2835 and bcm2836 implementations, leaving the CPU configuration to ++ * bcm2835.dtsi and bcm2836.dtsi. ++ */ ++ ++/ { ++ compatible = "brcm,bcm2835"; ++ model = "BCM2835"; ++ #address-cells = <1>; ++ #size-cells = <1>; ++ ++ aliases { ++ serial0 = &uart0; ++ serial1 = &uart1; ++ }; ++ ++ chosen { ++ stdout-path = "serial0:115200n8"; ++ }; ++ ++ rmem: reserved-memory { ++ #address-cells = <1>; ++ #size-cells = <1>; ++ ranges; ++ ++ cma: linux,cma { ++ compatible = "shared-dma-pool"; ++ size = <0x4000000>; /* 64MB */ ++ reusable; ++ linux,cma-default; ++ }; ++ }; ++ ++ thermal-zones { ++ cpu_thermal: cpu-thermal { ++ polling-delay-passive = <0>; ++ polling-delay = <1000>; ++ ++ trips { ++ cpu-crit { ++ temperature = <90000>; ++ hysteresis = <0>; ++ type = "critical"; ++ }; ++ }; ++ ++ cooling-maps { ++ }; ++ }; ++ }; ++ ++ soc { ++ compatible = "simple-bus"; ++ #address-cells = <1>; ++ #size-cells = <1>; ++ ++ system_timer: timer@7e003000 { ++ compatible = "brcm,bcm2835-system-timer"; ++ reg = <0x7e003000 0x1000>; ++ interrupts = <1 0>, <1 1>, <1 2>, <1 3>; ++ /* This could be a reference to BCM2835_CLOCK_TIMER, ++ * but we don't have the driver using the common clock ++ * support yet. ++ */ ++ clock-frequency = <1000000>; ++ }; ++ ++ txp: txp@7e004000 { ++ compatible = "brcm,bcm2835-txp"; ++ reg = <0x7e004000 0x20>; ++ interrupts = <1 11>; ++ }; ++ ++ clocks: cprman@7e101000 { ++ compatible = "brcm,bcm2835-cprman"; ++ #clock-cells = <1>; ++ reg = <0x7e101000 0x2000>; ++ ++ /* CPRMAN derives almost everything from the ++ * platform's oscillator. However, the DSI ++ * pixel clocks come from the DSI analog PHY. ++ */ ++ clocks = <&clk_osc>, ++ <&dsi0 0>, <&dsi0 1>, <&dsi0 2>, ++ <&dsi1 0>, <&dsi1 1>, <&dsi1 2>; ++ }; ++ ++ mailbox: mailbox@7e00b880 { ++ compatible = "brcm,bcm2835-mbox"; ++ reg = <0x7e00b880 0x40>; ++ interrupts = <0 1>; ++ #mbox-cells = <0>; ++ }; ++ ++ gpio: gpio@7e200000 { ++ compatible = "brcm,bcm2835-gpio"; ++ reg = <0x7e200000 0xb4>; ++ /* ++ * The GPIO IP block is designed for 3 banks of GPIOs. ++ * Each bank has a GPIO interrupt for itself. ++ * There is an overall "any bank" interrupt. ++ * In order, these are GIC interrupts 17, 18, 19, 20. ++ * Since the BCM2835 only has 2 banks, the 2nd bank ++ * interrupt output appears to be mirrored onto the ++ * 3rd bank's interrupt signal. ++ * So, a bank0 interrupt shows up on 17, 20, and ++ * a bank1 interrupt shows up on 18, 19, 20! ++ */ ++ interrupts = <2 17>, <2 18>, <2 19>, <2 20>; ++ ++ gpio-controller; ++ #gpio-cells = <2>; ++ ++ interrupt-controller; ++ #interrupt-cells = <2>; ++ ++ /* Defines common pin muxing groups ++ * ++ * While each pin can have its mux selected ++ * for various functions individually, some ++ * groups only make sense to switch to a ++ * particular function together. ++ */ ++ dpi_gpio0: dpi_gpio0 { ++ brcm,pins = <0 1 2 3 4 5 6 7 8 9 10 11 ++ 12 13 14 15 16 17 18 19 ++ 20 21 22 23 24 25 26 27>; ++ brcm,function = ; ++ }; ++ emmc_gpio22: emmc_gpio22 { ++ brcm,pins = <22 23 24 25 26 27>; ++ brcm,function = ; ++ }; ++ emmc_gpio34: emmc_gpio34 { ++ brcm,pins = <34 35 36 37 38 39>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ emmc_gpio48: emmc_gpio48 { ++ brcm,pins = <48 49 50 51 52 53>; ++ brcm,function = ; ++ }; ++ ++ gpclk0_gpio4: gpclk0_gpio4 { ++ brcm,pins = <4>; ++ brcm,function = ; ++ }; ++ gpclk1_gpio5: gpclk1_gpio5 { ++ brcm,pins = <5>; ++ brcm,function = ; ++ }; ++ gpclk1_gpio42: gpclk1_gpio42 { ++ brcm,pins = <42>; ++ brcm,function = ; ++ }; ++ gpclk1_gpio44: gpclk1_gpio44 { ++ brcm,pins = <44>; ++ brcm,function = ; ++ }; ++ gpclk2_gpio6: gpclk2_gpio6 { ++ brcm,pins = <6>; ++ brcm,function = ; ++ }; ++ gpclk2_gpio43: gpclk2_gpio43 { ++ brcm,pins = <43>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2c0_gpio0: i2c0_gpio0 { ++ brcm,pins = <0 1>; ++ brcm,function = ; ++ }; ++ i2c0_gpio28: i2c0_gpio28 { ++ brcm,pins = <28 29>; ++ brcm,function = ; ++ }; ++ i2c0_gpio44: i2c0_gpio44 { ++ brcm,pins = <44 45>; ++ brcm,function = ; ++ }; ++ i2c1_gpio2: i2c1_gpio2 { ++ brcm,pins = <2 3>; ++ brcm,function = ; ++ }; ++ i2c1_gpio44: i2c1_gpio44 { ++ brcm,pins = <44 45>; ++ brcm,function = ; ++ }; ++ ++ jtag_gpio22: jtag_gpio22 { ++ brcm,pins = <22 23 24 25 26 27>; ++ brcm,function = ; ++ }; ++ ++ pcm_gpio18: pcm_gpio18 { ++ brcm,pins = <18 19 20 21>; ++ brcm,function = ; ++ }; ++ pcm_gpio28: pcm_gpio28 { ++ brcm,pins = <28 29 30 31>; ++ brcm,function = ; ++ }; ++ ++ sdhost_gpio48: sdhost_gpio48 { ++ brcm,pins = <48 49 50 51 52 53>; ++ brcm,function = ; ++ }; ++ ++ spi0_gpio7: spi0_gpio7 { ++ brcm,pins = <7 8 9 10 11>; ++ brcm,function = ; ++ }; ++ spi0_gpio35: spi0_gpio35 { ++ brcm,pins = <35 36 37 38 39>; ++ brcm,function = ; ++ }; ++ spi1_gpio16: spi1_gpio16 { ++ brcm,pins = <16 17 18 19 20 21>; ++ brcm,function = ; ++ }; ++ spi2_gpio40: spi2_gpio40 { ++ brcm,pins = <40 41 42 43 44 45>; ++ brcm,function = ; ++ }; ++ ++ uart0_gpio14: uart0_gpio14 { ++ brcm,pins = <14 15>; ++ brcm,function = ; ++ }; ++ /* Separate from the uart0_gpio14 group ++ * because it conflicts with spi1_gpio16, and ++ * people often run uart0 on the two pins ++ * without flow control. ++ */ ++ uart0_ctsrts_gpio16: uart0_ctsrts_gpio16 { ++ brcm,pins = <16 17>; ++ brcm,function = ; ++ }; ++ uart0_ctsrts_gpio30: uart0_ctsrts_gpio30 { ++ brcm,pins = <30 31>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ uart0_gpio32: uart0_gpio32 { ++ brcm,pins = <32 33>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ uart0_gpio36: uart0_gpio36 { ++ brcm,pins = <36 37>; ++ brcm,function = ; ++ }; ++ uart0_ctsrts_gpio38: uart0_ctsrts_gpio38 { ++ brcm,pins = <38 39>; ++ brcm,function = ; ++ }; ++ ++ uart1_gpio14: uart1_gpio14 { ++ brcm,pins = <14 15>; ++ brcm,function = ; ++ }; ++ uart1_ctsrts_gpio16: uart1_ctsrts_gpio16 { ++ brcm,pins = <16 17>; ++ brcm,function = ; ++ }; ++ uart1_gpio32: uart1_gpio32 { ++ brcm,pins = <32 33>; ++ brcm,function = ; ++ }; ++ uart1_ctsrts_gpio30: uart1_ctsrts_gpio30 { ++ brcm,pins = <30 31>; ++ brcm,function = ; ++ }; ++ uart1_gpio40: uart1_gpio40 { ++ brcm,pins = <40 41>; ++ brcm,function = ; ++ }; ++ uart1_ctsrts_gpio42: uart1_ctsrts_gpio42 { ++ brcm,pins = <42 43>; ++ brcm,function = ; ++ }; ++ }; ++ ++ uart0: serial@7e201000 { ++ compatible = "arm,pl011", "arm,primecell"; ++ reg = <0x7e201000 0x200>; ++ interrupts = <2 25>; ++ clocks = <&clocks BCM2835_CLOCK_UART>, ++ <&clocks BCM2835_CLOCK_VPU>; ++ clock-names = "uartclk", "apb_pclk"; ++ arm,primecell-periphid = <0x00241011>; ++ }; ++ ++ sdhost: mmc@7e202000 { ++ compatible = "brcm,bcm2835-sdhost"; ++ reg = <0x7e202000 0x100>; ++ interrupts = <2 24>; ++ clocks = <&clocks BCM2835_CLOCK_VPU>; ++ status = "disabled"; ++ }; ++ ++ i2s: i2s@7e203000 { ++ compatible = "brcm,bcm2835-i2s"; ++ reg = <0x7e203000 0x24>; ++ clocks = <&clocks BCM2835_CLOCK_PCM>; ++ status = "disabled"; ++ }; ++ ++ spi: spi@7e204000 { ++ compatible = "brcm,bcm2835-spi"; ++ reg = <0x7e204000 0x200>; ++ interrupts = <2 22>; ++ clocks = <&clocks BCM2835_CLOCK_VPU>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "disabled"; ++ }; ++ ++ i2c0if: i2c@7e205000 { ++ compatible = "brcm,bcm2835-i2c"; ++ reg = <0x7e205000 0x200>; ++ interrupts = <2 21>; ++ clocks = <&clocks BCM2835_CLOCK_VPU>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "disabled"; ++ }; ++ ++ i2c0mux: i2c0mux { ++ compatible = "i2c-mux-pinctrl"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ i2c-parent = <&i2c0if>; ++ ++ pinctrl-names = "i2c0", "i2c_csi_dsi"; ++ ++ status = "disabled"; ++ ++ i2c0: i2c@0 { ++ reg = <0>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ }; ++ ++ i2c_csi_dsi: i2c@1 { ++ reg = <1>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ }; ++ }; ++ ++ dpi: dpi@7e208000 { ++ compatible = "brcm,bcm2835-dpi"; ++ reg = <0x7e208000 0x8c>; ++ clocks = <&clocks BCM2835_CLOCK_VPU>, ++ <&clocks BCM2835_CLOCK_DPI>; ++ clock-names = "core", "pixel"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "disabled"; ++ }; ++ ++ dsi0: dsi@7e209000 { ++ compatible = "brcm,bcm2835-dsi0"; ++ reg = <0x7e209000 0x78>; ++ interrupts = <2 4>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ #clock-cells = <1>; ++ ++ clocks = <&clocks BCM2835_PLLA_DSI0>, ++ <&clocks BCM2835_CLOCK_DSI0E>, ++ <&clocks BCM2835_CLOCK_DSI0P>; ++ clock-names = "phy", "escape", "pixel"; ++ ++ clock-output-names = "dsi0_byte", ++ "dsi0_ddr2", ++ "dsi0_ddr"; ++ ++ status = "disabled"; ++ }; ++ ++ aux: aux@7e215000 { ++ compatible = "brcm,bcm2835-aux"; ++ #clock-cells = <1>; ++ reg = <0x7e215000 0x8>; ++ clocks = <&clocks BCM2835_CLOCK_VPU>; ++ }; ++ ++ uart1: serial@7e215040 { ++ compatible = "brcm,bcm2835-aux-uart"; ++ reg = <0x7e215040 0x40>; ++ interrupts = <1 29>; ++ clocks = <&aux BCM2835_AUX_CLOCK_UART>; ++ status = "disabled"; ++ }; ++ ++ spi1: spi@7e215080 { ++ compatible = "brcm,bcm2835-aux-spi"; ++ reg = <0x7e215080 0x40>; ++ interrupts = <1 29>; ++ clocks = <&aux BCM2835_AUX_CLOCK_SPI1>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "disabled"; ++ }; ++ ++ spi2: spi@7e2150c0 { ++ compatible = "brcm,bcm2835-aux-spi"; ++ reg = <0x7e2150c0 0x40>; ++ interrupts = <1 29>; ++ clocks = <&aux BCM2835_AUX_CLOCK_SPI2>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "disabled"; ++ }; ++ ++ pwm: pwm@7e20c000 { ++ compatible = "brcm,bcm2835-pwm"; ++ reg = <0x7e20c000 0x28>; ++ clocks = <&clocks BCM2835_CLOCK_PWM>; ++ assigned-clocks = <&clocks BCM2835_CLOCK_PWM>; ++ assigned-clock-rates = <10000000>; ++ #pwm-cells = <2>; ++ status = "disabled"; ++ }; ++ ++ sdhci: sdhci@7e300000 { ++ compatible = "brcm,bcm2835-sdhci"; ++ reg = <0x7e300000 0x100>; ++ interrupts = <2 30>; ++ clocks = <&clocks BCM2835_CLOCK_EMMC>; ++ status = "disabled"; ++ }; ++ ++ hvs@7e400000 { ++ compatible = "brcm,bcm2835-hvs"; ++ reg = <0x7e400000 0x6000>; ++ interrupts = <2 1>; ++ }; ++ ++ dsi1: dsi@7e700000 { ++ compatible = "brcm,bcm2835-dsi1"; ++ reg = <0x7e700000 0x8c>; ++ interrupts = <2 12>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ #clock-cells = <1>; ++ ++ clocks = <&clocks BCM2835_PLLD_DSI1>, ++ <&clocks BCM2835_CLOCK_DSI1E>, ++ <&clocks BCM2835_CLOCK_DSI1P>; ++ clock-names = "phy", "escape", "pixel"; ++ ++ clock-output-names = "dsi1_byte", ++ "dsi1_ddr2", ++ "dsi1_ddr"; ++ ++ status = "disabled"; ++ }; ++ ++ i2c1: i2c@7e804000 { ++ compatible = "brcm,bcm2835-i2c"; ++ reg = <0x7e804000 0x1000>; ++ interrupts = <2 21>; ++ clocks = <&clocks BCM2835_CLOCK_VPU>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "disabled"; ++ }; ++ ++ vec: vec@7e806000 { ++ compatible = "brcm,bcm2835-vec"; ++ reg = <0x7e806000 0x1000>; ++ clocks = <&clocks BCM2835_CLOCK_VEC>; ++ interrupts = <2 27>; ++ status = "disabled"; ++ }; ++ ++ usb: usb@7e980000 { ++ compatible = "brcm,bcm2835-usb"; ++ reg = <0x7e980000 0x10000>; ++ interrupts = <1 9>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ clocks = <&clk_usb>; ++ clock-names = "otg"; ++ phys = <&usbphy>; ++ phy-names = "usb2-phy"; ++ }; ++ }; ++ ++ clocks { ++ /* The oscillator is the root of the clock tree. */ ++ clk_osc: clk-osc { ++ compatible = "fixed-clock"; ++ #clock-cells = <0>; ++ clock-output-names = "osc"; ++ clock-frequency = <19200000>; ++ }; ++ ++ clk_usb: clk-usb { ++ compatible = "fixed-clock"; ++ #clock-cells = <0>; ++ clock-output-names = "otg"; ++ clock-frequency = <480000000>; ++ }; ++ }; ++ ++ usbphy: phy { ++ compatible = "usb-nop-xceiv"; ++ #phy-cells = <0>; ++ }; ++}; diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0010-bcm283x-rpi-cam1-regulator.dtsi.patch b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0010-bcm283x-rpi-cam1-regulator.dtsi.patch new file mode 100644 index 0000000..e6b664a --- /dev/null +++ b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0010-bcm283x-rpi-cam1-regulator.dtsi.patch @@ -0,0 +1,13 @@ +--- /home/rossierd/soo/infrabase/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/boot/dts/broadcom/bcm283x-rpi-cam1-regulator.dtsi 1970-01-01 01:00:00.000000000 +0100 ++++ ./arch/arm64/boot/dts/broadcom/bcm283x-rpi-cam1-regulator.dtsi 2025-05-05 20:19:23.872333877 +0200 +@@ -0,0 +1,10 @@ ++// SPDX-License-Identifier: GPL-2.0 ++ ++/ { ++ cam1_reg: cam1_reg { ++ compatible = "regulator-fixed"; ++ regulator-name = "cam1-reg"; ++ enable-active-high; ++ status = "disabled"; ++ }; ++}; diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0011-bcm283x-rpi-csi1-2lane.dtsi.patch b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0011-bcm283x-rpi-csi1-2lane.dtsi.patch new file mode 100644 index 0000000..ee7c55f --- /dev/null +++ b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0011-bcm283x-rpi-csi1-2lane.dtsi.patch @@ -0,0 +1,7 @@ +--- /home/rossierd/soo/infrabase/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/boot/dts/broadcom/bcm283x-rpi-csi1-2lane.dtsi 1970-01-01 01:00:00.000000000 +0100 ++++ ./arch/arm64/boot/dts/broadcom/bcm283x-rpi-csi1-2lane.dtsi 2025-05-05 20:19:23.872333877 +0200 +@@ -0,0 +1,4 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++&csi1 { ++ brcm,num-data-lanes = <2>; ++}; diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0012-bcm283x-rpi-i2c0mux_0_44.dtsi.patch b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0012-bcm283x-rpi-i2c0mux_0_44.dtsi.patch new file mode 100644 index 0000000..b3d47ae --- /dev/null +++ b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0012-bcm283x-rpi-i2c0mux_0_44.dtsi.patch @@ -0,0 +1,7 @@ +--- /home/rossierd/soo/infrabase/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/boot/dts/broadcom/bcm283x-rpi-i2c0mux_0_44.dtsi 1970-01-01 01:00:00.000000000 +0100 ++++ ./arch/arm64/boot/dts/broadcom/bcm283x-rpi-i2c0mux_0_44.dtsi 2025-05-05 20:19:23.872333877 +0200 +@@ -0,0 +1,4 @@ ++&i2c0mux { ++ pinctrl-0 = <&i2c0_gpio0>; ++ pinctrl-1 = <&i2c0_gpio44>; ++}; diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0013-bcm283x-rpi-usb-peripheral.dtsi.patch b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0013-bcm283x-rpi-usb-peripheral.dtsi.patch new file mode 100644 index 0000000..844c43a --- /dev/null +++ b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0013-bcm283x-rpi-usb-peripheral.dtsi.patch @@ -0,0 +1,10 @@ +--- /home/rossierd/soo/infrabase/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/boot/dts/broadcom/bcm283x-rpi-usb-peripheral.dtsi 1970-01-01 01:00:00.000000000 +0100 ++++ ./arch/arm64/boot/dts/broadcom/bcm283x-rpi-usb-peripheral.dtsi 2025-05-05 20:19:23.872333877 +0200 +@@ -0,0 +1,7 @@ ++// SPDX-License-Identifier: GPL-2.0 ++&usb { ++ dr_mode = "peripheral"; ++ g-rx-fifo-size = <256>; ++ g-np-tx-fifo-size = <32>; ++ g-tx-fifo-size = <256 256 512 512 512 768 768>; ++}; diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0014-rpi4_64_defconfig.patch b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0014-rpi4_64_defconfig.patch index 5ce299c..e3a4bae 100644 --- a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0014-rpi4_64_defconfig.patch +++ b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0014-rpi4_64_defconfig.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/configs/rpi4_64_defconfig 1970-01-01 01:00:00.000000000 +0100 -+++ ./arch/arm64/configs/rpi4_64_defconfig 2026-02-08 09:42:02.565101571 +0100 +--- /home/rossierd/soo/infrabase/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/configs/rpi4_64_defconfig 1970-01-01 01:00:00.000000000 +0100 ++++ ./arch/arm64/configs/rpi4_64_defconfig 2025-09-04 17:52:33.604603312 +0200 @@ -0,0 +1,9567 @@ +# +# Automatically generated file; DO NOT EDIT. diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0015-Makefile.patch b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0015-Makefile.patch new file mode 100644 index 0000000..b3115e1 --- /dev/null +++ b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0015-Makefile.patch @@ -0,0 +1,12 @@ +--- /home/rossierd/soo/infrabase/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/Makefile 2025-09-03 20:23:08.000000000 +0200 ++++ ./Makefile 2025-09-04 17:09:43.485709002 +0200 +@@ -378,7 +378,8 @@ + # Alternatively CROSS_COMPILE can be set in the environment. + # Default value for CROSS_COMPILE is not to prefix executables + # Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile +-ARCH ?= $(SUBARCH) ++ARCH ?= arm64 ++CROSS_COMPILE ?= aarch64-none-linux-gnu- + + # Architecture as present in compile.h + UTS_MACHINE := $(ARCH) diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0016-rpi4_64_nomodules_defconfig.patch b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0016-rpi4_64_nomodules_defconfig.patch new file mode 100644 index 0000000..dc44b58 --- /dev/null +++ b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0016-rpi4_64_nomodules_defconfig.patch @@ -0,0 +1,5424 @@ +--- /home/rossierd/soo/infrabase/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/configs/rpi4_64_nomodules_defconfig 1970-01-01 01:00:00.000000000 +0100 ++++ ./arch/arm64/configs/rpi4_64_nomodules_defconfig 2025-09-06 10:06:10.623846119 +0200 +@@ -0,0 +1,5421 @@ ++# ++# Automatically generated file; DO NOT EDIT. ++# Linux/arm64 6.12.44 Kernel Configuration ++# ++CONFIG_CC_VERSION_TEXT="aarch64-none-linux-gnu-gcc (Arm GNU Toolchain 12.2.Rel1 (Build arm-12.24)) 12.2.1 20221205" ++CONFIG_CC_IS_GCC=y ++CONFIG_GCC_VERSION=120201 ++CONFIG_CLANG_VERSION=0 ++CONFIG_AS_IS_GNU=y ++CONFIG_AS_VERSION=23900 ++CONFIG_LD_IS_BFD=y ++CONFIG_LD_VERSION=23900 ++CONFIG_LLD_VERSION=0 ++CONFIG_RUSTC_VERSION=0 ++CONFIG_RUSTC_LLVM_VERSION=0 ++CONFIG_CC_CAN_LINK=y ++CONFIG_CC_CAN_LINK_STATIC=y ++CONFIG_GCC_ASM_GOTO_OUTPUT_BROKEN=y ++CONFIG_CC_HAS_ASM_INLINE=y ++CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y ++CONFIG_LD_CAN_USE_KEEP_IN_OVERLAY=y ++CONFIG_PAHOLE_VERSION=0 ++CONFIG_IRQ_WORK=y ++CONFIG_BUILDTIME_TABLE_SORT=y ++CONFIG_THREAD_INFO_IN_TASK=y ++ ++# ++# General setup ++# ++CONFIG_INIT_ENV_ARG_LIMIT=32 ++# CONFIG_COMPILE_TEST is not set ++# CONFIG_WERROR is not set ++CONFIG_LOCALVERSION="-v8" ++# CONFIG_LOCALVERSION_AUTO is not set ++CONFIG_BUILD_SALT="" ++CONFIG_DEFAULT_INIT="" ++CONFIG_DEFAULT_HOSTNAME="(none)" ++CONFIG_SYSVIPC=y ++CONFIG_SYSVIPC_SYSCTL=y ++CONFIG_SYSVIPC_COMPAT=y ++CONFIG_POSIX_MQUEUE=y ++CONFIG_POSIX_MQUEUE_SYSCTL=y ++# CONFIG_WATCH_QUEUE is not set ++CONFIG_CROSS_MEMORY_ATTACH=y ++# CONFIG_USELIB is not set ++CONFIG_AUDIT=y ++CONFIG_HAVE_ARCH_AUDITSYSCALL=y ++CONFIG_AUDITSYSCALL=y ++ ++# ++# IRQ subsystem ++# ++CONFIG_GENERIC_IRQ_PROBE=y ++CONFIG_GENERIC_IRQ_SHOW=y ++CONFIG_GENERIC_IRQ_SHOW_LEVEL=y ++CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y ++CONFIG_GENERIC_IRQ_MIGRATION=y ++CONFIG_GENERIC_IRQ_INJECTION=y ++CONFIG_HARDIRQS_SW_RESEND=y ++CONFIG_GENERIC_IRQ_CHIP=y ++CONFIG_IRQ_DOMAIN=y ++CONFIG_IRQ_DOMAIN_HIERARCHY=y ++CONFIG_GENERIC_IRQ_IPI=y ++CONFIG_GENERIC_MSI_IRQ=y ++CONFIG_IRQ_MSI_IOMMU=y ++CONFIG_IRQ_FORCED_THREADING=y ++CONFIG_SPARSE_IRQ=y ++CONFIG_GENERIC_IRQ_DEBUGFS=y ++# end of IRQ subsystem ++ ++CONFIG_GENERIC_TIME_VSYSCALL=y ++CONFIG_GENERIC_CLOCKEVENTS=y ++CONFIG_ARCH_HAS_TICK_BROADCAST=y ++CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y ++CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y ++CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y ++CONFIG_CONTEXT_TRACKING=y ++CONFIG_CONTEXT_TRACKING_IDLE=y ++ ++# ++# Timers subsystem ++# ++CONFIG_TICK_ONESHOT=y ++CONFIG_NO_HZ_COMMON=y ++# CONFIG_HZ_PERIODIC is not set ++CONFIG_NO_HZ_IDLE=y ++# CONFIG_NO_HZ_FULL is not set ++CONFIG_NO_HZ=y ++CONFIG_HIGH_RES_TIMERS=y ++# end of Timers subsystem ++ ++CONFIG_BPF=y ++CONFIG_HAVE_EBPF_JIT=y ++CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y ++ ++# ++# BPF subsystem ++# ++CONFIG_BPF_SYSCALL=y ++CONFIG_BPF_JIT=y ++# CONFIG_BPF_JIT_ALWAYS_ON is not set ++CONFIG_BPF_JIT_DEFAULT_ON=y ++CONFIG_BPF_UNPRIV_DEFAULT_OFF=y ++# CONFIG_BPF_PRELOAD is not set ++# CONFIG_BPF_LSM is not set ++# end of BPF subsystem ++ ++CONFIG_PREEMPT_BUILD=y ++# CONFIG_PREEMPT_NONE is not set ++# CONFIG_PREEMPT_VOLUNTARY is not set ++CONFIG_PREEMPT=y ++# CONFIG_PREEMPT_RT is not set ++CONFIG_PREEMPT_COUNT=y ++CONFIG_PREEMPTION=y ++# CONFIG_PREEMPT_DYNAMIC is not set ++ ++# ++# CPU/Task time and stats accounting ++# ++CONFIG_TICK_CPU_ACCOUNTING=y ++# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set ++# CONFIG_IRQ_TIME_ACCOUNTING is not set ++CONFIG_BSD_PROCESS_ACCT=y ++CONFIG_BSD_PROCESS_ACCT_V3=y ++CONFIG_TASKSTATS=y ++CONFIG_TASK_DELAY_ACCT=y ++CONFIG_TASK_XACCT=y ++CONFIG_TASK_IO_ACCOUNTING=y ++CONFIG_PSI=y ++CONFIG_PSI_DEFAULT_DISABLED=y ++# end of CPU/Task time and stats accounting ++ ++CONFIG_CPU_ISOLATION=y ++ ++# ++# RCU Subsystem ++# ++CONFIG_TREE_RCU=y ++CONFIG_PREEMPT_RCU=y ++# CONFIG_RCU_EXPERT is not set ++CONFIG_TREE_SRCU=y ++CONFIG_TASKS_RCU_GENERIC=y ++CONFIG_NEED_TASKS_RCU=y ++CONFIG_TASKS_RCU=y ++CONFIG_TASKS_RUDE_RCU=y ++CONFIG_TASKS_TRACE_RCU=y ++CONFIG_RCU_STALL_COMMON=y ++CONFIG_RCU_NEED_SEGCBLIST=y ++# end of RCU Subsystem ++ ++# CONFIG_IKCONFIG is not set ++# CONFIG_IKHEADERS is not set ++CONFIG_LOG_BUF_SHIFT=17 ++CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 ++# CONFIG_PRINTK_INDEX is not set ++CONFIG_GENERIC_SCHED_CLOCK=y ++ ++# ++# Scheduler features ++# ++# CONFIG_UCLAMP_TASK is not set ++# end of Scheduler features ++ ++CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y ++CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y ++CONFIG_CC_HAS_INT128=y ++CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" ++CONFIG_GCC10_NO_ARRAY_BOUNDS=y ++CONFIG_CC_NO_ARRAY_BOUNDS=y ++CONFIG_GCC_NO_STRINGOP_OVERFLOW=y ++CONFIG_CC_NO_STRINGOP_OVERFLOW=y ++CONFIG_ARCH_SUPPORTS_INT128=y ++# CONFIG_NUMA_BALANCING is not set ++CONFIG_SLAB_OBJ_EXT=y ++CONFIG_CGROUPS=y ++CONFIG_PAGE_COUNTER=y ++# CONFIG_CGROUP_FAVOR_DYNMODS is not set ++CONFIG_MEMCG=y ++# CONFIG_MEMCG_V1 is not set ++CONFIG_BLK_CGROUP=y ++CONFIG_CGROUP_WRITEBACK=y ++CONFIG_CGROUP_SCHED=y ++CONFIG_GROUP_SCHED_WEIGHT=y ++CONFIG_FAIR_GROUP_SCHED=y ++CONFIG_CFS_BANDWIDTH=y ++# CONFIG_RT_GROUP_SCHED is not set ++CONFIG_SCHED_MM_CID=y ++CONFIG_CGROUP_PIDS=y ++# CONFIG_CGROUP_RDMA is not set ++CONFIG_CGROUP_FREEZER=y ++CONFIG_CPUSETS=y ++CONFIG_CPUSETS_V1=y ++CONFIG_PROC_PID_CPUSET=y ++CONFIG_CGROUP_DEVICE=y ++CONFIG_CGROUP_CPUACCT=y ++CONFIG_CGROUP_PERF=y ++CONFIG_CGROUP_BPF=y ++# CONFIG_CGROUP_MISC is not set ++# CONFIG_CGROUP_DEBUG is not set ++CONFIG_SOCK_CGROUP_DATA=y ++CONFIG_NAMESPACES=y ++CONFIG_UTS_NS=y ++CONFIG_TIME_NS=y ++CONFIG_IPC_NS=y ++CONFIG_USER_NS=y ++CONFIG_PID_NS=y ++CONFIG_NET_NS=y ++CONFIG_CHECKPOINT_RESTORE=y ++CONFIG_SCHED_AUTOGROUP=y ++CONFIG_RELAY=y ++CONFIG_BLK_DEV_INITRD=y ++CONFIG_INITRAMFS_SOURCE="" ++CONFIG_RD_GZIP=y ++CONFIG_RD_BZIP2=y ++CONFIG_RD_LZMA=y ++CONFIG_RD_XZ=y ++CONFIG_RD_LZO=y ++CONFIG_RD_LZ4=y ++CONFIG_RD_ZSTD=y ++# CONFIG_BOOT_CONFIG is not set ++CONFIG_INITRAMFS_PRESERVE_MTIME=y ++CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y ++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set ++CONFIG_LD_ORPHAN_WARN=y ++CONFIG_LD_ORPHAN_WARN_LEVEL="warn" ++CONFIG_SYSCTL=y ++CONFIG_HAVE_UID16=y ++CONFIG_SYSCTL_EXCEPTION_TRACE=y ++CONFIG_EXPERT=y ++CONFIG_UID16=y ++CONFIG_MULTIUSER=y ++# CONFIG_SGETMASK_SYSCALL is not set ++CONFIG_SYSFS_SYSCALL=y ++CONFIG_FHANDLE=y ++CONFIG_POSIX_TIMERS=y ++CONFIG_PRINTK=y ++CONFIG_BUG=y ++CONFIG_ELF_CORE=y ++# CONFIG_BASE_SMALL is not set ++CONFIG_FUTEX=y ++CONFIG_FUTEX_PI=y ++CONFIG_EPOLL=y ++CONFIG_SIGNALFD=y ++CONFIG_TIMERFD=y ++CONFIG_EVENTFD=y ++CONFIG_SHMEM=y ++CONFIG_AIO=y ++CONFIG_IO_URING=y ++CONFIG_ADVISE_SYSCALLS=y ++CONFIG_MEMBARRIER=y ++CONFIG_KCMP=y ++CONFIG_RSEQ=y ++# CONFIG_DEBUG_RSEQ is not set ++CONFIG_CACHESTAT_SYSCALL=y ++# CONFIG_PC104 is not set ++CONFIG_KALLSYMS=y ++# CONFIG_KALLSYMS_SELFTEST is not set ++CONFIG_KALLSYMS_ALL=y ++CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y ++CONFIG_HAVE_PERF_EVENTS=y ++CONFIG_GUEST_PERF_EVENTS=y ++ ++# ++# Kernel Performance Events And Counters ++# ++CONFIG_PERF_EVENTS=y ++# CONFIG_DEBUG_PERF_USE_VMALLOC is not set ++# end of Kernel Performance Events And Counters ++ ++CONFIG_PROFILING=y ++CONFIG_TRACEPOINTS=y ++ ++# ++# Kexec and crash features ++# ++# CONFIG_KEXEC_FILE is not set ++# end of Kexec and crash features ++# end of General setup ++ ++CONFIG_ARM64=y ++CONFIG_RUSTC_SUPPORTS_ARM64=y ++CONFIG_GCC_SUPPORTS_DYNAMIC_FTRACE_WITH_ARGS=y ++CONFIG_64BIT=y ++CONFIG_MMU=y ++CONFIG_ARM64_CONT_PTE_SHIFT=4 ++CONFIG_ARM64_CONT_PMD_SHIFT=4 ++CONFIG_ARCH_MMAP_RND_BITS_MIN=18 ++CONFIG_ARCH_MMAP_RND_BITS_MAX=24 ++CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11 ++CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 ++CONFIG_STACKTRACE_SUPPORT=y ++CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 ++CONFIG_LOCKDEP_SUPPORT=y ++CONFIG_GENERIC_BUG=y ++CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y ++CONFIG_GENERIC_HWEIGHT=y ++CONFIG_GENERIC_CSUM=y ++CONFIG_GENERIC_CALIBRATE_DELAY=y ++CONFIG_SMP=y ++CONFIG_KERNEL_MODE_NEON=y ++CONFIG_FIX_EARLYCON_MEM=y ++CONFIG_PGTABLE_LEVELS=3 ++CONFIG_ARCH_SUPPORTS_UPROBES=y ++CONFIG_ARCH_PROC_KCORE_TEXT=y ++CONFIG_BUILTIN_RETURN_ADDRESS_STRIPS_PAC=y ++ ++# ++# Platform selection ++# ++# CONFIG_ARCH_ACTIONS is not set ++# CONFIG_ARCH_AIROHA is not set ++# CONFIG_ARCH_SUNXI is not set ++# CONFIG_ARCH_ALPINE is not set ++# CONFIG_ARCH_APPLE is not set ++CONFIG_ARCH_BCM=y ++CONFIG_ARCH_BCM2835=y ++# CONFIG_ARCH_BCM_IPROC is not set ++# CONFIG_ARCH_BCMBCA is not set ++CONFIG_ARCH_BRCMSTB=y ++# CONFIG_ARCH_BERLIN is not set ++# CONFIG_ARCH_BITMAIN is not set ++# CONFIG_ARCH_EXYNOS is not set ++# CONFIG_ARCH_SPARX5 is not set ++# CONFIG_ARCH_K3 is not set ++# CONFIG_ARCH_LG1K is not set ++# CONFIG_ARCH_HISI is not set ++# CONFIG_ARCH_KEEMBAY is not set ++# CONFIG_ARCH_MEDIATEK is not set ++# CONFIG_ARCH_MESON is not set ++# CONFIG_ARCH_MVEBU is not set ++# CONFIG_ARCH_NXP is not set ++# CONFIG_ARCH_MA35 is not set ++# CONFIG_ARCH_NPCM is not set ++# CONFIG_ARCH_PENSANDO is not set ++# CONFIG_ARCH_QCOM is not set ++# CONFIG_ARCH_REALTEK is not set ++# CONFIG_ARCH_RENESAS is not set ++# CONFIG_ARCH_ROCKCHIP is not set ++# CONFIG_ARCH_SEATTLE is not set ++# CONFIG_ARCH_INTEL_SOCFPGA is not set ++# CONFIG_ARCH_STM32 is not set ++# CONFIG_ARCH_SYNQUACER is not set ++# CONFIG_ARCH_TEGRA is not set ++# CONFIG_ARCH_SPRD is not set ++# CONFIG_ARCH_THUNDER is not set ++# CONFIG_ARCH_THUNDER2 is not set ++# CONFIG_ARCH_UNIPHIER is not set ++# CONFIG_ARCH_VEXPRESS is not set ++# CONFIG_ARCH_VISCONTI is not set ++# CONFIG_ARCH_XGENE is not set ++# CONFIG_ARCH_ZYNQMP is not set ++# end of Platform selection ++ ++# ++# Kernel Features ++# ++ ++# ++# ARM errata workarounds via the alternatives framework ++# ++CONFIG_AMPERE_ERRATUM_AC03_CPU_38=y ++CONFIG_ARM64_WORKAROUND_CLEAN_CACHE=y ++CONFIG_ARM64_ERRATUM_826319=y ++CONFIG_ARM64_ERRATUM_827319=y ++CONFIG_ARM64_ERRATUM_824069=y ++CONFIG_ARM64_ERRATUM_819472=y ++CONFIG_ARM64_ERRATUM_832075=y ++CONFIG_ARM64_ERRATUM_834220=y ++CONFIG_ARM64_ERRATUM_1742098=y ++CONFIG_ARM64_ERRATUM_845719=y ++CONFIG_ARM64_ERRATUM_843419=y ++CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y ++CONFIG_ARM64_ERRATUM_1024718=y ++CONFIG_ARM64_ERRATUM_1418040=y ++CONFIG_ARM64_WORKAROUND_SPECULATIVE_AT=y ++CONFIG_ARM64_ERRATUM_1165522=y ++CONFIG_ARM64_ERRATUM_1319367=y ++CONFIG_ARM64_ERRATUM_1530923=y ++CONFIG_ARM64_WORKAROUND_REPEAT_TLBI=y ++CONFIG_ARM64_ERRATUM_2441007=y ++CONFIG_ARM64_ERRATUM_1286807=y ++CONFIG_ARM64_ERRATUM_1463225=y ++CONFIG_ARM64_ERRATUM_1542419=y ++CONFIG_ARM64_ERRATUM_1508412=y ++CONFIG_ARM64_ERRATUM_2051678=y ++CONFIG_ARM64_ERRATUM_2077057=y ++CONFIG_ARM64_ERRATUM_2658417=y ++CONFIG_ARM64_WORKAROUND_TSB_FLUSH_FAILURE=y ++CONFIG_ARM64_ERRATUM_2054223=y ++CONFIG_ARM64_ERRATUM_2067961=y ++CONFIG_ARM64_ERRATUM_2441009=y ++CONFIG_ARM64_ERRATUM_2457168=y ++CONFIG_ARM64_ERRATUM_2645198=y ++CONFIG_ARM64_WORKAROUND_SPECULATIVE_UNPRIV_LOAD=y ++CONFIG_ARM64_ERRATUM_2966298=y ++CONFIG_ARM64_ERRATUM_3117295=y ++CONFIG_ARM64_ERRATUM_3194386=y ++# CONFIG_CAVIUM_ERRATUM_22375 is not set ++CONFIG_CAVIUM_ERRATUM_23144=y ++# CONFIG_CAVIUM_ERRATUM_23154 is not set ++# CONFIG_CAVIUM_ERRATUM_27456 is not set ++CONFIG_CAVIUM_ERRATUM_30115=y ++CONFIG_CAVIUM_TX2_ERRATUM_219=y ++CONFIG_FUJITSU_ERRATUM_010001=y ++CONFIG_HISILICON_ERRATUM_161600802=y ++CONFIG_HISILICON_ERRATUM_162100801=y ++CONFIG_QCOM_FALKOR_ERRATUM_1003=y ++CONFIG_QCOM_FALKOR_ERRATUM_1009=y ++CONFIG_QCOM_QDF2400_ERRATUM_0065=y ++CONFIG_QCOM_FALKOR_ERRATUM_E1041=y ++CONFIG_NVIDIA_CARMEL_CNP_ERRATUM=y ++CONFIG_ROCKCHIP_ERRATUM_3588001=y ++CONFIG_SOCIONEXT_SYNQUACER_PREITS=y ++# end of ARM errata workarounds via the alternatives framework ++ ++CONFIG_ARM64_4K_PAGES=y ++# CONFIG_ARM64_16K_PAGES is not set ++# CONFIG_ARM64_64K_PAGES is not set ++CONFIG_ARM64_VA_BITS_39=y ++# CONFIG_ARM64_VA_BITS_48 is not set ++# CONFIG_ARM64_VA_BITS_52 is not set ++CONFIG_ARM64_VA_BITS=39 ++CONFIG_ARM64_PA_BITS_48=y ++CONFIG_ARM64_PA_BITS=48 ++# CONFIG_CPU_BIG_ENDIAN is not set ++CONFIG_CPU_LITTLE_ENDIAN=y ++# CONFIG_SCHED_MC is not set ++# CONFIG_SCHED_CLUSTER is not set ++# CONFIG_SCHED_SMT is not set ++CONFIG_NR_CPUS=4 ++CONFIG_HOTPLUG_CPU=y ++CONFIG_NUMA=y ++CONFIG_NODES_SHIFT=4 ++# CONFIG_HZ_100 is not set ++CONFIG_HZ_250=y ++# CONFIG_HZ_300 is not set ++# CONFIG_HZ_1000 is not set ++CONFIG_HZ=250 ++CONFIG_SCHED_HRTICK=y ++CONFIG_ARCH_SPARSEMEM_ENABLE=y ++CONFIG_HW_PERF_EVENTS=y ++CONFIG_CC_HAVE_SHADOW_CALL_STACK=y ++# CONFIG_PARAVIRT is not set ++# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set ++CONFIG_ARCH_SUPPORTS_KEXEC_FILE=y ++CONFIG_ARCH_SUPPORTS_KEXEC_SIG=y ++CONFIG_ARCH_SUPPORTS_KEXEC_IMAGE_VERIFY_SIG=y ++CONFIG_ARCH_DEFAULT_KEXEC_IMAGE_VERIFY_SIG=y ++CONFIG_ARCH_SUPPORTS_CRASH_DUMP=y ++CONFIG_ARCH_DEFAULT_CRASH_DUMP=y ++# CONFIG_XEN is not set ++CONFIG_ARCH_FORCE_MAX_ORDER=10 ++CONFIG_UNMAP_KERNEL_AT_EL0=y ++CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY=y ++CONFIG_RODATA_FULL_DEFAULT_ENABLED=y ++# CONFIG_ARM64_SW_TTBR0_PAN is not set ++CONFIG_ARM64_TAGGED_ADDR_ABI=y ++CONFIG_COMPAT=y ++CONFIG_KUSER_HELPERS=y ++# CONFIG_COMPAT_ALIGNMENT_FIXUPS is not set ++CONFIG_ARMV8_DEPRECATED=y ++CONFIG_SWP_EMULATION=y ++CONFIG_CP15_BARRIER_EMULATION=y ++CONFIG_SETEND_EMULATION=y ++ ++# ++# ARMv8.1 architectural features ++# ++CONFIG_ARM64_HW_AFDBM=y ++CONFIG_ARM64_PAN=y ++CONFIG_AS_HAS_LSE_ATOMICS=y ++CONFIG_ARM64_LSE_ATOMICS=y ++CONFIG_ARM64_USE_LSE_ATOMICS=y ++# end of ARMv8.1 architectural features ++ ++# ++# ARMv8.2 architectural features ++# ++CONFIG_AS_HAS_ARMV8_2=y ++CONFIG_AS_HAS_SHA3=y ++# CONFIG_ARM64_PMEM is not set ++CONFIG_ARM64_RAS_EXTN=y ++CONFIG_ARM64_CNP=y ++# end of ARMv8.2 architectural features ++ ++# ++# ARMv8.3 architectural features ++# ++CONFIG_ARM64_PTR_AUTH=y ++CONFIG_ARM64_PTR_AUTH_KERNEL=y ++CONFIG_CC_HAS_BRANCH_PROT_PAC_RET=y ++CONFIG_CC_HAS_SIGN_RETURN_ADDRESS=y ++CONFIG_AS_HAS_ARMV8_3=y ++CONFIG_AS_HAS_CFI_NEGATE_RA_STATE=y ++CONFIG_AS_HAS_LDAPR=y ++# end of ARMv8.3 architectural features ++ ++# ++# ARMv8.4 architectural features ++# ++CONFIG_ARM64_AMU_EXTN=y ++CONFIG_AS_HAS_ARMV8_4=y ++CONFIG_ARM64_TLB_RANGE=y ++# end of ARMv8.4 architectural features ++ ++# ++# ARMv8.5 architectural features ++# ++CONFIG_AS_HAS_ARMV8_5=y ++CONFIG_ARM64_BTI=y ++CONFIG_CC_HAS_BRANCH_PROT_PAC_RET_BTI=y ++CONFIG_ARM64_E0PD=y ++CONFIG_ARM64_AS_HAS_MTE=y ++CONFIG_ARM64_MTE=y ++# end of ARMv8.5 architectural features ++ ++# ++# ARMv8.7 architectural features ++# ++CONFIG_ARM64_EPAN=y ++# end of ARMv8.7 architectural features ++ ++# ++# ARMv8.9 architectural features ++# ++CONFIG_ARM64_POE=y ++CONFIG_ARCH_PKEY_BITS=3 ++# end of ARMv8.9 architectural features ++ ++CONFIG_ARM64_SVE=y ++# CONFIG_ARM64_PSEUDO_NMI is not set ++CONFIG_RELOCATABLE=y ++CONFIG_RANDOMIZE_BASE=y ++CONFIG_RANDOMIZE_MODULE_REGION_FULL=y ++CONFIG_CC_HAVE_STACKPROTECTOR_SYSREG=y ++CONFIG_STACKPROTECTOR_PER_TASK=y ++# end of Kernel Features ++ ++# ++# Boot options ++# ++CONFIG_CMDLINE="console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait" ++CONFIG_CMDLINE_FROM_BOOTLOADER=y ++# CONFIG_CMDLINE_FORCE is not set ++CONFIG_EFI_STUB=y ++CONFIG_EFI=y ++# CONFIG_COMPRESSED_INSTALL is not set ++CONFIG_DMI=y ++# end of Boot options ++ ++# ++# Power management options ++# ++# CONFIG_SUSPEND is not set ++# CONFIG_HIBERNATION is not set ++CONFIG_PM=y ++CONFIG_PM_DEBUG=y ++# CONFIG_PM_ADVANCED_DEBUG is not set ++# CONFIG_DPM_WATCHDOG is not set ++CONFIG_PM_CLK=y ++CONFIG_PM_GENERIC_DOMAINS=y ++# CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set ++CONFIG_PM_GENERIC_DOMAINS_OF=y ++CONFIG_CPU_PM=y ++# CONFIG_ENERGY_MODEL is not set ++CONFIG_ARCH_HIBERNATION_POSSIBLE=y ++CONFIG_ARCH_SUSPEND_POSSIBLE=y ++# end of Power management options ++ ++# ++# CPU Power Management ++# ++ ++# ++# CPU Idle ++# ++CONFIG_CPU_IDLE=y ++# CONFIG_CPU_IDLE_GOV_LADDER is not set ++CONFIG_CPU_IDLE_GOV_MENU=y ++# CONFIG_CPU_IDLE_GOV_TEO is not set ++ ++# ++# ARM CPU Idle Drivers ++# ++# CONFIG_ARM_PSCI_CPUIDLE is not set ++# end of ARM CPU Idle Drivers ++# end of CPU Idle ++ ++# ++# CPU Frequency scaling ++# ++CONFIG_CPU_FREQ=y ++CONFIG_CPU_FREQ_GOV_ATTR_SET=y ++CONFIG_CPU_FREQ_GOV_COMMON=y ++CONFIG_CPU_FREQ_STAT=y ++# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set ++# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set ++# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set ++CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y ++# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set ++# CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set ++CONFIG_CPU_FREQ_GOV_PERFORMANCE=y ++CONFIG_CPU_FREQ_GOV_POWERSAVE=y ++CONFIG_CPU_FREQ_GOV_USERSPACE=y ++CONFIG_CPU_FREQ_GOV_ONDEMAND=y ++CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y ++CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y ++ ++# ++# CPU frequency scaling drivers ++# ++CONFIG_CPUFREQ_DT=y ++CONFIG_CPUFREQ_DT_PLATDEV=y ++CONFIG_ARM_BRCMSTB_AVS_CPUFREQ=y ++CONFIG_ARM_RASPBERRYPI_CPUFREQ=y ++# end of CPU Frequency scaling ++# end of CPU Power Management ++ ++CONFIG_ARCH_SUPPORTS_ACPI=y ++# CONFIG_ACPI is not set ++CONFIG_KVM_COMMON=y ++CONFIG_HAVE_KVM_IRQCHIP=y ++CONFIG_HAVE_KVM_IRQ_ROUTING=y ++CONFIG_HAVE_KVM_DIRTY_RING=y ++CONFIG_HAVE_KVM_DIRTY_RING_ACQ_REL=y ++CONFIG_NEED_KVM_DIRTY_RING_WITH_BITMAP=y ++CONFIG_KVM_MMIO=y ++CONFIG_HAVE_KVM_MSI=y ++CONFIG_HAVE_KVM_READONLY_MEM=y ++CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT=y ++CONFIG_KVM_VFIO=y ++CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y ++CONFIG_HAVE_KVM_IRQ_BYPASS=y ++CONFIG_HAVE_KVM_VCPU_RUN_PID_CHANGE=y ++CONFIG_KVM_XFER_TO_GUEST_WORK=y ++CONFIG_KVM_GENERIC_HARDWARE_ENABLING=y ++CONFIG_KVM_GENERIC_MMU_NOTIFIER=y ++CONFIG_VIRTUALIZATION=y ++CONFIG_KVM=y ++# CONFIG_NVHE_EL2_DEBUG is not set ++# CONFIG_PTDUMP_STAGE2_DEBUGFS is not set ++CONFIG_CPU_MITIGATIONS=y ++ ++# ++# General architecture-dependent options ++# ++CONFIG_ARCH_HAS_SUBPAGE_FAULTS=y ++CONFIG_HOTPLUG_CORE_SYNC=y ++CONFIG_HOTPLUG_CORE_SYNC_DEAD=y ++CONFIG_KPROBES=y ++CONFIG_JUMP_LABEL=y ++# CONFIG_STATIC_KEYS_SELFTEST is not set ++CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y ++CONFIG_KRETPROBES=y ++CONFIG_HAVE_IOREMAP_PROT=y ++CONFIG_HAVE_KPROBES=y ++CONFIG_HAVE_KRETPROBES=y ++CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y ++CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y ++CONFIG_HAVE_NMI=y ++CONFIG_TRACE_IRQFLAGS_SUPPORT=y ++CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y ++CONFIG_HAVE_ARCH_TRACEHOOK=y ++CONFIG_HAVE_DMA_CONTIGUOUS=y ++CONFIG_GENERIC_SMP_IDLE_THREAD=y ++CONFIG_GENERIC_IDLE_POLL_SETUP=y ++CONFIG_ARCH_HAS_FORTIFY_SOURCE=y ++CONFIG_ARCH_HAS_KEEPINITRD=y ++CONFIG_ARCH_HAS_SET_MEMORY=y ++CONFIG_ARCH_HAS_SET_DIRECT_MAP=y ++CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y ++CONFIG_ARCH_WANTS_NO_INSTR=y ++CONFIG_HAVE_ASM_MODVERSIONS=y ++CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y ++CONFIG_HAVE_RSEQ=y ++CONFIG_HAVE_RUST=y ++CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y ++CONFIG_HAVE_HW_BREAKPOINT=y ++CONFIG_HAVE_PERF_REGS=y ++CONFIG_HAVE_PERF_USER_STACK_DUMP=y ++CONFIG_HAVE_ARCH_JUMP_LABEL=y ++CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y ++CONFIG_MMU_GATHER_TABLE_FREE=y ++CONFIG_MMU_GATHER_RCU_TABLE_FREE=y ++CONFIG_MMU_LAZY_TLB_REFCOUNT=y ++CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y ++CONFIG_ARCH_HAS_NMI_SAFE_THIS_CPU_OPS=y ++CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y ++CONFIG_HAVE_CMPXCHG_LOCAL=y ++CONFIG_HAVE_CMPXCHG_DOUBLE=y ++CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y ++CONFIG_HAVE_ARCH_SECCOMP=y ++CONFIG_HAVE_ARCH_SECCOMP_FILTER=y ++CONFIG_SECCOMP=y ++CONFIG_SECCOMP_FILTER=y ++# CONFIG_SECCOMP_CACHE_DEBUG is not set ++CONFIG_HAVE_ARCH_STACKLEAK=y ++CONFIG_HAVE_STACKPROTECTOR=y ++CONFIG_STACKPROTECTOR=y ++CONFIG_STACKPROTECTOR_STRONG=y ++CONFIG_ARCH_SUPPORTS_SHADOW_CALL_STACK=y ++# CONFIG_SHADOW_CALL_STACK is not set ++CONFIG_ARCH_SUPPORTS_LTO_CLANG=y ++CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y ++CONFIG_LTO_NONE=y ++CONFIG_ARCH_SUPPORTS_CFI_CLANG=y ++CONFIG_HAVE_CONTEXT_TRACKING_USER=y ++CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y ++CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y ++CONFIG_HAVE_MOVE_PUD=y ++CONFIG_HAVE_MOVE_PMD=y ++CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y ++CONFIG_HAVE_ARCH_HUGE_VMAP=y ++CONFIG_HAVE_ARCH_HUGE_VMALLOC=y ++CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y ++CONFIG_HAVE_MOD_ARCH_SPECIFIC=y ++CONFIG_MODULES_USE_ELF_RELA=y ++CONFIG_ARCH_WANTS_EXECMEM_LATE=y ++CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y ++CONFIG_SOFTIRQ_ON_OWN_STACK=y ++CONFIG_ARCH_HAS_ELF_RANDOMIZE=y ++CONFIG_HAVE_ARCH_MMAP_RND_BITS=y ++CONFIG_ARCH_MMAP_RND_BITS=18 ++CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y ++CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11 ++CONFIG_HAVE_PAGE_SIZE_4KB=y ++CONFIG_PAGE_SIZE_4KB=y ++CONFIG_PAGE_SIZE_LESS_THAN_64KB=y ++CONFIG_PAGE_SIZE_LESS_THAN_256KB=y ++CONFIG_PAGE_SHIFT=12 ++CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y ++CONFIG_CLONE_BACKWARDS=y ++CONFIG_OLD_SIGSUSPEND3=y ++CONFIG_COMPAT_OLD_SIGACTION=y ++CONFIG_COMPAT_32BIT_TIME=y ++CONFIG_ARCH_SUPPORTS_RT=y ++CONFIG_HAVE_ARCH_VMAP_STACK=y ++CONFIG_VMAP_STACK=y ++CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y ++CONFIG_RANDOMIZE_KSTACK_OFFSET=y ++# CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set ++CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y ++CONFIG_STRICT_KERNEL_RWX=y ++CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y ++CONFIG_STRICT_MODULE_RWX=y ++CONFIG_HAVE_ARCH_COMPILER_H=y ++CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y ++CONFIG_ARCH_USE_MEMREMAP_PROT=y ++# CONFIG_LOCK_EVENT_COUNTS is not set ++CONFIG_ARCH_HAS_RELR=y ++CONFIG_ARCH_HAS_MEM_ENCRYPT=y ++CONFIG_HAVE_PREEMPT_DYNAMIC=y ++CONFIG_HAVE_PREEMPT_DYNAMIC_KEY=y ++CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y ++CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y ++CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y ++CONFIG_ARCH_HAVE_TRACE_MMIO_ACCESS=y ++CONFIG_ARCH_HAS_HW_PTE_YOUNG=y ++CONFIG_ARCH_HAS_KERNEL_FPU_SUPPORT=y ++ ++# ++# GCOV-based kernel profiling ++# ++# CONFIG_GCOV_KERNEL is not set ++CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y ++# end of GCOV-based kernel profiling ++ ++CONFIG_HAVE_GCC_PLUGINS=y ++CONFIG_GCC_PLUGINS=y ++# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set ++CONFIG_FUNCTION_ALIGNMENT_4B=y ++CONFIG_FUNCTION_ALIGNMENT_8B=y ++CONFIG_FUNCTION_ALIGNMENT=8 ++# end of General architecture-dependent options ++ ++CONFIG_RT_MUTEXES=y ++CONFIG_MODULES=y ++# CONFIG_MODULE_DEBUG is not set ++# CONFIG_MODULE_FORCE_LOAD is not set ++CONFIG_MODULE_UNLOAD=y ++# CONFIG_MODULE_FORCE_UNLOAD is not set ++# CONFIG_MODULE_UNLOAD_TAINT_TRACKING is not set ++CONFIG_MODVERSIONS=y ++CONFIG_ASM_MODVERSIONS=y ++CONFIG_MODULE_SRCVERSION_ALL=y ++# CONFIG_MODULE_SIG is not set ++CONFIG_MODULE_COMPRESS=y ++# CONFIG_MODULE_COMPRESS_GZIP is not set ++CONFIG_MODULE_COMPRESS_XZ=y ++# CONFIG_MODULE_COMPRESS_ZSTD is not set ++CONFIG_MODULE_COMPRESS_ALL=y ++# CONFIG_MODULE_DECOMPRESS is not set ++# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set ++CONFIG_MODPROBE_PATH="/sbin/modprobe" ++# CONFIG_TRIM_UNUSED_KSYMS is not set ++CONFIG_MODULES_TREE_LOOKUP=y ++CONFIG_BLOCK=y ++CONFIG_BLOCK_LEGACY_AUTOLOAD=y ++CONFIG_BLK_CGROUP_RWSTAT=y ++CONFIG_BLK_DEV_BSG_COMMON=y ++CONFIG_BLK_ICQ=y ++CONFIG_BLK_DEV_BSGLIB=y ++CONFIG_BLK_DEV_INTEGRITY=y ++CONFIG_BLK_DEV_WRITE_MOUNTED=y ++# CONFIG_BLK_DEV_ZONED is not set ++CONFIG_BLK_DEV_THROTTLING=y ++# CONFIG_BLK_WBT is not set ++# CONFIG_BLK_CGROUP_IOLATENCY is not set ++# CONFIG_BLK_CGROUP_IOCOST is not set ++# CONFIG_BLK_CGROUP_IOPRIO is not set ++CONFIG_BLK_DEBUG_FS=y ++# CONFIG_BLK_SED_OPAL is not set ++# CONFIG_BLK_INLINE_ENCRYPTION is not set ++ ++# ++# Partition Types ++# ++CONFIG_PARTITION_ADVANCED=y ++# CONFIG_ACORN_PARTITION is not set ++# CONFIG_AIX_PARTITION is not set ++# CONFIG_OSF_PARTITION is not set ++# CONFIG_AMIGA_PARTITION is not set ++# CONFIG_ATARI_PARTITION is not set ++CONFIG_MAC_PARTITION=y ++CONFIG_MSDOS_PARTITION=y ++# CONFIG_BSD_DISKLABEL is not set ++# CONFIG_MINIX_SUBPARTITION is not set ++# CONFIG_SOLARIS_X86_PARTITION is not set ++# CONFIG_UNIXWARE_DISKLABEL is not set ++# CONFIG_LDM_PARTITION is not set ++# CONFIG_SGI_PARTITION is not set ++# CONFIG_ULTRIX_PARTITION is not set ++# CONFIG_SUN_PARTITION is not set ++# CONFIG_KARMA_PARTITION is not set ++CONFIG_EFI_PARTITION=y ++# CONFIG_SYSV68_PARTITION is not set ++# CONFIG_CMDLINE_PARTITION is not set ++# end of Partition Types ++ ++CONFIG_BLK_MQ_PCI=y ++CONFIG_BLK_PM=y ++ ++# ++# IO Schedulers ++# ++CONFIG_MQ_IOSCHED_DEADLINE=y ++CONFIG_MQ_IOSCHED_KYBER=y ++CONFIG_IOSCHED_BFQ=y ++CONFIG_BFQ_GROUP_IOSCHED=y ++# CONFIG_BFQ_CGROUP_DEBUG is not set ++# end of IO Schedulers ++ ++CONFIG_PREEMPT_NOTIFIERS=y ++CONFIG_ASN1=y ++CONFIG_UNINLINE_SPIN_UNLOCK=y ++CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y ++CONFIG_MUTEX_SPIN_ON_OWNER=y ++CONFIG_RWSEM_SPIN_ON_OWNER=y ++CONFIG_LOCK_SPIN_ON_OWNER=y ++CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y ++CONFIG_QUEUED_SPINLOCKS=y ++CONFIG_ARCH_USE_QUEUED_RWLOCKS=y ++CONFIG_QUEUED_RWLOCKS=y ++CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y ++CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y ++CONFIG_FREEZER=y ++ ++# ++# Executable file formats ++# ++CONFIG_BINFMT_ELF=y ++CONFIG_COMPAT_BINFMT_ELF=y ++CONFIG_ARCH_BINFMT_ELF_STATE=y ++CONFIG_ARCH_BINFMT_ELF_EXTRA_PHDRS=y ++CONFIG_ARCH_HAVE_ELF_PROT=y ++CONFIG_ARCH_USE_GNU_PROPERTY=y ++CONFIG_ELFCORE=y ++CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y ++CONFIG_BINFMT_SCRIPT=y ++# CONFIG_BINFMT_MISC is not set ++CONFIG_COREDUMP=y ++# end of Executable file formats ++ ++# ++# Memory Management options ++# ++CONFIG_ZPOOL=y ++CONFIG_SWAP=y ++CONFIG_ZSWAP=y ++# CONFIG_ZSWAP_DEFAULT_ON is not set ++# CONFIG_ZSWAP_SHRINKER_DEFAULT_ON is not set ++# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_DEFLATE is not set ++CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZO=y ++# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_842 is not set ++# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZ4 is not set ++# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZ4HC is not set ++# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_ZSTD is not set ++CONFIG_ZSWAP_COMPRESSOR_DEFAULT="lzo" ++# CONFIG_ZSWAP_ZPOOL_DEFAULT_ZBUD is not set ++# CONFIG_ZSWAP_ZPOOL_DEFAULT_Z3FOLD_DEPRECATED is not set ++CONFIG_ZSWAP_ZPOOL_DEFAULT_ZSMALLOC=y ++CONFIG_ZSWAP_ZPOOL_DEFAULT="zsmalloc" ++# CONFIG_ZBUD is not set ++# CONFIG_Z3FOLD_DEPRECATED is not set ++CONFIG_ZSMALLOC=y ++# CONFIG_ZSMALLOC_STAT is not set ++CONFIG_ZSMALLOC_CHAIN_SIZE=8 ++ ++# ++# Slab allocator options ++# ++CONFIG_SLUB=y ++# CONFIG_SLUB_TINY is not set ++CONFIG_SLAB_MERGE_DEFAULT=y ++# CONFIG_SLAB_FREELIST_RANDOM is not set ++# CONFIG_SLAB_FREELIST_HARDENED is not set ++# CONFIG_SLAB_BUCKETS is not set ++# CONFIG_SLUB_STATS is not set ++CONFIG_SLUB_CPU_PARTIAL=y ++# CONFIG_RANDOM_KMALLOC_CACHES is not set ++# end of Slab allocator options ++ ++# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set ++# CONFIG_COMPAT_BRK is not set ++CONFIG_SPARSEMEM=y ++CONFIG_SPARSEMEM_EXTREME=y ++CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y ++CONFIG_SPARSEMEM_VMEMMAP=y ++CONFIG_HAVE_GUP_FAST=y ++CONFIG_ARCH_KEEP_MEMBLOCK=y ++CONFIG_MEMORY_ISOLATION=y ++CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y ++CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y ++# CONFIG_MEMORY_HOTPLUG is not set ++CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y ++CONFIG_SPLIT_PTE_PTLOCKS=y ++CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y ++CONFIG_SPLIT_PMD_PTLOCKS=y ++CONFIG_COMPACTION=y ++CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1 ++# CONFIG_PAGE_REPORTING is not set ++CONFIG_MIGRATION=y ++CONFIG_CONTIG_ALLOC=y ++CONFIG_PCP_BATCH_SCALE_MAX=5 ++CONFIG_PHYS_ADDR_T_64BIT=y ++CONFIG_MMU_NOTIFIER=y ++# CONFIG_KSM is not set ++CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 ++CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y ++# CONFIG_MEMORY_FAILURE is not set ++CONFIG_ARCH_WANTS_THP_SWAP=y ++# CONFIG_TRANSPARENT_HUGEPAGE is not set ++CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y ++CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y ++CONFIG_USE_PERCPU_NUMA_NODE_ID=y ++CONFIG_HAVE_SETUP_PER_CPU_AREA=y ++CONFIG_CMA=y ++# CONFIG_CMA_DEBUGFS is not set ++# CONFIG_CMA_SYSFS is not set ++CONFIG_CMA_AREAS=7 ++CONFIG_GENERIC_EARLY_IOREMAP=y ++# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set ++# CONFIG_IDLE_PAGE_TRACKING is not set ++CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y ++CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y ++CONFIG_ARCH_HAS_PTE_DEVMAP=y ++CONFIG_ARCH_HAS_ZONE_DMA_SET=y ++CONFIG_ZONE_DMA=y ++CONFIG_ZONE_DMA32=y ++CONFIG_VMAP_PFN=y ++CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y ++CONFIG_ARCH_HAS_PKEYS=y ++CONFIG_ARCH_USES_PG_ARCH_2=y ++CONFIG_ARCH_USES_PG_ARCH_3=y ++CONFIG_VM_EVENT_COUNTERS=y ++# CONFIG_PERCPU_STATS is not set ++# CONFIG_GUP_TEST is not set ++# CONFIG_DMAPOOL_TEST is not set ++CONFIG_ARCH_HAS_PTE_SPECIAL=y ++CONFIG_MEMFD_CREATE=y ++CONFIG_SECRETMEM=y ++# CONFIG_ANON_VMA_NAME is not set ++# CONFIG_USERFAULTFD is not set ++CONFIG_LRU_GEN=y ++CONFIG_LRU_GEN_ENABLED=y ++# CONFIG_LRU_GEN_STATS is not set ++CONFIG_LRU_GEN_WALKS_MMU=y ++CONFIG_ARCH_SUPPORTS_PER_VMA_LOCK=y ++CONFIG_PER_VMA_LOCK=y ++CONFIG_LOCK_MM_AND_FIND_VMA=y ++CONFIG_EXECMEM=y ++CONFIG_NUMA_MEMBLKS=y ++CONFIG_NUMA_EMU=y ++ ++# ++# Data Access Monitoring ++# ++# CONFIG_DAMON is not set ++# end of Data Access Monitoring ++# end of Memory Management options ++ ++CONFIG_NET=y ++CONFIG_NET_INGRESS=y ++CONFIG_NET_EGRESS=y ++CONFIG_NET_XGRESS=y ++CONFIG_SKB_EXTENSIONS=y ++CONFIG_NET_DEVMEM=y ++ ++# ++# Networking options ++# ++CONFIG_PACKET=y ++# CONFIG_PACKET_DIAG is not set ++CONFIG_UNIX=y ++CONFIG_AF_UNIX_OOB=y ++# CONFIG_UNIX_DIAG is not set ++# CONFIG_TLS is not set ++# CONFIG_XFRM_USER is not set ++# CONFIG_NET_KEY is not set ++# CONFIG_XDP_SOCKETS is not set ++CONFIG_NET_HANDSHAKE=y ++CONFIG_INET=y ++CONFIG_IP_MULTICAST=y ++CONFIG_IP_ADVANCED_ROUTER=y ++# CONFIG_IP_FIB_TRIE_STATS is not set ++CONFIG_IP_MULTIPLE_TABLES=y ++CONFIG_IP_ROUTE_MULTIPATH=y ++CONFIG_IP_ROUTE_VERBOSE=y ++CONFIG_IP_PNP=y ++CONFIG_IP_PNP_DHCP=y ++# CONFIG_IP_PNP_BOOTP is not set ++CONFIG_IP_PNP_RARP=y ++# CONFIG_NET_IPIP is not set ++# CONFIG_NET_IPGRE_DEMUX is not set ++CONFIG_IP_MROUTE_COMMON=y ++CONFIG_IP_MROUTE=y ++CONFIG_IP_MROUTE_MULTIPLE_TABLES=y ++CONFIG_IP_PIMSM_V1=y ++CONFIG_IP_PIMSM_V2=y ++CONFIG_SYN_COOKIES=y ++# CONFIG_NET_IPVTI is not set ++# CONFIG_NET_FOU is not set ++# CONFIG_INET_AH is not set ++# CONFIG_INET_ESP is not set ++# CONFIG_INET_IPCOMP is not set ++CONFIG_INET_TABLE_PERTURB_ORDER=16 ++# CONFIG_INET_DIAG is not set ++CONFIG_TCP_CONG_ADVANCED=y ++# CONFIG_TCP_CONG_BIC is not set ++CONFIG_TCP_CONG_CUBIC=y ++# CONFIG_TCP_CONG_WESTWOOD is not set ++# CONFIG_TCP_CONG_HTCP is not set ++# CONFIG_TCP_CONG_HSTCP is not set ++# CONFIG_TCP_CONG_HYBLA is not set ++# CONFIG_TCP_CONG_VEGAS is not set ++# CONFIG_TCP_CONG_NV is not set ++# CONFIG_TCP_CONG_SCALABLE is not set ++# CONFIG_TCP_CONG_LP is not set ++# CONFIG_TCP_CONG_VENO is not set ++# CONFIG_TCP_CONG_YEAH is not set ++# CONFIG_TCP_CONG_ILLINOIS is not set ++# CONFIG_TCP_CONG_DCTCP is not set ++# CONFIG_TCP_CONG_CDG is not set ++# CONFIG_TCP_CONG_BBR is not set ++CONFIG_DEFAULT_CUBIC=y ++# CONFIG_DEFAULT_RENO is not set ++CONFIG_DEFAULT_TCP_CONG="cubic" ++# CONFIG_TCP_AO is not set ++# CONFIG_TCP_MD5SIG is not set ++# CONFIG_IPV6 is not set ++# CONFIG_NETLABEL is not set ++CONFIG_MPTCP=y ++# CONFIG_NETWORK_SECMARK is not set ++CONFIG_NET_PTP_CLASSIFY=y ++CONFIG_NETWORK_PHY_TIMESTAMPING=y ++CONFIG_NETFILTER=y ++CONFIG_NETFILTER_ADVANCED=y ++ ++# ++# Core Netfilter Configuration ++# ++CONFIG_NETFILTER_INGRESS=y ++CONFIG_NETFILTER_EGRESS=y ++CONFIG_NETFILTER_SKIP_EGRESS=y ++CONFIG_NETFILTER_BPF_LINK=y ++# CONFIG_NETFILTER_NETLINK_ACCT is not set ++# CONFIG_NETFILTER_NETLINK_QUEUE is not set ++# CONFIG_NETFILTER_NETLINK_LOG is not set ++# CONFIG_NETFILTER_NETLINK_OSF is not set ++# CONFIG_NF_CONNTRACK is not set ++# CONFIG_NF_LOG_SYSLOG is not set ++# CONFIG_NF_TABLES is not set ++# CONFIG_NETFILTER_XTABLES is not set ++# end of Core Netfilter Configuration ++ ++# CONFIG_IP_SET is not set ++# CONFIG_IP_VS is not set ++ ++# ++# IP: Netfilter Configuration ++# ++# CONFIG_NF_SOCKET_IPV4 is not set ++# CONFIG_NF_TPROXY_IPV4 is not set ++# CONFIG_NF_DUP_IPV4 is not set ++# CONFIG_NF_LOG_ARP is not set ++# CONFIG_NF_LOG_IPV4 is not set ++# CONFIG_NF_REJECT_IPV4 is not set ++# CONFIG_IP_NF_IPTABLES is not set ++# end of IP: Netfilter Configuration ++ ++# CONFIG_IP_DCCP is not set ++# CONFIG_IP_SCTP is not set ++# CONFIG_RDS is not set ++# CONFIG_TIPC is not set ++# CONFIG_ATM is not set ++# CONFIG_L2TP is not set ++# CONFIG_BRIDGE is not set ++# CONFIG_NET_DSA is not set ++# CONFIG_VLAN_8021Q is not set ++# CONFIG_LLC2 is not set ++# CONFIG_ATALK is not set ++# CONFIG_X25 is not set ++# CONFIG_LAPB is not set ++# CONFIG_PHONET is not set ++# CONFIG_IEEE802154 is not set ++CONFIG_NET_SCHED=y ++ ++# ++# Queueing/Scheduling ++# ++# CONFIG_NET_SCH_HTB is not set ++# CONFIG_NET_SCH_HFSC is not set ++# CONFIG_NET_SCH_PRIO is not set ++# CONFIG_NET_SCH_MULTIQ is not set ++# CONFIG_NET_SCH_RED is not set ++# CONFIG_NET_SCH_SFB is not set ++# CONFIG_NET_SCH_SFQ is not set ++# CONFIG_NET_SCH_TEQL is not set ++# CONFIG_NET_SCH_TBF is not set ++# CONFIG_NET_SCH_CBS is not set ++# CONFIG_NET_SCH_ETF is not set ++# CONFIG_NET_SCH_TAPRIO is not set ++# CONFIG_NET_SCH_GRED is not set ++# CONFIG_NET_SCH_NETEM is not set ++# CONFIG_NET_SCH_DRR is not set ++# CONFIG_NET_SCH_MQPRIO is not set ++# CONFIG_NET_SCH_SKBPRIO is not set ++# CONFIG_NET_SCH_CHOKE is not set ++# CONFIG_NET_SCH_QFQ is not set ++# CONFIG_NET_SCH_CODEL is not set ++# CONFIG_NET_SCH_FQ_CODEL is not set ++# CONFIG_NET_SCH_CAKE is not set ++# CONFIG_NET_SCH_FQ is not set ++# CONFIG_NET_SCH_HHF is not set ++# CONFIG_NET_SCH_PIE is not set ++# CONFIG_NET_SCH_INGRESS is not set ++# CONFIG_NET_SCH_PLUG is not set ++# CONFIG_NET_SCH_ETS is not set ++# CONFIG_NET_SCH_DEFAULT is not set ++ ++# ++# Classification ++# ++CONFIG_NET_CLS=y ++# CONFIG_NET_CLS_BASIC is not set ++# CONFIG_NET_CLS_ROUTE4 is not set ++# CONFIG_NET_CLS_FW is not set ++# CONFIG_NET_CLS_U32 is not set ++# CONFIG_NET_CLS_FLOW is not set ++# CONFIG_NET_CLS_CGROUP is not set ++CONFIG_NET_CLS_BPF=y ++# CONFIG_NET_CLS_FLOWER is not set ++# CONFIG_NET_CLS_MATCHALL is not set ++CONFIG_NET_EMATCH=y ++CONFIG_NET_EMATCH_STACK=32 ++# CONFIG_NET_EMATCH_CMP is not set ++# CONFIG_NET_EMATCH_NBYTE is not set ++# CONFIG_NET_EMATCH_U32 is not set ++# CONFIG_NET_EMATCH_META is not set ++# CONFIG_NET_EMATCH_TEXT is not set ++CONFIG_NET_CLS_ACT=y ++# CONFIG_NET_ACT_POLICE is not set ++# CONFIG_NET_ACT_GACT is not set ++# CONFIG_NET_ACT_MIRRED is not set ++# CONFIG_NET_ACT_SAMPLE is not set ++# CONFIG_NET_ACT_NAT is not set ++# CONFIG_NET_ACT_PEDIT is not set ++# CONFIG_NET_ACT_SIMP is not set ++# CONFIG_NET_ACT_SKBEDIT is not set ++# CONFIG_NET_ACT_CSUM is not set ++# CONFIG_NET_ACT_MPLS is not set ++# CONFIG_NET_ACT_VLAN is not set ++# CONFIG_NET_ACT_BPF is not set ++# CONFIG_NET_ACT_SKBMOD is not set ++# CONFIG_NET_ACT_IFE is not set ++# CONFIG_NET_ACT_TUNNEL_KEY is not set ++# CONFIG_NET_ACT_GATE is not set ++# CONFIG_NET_TC_SKB_EXT is not set ++CONFIG_NET_SCH_FIFO=y ++# CONFIG_DCB is not set ++CONFIG_DNS_RESOLVER=y ++# CONFIG_BATMAN_ADV is not set ++# CONFIG_OPENVSWITCH is not set ++# CONFIG_VSOCKETS is not set ++# CONFIG_NETLINK_DIAG is not set ++CONFIG_MPLS=y ++# CONFIG_NET_MPLS_GSO is not set ++# CONFIG_MPLS_ROUTING is not set ++# CONFIG_NET_NSH is not set ++# CONFIG_HSR is not set ++CONFIG_NET_SWITCHDEV=y ++CONFIG_NET_L3_MASTER_DEV=y ++# CONFIG_QRTR is not set ++# CONFIG_NET_NCSI is not set ++CONFIG_PCPU_DEV_REFCNT=y ++CONFIG_MAX_SKB_FRAGS=17 ++CONFIG_RPS=y ++CONFIG_RFS_ACCEL=y ++CONFIG_SOCK_RX_QUEUE_MAPPING=y ++CONFIG_XPS=y ++CONFIG_CGROUP_NET_PRIO=y ++CONFIG_CGROUP_NET_CLASSID=y ++CONFIG_NET_RX_BUSY_POLL=y ++CONFIG_BQL=y ++# CONFIG_BPF_STREAM_PARSER is not set ++CONFIG_NET_FLOW_LIMIT=y ++ ++# ++# Network testing ++# ++# CONFIG_NET_PKTGEN is not set ++# CONFIG_NET_DROP_MONITOR is not set ++# end of Network testing ++# end of Networking options ++ ++CONFIG_HAMRADIO=y ++ ++# ++# Packet Radio protocols ++# ++# CONFIG_AX25 is not set ++# CONFIG_CAN is not set ++# CONFIG_BT is not set ++# CONFIG_AF_RXRPC is not set ++# CONFIG_AF_KCM is not set ++# CONFIG_MCTP is not set ++CONFIG_FIB_RULES=y ++CONFIG_WIRELESS=y ++# CONFIG_CFG80211 is not set ++ ++# ++# CFG80211 needs to be enabled for MAC80211 ++# ++CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 ++# CONFIG_RFKILL is not set ++# CONFIG_NET_9P is not set ++# CONFIG_CAIF is not set ++# CONFIG_CEPH_LIB is not set ++# CONFIG_NFC is not set ++# CONFIG_PSAMPLE is not set ++# CONFIG_NET_IFE is not set ++CONFIG_LWTUNNEL=y ++CONFIG_LWTUNNEL_BPF=y ++CONFIG_NET_SELFTESTS=y ++CONFIG_NET_SOCK_MSG=y ++CONFIG_PAGE_POOL=y ++# CONFIG_PAGE_POOL_STATS is not set ++# CONFIG_FAILOVER is not set ++CONFIG_ETHTOOL_NETLINK=y ++ ++# ++# Device Drivers ++# ++CONFIG_ARM_AMBA=y ++CONFIG_HAVE_PCI=y ++CONFIG_GENERIC_PCI_IOMAP=y ++CONFIG_PCI=y ++CONFIG_PCI_DOMAINS=y ++CONFIG_PCI_DOMAINS_GENERIC=y ++CONFIG_PCI_SYSCALL=y ++CONFIG_PCIEPORTBUS=y ++CONFIG_PCIEAER=y ++# CONFIG_PCIEAER_INJECT is not set ++# CONFIG_PCIE_ECRC is not set ++CONFIG_PCIEASPM=y ++# CONFIG_PCIEASPM_DEFAULT is not set ++CONFIG_PCIEASPM_POWERSAVE=y ++# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set ++# CONFIG_PCIEASPM_PERFORMANCE is not set ++CONFIG_PCIE_PME=y ++CONFIG_PCIE_DPC=y ++# CONFIG_PCIE_PTM is not set ++CONFIG_PCI_MSI=y ++CONFIG_PCI_QUIRKS=y ++# CONFIG_PCI_DEBUG is not set ++# CONFIG_PCI_STUB is not set ++# CONFIG_PCI_IOV is not set ++# CONFIG_PCI_NPEM is not set ++# CONFIG_PCI_PRI is not set ++# CONFIG_PCI_PASID is not set ++CONFIG_PCI_LABEL=y ++# CONFIG_PCI_DYNAMIC_OF_NODES is not set ++# CONFIG_PCIE_BUS_TUNE_OFF is not set ++CONFIG_PCIE_BUS_DEFAULT=y ++# CONFIG_PCIE_BUS_SAFE is not set ++# CONFIG_PCIE_BUS_PERFORMANCE is not set ++# CONFIG_PCIE_BUS_PEER2PEER is not set ++CONFIG_VGA_ARB=y ++CONFIG_VGA_ARB_MAX_GPUS=16 ++# CONFIG_HOTPLUG_PCI is not set ++ ++# ++# PCI controller drivers ++# ++# CONFIG_PCIE_ALTERA is not set ++CONFIG_PCIE_BRCMSTB=y ++# CONFIG_PCI_HOST_THUNDER_PEM is not set ++# CONFIG_PCI_HOST_THUNDER_ECAM is not set ++# CONFIG_PCI_FTPCI100 is not set ++# CONFIG_PCI_HOST_GENERIC is not set ++# CONFIG_PCI_XGENE is not set ++# CONFIG_PCIE_XILINX is not set ++ ++# ++# Cadence-based PCIe controllers ++# ++# CONFIG_PCIE_CADENCE_PLAT_HOST is not set ++# end of Cadence-based PCIe controllers ++ ++# ++# DesignWare-based PCIe controllers ++# ++# CONFIG_PCIE_AL is not set ++# CONFIG_PCI_MESON is not set ++# CONFIG_PCI_HISI is not set ++# CONFIG_PCIE_KIRIN is not set ++# CONFIG_PCIE_DW_PLAT_HOST is not set ++# end of DesignWare-based PCIe controllers ++ ++# ++# Mobiveil-based PCIe controllers ++# ++# end of Mobiveil-based PCIe controllers ++ ++# ++# PLDA-based PCIe controllers ++# ++# CONFIG_PCIE_MICROCHIP_HOST is not set ++# end of PLDA-based PCIe controllers ++# end of PCI controller drivers ++ ++# ++# PCI Endpoint ++# ++# CONFIG_PCI_ENDPOINT is not set ++# end of PCI Endpoint ++ ++# ++# PCI switch controller drivers ++# ++# CONFIG_PCI_SW_SWITCHTEC is not set ++# end of PCI switch controller drivers ++ ++# CONFIG_CXL_BUS is not set ++# CONFIG_PCCARD is not set ++# CONFIG_RAPIDIO is not set ++ ++# ++# Generic Driver Options ++# ++CONFIG_UEVENT_HELPER=y ++CONFIG_UEVENT_HELPER_PATH="" ++CONFIG_DEVTMPFS=y ++CONFIG_DEVTMPFS_MOUNT=y ++# CONFIG_DEVTMPFS_SAFE is not set ++CONFIG_STANDALONE=y ++CONFIG_PREVENT_FIRMWARE_BUILD=y ++ ++# ++# Firmware loader ++# ++CONFIG_FW_LOADER=y ++CONFIG_EXTRA_FIRMWARE="" ++# CONFIG_FW_LOADER_USER_HELPER is not set ++# CONFIG_FW_LOADER_COMPRESS is not set ++# CONFIG_FW_UPLOAD is not set ++# end of Firmware loader ++ ++CONFIG_ALLOW_DEV_COREDUMP=y ++# CONFIG_DEBUG_DRIVER is not set ++# CONFIG_DEBUG_DEVRES is not set ++# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set ++# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set ++CONFIG_GENERIC_CPU_DEVICES=y ++CONFIG_GENERIC_CPU_AUTOPROBE=y ++CONFIG_GENERIC_CPU_VULNERABILITIES=y ++CONFIG_SOC_BUS=y ++CONFIG_REGMAP=y ++CONFIG_REGMAP_MMIO=y ++CONFIG_DMA_SHARED_BUFFER=y ++# CONFIG_DMA_FENCE_TRACE is not set ++CONFIG_GENERIC_ARCH_TOPOLOGY=y ++CONFIG_GENERIC_ARCH_NUMA=y ++# CONFIG_FW_DEVLINK_SYNC_STATE_TIMEOUT is not set ++# end of Generic Driver Options ++ ++# ++# Bus devices ++# ++# CONFIG_BRCMSTB_GISB_ARB is not set ++# CONFIG_MOXTET is not set ++# CONFIG_VEXPRESS_CONFIG is not set ++# CONFIG_MHI_BUS is not set ++# CONFIG_MHI_BUS_EP is not set ++# end of Bus devices ++ ++# ++# Cache Drivers ++# ++# end of Cache Drivers ++ ++# CONFIG_CONNECTOR is not set ++ ++# ++# Firmware Drivers ++# ++ ++# ++# ARM System Control and Management Interface Protocol ++# ++# CONFIG_ARM_SCMI_PROTOCOL is not set ++# end of ARM System Control and Management Interface Protocol ++ ++# CONFIG_ARM_SCPI_PROTOCOL is not set ++# CONFIG_ARM_SDE_INTERFACE is not set ++# CONFIG_FIRMWARE_MEMMAP is not set ++CONFIG_DMIID=y ++# CONFIG_DMI_SYSFS is not set ++CONFIG_RASPBERRYPI_FIRMWARE=y ++# CONFIG_FW_CFG_SYSFS is not set ++# CONFIG_SYSFB_SIMPLEFB is not set ++# CONFIG_ARM_FFA_TRANSPORT is not set ++# CONFIG_GOOGLE_FIRMWARE is not set ++ ++# ++# EFI (Extensible Firmware Interface) Support ++# ++CONFIG_EFI_ESRT=y ++# CONFIG_EFI_VARS_PSTORE is not set ++CONFIG_EFI_PARAMS_FROM_FDT=y ++CONFIG_EFI_RUNTIME_WRAPPERS=y ++CONFIG_EFI_GENERIC_STUB=y ++# CONFIG_EFI_ZBOOT is not set ++CONFIG_EFI_ARMSTUB_DTB_LOADER=y ++# CONFIG_EFI_BOOTLOADER_CONTROL is not set ++# CONFIG_EFI_CAPSULE_LOADER is not set ++# CONFIG_EFI_TEST is not set ++# CONFIG_RESET_ATTACK_MITIGATION is not set ++# CONFIG_EFI_DISABLE_PCI_DMA is not set ++CONFIG_EFI_EARLYCON=y ++# CONFIG_EFI_DISABLE_RUNTIME is not set ++# CONFIG_EFI_COCO_SECRET is not set ++# end of EFI (Extensible Firmware Interface) Support ++ ++CONFIG_ARM_PSCI_FW=y ++# CONFIG_ARM_PSCI_CHECKER is not set ++ ++# ++# Qualcomm firmware drivers ++# ++# end of Qualcomm firmware drivers ++ ++CONFIG_HAVE_ARM_SMCCC=y ++CONFIG_HAVE_ARM_SMCCC_DISCOVERY=y ++CONFIG_ARM_SMCCC_SOC_ID=y ++ ++# ++# Tegra firmware driver ++# ++# end of Tegra firmware driver ++# end of Firmware Drivers ++ ++# CONFIG_GNSS is not set ++# CONFIG_MTD is not set ++CONFIG_DTC=y ++CONFIG_OF=y ++# CONFIG_OF_UNITTEST is not set ++CONFIG_OF_FLATTREE=y ++CONFIG_OF_EARLY_FLATTREE=y ++CONFIG_OF_KOBJ=y ++CONFIG_OF_DYNAMIC=y ++CONFIG_OF_ADDRESS=y ++CONFIG_OF_IRQ=y ++CONFIG_OF_RESERVED_MEM=y ++CONFIG_OF_RESOLVE=y ++CONFIG_OF_OVERLAY=y ++CONFIG_OF_NUMA=y ++CONFIG_OF_CONFIGFS=y ++# CONFIG_PARPORT is not set ++CONFIG_BLK_DEV=y ++# CONFIG_BLK_DEV_NULL_BLK is not set ++# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set ++# CONFIG_ZRAM is not set ++CONFIG_BLK_DEV_LOOP=y ++CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 ++# CONFIG_BLK_DEV_DRBD is not set ++# CONFIG_BLK_DEV_NBD is not set ++CONFIG_BLK_DEV_RAM=y ++CONFIG_BLK_DEV_RAM_COUNT=16 ++CONFIG_BLK_DEV_RAM_SIZE=4096 ++# CONFIG_CDROM_PKTCDVD is not set ++# CONFIG_ATA_OVER_ETH is not set ++# CONFIG_BLK_DEV_RBD is not set ++# CONFIG_BLK_DEV_UBLK is not set ++ ++# ++# NVME Support ++# ++CONFIG_NVME_CORE=y ++CONFIG_BLK_DEV_NVME=y ++# CONFIG_NVME_MULTIPATH is not set ++# CONFIG_NVME_VERBOSE_ERRORS is not set ++CONFIG_NVME_HWMON=y ++# CONFIG_NVME_FC is not set ++# CONFIG_NVME_TCP is not set ++# CONFIG_NVME_HOST_AUTH is not set ++# CONFIG_NVME_TARGET is not set ++# end of NVME Support ++ ++# ++# Misc devices ++# ++# CONFIG_BCM2835_SMI is not set ++# CONFIG_AD525X_DPOT is not set ++# CONFIG_DUMMY_IRQ is not set ++# CONFIG_PHANTOM is not set ++# CONFIG_RPMB is not set ++# CONFIG_TIFM_CORE is not set ++# CONFIG_ICS932S401 is not set ++# CONFIG_ENCLOSURE_SERVICES is not set ++# CONFIG_HP_ILO is not set ++# CONFIG_APDS9802ALS is not set ++# CONFIG_ISL29003 is not set ++# CONFIG_ISL29020 is not set ++# CONFIG_SENSORS_TSL2550 is not set ++# CONFIG_SENSORS_BH1770 is not set ++# CONFIG_SENSORS_APDS990X is not set ++# CONFIG_HMC6352 is not set ++# CONFIG_DS1682 is not set ++# CONFIG_LATTICE_ECP3_CONFIG is not set ++CONFIG_SRAM=y ++# CONFIG_DW_XDATA_PCIE is not set ++# CONFIG_PCI_ENDPOINT_TEST is not set ++# CONFIG_XILINX_SDFEC is not set ++# CONFIG_HISI_HIKEY_USB is not set ++# CONFIG_OPEN_DICE is not set ++# CONFIG_VCPU_STALL_DETECTOR is not set ++# CONFIG_C2PORT is not set ++ ++# ++# EEPROM support ++# ++# CONFIG_EEPROM_AT24 is not set ++# CONFIG_EEPROM_AT25 is not set ++# CONFIG_EEPROM_MAX6875 is not set ++# CONFIG_EEPROM_93CX6 is not set ++# CONFIG_EEPROM_93XX46 is not set ++# CONFIG_EEPROM_IDT_89HPESX is not set ++# CONFIG_EEPROM_EE1004 is not set ++# end of EEPROM support ++ ++# CONFIG_CB710_CORE is not set ++ ++# ++# Texas Instruments shared transport line discipline ++# ++# CONFIG_TI_ST is not set ++# end of Texas Instruments shared transport line discipline ++ ++# CONFIG_SENSORS_LIS3_SPI is not set ++# CONFIG_SENSORS_LIS3_I2C is not set ++# CONFIG_ALTERA_STAPL is not set ++# CONFIG_VMWARE_VMCI is not set ++# CONFIG_GENWQE is not set ++# CONFIG_ECHO is not set ++# CONFIG_BCM_VK is not set ++# CONFIG_MISC_ALCOR_PCI is not set ++# CONFIG_MISC_RTSX_PCI is not set ++# CONFIG_MISC_RTSX_USB is not set ++# CONFIG_UACCE is not set ++# CONFIG_PVPANIC is not set ++# CONFIG_GP_PCI1XXXX is not set ++# CONFIG_KEBA_CP500 is not set ++# end of Misc devices ++ ++# ++# SCSI device support ++# ++CONFIG_SCSI_MOD=y ++# CONFIG_RAID_ATTRS is not set ++CONFIG_SCSI_COMMON=y ++CONFIG_SCSI=y ++CONFIG_SCSI_DMA=y ++# CONFIG_SCSI_PROC_FS is not set ++ ++# ++# SCSI support type (disk, tape, CD-ROM) ++# ++CONFIG_BLK_DEV_SD=y ++# CONFIG_CHR_DEV_ST is not set ++# CONFIG_BLK_DEV_SR is not set ++# CONFIG_CHR_DEV_SG is not set ++CONFIG_BLK_DEV_BSG=y ++# CONFIG_CHR_DEV_SCH is not set ++# CONFIG_SCSI_CONSTANTS is not set ++# CONFIG_SCSI_LOGGING is not set ++# CONFIG_SCSI_SCAN_ASYNC is not set ++ ++# ++# SCSI Transports ++# ++# CONFIG_SCSI_SPI_ATTRS is not set ++# CONFIG_SCSI_FC_ATTRS is not set ++CONFIG_SCSI_ISCSI_ATTRS=y ++# CONFIG_SCSI_SAS_ATTRS is not set ++# CONFIG_SCSI_SAS_LIBSAS is not set ++# CONFIG_SCSI_SRP_ATTRS is not set ++# end of SCSI Transports ++ ++CONFIG_SCSI_LOWLEVEL=y ++# CONFIG_ISCSI_TCP is not set ++# CONFIG_ISCSI_BOOT_SYSFS is not set ++# CONFIG_SCSI_CXGB3_ISCSI is not set ++# CONFIG_SCSI_CXGB4_ISCSI is not set ++# CONFIG_SCSI_BNX2_ISCSI is not set ++# CONFIG_BE2ISCSI is not set ++# CONFIG_BLK_DEV_3W_XXXX_RAID is not set ++# CONFIG_SCSI_HPSA is not set ++# CONFIG_SCSI_3W_9XXX is not set ++# CONFIG_SCSI_3W_SAS is not set ++# CONFIG_SCSI_ACARD is not set ++# CONFIG_SCSI_AACRAID is not set ++# CONFIG_SCSI_AIC7XXX is not set ++# CONFIG_SCSI_AIC79XX is not set ++# CONFIG_SCSI_AIC94XX is not set ++# CONFIG_SCSI_MVSAS is not set ++# CONFIG_SCSI_MVUMI is not set ++# CONFIG_SCSI_ADVANSYS is not set ++# CONFIG_SCSI_ARCMSR is not set ++# CONFIG_SCSI_ESAS2R is not set ++# CONFIG_MEGARAID_NEWGEN is not set ++# CONFIG_MEGARAID_LEGACY is not set ++# CONFIG_MEGARAID_SAS is not set ++# CONFIG_SCSI_MPT3SAS is not set ++# CONFIG_SCSI_MPT2SAS is not set ++# CONFIG_SCSI_MPI3MR is not set ++# CONFIG_SCSI_SMARTPQI is not set ++# CONFIG_SCSI_HPTIOP is not set ++# CONFIG_SCSI_BUSLOGIC is not set ++# CONFIG_SCSI_MYRB is not set ++# CONFIG_SCSI_MYRS is not set ++# CONFIG_SCSI_SNIC is not set ++# CONFIG_SCSI_DMX3191D is not set ++# CONFIG_SCSI_FDOMAIN_PCI is not set ++# CONFIG_SCSI_IPS is not set ++# CONFIG_SCSI_INITIO is not set ++# CONFIG_SCSI_INIA100 is not set ++# CONFIG_SCSI_STEX is not set ++# CONFIG_SCSI_SYM53C8XX_2 is not set ++# CONFIG_SCSI_IPR is not set ++# CONFIG_SCSI_QLOGIC_1280 is not set ++# CONFIG_SCSI_QLA_ISCSI is not set ++# CONFIG_SCSI_DC395x is not set ++# CONFIG_SCSI_AM53C974 is not set ++# CONFIG_SCSI_WD719X is not set ++# CONFIG_SCSI_DEBUG is not set ++# CONFIG_SCSI_PMCRAID is not set ++# CONFIG_SCSI_PM8001 is not set ++# CONFIG_SCSI_DH is not set ++# end of SCSI device support ++ ++# CONFIG_ATA is not set ++CONFIG_MD=y ++# CONFIG_BLK_DEV_MD is not set ++CONFIG_MD_BITMAP_FILE=y ++# CONFIG_BCACHE is not set ++# CONFIG_BLK_DEV_DM is not set ++# CONFIG_TARGET_CORE is not set ++# CONFIG_FUSION is not set ++ ++# ++# IEEE 1394 (FireWire) support ++# ++# CONFIG_FIREWIRE is not set ++# CONFIG_FIREWIRE_NOSY is not set ++# end of IEEE 1394 (FireWire) support ++ ++CONFIG_NETDEVICES=y ++CONFIG_MII=y ++CONFIG_NET_CORE=y ++# CONFIG_BONDING is not set ++# CONFIG_DUMMY is not set ++# CONFIG_WIREGUARD is not set ++# CONFIG_EQUALIZER is not set ++# CONFIG_NET_FC is not set ++# CONFIG_NET_TEAM is not set ++# CONFIG_MACVLAN is not set ++# CONFIG_IPVLAN is not set ++# CONFIG_VXLAN is not set ++# CONFIG_GENEVE is not set ++# CONFIG_BAREUDP is not set ++# CONFIG_GTP is not set ++# CONFIG_PFCP is not set ++# CONFIG_AMT is not set ++# CONFIG_MACSEC is not set ++# CONFIG_NETCONSOLE is not set ++# CONFIG_TUN is not set ++# CONFIG_TUN_VNET_CROSS_LE is not set ++# CONFIG_VETH is not set ++# CONFIG_NLMON is not set ++CONFIG_NETKIT=y ++# CONFIG_NET_VRF is not set ++# CONFIG_ARCNET is not set ++CONFIG_ETHERNET=y ++CONFIG_NET_VENDOR_3COM=y ++# CONFIG_VORTEX is not set ++# CONFIG_TYPHOON is not set ++CONFIG_NET_VENDOR_ADAPTEC=y ++# CONFIG_ADAPTEC_STARFIRE is not set ++CONFIG_NET_VENDOR_AGERE=y ++# CONFIG_ET131X is not set ++CONFIG_NET_VENDOR_ALACRITECH=y ++# CONFIG_SLICOSS is not set ++CONFIG_NET_VENDOR_ALTEON=y ++# CONFIG_ACENIC is not set ++# CONFIG_ALTERA_TSE is not set ++CONFIG_NET_VENDOR_AMAZON=y ++# CONFIG_ENA_ETHERNET is not set ++CONFIG_NET_VENDOR_AMD=y ++# CONFIG_AMD8111_ETH is not set ++# CONFIG_PCNET32 is not set ++# CONFIG_AMD_XGBE is not set ++# CONFIG_PDS_CORE is not set ++CONFIG_NET_VENDOR_AQUANTIA=y ++# CONFIG_AQTION is not set ++CONFIG_NET_VENDOR_ARC=y ++CONFIG_NET_VENDOR_ASIX=y ++# CONFIG_SPI_AX88796C is not set ++CONFIG_NET_VENDOR_ATHEROS=y ++# CONFIG_ATL2 is not set ++# CONFIG_ATL1 is not set ++# CONFIG_ATL1E is not set ++# CONFIG_ATL1C is not set ++# CONFIG_ALX is not set ++CONFIG_NET_VENDOR_BROADCOM=y ++# CONFIG_B44 is not set ++CONFIG_BCMGENET=y ++# CONFIG_BNX2 is not set ++# CONFIG_CNIC is not set ++# CONFIG_TIGON3 is not set ++# CONFIG_BNX2X is not set ++# CONFIG_SYSTEMPORT is not set ++# CONFIG_BNXT is not set ++CONFIG_BCMASP=y ++CONFIG_NET_VENDOR_CADENCE=y ++CONFIG_MACB=y ++CONFIG_MACB_USE_HWSTAMP=y ++# CONFIG_MACB_PCI is not set ++CONFIG_NET_VENDOR_CAVIUM=y ++# CONFIG_THUNDER_NIC_PF is not set ++# CONFIG_THUNDER_NIC_VF is not set ++# CONFIG_THUNDER_NIC_BGX is not set ++# CONFIG_THUNDER_NIC_RGX is not set ++# CONFIG_CAVIUM_PTP is not set ++# CONFIG_LIQUIDIO is not set ++# CONFIG_LIQUIDIO_VF is not set ++CONFIG_NET_VENDOR_CHELSIO=y ++# CONFIG_CHELSIO_T1 is not set ++# CONFIG_CHELSIO_T3 is not set ++# CONFIG_CHELSIO_T4 is not set ++# CONFIG_CHELSIO_T4VF is not set ++CONFIG_NET_VENDOR_CISCO=y ++# CONFIG_ENIC is not set ++CONFIG_NET_VENDOR_CORTINA=y ++# CONFIG_GEMINI_ETHERNET is not set ++CONFIG_NET_VENDOR_DAVICOM=y ++# CONFIG_DM9051 is not set ++# CONFIG_DNET is not set ++CONFIG_NET_VENDOR_DEC=y ++# CONFIG_NET_TULIP is not set ++CONFIG_NET_VENDOR_DLINK=y ++# CONFIG_DL2K is not set ++# CONFIG_SUNDANCE is not set ++CONFIG_NET_VENDOR_EMULEX=y ++# CONFIG_BE2NET is not set ++CONFIG_NET_VENDOR_ENGLEDER=y ++# CONFIG_TSNEP is not set ++CONFIG_NET_VENDOR_EZCHIP=y ++# CONFIG_EZCHIP_NPS_MANAGEMENT_ENET is not set ++CONFIG_NET_VENDOR_FUNGIBLE=y ++# CONFIG_FUN_ETH is not set ++CONFIG_NET_VENDOR_GOOGLE=y ++# CONFIG_GVE is not set ++CONFIG_NET_VENDOR_HISILICON=y ++# CONFIG_HIX5HD2_GMAC is not set ++# CONFIG_HISI_FEMAC is not set ++# CONFIG_HIP04_ETH is not set ++# CONFIG_HNS_DSAF is not set ++# CONFIG_HNS_ENET is not set ++# CONFIG_HNS3 is not set ++CONFIG_NET_VENDOR_HUAWEI=y ++# CONFIG_HINIC is not set ++CONFIG_NET_VENDOR_I825XX=y ++CONFIG_NET_VENDOR_INTEL=y ++# CONFIG_E100 is not set ++# CONFIG_E1000 is not set ++# CONFIG_E1000E is not set ++# CONFIG_IGB is not set ++# CONFIG_IGBVF is not set ++# CONFIG_IXGBE is not set ++# CONFIG_IXGBEVF is not set ++# CONFIG_I40E is not set ++# CONFIG_I40EVF is not set ++# CONFIG_ICE is not set ++# CONFIG_FM10K is not set ++# CONFIG_IGC is not set ++# CONFIG_IDPF is not set ++# CONFIG_JME is not set ++CONFIG_NET_VENDOR_ADI=y ++# CONFIG_ADIN1110 is not set ++CONFIG_NET_VENDOR_LITEX=y ++# CONFIG_LITEX_LITEETH is not set ++CONFIG_NET_VENDOR_MARVELL=y ++# CONFIG_MVMDIO is not set ++# CONFIG_SKGE is not set ++# CONFIG_SKY2 is not set ++# CONFIG_OCTEONTX2_AF is not set ++# CONFIG_OCTEONTX2_PF is not set ++# CONFIG_OCTEON_EP is not set ++# CONFIG_OCTEON_EP_VF is not set ++CONFIG_NET_VENDOR_MELLANOX=y ++# CONFIG_MLX4_EN is not set ++# CONFIG_MLX5_CORE is not set ++# CONFIG_MLXSW_CORE is not set ++# CONFIG_MLXFW is not set ++CONFIG_NET_VENDOR_META=y ++CONFIG_NET_VENDOR_MICREL=y ++# CONFIG_KS8842 is not set ++# CONFIG_KS8851 is not set ++# CONFIG_KS8851_MLL is not set ++# CONFIG_KSZ884X_PCI is not set ++CONFIG_NET_VENDOR_MICROCHIP=y ++# CONFIG_ENC28J60 is not set ++# CONFIG_ENCX24J600 is not set ++# CONFIG_LAN743X is not set ++# CONFIG_LAN865X is not set ++# CONFIG_LAN966X_SWITCH is not set ++# CONFIG_VCAP is not set ++CONFIG_NET_VENDOR_MICROSEMI=y ++# CONFIG_MSCC_OCELOT_SWITCH is not set ++CONFIG_NET_VENDOR_MICROSOFT=y ++CONFIG_NET_VENDOR_MYRI=y ++# CONFIG_MYRI10GE is not set ++# CONFIG_FEALNX is not set ++CONFIG_NET_VENDOR_NI=y ++# CONFIG_NI_XGE_MANAGEMENT_ENET is not set ++CONFIG_NET_VENDOR_NATSEMI=y ++# CONFIG_NATSEMI is not set ++# CONFIG_NS83820 is not set ++CONFIG_NET_VENDOR_NETERION=y ++# CONFIG_S2IO is not set ++CONFIG_NET_VENDOR_NETRONOME=y ++# CONFIG_NFP is not set ++CONFIG_NET_VENDOR_8390=y ++# CONFIG_NE2K_PCI is not set ++CONFIG_NET_VENDOR_NVIDIA=y ++# CONFIG_FORCEDETH is not set ++CONFIG_NET_VENDOR_OKI=y ++# CONFIG_ETHOC is not set ++# CONFIG_OA_TC6 is not set ++CONFIG_NET_VENDOR_PACKET_ENGINES=y ++# CONFIG_HAMACHI is not set ++# CONFIG_YELLOWFIN is not set ++CONFIG_NET_VENDOR_PENSANDO=y ++# CONFIG_IONIC is not set ++CONFIG_NET_VENDOR_QLOGIC=y ++# CONFIG_QLA3XXX is not set ++# CONFIG_QLCNIC is not set ++# CONFIG_NETXEN_NIC is not set ++# CONFIG_QED is not set ++CONFIG_NET_VENDOR_BROCADE=y ++# CONFIG_BNA is not set ++CONFIG_NET_VENDOR_QUALCOMM=y ++# CONFIG_QCA7000_SPI is not set ++# CONFIG_QCA7000_UART is not set ++# CONFIG_QCOM_EMAC is not set ++# CONFIG_RMNET is not set ++CONFIG_NET_VENDOR_RDC=y ++# CONFIG_R6040 is not set ++CONFIG_NET_VENDOR_REALTEK=y ++# CONFIG_8139CP is not set ++# CONFIG_8139TOO is not set ++# CONFIG_R8169 is not set ++# CONFIG_RTASE is not set ++CONFIG_NET_VENDOR_RENESAS=y ++CONFIG_NET_VENDOR_ROCKER=y ++CONFIG_NET_VENDOR_SAMSUNG=y ++# CONFIG_SXGBE_ETH is not set ++CONFIG_NET_VENDOR_SEEQ=y ++CONFIG_NET_VENDOR_SILAN=y ++# CONFIG_SC92031 is not set ++CONFIG_NET_VENDOR_SIS=y ++# CONFIG_SIS900 is not set ++# CONFIG_SIS190 is not set ++CONFIG_NET_VENDOR_SOLARFLARE=y ++# CONFIG_SFC is not set ++# CONFIG_SFC_FALCON is not set ++# CONFIG_SFC_SIENA is not set ++CONFIG_NET_VENDOR_SMSC=y ++# CONFIG_SMC91X is not set ++# CONFIG_EPIC100 is not set ++# CONFIG_SMSC911X is not set ++# CONFIG_SMSC9420 is not set ++CONFIG_NET_VENDOR_SOCIONEXT=y ++CONFIG_NET_VENDOR_STMICRO=y ++# CONFIG_STMMAC_ETH is not set ++CONFIG_NET_VENDOR_SUN=y ++# CONFIG_HAPPYMEAL is not set ++# CONFIG_SUNGEM is not set ++# CONFIG_CASSINI is not set ++# CONFIG_NIU is not set ++CONFIG_NET_VENDOR_SYNOPSYS=y ++# CONFIG_DWC_XLGMAC is not set ++CONFIG_NET_VENDOR_TEHUTI=y ++# CONFIG_TEHUTI is not set ++# CONFIG_TEHUTI_TN40 is not set ++CONFIG_NET_VENDOR_TI=y ++# CONFIG_TI_CPSW_PHY_SEL is not set ++# CONFIG_TLAN is not set ++CONFIG_NET_VENDOR_VERTEXCOM=y ++# CONFIG_MSE102X is not set ++CONFIG_NET_VENDOR_VIA=y ++# CONFIG_VIA_RHINE is not set ++# CONFIG_VIA_VELOCITY is not set ++CONFIG_NET_VENDOR_WANGXUN=y ++# CONFIG_NGBE is not set ++CONFIG_NET_VENDOR_WIZNET=y ++# CONFIG_WIZNET_W5100 is not set ++# CONFIG_WIZNET_W5300 is not set ++CONFIG_NET_VENDOR_XILINX=y ++# CONFIG_XILINX_EMACLITE is not set ++# CONFIG_XILINX_LL_TEMAC is not set ++# CONFIG_FDDI is not set ++# CONFIG_HIPPI is not set ++CONFIG_PHYLINK=y ++CONFIG_PHYLIB=y ++CONFIG_SWPHY=y ++# CONFIG_LED_TRIGGER_PHY is not set ++CONFIG_PHYLIB_LEDS=y ++CONFIG_FIXED_PHY=y ++# CONFIG_SFP is not set ++ ++# ++# MII PHY device drivers ++# ++# CONFIG_AIR_EN8811H_PHY is not set ++# CONFIG_AMD_PHY is not set ++# CONFIG_ADIN_PHY is not set ++# CONFIG_ADIN1100_PHY is not set ++# CONFIG_AQUANTIA_PHY is not set ++# CONFIG_AX88796B_PHY is not set ++CONFIG_BROADCOM_PHY=y ++# CONFIG_BCM54140_PHY is not set ++CONFIG_BCM7XXX_PHY=y ++# CONFIG_BCM84881_PHY is not set ++# CONFIG_BCM87XX_PHY is not set ++CONFIG_BCM_NET_PHYLIB=y ++CONFIG_BCM_NET_PHYPTP=y ++# CONFIG_CICADA_PHY is not set ++# CONFIG_CORTINA_PHY is not set ++# CONFIG_DAVICOM_PHY is not set ++# CONFIG_ICPLUS_PHY is not set ++# CONFIG_LXT_PHY is not set ++# CONFIG_INTEL_XWAY_PHY is not set ++# CONFIG_LSI_ET1011C_PHY is not set ++# CONFIG_MARVELL_PHY is not set ++# CONFIG_MARVELL_10G_PHY is not set ++# CONFIG_MARVELL_88Q2XXX_PHY is not set ++# CONFIG_MARVELL_88X2222_PHY is not set ++# CONFIG_MAXLINEAR_GPHY is not set ++# CONFIG_MEDIATEK_GE_PHY is not set ++CONFIG_MICREL_PHY=y ++# CONFIG_MICROCHIP_T1S_PHY is not set ++CONFIG_MICROCHIP_PHY=y ++# CONFIG_MICROCHIP_T1_PHY is not set ++# CONFIG_MICROSEMI_PHY is not set ++# CONFIG_MOTORCOMM_PHY is not set ++# CONFIG_NATIONAL_PHY is not set ++# CONFIG_NXP_CBTX_PHY is not set ++# CONFIG_NXP_C45_TJA11XX_PHY is not set ++# CONFIG_NXP_TJA11XX_PHY is not set ++# CONFIG_NCN26000_PHY is not set ++# CONFIG_AT803X_PHY is not set ++# CONFIG_QCA83XX_PHY is not set ++# CONFIG_QCA808X_PHY is not set ++# CONFIG_QCA807X_PHY is not set ++# CONFIG_QSEMI_PHY is not set ++# CONFIG_REALTEK_PHY is not set ++# CONFIG_RENESAS_PHY is not set ++# CONFIG_ROCKCHIP_PHY is not set ++CONFIG_SMSC_PHY=y ++# CONFIG_STE10XP is not set ++# CONFIG_TERANETICS_PHY is not set ++# CONFIG_DP83822_PHY is not set ++# CONFIG_DP83TC811_PHY is not set ++# CONFIG_DP83848_PHY is not set ++# CONFIG_DP83867_PHY is not set ++# CONFIG_DP83869_PHY is not set ++# CONFIG_DP83TD510_PHY is not set ++# CONFIG_DP83TG720_PHY is not set ++# CONFIG_VITESSE_PHY is not set ++# CONFIG_XILINX_GMII2RGMII is not set ++# CONFIG_MICREL_KS8995MA is not set ++# CONFIG_PSE_CONTROLLER is not set ++CONFIG_MDIO_DEVICE=y ++CONFIG_MDIO_BUS=y ++CONFIG_FWNODE_MDIO=y ++CONFIG_OF_MDIO=y ++CONFIG_MDIO_DEVRES=y ++# CONFIG_MDIO_BITBANG is not set ++CONFIG_MDIO_BCM_UNIMAC=y ++# CONFIG_MDIO_HISI_FEMAC is not set ++# CONFIG_MDIO_MVUSB is not set ++# CONFIG_MDIO_MSCC_MIIM is not set ++# CONFIG_MDIO_OCTEON is not set ++# CONFIG_MDIO_IPQ4019 is not set ++# CONFIG_MDIO_IPQ8064 is not set ++# CONFIG_MDIO_THUNDER is not set ++ ++# ++# MDIO Multiplexers ++# ++# CONFIG_MDIO_BUS_MUX_GPIO is not set ++# CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set ++# CONFIG_MDIO_BUS_MUX_MMIOREG is not set ++ ++# ++# PCS device drivers ++# ++# CONFIG_PCS_XPCS is not set ++# end of PCS device drivers ++ ++# CONFIG_PPP is not set ++# CONFIG_SLIP is not set ++CONFIG_USB_NET_DRIVERS=y ++# CONFIG_USB_CATC is not set ++# CONFIG_USB_KAWETH is not set ++# CONFIG_USB_PEGASUS is not set ++# CONFIG_USB_RTL8150 is not set ++# CONFIG_USB_RTL8152 is not set ++CONFIG_USB_LAN78XX=y ++CONFIG_USB_USBNET=y ++# CONFIG_USB_NET_AX8817X is not set ++# CONFIG_USB_NET_AX88179_178A is not set ++# CONFIG_USB_NET_CDCETHER is not set ++# CONFIG_USB_NET_CDC_EEM is not set ++# CONFIG_USB_NET_CDC_NCM is not set ++# CONFIG_USB_NET_HUAWEI_CDC_NCM is not set ++# CONFIG_USB_NET_CDC_MBIM is not set ++# CONFIG_USB_NET_DM9601 is not set ++# CONFIG_USB_NET_SR9700 is not set ++# CONFIG_USB_NET_SR9800 is not set ++# CONFIG_USB_NET_SMSC75XX is not set ++CONFIG_USB_NET_SMSC95XX=y ++# CONFIG_USB_NET_GL620A is not set ++# CONFIG_USB_NET_NET1080 is not set ++# CONFIG_USB_NET_PLUSB is not set ++# CONFIG_USB_NET_MCS7830 is not set ++# CONFIG_USB_NET_RNDIS_HOST is not set ++# CONFIG_USB_NET_CDC_SUBSET is not set ++# CONFIG_USB_NET_ZAURUS is not set ++# CONFIG_USB_NET_CX82310_ETH is not set ++# CONFIG_USB_NET_KALMIA is not set ++# CONFIG_USB_NET_QMI_WWAN is not set ++# CONFIG_USB_NET_INT51X1 is not set ++# CONFIG_USB_IPHETH is not set ++# CONFIG_USB_SIERRA_NET is not set ++# CONFIG_USB_NET_CH9200 is not set ++# CONFIG_USB_NET_AQC111 is not set ++CONFIG_WLAN=y ++CONFIG_WLAN_VENDOR_ADMTEK=y ++CONFIG_WLAN_VENDOR_ATH=y ++# CONFIG_ATH_DEBUG is not set ++# CONFIG_ATH5K_PCI is not set ++CONFIG_WLAN_VENDOR_ATMEL=y ++CONFIG_WLAN_VENDOR_BROADCOM=y ++CONFIG_WLAN_VENDOR_INTEL=y ++CONFIG_WLAN_VENDOR_INTERSIL=y ++CONFIG_WLAN_VENDOR_MARVELL=y ++CONFIG_WLAN_VENDOR_MEDIATEK=y ++CONFIG_WLAN_VENDOR_MICROCHIP=y ++CONFIG_WLAN_VENDOR_PURELIFI=y ++CONFIG_WLAN_VENDOR_RALINK=y ++CONFIG_WLAN_VENDOR_REALTEK=y ++CONFIG_WLAN_VENDOR_RSI=y ++CONFIG_WLAN_VENDOR_SILABS=y ++CONFIG_WLAN_VENDOR_ST=y ++CONFIG_WLAN_VENDOR_TI=y ++CONFIG_WLAN_VENDOR_ZYDAS=y ++CONFIG_WLAN_VENDOR_QUANTENNA=y ++# CONFIG_WAN is not set ++ ++# ++# Wireless WAN ++# ++# CONFIG_WWAN is not set ++# end of Wireless WAN ++ ++# CONFIG_VMXNET3 is not set ++# CONFIG_NETDEVSIM is not set ++# CONFIG_NET_FAILOVER is not set ++# CONFIG_ISDN is not set ++ ++# ++# Input device support ++# ++CONFIG_INPUT=y ++CONFIG_INPUT_LEDS=y ++# CONFIG_INPUT_FF_MEMLESS is not set ++# CONFIG_INPUT_SPARSEKMAP is not set ++# CONFIG_INPUT_MATRIXKMAP is not set ++ ++# ++# Userland interfaces ++# ++CONFIG_INPUT_MOUSEDEV=y ++# CONFIG_INPUT_MOUSEDEV_PSAUX is not set ++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 ++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 ++# CONFIG_INPUT_JOYDEV is not set ++CONFIG_INPUT_EVDEV=y ++# CONFIG_INPUT_EVBUG is not set ++ ++# ++# Input Device Drivers ++# ++CONFIG_INPUT_KEYBOARD=y ++# CONFIG_KEYBOARD_ADP5588 is not set ++# CONFIG_KEYBOARD_ADP5589 is not set ++# CONFIG_KEYBOARD_ATKBD is not set ++# CONFIG_KEYBOARD_QT1050 is not set ++# CONFIG_KEYBOARD_QT1070 is not set ++# CONFIG_KEYBOARD_QT2160 is not set ++# CONFIG_KEYBOARD_DLINK_DIR685 is not set ++# CONFIG_KEYBOARD_LKKBD is not set ++# CONFIG_KEYBOARD_GPIO is not set ++# CONFIG_KEYBOARD_GPIO_POLLED is not set ++# CONFIG_KEYBOARD_TCA6416 is not set ++# CONFIG_KEYBOARD_TCA8418 is not set ++# CONFIG_KEYBOARD_MATRIX is not set ++# CONFIG_KEYBOARD_LM8323 is not set ++# CONFIG_KEYBOARD_LM8333 is not set ++# CONFIG_KEYBOARD_MAX7359 is not set ++# CONFIG_KEYBOARD_MPR121 is not set ++# CONFIG_KEYBOARD_NEWTON is not set ++# CONFIG_KEYBOARD_OPENCORES is not set ++# CONFIG_KEYBOARD_PINEPHONE is not set ++# CONFIG_KEYBOARD_SAMSUNG is not set ++# CONFIG_KEYBOARD_STOWAWAY is not set ++# CONFIG_KEYBOARD_SUNKBD is not set ++# CONFIG_KEYBOARD_STMPE is not set ++# CONFIG_KEYBOARD_OMAP4 is not set ++# CONFIG_KEYBOARD_TM2_TOUCHKEY is not set ++# CONFIG_KEYBOARD_XTKBD is not set ++# CONFIG_KEYBOARD_CAP11XX is not set ++# CONFIG_KEYBOARD_BCM is not set ++# CONFIG_KEYBOARD_CYPRESS_SF is not set ++# CONFIG_INPUT_MOUSE is not set ++CONFIG_INPUT_JOYSTICK=y ++# CONFIG_JOYSTICK_ANALOG is not set ++# CONFIG_JOYSTICK_A3D is not set ++# CONFIG_JOYSTICK_ADI is not set ++# CONFIG_JOYSTICK_COBRA is not set ++# CONFIG_JOYSTICK_GF2K is not set ++# CONFIG_JOYSTICK_GRIP is not set ++# CONFIG_JOYSTICK_GRIP_MP is not set ++# CONFIG_JOYSTICK_GUILLEMOT is not set ++# CONFIG_JOYSTICK_INTERACT is not set ++# CONFIG_JOYSTICK_SIDEWINDER is not set ++# CONFIG_JOYSTICK_TMDC is not set ++# CONFIG_JOYSTICK_IFORCE is not set ++# CONFIG_JOYSTICK_WARRIOR is not set ++# CONFIG_JOYSTICK_MAGELLAN is not set ++# CONFIG_JOYSTICK_SPACEORB is not set ++# CONFIG_JOYSTICK_SPACEBALL is not set ++# CONFIG_JOYSTICK_STINGER is not set ++# CONFIG_JOYSTICK_TWIDJOY is not set ++# CONFIG_JOYSTICK_ZHENHUA is not set ++# CONFIG_JOYSTICK_AS5011 is not set ++# CONFIG_JOYSTICK_JOYDUMP is not set ++# CONFIG_JOYSTICK_XPAD is not set ++# CONFIG_JOYSTICK_PSXPAD_SPI is not set ++# CONFIG_JOYSTICK_PXRC is not set ++# CONFIG_JOYSTICK_QWIIC is not set ++# CONFIG_JOYSTICK_FSIA6B is not set ++# CONFIG_JOYSTICK_SENSEHAT is not set ++# CONFIG_JOYSTICK_SEESAW is not set ++# CONFIG_INPUT_TABLET is not set ++CONFIG_INPUT_TOUCHSCREEN=y ++# CONFIG_TOUCHSCREEN_ADS7846 is not set ++# CONFIG_TOUCHSCREEN_AD7877 is not set ++# CONFIG_TOUCHSCREEN_AD7879 is not set ++# CONFIG_TOUCHSCREEN_AR1021_I2C is not set ++# CONFIG_TOUCHSCREEN_ATMEL_MXT is not set ++# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set ++# CONFIG_TOUCHSCREEN_BU21013 is not set ++# CONFIG_TOUCHSCREEN_BU21029 is not set ++# CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set ++# CONFIG_TOUCHSCREEN_CY8CTMA140 is not set ++# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set ++# CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set ++# CONFIG_TOUCHSCREEN_CYTTSP5 is not set ++# CONFIG_TOUCHSCREEN_DYNAPRO is not set ++# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set ++# CONFIG_TOUCHSCREEN_EETI is not set ++# CONFIG_TOUCHSCREEN_EGALAX is not set ++# CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set ++# CONFIG_TOUCHSCREEN_EXC3000 is not set ++# CONFIG_TOUCHSCREEN_FUJITSU is not set ++# CONFIG_TOUCHSCREEN_GOODIX is not set ++# CONFIG_TOUCHSCREEN_GOODIX_BERLIN_I2C is not set ++# CONFIG_TOUCHSCREEN_GOODIX_BERLIN_SPI is not set ++# CONFIG_TOUCHSCREEN_HIDEEP is not set ++# CONFIG_TOUCHSCREEN_HYCON_HY46XX is not set ++# CONFIG_TOUCHSCREEN_HYNITRON_CSTXXX is not set ++# CONFIG_TOUCHSCREEN_ILI210X is not set ++# CONFIG_TOUCHSCREEN_ILITEK is not set ++# CONFIG_TOUCHSCREEN_S6SY761 is not set ++# CONFIG_TOUCHSCREEN_GUNZE is not set ++# CONFIG_TOUCHSCREEN_EKTF2127 is not set ++# CONFIG_TOUCHSCREEN_ELAN is not set ++# CONFIG_TOUCHSCREEN_ELO is not set ++# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set ++# CONFIG_TOUCHSCREEN_WACOM_I2C is not set ++# CONFIG_TOUCHSCREEN_MAX11801 is not set ++# CONFIG_TOUCHSCREEN_MMS114 is not set ++# CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set ++# CONFIG_TOUCHSCREEN_MSG2638 is not set ++# CONFIG_TOUCHSCREEN_MTOUCH is not set ++# CONFIG_TOUCHSCREEN_NOVATEK_NVT_TS is not set ++# CONFIG_TOUCHSCREEN_IMAGIS is not set ++# CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set ++# CONFIG_TOUCHSCREEN_INEXIO is not set ++# CONFIG_TOUCHSCREEN_PENMOUNT is not set ++# CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set ++# CONFIG_TOUCHSCREEN_RASPBERRYPI_FW is not set ++# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set ++# CONFIG_TOUCHSCREEN_TOUCHWIN is not set ++# CONFIG_TOUCHSCREEN_PIXCIR is not set ++# CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set ++# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set ++# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set ++# CONFIG_TOUCHSCREEN_TSC_SERIO is not set ++# CONFIG_TOUCHSCREEN_TSC2004 is not set ++# CONFIG_TOUCHSCREEN_TSC2005 is not set ++# CONFIG_TOUCHSCREEN_TSC2007 is not set ++# CONFIG_TOUCHSCREEN_RM_TS is not set ++# CONFIG_TOUCHSCREEN_SILEAD is not set ++# CONFIG_TOUCHSCREEN_SIS_I2C is not set ++# CONFIG_TOUCHSCREEN_ST1232 is not set ++# CONFIG_TOUCHSCREEN_STMFTS is not set ++# CONFIG_TOUCHSCREEN_STMPE is not set ++# CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set ++# CONFIG_TOUCHSCREEN_SX8654 is not set ++# CONFIG_TOUCHSCREEN_TPS6507X is not set ++# CONFIG_TOUCHSCREEN_ZET6223 is not set ++# CONFIG_TOUCHSCREEN_ZFORCE is not set ++# CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set ++# CONFIG_TOUCHSCREEN_IQS5XX is not set ++# CONFIG_TOUCHSCREEN_IQS7211 is not set ++# CONFIG_TOUCHSCREEN_ZINITIX is not set ++# CONFIG_TOUCHSCREEN_HIMAX_HX83112B is not set ++CONFIG_INPUT_MISC=y ++# CONFIG_INPUT_AD714X is not set ++# CONFIG_INPUT_ATMEL_CAPTOUCH is not set ++# CONFIG_INPUT_BMA150 is not set ++# CONFIG_INPUT_E3X0_BUTTON is not set ++# CONFIG_INPUT_MMA8450 is not set ++# CONFIG_INPUT_GPIO_BEEPER is not set ++# CONFIG_INPUT_GPIO_DECODER is not set ++# CONFIG_INPUT_GPIO_VIBRA is not set ++# CONFIG_INPUT_ATI_REMOTE2 is not set ++# CONFIG_INPUT_KEYSPAN_REMOTE is not set ++# CONFIG_INPUT_KXTJ9 is not set ++# CONFIG_INPUT_POWERMATE is not set ++# CONFIG_INPUT_YEALINK is not set ++# CONFIG_INPUT_CM109 is not set ++# CONFIG_INPUT_REGULATOR_HAPTIC is not set ++# CONFIG_INPUT_UINPUT is not set ++# CONFIG_INPUT_PCF8574 is not set ++# CONFIG_INPUT_PWM_BEEPER is not set ++# CONFIG_INPUT_PWM_VIBRA is not set ++# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set ++# CONFIG_INPUT_DA7280_HAPTICS is not set ++# CONFIG_INPUT_ADXL34X is not set ++# CONFIG_INPUT_IMS_PCU is not set ++# CONFIG_INPUT_IQS269A is not set ++# CONFIG_INPUT_IQS626A is not set ++# CONFIG_INPUT_IQS7222 is not set ++# CONFIG_INPUT_CMA3000 is not set ++# CONFIG_INPUT_DRV260X_HAPTICS is not set ++# CONFIG_INPUT_DRV2665_HAPTICS is not set ++# CONFIG_INPUT_DRV2667_HAPTICS is not set ++# CONFIG_RMI4_CORE is not set ++ ++# ++# Hardware I/O ports ++# ++# CONFIG_SERIO is not set ++# CONFIG_GAMEPORT is not set ++# end of Hardware I/O ports ++# end of Input device support ++ ++# ++# Character devices ++# ++CONFIG_BRCM_CHAR_DRIVERS=y ++CONFIG_BCM2708_VCMEM=y ++CONFIG_BCM_VCIO=y ++CONFIG_TTY=y ++CONFIG_VT=y ++CONFIG_CONSOLE_TRANSLATIONS=y ++CONFIG_VT_CONSOLE=y ++CONFIG_VT_HW_CONSOLE_BINDING=y ++CONFIG_UNIX98_PTYS=y ++# CONFIG_LEGACY_PTYS is not set ++CONFIG_LEGACY_TIOCSTI=y ++CONFIG_LDISC_AUTOLOAD=y ++ ++# ++# Serial drivers ++# ++CONFIG_SERIAL_EARLYCON=y ++CONFIG_SERIAL_8250=y ++# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set ++CONFIG_SERIAL_8250_16550A_VARIANTS=y ++# CONFIG_SERIAL_8250_FINTEK is not set ++CONFIG_SERIAL_8250_CONSOLE=y ++# CONFIG_SERIAL_8250_DMA is not set ++CONFIG_SERIAL_8250_PCILIB=y ++CONFIG_SERIAL_8250_PCI=y ++CONFIG_SERIAL_8250_EXAR=y ++CONFIG_SERIAL_8250_NR_UARTS=5 ++CONFIG_SERIAL_8250_RUNTIME_UARTS=0 ++CONFIG_SERIAL_8250_EXTENDED=y ++# CONFIG_SERIAL_8250_MANY_PORTS is not set ++# CONFIG_SERIAL_8250_PCI1XXXX is not set ++CONFIG_SERIAL_8250_SHARE_IRQ=y ++# CONFIG_SERIAL_8250_DETECT_IRQ is not set ++# CONFIG_SERIAL_8250_RSA is not set ++CONFIG_SERIAL_8250_BCM2835AUX=y ++CONFIG_SERIAL_8250_FSL=y ++# CONFIG_SERIAL_8250_DW is not set ++# CONFIG_SERIAL_8250_RT288X is not set ++CONFIG_SERIAL_8250_PERICOM=y ++CONFIG_SERIAL_8250_BCM7271=y ++CONFIG_SERIAL_OF_PLATFORM=y ++ ++# ++# Non-8250 serial port support ++# ++# CONFIG_SERIAL_AMBA_PL010 is not set ++CONFIG_SERIAL_AMBA_PL011=y ++CONFIG_SERIAL_AMBA_PL011_CONSOLE=y ++# CONFIG_SERIAL_EARLYCON_SEMIHOST is not set ++# CONFIG_SERIAL_KGDB_NMI is not set ++# CONFIG_SERIAL_MAX3100 is not set ++# CONFIG_SERIAL_MAX310X is not set ++# CONFIG_SERIAL_UARTLITE is not set ++CONFIG_SERIAL_CORE=y ++CONFIG_SERIAL_CORE_CONSOLE=y ++CONFIG_CONSOLE_POLL=y ++# CONFIG_SERIAL_JSM is not set ++# CONFIG_SERIAL_SIFIVE is not set ++# CONFIG_SERIAL_SCCNXP is not set ++# CONFIG_SERIAL_SC16IS7XX is not set ++# CONFIG_SERIAL_ALTERA_JTAGUART is not set ++# CONFIG_SERIAL_ALTERA_UART is not set ++# CONFIG_SERIAL_XILINX_PS_UART is not set ++# CONFIG_SERIAL_ARC is not set ++# CONFIG_SERIAL_RP2 is not set ++# CONFIG_SERIAL_FSL_LPUART is not set ++# CONFIG_SERIAL_FSL_LINFLEXUART is not set ++# CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set ++# CONFIG_SERIAL_SPRD is not set ++# CONFIG_SERIAL_RPI_FW is not set ++# end of Serial drivers ++ ++CONFIG_SERIAL_MCTRL_GPIO=y ++# CONFIG_SERIAL_NONSTANDARD is not set ++# CONFIG_N_GSM is not set ++# CONFIG_NOZOMI is not set ++# CONFIG_NULL_TTY is not set ++# CONFIG_HVC_DCC is not set ++CONFIG_SERIAL_DEV_BUS=y ++CONFIG_SERIAL_DEV_CTRL_TTYPORT=y ++CONFIG_TTY_PRINTK=y ++CONFIG_TTY_PRINTK_LEVEL=6 ++# CONFIG_VIRTIO_CONSOLE is not set ++# CONFIG_IPMI_HANDLER is not set ++CONFIG_HW_RANDOM=y ++# CONFIG_HW_RANDOM_TIMERIOMEM is not set ++# CONFIG_HW_RANDOM_BA431 is not set ++CONFIG_HW_RANDOM_BCM2835=y ++CONFIG_HW_RANDOM_IPROC_RNG200=y ++# CONFIG_HW_RANDOM_CCTRNG is not set ++# CONFIG_HW_RANDOM_XIPHERA is not set ++CONFIG_HW_RANDOM_ARM_SMCCC_TRNG=y ++# CONFIG_HW_RANDOM_CN10K is not set ++# CONFIG_APPLICOM is not set ++CONFIG_DEVMEM=y ++CONFIG_DEVPORT=y ++# CONFIG_TCG_TPM is not set ++# CONFIG_XILLYBUS is not set ++# CONFIG_XILLYUSB is not set ++# CONFIG_RASPBERRYPI_GPIOMEM is not set ++# end of Character devices ++ ++# ++# I2C support ++# ++CONFIG_I2C=y ++CONFIG_I2C_BOARDINFO=y ++# CONFIG_I2C_CHARDEV is not set ++# CONFIG_I2C_MUX is not set ++CONFIG_I2C_HELPER_AUTO=y ++ ++# ++# I2C Hardware Bus support ++# ++ ++# ++# PC SMBus host controller drivers ++# ++# CONFIG_I2C_BCM2708 is not set ++# CONFIG_I2C_ALI1535 is not set ++# CONFIG_I2C_ALI1563 is not set ++# CONFIG_I2C_ALI15X3 is not set ++# CONFIG_I2C_AMD756 is not set ++# CONFIG_I2C_AMD8111 is not set ++# CONFIG_I2C_I801 is not set ++# CONFIG_I2C_ISCH is not set ++# CONFIG_I2C_PIIX4 is not set ++# CONFIG_I2C_NFORCE2 is not set ++# CONFIG_I2C_NVIDIA_GPU is not set ++# CONFIG_I2C_SIS5595 is not set ++# CONFIG_I2C_SIS630 is not set ++# CONFIG_I2C_SIS96X is not set ++# CONFIG_I2C_VIA is not set ++# CONFIG_I2C_VIAPRO is not set ++ ++# ++# I2C system bus drivers (mostly embedded / system-on-chip) ++# ++# CONFIG_I2C_BCM2835 is not set ++# CONFIG_I2C_BRCMSTB is not set ++# CONFIG_I2C_CADENCE is not set ++# CONFIG_I2C_CBUS_GPIO is not set ++# CONFIG_I2C_DESIGNWARE_CORE is not set ++# CONFIG_I2C_EMEV2 is not set ++# CONFIG_I2C_GPIO is not set ++# CONFIG_I2C_HISI is not set ++# CONFIG_I2C_NOMADIK is not set ++# CONFIG_I2C_OCORES is not set ++# CONFIG_I2C_PCA_PLATFORM is not set ++# CONFIG_I2C_RK3X is not set ++# CONFIG_I2C_SIMTEC is not set ++# CONFIG_I2C_THUNDERX is not set ++# CONFIG_I2C_XILINX is not set ++ ++# ++# External I2C/SMBus adapter drivers ++# ++# CONFIG_I2C_DIOLAN_U2C is not set ++# CONFIG_I2C_CP2615 is not set ++# CONFIG_I2C_PCI1XXXX is not set ++# CONFIG_I2C_ROBOTFUZZ_OSIF is not set ++# CONFIG_I2C_TAOS_EVM is not set ++# CONFIG_I2C_TINY_USB is not set ++ ++# ++# Other I2C/SMBus bus drivers ++# ++# CONFIG_I2C_VIRTIO is not set ++# end of I2C Hardware Bus support ++ ++# CONFIG_I2C_STUB is not set ++# CONFIG_I2C_SLAVE is not set ++# CONFIG_I2C_DEBUG_CORE is not set ++# CONFIG_I2C_DEBUG_ALGO is not set ++# CONFIG_I2C_DEBUG_BUS is not set ++# end of I2C support ++ ++# CONFIG_I3C is not set ++CONFIG_SPI=y ++# CONFIG_SPI_DEBUG is not set ++CONFIG_SPI_MASTER=y ++CONFIG_SPI_MEM=y ++ ++# ++# SPI Master Controller Drivers ++# ++# CONFIG_SPI_ALTERA is not set ++# CONFIG_SPI_AXI_SPI_ENGINE is not set ++# CONFIG_SPI_BCM2835 is not set ++# CONFIG_SPI_BCM2835AUX is not set ++# CONFIG_SPI_BCM_QSPI is not set ++# CONFIG_SPI_BITBANG is not set ++# CONFIG_SPI_CADENCE is not set ++# CONFIG_SPI_CADENCE_QUADSPI is not set ++# CONFIG_SPI_CADENCE_XSPI is not set ++# CONFIG_SPI_CH341 is not set ++# CONFIG_SPI_DESIGNWARE is not set ++# CONFIG_SPI_GPIO is not set ++# CONFIG_SPI_FSL_SPI is not set ++# CONFIG_SPI_MICROCHIP_CORE is not set ++# CONFIG_SPI_MICROCHIP_CORE_QSPI is not set ++# CONFIG_SPI_OC_TINY is not set ++# CONFIG_SPI_PCI1XXXX is not set ++# CONFIG_SPI_PL022 is not set ++# CONFIG_SPI_RP2040_GPIO_BRIDGE is not set ++# CONFIG_SPI_SC18IS602 is not set ++# CONFIG_SPI_SIFIVE is not set ++# CONFIG_SPI_SN_F_OSPI is not set ++# CONFIG_SPI_MXIC is not set ++# CONFIG_SPI_THUNDERX is not set ++# CONFIG_SPI_XCOMM is not set ++# CONFIG_SPI_XILINX is not set ++# CONFIG_SPI_ZYNQMP_GQSPI is not set ++# CONFIG_SPI_AMD is not set ++ ++# ++# SPI Multiplexer support ++# ++# CONFIG_SPI_MUX is not set ++ ++# ++# SPI Protocol Masters ++# ++# CONFIG_SPI_SPIDEV is not set ++# CONFIG_SPI_LOOPBACK_TEST is not set ++# CONFIG_SPI_TLE62X0 is not set ++CONFIG_SPI_SLAVE=y ++# CONFIG_SPI_SLAVE_TIME is not set ++# CONFIG_SPI_SLAVE_SYSTEM_CONTROL is not set ++CONFIG_SPI_DYNAMIC=y ++# CONFIG_SPMI is not set ++# CONFIG_HSI is not set ++CONFIG_PPS=y ++# CONFIG_PPS_DEBUG is not set ++ ++# ++# PPS clients support ++# ++# CONFIG_PPS_CLIENT_KTIMER is not set ++# CONFIG_PPS_CLIENT_LDISC is not set ++# CONFIG_PPS_CLIENT_GPIO is not set ++ ++# ++# PPS generators support ++# ++ ++# ++# PTP clock support ++# ++CONFIG_PTP_1588_CLOCK=y ++CONFIG_PTP_1588_CLOCK_OPTIONAL=y ++# CONFIG_DP83640_PHY is not set ++# CONFIG_PTP_1588_CLOCK_INES is not set ++CONFIG_PTP_1588_CLOCK_KVM=y ++# CONFIG_PTP_1588_CLOCK_IDT82P33 is not set ++# CONFIG_PTP_1588_CLOCK_IDTCM is not set ++# CONFIG_PTP_1588_CLOCK_FC3W is not set ++# CONFIG_PTP_1588_CLOCK_MOCK is not set ++# end of PTP clock support ++ ++CONFIG_PINCTRL=y ++CONFIG_PINMUX=y ++CONFIG_PINCONF=y ++CONFIG_GENERIC_PINCONF=y ++# CONFIG_DEBUG_PINCTRL is not set ++# CONFIG_PINCTRL_AW9523 is not set ++# CONFIG_PINCTRL_CY8C95X0 is not set ++# CONFIG_PINCTRL_MCP23S08 is not set ++# CONFIG_PINCTRL_MICROCHIP_SGPIO is not set ++# CONFIG_PINCTRL_OCELOT is not set ++# CONFIG_PINCTRL_SINGLE is not set ++# CONFIG_PINCTRL_STMFX is not set ++# CONFIG_PINCTRL_SX150X is not set ++CONFIG_PINCTRL_RP1=y ++CONFIG_PINCTRL_BCM2712=y ++CONFIG_PINCTRL_BCM2835=y ++ ++# ++# Renesas pinctrl drivers ++# ++# end of Renesas pinctrl drivers ++ ++CONFIG_GPIOLIB=y ++CONFIG_GPIOLIB_FASTPATH_LIMIT=512 ++CONFIG_OF_GPIO=y ++CONFIG_GPIOLIB_IRQCHIP=y ++# CONFIG_DEBUG_GPIO is not set ++CONFIG_GPIO_SYSFS=y ++CONFIG_GPIO_CDEV=y ++CONFIG_GPIO_CDEV_V1=y ++CONFIG_GPIO_GENERIC=y ++ ++# ++# Memory mapped GPIO drivers ++# ++# CONFIG_GPIO_74XX_MMIO is not set ++# CONFIG_GPIO_ALTERA is not set ++CONFIG_GPIO_RASPBERRYPI_EXP=y ++CONFIG_GPIO_BCM_VIRT=y ++CONFIG_GPIO_BRCMSTB=y ++# CONFIG_GPIO_CADENCE is not set ++# CONFIG_GPIO_DWAPB is not set ++# CONFIG_GPIO_EXAR is not set ++# CONFIG_GPIO_FTGPIO010 is not set ++# CONFIG_GPIO_GENERIC_PLATFORM is not set ++# CONFIG_GPIO_GRGPIO is not set ++# CONFIG_GPIO_HISI is not set ++# CONFIG_GPIO_HLWD is not set ++# CONFIG_GPIO_LOGICVC is not set ++# CONFIG_GPIO_MB86S7X is not set ++# CONFIG_GPIO_PL061 is not set ++# CONFIG_GPIO_PWM is not set ++# CONFIG_GPIO_SIFIVE is not set ++# CONFIG_GPIO_SYSCON is not set ++# CONFIG_GPIO_XGENE is not set ++# CONFIG_GPIO_XILINX is not set ++# CONFIG_GPIO_AMD_FCH is not set ++# end of Memory mapped GPIO drivers ++ ++# ++# I2C GPIO expanders ++# ++# CONFIG_GPIO_ADNP is not set ++# CONFIG_GPIO_FXL6408 is not set ++# CONFIG_GPIO_DS4520 is not set ++# CONFIG_GPIO_GW_PLD is not set ++# CONFIG_GPIO_MAX7300 is not set ++# CONFIG_GPIO_MAX732X is not set ++# CONFIG_GPIO_PCA953X is not set ++# CONFIG_GPIO_PCA9570 is not set ++# CONFIG_GPIO_PCF857X is not set ++# CONFIG_GPIO_TPIC2810 is not set ++# end of I2C GPIO expanders ++ ++# ++# MFD GPIO expanders ++# ++# CONFIG_GPIO_FSM is not set ++CONFIG_GPIO_STMPE=y ++# end of MFD GPIO expanders ++ ++# ++# PCI GPIO expanders ++# ++# CONFIG_GPIO_BT8XX is not set ++# CONFIG_GPIO_PCI_IDIO_16 is not set ++# CONFIG_GPIO_PCIE_IDIO_24 is not set ++# CONFIG_GPIO_RDC321X is not set ++# end of PCI GPIO expanders ++ ++# ++# SPI GPIO expanders ++# ++# CONFIG_GPIO_74X164 is not set ++# CONFIG_GPIO_MAX3191X is not set ++# CONFIG_GPIO_MAX7301 is not set ++# CONFIG_GPIO_MC33880 is not set ++# CONFIG_GPIO_PISOSR is not set ++# CONFIG_GPIO_XRA1403 is not set ++# end of SPI GPIO expanders ++ ++# ++# USB GPIO expanders ++# ++# end of USB GPIO expanders ++ ++# ++# Virtual GPIO drivers ++# ++# CONFIG_GPIO_AGGREGATOR is not set ++# CONFIG_GPIO_LATCH is not set ++# CONFIG_GPIO_MOCKUP is not set ++# CONFIG_GPIO_SIM is not set ++# end of Virtual GPIO drivers ++ ++# ++# GPIO Debugging utilities ++# ++# CONFIG_GPIO_SLOPPY_LOGIC_ANALYZER is not set ++# CONFIG_GPIO_VIRTUSER is not set ++# end of GPIO Debugging utilities ++ ++# CONFIG_W1 is not set ++CONFIG_POWER_RESET=y ++# CONFIG_POWER_RESET_BRCMSTB is not set ++CONFIG_POWER_RESET_GPIO=y ++# CONFIG_POWER_RESET_GPIO_RESTART is not set ++# CONFIG_POWER_RESET_LTC2952 is not set ++# CONFIG_POWER_RESET_REGULATOR is not set ++# CONFIG_POWER_RESET_RESTART is not set ++# CONFIG_POWER_RESET_XGENE is not set ++# CONFIG_POWER_RESET_SYSCON is not set ++# CONFIG_POWER_RESET_SYSCON_POWEROFF is not set ++# CONFIG_SYSCON_REBOOT_MODE is not set ++# CONFIG_NVMEM_REBOOT_MODE is not set ++# CONFIG_POWER_SEQUENCING is not set ++CONFIG_POWER_SUPPLY=y ++# CONFIG_POWER_SUPPLY_DEBUG is not set ++CONFIG_POWER_SUPPLY_HWMON=y ++# CONFIG_RPI_POE_POWER is not set ++# CONFIG_IP5XXX_POWER is not set ++# CONFIG_TEST_POWER is not set ++# CONFIG_CHARGER_ADP5061 is not set ++# CONFIG_BATTERY_CW2015 is not set ++# CONFIG_BATTERY_DS2780 is not set ++# CONFIG_BATTERY_DS2781 is not set ++# CONFIG_BATTERY_DS2782 is not set ++# CONFIG_BATTERY_SAMSUNG_SDI is not set ++# CONFIG_BATTERY_SBS is not set ++# CONFIG_CHARGER_SBS is not set ++# CONFIG_BATTERY_BQ27XXX is not set ++# CONFIG_BATTERY_MAX17042 is not set ++# CONFIG_BATTERY_MAX1720X is not set ++# CONFIG_CHARGER_ISP1704 is not set ++# CONFIG_CHARGER_MAX8903 is not set ++# CONFIG_CHARGER_LP8727 is not set ++# CONFIG_CHARGER_GPIO is not set ++# CONFIG_CHARGER_MANAGER is not set ++# CONFIG_CHARGER_LT3651 is not set ++# CONFIG_CHARGER_LTC4162L is not set ++# CONFIG_CHARGER_DETECTOR_MAX14656 is not set ++# CONFIG_CHARGER_MAX77976 is not set ++# CONFIG_CHARGER_BQ2415X is not set ++# CONFIG_CHARGER_BQ24190 is not set ++# CONFIG_CHARGER_BQ24257 is not set ++# CONFIG_CHARGER_BQ24735 is not set ++# CONFIG_CHARGER_BQ2515X is not set ++# CONFIG_CHARGER_BQ25890 is not set ++# CONFIG_CHARGER_BQ25980 is not set ++# CONFIG_CHARGER_BQ256XX is not set ++# CONFIG_CHARGER_SMB347 is not set ++# CONFIG_BATTERY_GAUGE_LTC2941 is not set ++# CONFIG_BATTERY_GOLDFISH is not set ++# CONFIG_BATTERY_RT5033 is not set ++# CONFIG_CHARGER_RT9455 is not set ++# CONFIG_CHARGER_RT9467 is not set ++# CONFIG_CHARGER_RT9471 is not set ++# CONFIG_CHARGER_UCS1002 is not set ++# CONFIG_CHARGER_BD99954 is not set ++# CONFIG_BATTERY_UG3105 is not set ++# CONFIG_FUEL_GAUGE_MM8013 is not set ++CONFIG_HWMON=y ++# CONFIG_HWMON_DEBUG_CHIP is not set ++ ++# ++# Native drivers ++# ++# CONFIG_SENSORS_AD7314 is not set ++# CONFIG_SENSORS_AD7414 is not set ++# CONFIG_SENSORS_AD7418 is not set ++# CONFIG_SENSORS_ADM1025 is not set ++# CONFIG_SENSORS_ADM1026 is not set ++# CONFIG_SENSORS_ADM1029 is not set ++# CONFIG_SENSORS_ADM1031 is not set ++# CONFIG_SENSORS_ADM1177 is not set ++# CONFIG_SENSORS_ADM9240 is not set ++# CONFIG_SENSORS_ADT7310 is not set ++# CONFIG_SENSORS_ADT7410 is not set ++# CONFIG_SENSORS_ADT7411 is not set ++# CONFIG_SENSORS_ADT7462 is not set ++# CONFIG_SENSORS_ADT7470 is not set ++# CONFIG_SENSORS_ADT7475 is not set ++# CONFIG_SENSORS_AHT10 is not set ++# CONFIG_SENSORS_AQUACOMPUTER_D5NEXT is not set ++# CONFIG_SENSORS_AS370 is not set ++# CONFIG_SENSORS_ASC7621 is not set ++# CONFIG_SENSORS_ASUS_ROG_RYUJIN is not set ++# CONFIG_SENSORS_AXI_FAN_CONTROL is not set ++# CONFIG_SENSORS_ATXP1 is not set ++# CONFIG_SENSORS_CHIPCAP2 is not set ++# CONFIG_SENSORS_CORSAIR_CPRO is not set ++# CONFIG_SENSORS_CORSAIR_PSU is not set ++# CONFIG_SENSORS_DS620 is not set ++# CONFIG_SENSORS_DS1621 is not set ++# CONFIG_SENSORS_I5K_AMB is not set ++# CONFIG_SENSORS_F71805F is not set ++# CONFIG_SENSORS_F71882FG is not set ++# CONFIG_SENSORS_F75375S is not set ++# CONFIG_SENSORS_FTSTEUTATES is not set ++# CONFIG_SENSORS_GIGABYTE_WATERFORCE is not set ++# CONFIG_SENSORS_GL518SM is not set ++# CONFIG_SENSORS_GL520SM is not set ++# CONFIG_SENSORS_G760A is not set ++# CONFIG_SENSORS_G762 is not set ++# CONFIG_SENSORS_GPIO_FAN is not set ++# CONFIG_SENSORS_HIH6130 is not set ++# CONFIG_SENSORS_HS3001 is not set ++# CONFIG_SENSORS_IT87 is not set ++# CONFIG_SENSORS_JC42 is not set ++# CONFIG_SENSORS_POWERZ is not set ++# CONFIG_SENSORS_POWR1220 is not set ++# CONFIG_SENSORS_LINEAGE is not set ++# CONFIG_SENSORS_LTC2945 is not set ++# CONFIG_SENSORS_LTC2947_I2C is not set ++# CONFIG_SENSORS_LTC2947_SPI is not set ++# CONFIG_SENSORS_LTC2990 is not set ++# CONFIG_SENSORS_LTC2991 is not set ++# CONFIG_SENSORS_LTC2992 is not set ++# CONFIG_SENSORS_LTC4151 is not set ++# CONFIG_SENSORS_LTC4215 is not set ++# CONFIG_SENSORS_LTC4222 is not set ++# CONFIG_SENSORS_LTC4245 is not set ++# CONFIG_SENSORS_LTC4260 is not set ++# CONFIG_SENSORS_LTC4261 is not set ++# CONFIG_SENSORS_LTC4282 is not set ++# CONFIG_SENSORS_MAX1111 is not set ++# CONFIG_SENSORS_MAX127 is not set ++# CONFIG_SENSORS_MAX16065 is not set ++# CONFIG_SENSORS_MAX1619 is not set ++# CONFIG_SENSORS_MAX1668 is not set ++# CONFIG_SENSORS_MAX197 is not set ++# CONFIG_SENSORS_MAX31722 is not set ++# CONFIG_SENSORS_MAX31730 is not set ++# CONFIG_SENSORS_MAX31760 is not set ++# CONFIG_MAX31827 is not set ++# CONFIG_SENSORS_MAX6620 is not set ++# CONFIG_SENSORS_MAX6621 is not set ++# CONFIG_SENSORS_MAX6639 is not set ++# CONFIG_SENSORS_MAX6650 is not set ++# CONFIG_SENSORS_MAX6697 is not set ++# CONFIG_SENSORS_MAX31790 is not set ++# CONFIG_SENSORS_MC34VR500 is not set ++# CONFIG_SENSORS_MCP3021 is not set ++# CONFIG_SENSORS_TC654 is not set ++# CONFIG_SENSORS_TPS23861 is not set ++# CONFIG_SENSORS_MR75203 is not set ++# CONFIG_SENSORS_ADCXX is not set ++# CONFIG_SENSORS_LM63 is not set ++# CONFIG_SENSORS_LM70 is not set ++# CONFIG_SENSORS_LM73 is not set ++# CONFIG_SENSORS_LM75 is not set ++# CONFIG_SENSORS_LM77 is not set ++# CONFIG_SENSORS_LM78 is not set ++# CONFIG_SENSORS_LM80 is not set ++# CONFIG_SENSORS_LM83 is not set ++# CONFIG_SENSORS_LM85 is not set ++# CONFIG_SENSORS_LM87 is not set ++# CONFIG_SENSORS_LM90 is not set ++# CONFIG_SENSORS_LM92 is not set ++# CONFIG_SENSORS_LM93 is not set ++# CONFIG_SENSORS_LM95234 is not set ++# CONFIG_SENSORS_LM95241 is not set ++# CONFIG_SENSORS_LM95245 is not set ++# CONFIG_SENSORS_PC87360 is not set ++# CONFIG_SENSORS_PC87427 is not set ++# CONFIG_SENSORS_NCT6683 is not set ++# CONFIG_SENSORS_NCT6775 is not set ++# CONFIG_SENSORS_NCT6775_I2C is not set ++# CONFIG_SENSORS_NCT7802 is not set ++# CONFIG_SENSORS_NCT7904 is not set ++# CONFIG_SENSORS_NPCM7XX is not set ++# CONFIG_SENSORS_NZXT_KRAKEN2 is not set ++# CONFIG_SENSORS_NZXT_KRAKEN3 is not set ++# CONFIG_SENSORS_NZXT_SMART2 is not set ++# CONFIG_SENSORS_OCC_P8_I2C is not set ++# CONFIG_SENSORS_PCF8591 is not set ++# CONFIG_PMBUS is not set ++# CONFIG_SENSORS_PT5161L is not set ++# CONFIG_SENSORS_PWM_FAN is not set ++# CONFIG_SENSORS_RASPBERRYPI_HWMON is not set ++# CONFIG_SENSORS_SBTSI is not set ++# CONFIG_SENSORS_SBRMI is not set ++# CONFIG_SENSORS_SHT15 is not set ++# CONFIG_SENSORS_SHT21 is not set ++# CONFIG_SENSORS_SHT3x is not set ++# CONFIG_SENSORS_SHT4x is not set ++# CONFIG_SENSORS_SHTC1 is not set ++# CONFIG_SENSORS_SIS5595 is not set ++# CONFIG_SENSORS_DME1737 is not set ++# CONFIG_SENSORS_EMC1403 is not set ++# CONFIG_SENSORS_EMC2103 is not set ++# CONFIG_SENSORS_EMC2305 is not set ++# CONFIG_SENSORS_EMC6W201 is not set ++# CONFIG_SENSORS_SMSC47M1 is not set ++# CONFIG_SENSORS_SMSC47M192 is not set ++# CONFIG_SENSORS_SMSC47B397 is not set ++# CONFIG_SENSORS_SCH5627 is not set ++# CONFIG_SENSORS_SCH5636 is not set ++# CONFIG_SENSORS_STTS751 is not set ++# CONFIG_SENSORS_ADC128D818 is not set ++# CONFIG_SENSORS_ADS7828 is not set ++# CONFIG_SENSORS_ADS7871 is not set ++# CONFIG_SENSORS_AMC6821 is not set ++# CONFIG_SENSORS_INA209 is not set ++# CONFIG_SENSORS_INA2XX is not set ++# CONFIG_SENSORS_INA238 is not set ++# CONFIG_SENSORS_INA3221 is not set ++# CONFIG_SENSORS_SPD5118 is not set ++# CONFIG_SENSORS_TC74 is not set ++# CONFIG_SENSORS_THMC50 is not set ++# CONFIG_SENSORS_TMP102 is not set ++# CONFIG_SENSORS_TMP103 is not set ++# CONFIG_SENSORS_TMP108 is not set ++# CONFIG_SENSORS_TMP401 is not set ++# CONFIG_SENSORS_TMP421 is not set ++# CONFIG_SENSORS_TMP464 is not set ++# CONFIG_SENSORS_TMP513 is not set ++# CONFIG_SENSORS_VIA686A is not set ++# CONFIG_SENSORS_VT1211 is not set ++# CONFIG_SENSORS_VT8231 is not set ++# CONFIG_SENSORS_W83773G is not set ++# CONFIG_SENSORS_W83781D is not set ++# CONFIG_SENSORS_W83791D is not set ++# CONFIG_SENSORS_W83792D is not set ++# CONFIG_SENSORS_W83793 is not set ++# CONFIG_SENSORS_W83795 is not set ++# CONFIG_SENSORS_W83L785TS is not set ++# CONFIG_SENSORS_W83L786NG is not set ++# CONFIG_SENSORS_W83627HF is not set ++# CONFIG_SENSORS_W83627EHF is not set ++# CONFIG_SENSORS_RP1_ADC is not set ++CONFIG_THERMAL=y ++# CONFIG_THERMAL_NETLINK is not set ++# CONFIG_THERMAL_STATISTICS is not set ++# CONFIG_THERMAL_DEBUGFS is not set ++# CONFIG_THERMAL_CORE_TESTING is not set ++CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 ++CONFIG_THERMAL_HWMON=y ++CONFIG_THERMAL_OF=y ++CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y ++# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set ++# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set ++# CONFIG_THERMAL_GOV_FAIR_SHARE is not set ++CONFIG_THERMAL_GOV_STEP_WISE=y ++# CONFIG_THERMAL_GOV_BANG_BANG is not set ++# CONFIG_THERMAL_GOV_USER_SPACE is not set ++# CONFIG_CPU_THERMAL is not set ++# CONFIG_THERMAL_EMULATION is not set ++# CONFIG_THERMAL_MMIO is not set ++ ++# ++# Broadcom thermal drivers ++# ++CONFIG_BCM2711_THERMAL=y ++CONFIG_BCM2835_THERMAL=y ++# CONFIG_BRCMSTB_THERMAL is not set ++# end of Broadcom thermal drivers ++ ++CONFIG_WATCHDOG=y ++CONFIG_WATCHDOG_CORE=y ++# CONFIG_WATCHDOG_NOWAYOUT is not set ++CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y ++CONFIG_WATCHDOG_OPEN_TIMEOUT=0 ++CONFIG_WATCHDOG_SYSFS=y ++# CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT is not set ++ ++# ++# Watchdog Pretimeout Governors ++# ++# CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set ++ ++# ++# Watchdog Device Drivers ++# ++# CONFIG_SOFT_WATCHDOG is not set ++# CONFIG_GPIO_WATCHDOG is not set ++# CONFIG_XILINX_WATCHDOG is not set ++# CONFIG_XILINX_WINDOW_WATCHDOG is not set ++# CONFIG_ZIIRAVE_WATCHDOG is not set ++# CONFIG_ARM_SP805_WATCHDOG is not set ++# CONFIG_ARM_SBSA_WATCHDOG is not set ++# CONFIG_CADENCE_WATCHDOG is not set ++# CONFIG_DW_WATCHDOG is not set ++# CONFIG_MAX63XX_WATCHDOG is not set ++# CONFIG_ARM_SMC_WATCHDOG is not set ++# CONFIG_ALIM7101_WDT is not set ++# CONFIG_I6300ESB_WDT is not set ++# CONFIG_HP_WATCHDOG is not set ++CONFIG_BCM2835_WDT=y ++# CONFIG_BCM7038_WDT is not set ++# CONFIG_MEN_A21_WDT is not set ++ ++# ++# PCI-based Watchdog Cards ++# ++# CONFIG_PCIPCWATCHDOG is not set ++# CONFIG_WDTPCI is not set ++ ++# ++# USB-based Watchdog Cards ++# ++# CONFIG_USBPCWATCHDOG is not set ++CONFIG_SSB_POSSIBLE=y ++# CONFIG_SSB is not set ++CONFIG_BCMA_POSSIBLE=y ++# CONFIG_BCMA is not set ++ ++# ++# Multifunction device drivers ++# ++CONFIG_MFD_CORE=y ++# CONFIG_MFD_ADP5585 is not set ++# CONFIG_MFD_ACT8945A is not set ++# CONFIG_MFD_AS3711 is not set ++# CONFIG_MFD_SMPRO is not set ++# CONFIG_MFD_AS3722 is not set ++# CONFIG_PMIC_ADP5520 is not set ++# CONFIG_MFD_AAT2870_CORE is not set ++# CONFIG_MFD_ATMEL_FLEXCOM is not set ++# CONFIG_MFD_ATMEL_HLCDC is not set ++# CONFIG_MFD_BCM590XX is not set ++# CONFIG_MFD_BD9571MWV is not set ++# CONFIG_MFD_AXP20X_I2C is not set ++# CONFIG_MFD_CS42L43_I2C is not set ++# CONFIG_MFD_MADERA is not set ++# CONFIG_MFD_MAX5970 is not set ++# CONFIG_PMIC_DA903X is not set ++# CONFIG_MFD_DA9052_SPI is not set ++# CONFIG_MFD_DA9052_I2C is not set ++# CONFIG_MFD_DA9055 is not set ++# CONFIG_MFD_DA9062 is not set ++# CONFIG_MFD_DA9063 is not set ++# CONFIG_MFD_DA9150 is not set ++# CONFIG_MFD_DLN2 is not set ++# CONFIG_MFD_GATEWORKS_GSC is not set ++# CONFIG_MFD_MC13XXX_SPI is not set ++# CONFIG_MFD_MC13XXX_I2C is not set ++# CONFIG_MFD_MP2629 is not set ++# CONFIG_MFD_HI6421_PMIC is not set ++# CONFIG_LPC_ICH is not set ++# CONFIG_LPC_SCH is not set ++# CONFIG_MFD_IQS62X is not set ++# CONFIG_MFD_JANZ_CMODIO is not set ++# CONFIG_MFD_KEMPLD is not set ++# CONFIG_MFD_88PM800 is not set ++# CONFIG_MFD_88PM805 is not set ++# CONFIG_MFD_88PM860X is not set ++# CONFIG_MFD_88PM886_PMIC is not set ++# CONFIG_MFD_MAX14577 is not set ++# CONFIG_MFD_MAX77541 is not set ++# CONFIG_MFD_MAX77620 is not set ++# CONFIG_MFD_MAX77650 is not set ++# CONFIG_MFD_MAX77686 is not set ++# CONFIG_MFD_MAX77693 is not set ++# CONFIG_MFD_MAX77714 is not set ++# CONFIG_MFD_MAX77843 is not set ++# CONFIG_MFD_MAX8907 is not set ++# CONFIG_MFD_MAX8925 is not set ++# CONFIG_MFD_MAX8997 is not set ++# CONFIG_MFD_MAX8998 is not set ++# CONFIG_MFD_MT6360 is not set ++# CONFIG_MFD_MT6370 is not set ++# CONFIG_MFD_MT6397 is not set ++# CONFIG_MFD_MENF21BMC is not set ++# CONFIG_MFD_OCELOT is not set ++# CONFIG_EZX_PCAP is not set ++# CONFIG_MFD_CPCAP is not set ++# CONFIG_MFD_VIPERBOARD is not set ++# CONFIG_MFD_NTXEC is not set ++# CONFIG_MFD_RETU is not set ++# CONFIG_MFD_PCF50633 is not set ++# CONFIG_MFD_SY7636A is not set ++# CONFIG_MFD_RASPBERRYPI_POE_HAT is not set ++# CONFIG_MFD_RDC321X is not set ++# CONFIG_MFD_RT4831 is not set ++# CONFIG_MFD_RT5033 is not set ++# CONFIG_MFD_RT5120 is not set ++# CONFIG_MFD_RC5T583 is not set ++# CONFIG_MFD_RK8XX_I2C is not set ++# CONFIG_MFD_RK8XX_SPI is not set ++# CONFIG_MFD_RN5T618 is not set ++# CONFIG_MFD_SEC_CORE is not set ++# CONFIG_MFD_SI476X_CORE is not set ++# CONFIG_MFD_SM501 is not set ++# CONFIG_MFD_SKY81452 is not set ++CONFIG_MFD_STMPE=y ++ ++# ++# STMicroelectronics STMPE Interface Drivers ++# ++CONFIG_STMPE_I2C=y ++CONFIG_STMPE_SPI=y ++# end of STMicroelectronics STMPE Interface Drivers ++ ++CONFIG_MFD_SYSCON=y ++# CONFIG_MFD_LP3943 is not set ++# CONFIG_MFD_LP8788 is not set ++# CONFIG_MFD_TI_LMU is not set ++# CONFIG_MFD_PALMAS is not set ++# CONFIG_TPS6105X is not set ++# CONFIG_TPS65010 is not set ++# CONFIG_TPS6507X is not set ++# CONFIG_MFD_TPS65086 is not set ++# CONFIG_MFD_TPS65090 is not set ++# CONFIG_MFD_TPS65217 is not set ++# CONFIG_MFD_TI_LP873X is not set ++# CONFIG_MFD_TI_LP87565 is not set ++# CONFIG_MFD_TPS65218 is not set ++# CONFIG_MFD_TPS65219 is not set ++# CONFIG_MFD_TPS6586X is not set ++# CONFIG_MFD_TPS65910 is not set ++# CONFIG_MFD_TPS65912_I2C is not set ++# CONFIG_MFD_TPS65912_SPI is not set ++# CONFIG_MFD_TPS6594_I2C is not set ++# CONFIG_MFD_TPS6594_SPI is not set ++# CONFIG_TWL4030_CORE is not set ++# CONFIG_TWL6040_CORE is not set ++# CONFIG_MFD_WL1273_CORE is not set ++# CONFIG_MFD_LM3533 is not set ++# CONFIG_MFD_TC3589X is not set ++# CONFIG_MFD_TQMX86 is not set ++# CONFIG_MFD_VX855 is not set ++# CONFIG_MFD_LOCHNAGAR is not set ++# CONFIG_MFD_ARIZONA_I2C is not set ++# CONFIG_MFD_ARIZONA_SPI is not set ++# CONFIG_MFD_WM8400 is not set ++# CONFIG_MFD_WM831X_I2C is not set ++# CONFIG_MFD_WM831X_SPI is not set ++# CONFIG_MFD_WM8350_I2C is not set ++# CONFIG_MFD_WM8994 is not set ++# CONFIG_MFD_ROHM_BD718XX is not set ++# CONFIG_MFD_ROHM_BD71828 is not set ++# CONFIG_MFD_ROHM_BD957XMUF is not set ++# CONFIG_MFD_ROHM_BD96801 is not set ++# CONFIG_MFD_STPMIC1 is not set ++# CONFIG_MFD_STMFX is not set ++# CONFIG_MFD_ATC260X_I2C is not set ++# CONFIG_MFD_QCOM_PM8008 is not set ++# CONFIG_MFD_CS40L50_I2C is not set ++# CONFIG_MFD_CS40L50_SPI is not set ++# CONFIG_RAVE_SP_CORE is not set ++# CONFIG_MFD_INTEL_M10_BMC_SPI is not set ++CONFIG_MFD_RP1=y ++# CONFIG_MFD_RSMU_I2C is not set ++# CONFIG_MFD_RSMU_SPI is not set ++# end of Multifunction device drivers ++ ++CONFIG_REGULATOR=y ++# CONFIG_REGULATOR_DEBUG is not set ++CONFIG_REGULATOR_FIXED_VOLTAGE=y ++# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set ++# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set ++# CONFIG_REGULATOR_NETLINK_EVENTS is not set ++# CONFIG_REGULATOR_88PG86X is not set ++# CONFIG_REGULATOR_ACT8865 is not set ++# CONFIG_REGULATOR_AD5398 is not set ++# CONFIG_REGULATOR_AW37503 is not set ++# CONFIG_REGULATOR_DA9121 is not set ++# CONFIG_REGULATOR_DA9210 is not set ++# CONFIG_REGULATOR_DA9211 is not set ++# CONFIG_REGULATOR_FAN53555 is not set ++# CONFIG_REGULATOR_FAN53880 is not set ++CONFIG_REGULATOR_GPIO=y ++# CONFIG_REGULATOR_ISL9305 is not set ++# CONFIG_REGULATOR_ISL6271A is not set ++# CONFIG_REGULATOR_LP3971 is not set ++# CONFIG_REGULATOR_LP3972 is not set ++# CONFIG_REGULATOR_LP872X is not set ++# CONFIG_REGULATOR_LP8755 is not set ++# CONFIG_REGULATOR_LTC3589 is not set ++# CONFIG_REGULATOR_LTC3676 is not set ++# CONFIG_REGULATOR_MAX1586 is not set ++# CONFIG_REGULATOR_MAX77503 is not set ++# CONFIG_REGULATOR_MAX77857 is not set ++# CONFIG_REGULATOR_MAX8649 is not set ++# CONFIG_REGULATOR_MAX8660 is not set ++# CONFIG_REGULATOR_MAX8893 is not set ++# CONFIG_REGULATOR_MAX8952 is not set ++# CONFIG_REGULATOR_MAX8973 is not set ++# CONFIG_REGULATOR_MAX20086 is not set ++# CONFIG_REGULATOR_MAX20411 is not set ++# CONFIG_REGULATOR_MAX77826 is not set ++# CONFIG_REGULATOR_MCP16502 is not set ++# CONFIG_REGULATOR_MP5416 is not set ++# CONFIG_REGULATOR_MP8859 is not set ++# CONFIG_REGULATOR_MP886X is not set ++# CONFIG_REGULATOR_MPQ7920 is not set ++# CONFIG_REGULATOR_MT6311 is not set ++# CONFIG_REGULATOR_PCA9450 is not set ++# CONFIG_REGULATOR_PF8X00 is not set ++# CONFIG_REGULATOR_PFUZE100 is not set ++# CONFIG_REGULATOR_PV88060 is not set ++# CONFIG_REGULATOR_PV88080 is not set ++# CONFIG_REGULATOR_PV88090 is not set ++# CONFIG_REGULATOR_PWM is not set ++# CONFIG_REGULATOR_RAA215300 is not set ++# CONFIG_REGULATOR_RT4801 is not set ++# CONFIG_REGULATOR_RT4803 is not set ++# CONFIG_REGULATOR_RT5190A is not set ++# CONFIG_REGULATOR_RT5739 is not set ++# CONFIG_REGULATOR_RT5759 is not set ++# CONFIG_REGULATOR_RT6160 is not set ++# CONFIG_REGULATOR_RT6190 is not set ++# CONFIG_REGULATOR_RT6245 is not set ++# CONFIG_REGULATOR_RTQ2134 is not set ++# CONFIG_REGULATOR_RTMV20 is not set ++# CONFIG_REGULATOR_RTQ6752 is not set ++# CONFIG_REGULATOR_RTQ2208 is not set ++# CONFIG_REGULATOR_SLG51000 is not set ++# CONFIG_REGULATOR_SY8106A is not set ++# CONFIG_REGULATOR_SY8824X is not set ++# CONFIG_REGULATOR_SY8827N is not set ++# CONFIG_REGULATOR_TPS51632 is not set ++# CONFIG_REGULATOR_TPS62360 is not set ++# CONFIG_REGULATOR_TPS6286X is not set ++# CONFIG_REGULATOR_TPS6287X is not set ++# CONFIG_REGULATOR_TPS65023 is not set ++# CONFIG_REGULATOR_TPS6507X is not set ++# CONFIG_REGULATOR_TPS65132 is not set ++# CONFIG_REGULATOR_TPS6524X is not set ++# CONFIG_REGULATOR_VCTRL is not set ++CONFIG_RC_CORE=y ++CONFIG_BPF_LIRC_MODE2=y ++CONFIG_LIRC=y ++CONFIG_RC_MAP=y ++CONFIG_RC_DECODERS=y ++# CONFIG_IR_IMON_DECODER is not set ++# CONFIG_IR_JVC_DECODER is not set ++# CONFIG_IR_MCE_KBD_DECODER is not set ++# CONFIG_IR_NEC_DECODER is not set ++# CONFIG_IR_RC5_DECODER is not set ++# CONFIG_IR_RC6_DECODER is not set ++# CONFIG_IR_RCMM_DECODER is not set ++# CONFIG_IR_SANYO_DECODER is not set ++# CONFIG_IR_SHARP_DECODER is not set ++# CONFIG_IR_SONY_DECODER is not set ++# CONFIG_IR_XMP_DECODER is not set ++CONFIG_RC_DEVICES=y ++# CONFIG_IR_GPIO_CIR is not set ++# CONFIG_IR_GPIO_TX is not set ++# CONFIG_IR_HIX5HD2 is not set ++# CONFIG_IR_IGORPLUGUSB is not set ++# CONFIG_IR_IGUANA is not set ++# CONFIG_IR_IMON is not set ++# CONFIG_IR_IMON_RAW is not set ++# CONFIG_IR_MCEUSB is not set ++# CONFIG_IR_PWM_TX is not set ++# CONFIG_IR_REDRAT3 is not set ++# CONFIG_IR_SERIAL is not set ++# CONFIG_IR_SPI is not set ++# CONFIG_IR_STREAMZAP is not set ++# CONFIG_IR_TOY is not set ++# CONFIG_IR_TTUSBIR is not set ++# CONFIG_RC_ATI_REMOTE is not set ++# CONFIG_RC_LOOPBACK is not set ++# CONFIG_RC_XBOX_DVD is not set ++ ++# ++# CEC support ++# ++CONFIG_MEDIA_CEC_SUPPORT=y ++# CONFIG_CEC_CH7322 is not set ++# CONFIG_CEC_GPIO is not set ++# CONFIG_USB_PULSE8_CEC is not set ++# CONFIG_USB_RAINSHADOW_CEC is not set ++# end of CEC support ++ ++# CONFIG_MEDIA_SUPPORT is not set ++ ++# ++# Graphics support ++# ++CONFIG_APERTURE_HELPERS=y ++CONFIG_VIDEO=y ++CONFIG_AUXDISPLAY=y ++# CONFIG_HD44780 is not set ++# CONFIG_LCD2S is not set ++# CONFIG_CHARLCD_BL_OFF is not set ++# CONFIG_CHARLCD_BL_ON is not set ++CONFIG_CHARLCD_BL_FLASH=y ++# CONFIG_IMG_ASCII_LCD is not set ++# CONFIG_HT16K33 is not set ++# CONFIG_MAX6959 is not set ++# CONFIG_SEG_LED_GPIO is not set ++# CONFIG_DRM is not set ++ ++# ++# Frame buffer Devices ++# ++CONFIG_FB=y ++CONFIG_FB_BCM2708=y ++# CONFIG_FB_CIRRUS is not set ++# CONFIG_FB_PM2 is not set ++# CONFIG_FB_CYBER2000 is not set ++# CONFIG_FB_ASILIANT is not set ++# CONFIG_FB_IMSTT is not set ++# CONFIG_FB_EFI is not set ++# CONFIG_FB_OPENCORES is not set ++# CONFIG_FB_S1D13XXX is not set ++# CONFIG_FB_NVIDIA is not set ++# CONFIG_FB_RIVA is not set ++# CONFIG_FB_I740 is not set ++# CONFIG_FB_MATROX is not set ++# CONFIG_FB_RADEON is not set ++# CONFIG_FB_ATY128 is not set ++# CONFIG_FB_ATY is not set ++# CONFIG_FB_S3 is not set ++# CONFIG_FB_SAVAGE is not set ++# CONFIG_FB_SIS is not set ++# CONFIG_FB_NEOMAGIC is not set ++# CONFIG_FB_KYRO is not set ++# CONFIG_FB_3DFX is not set ++# CONFIG_FB_VOODOO1 is not set ++# CONFIG_FB_VT8623 is not set ++# CONFIG_FB_TRIDENT is not set ++# CONFIG_FB_ARK is not set ++# CONFIG_FB_PM3 is not set ++# CONFIG_FB_CARMINE is not set ++# CONFIG_FB_SMSCUFX is not set ++# CONFIG_FB_UDL is not set ++# CONFIG_FB_IBM_GXT4500 is not set ++# CONFIG_FB_VIRTUAL is not set ++# CONFIG_FB_METRONOME is not set ++# CONFIG_FB_MB862XX is not set ++CONFIG_FB_SIMPLE=y ++# CONFIG_FB_SSD1307 is not set ++# CONFIG_FB_SM712 is not set ++# CONFIG_FB_RPISENSE is not set ++CONFIG_FB_CORE=y ++CONFIG_FB_NOTIFY=y ++# CONFIG_FIRMWARE_EDID is not set ++CONFIG_FB_DEVICE=y ++CONFIG_FB_CFB_FILLRECT=y ++CONFIG_FB_CFB_COPYAREA=y ++CONFIG_FB_CFB_IMAGEBLIT=y ++# CONFIG_FB_FOREIGN_ENDIAN is not set ++CONFIG_FB_IOMEM_FOPS=y ++CONFIG_FB_IOMEM_HELPERS=y ++# CONFIG_FB_MODE_HELPERS is not set ++# CONFIG_FB_TILEBLITTING is not set ++# end of Frame buffer Devices ++ ++# ++# Backlight & LCD device support ++# ++# CONFIG_LCD_CLASS_DEVICE is not set ++# CONFIG_BACKLIGHT_CLASS_DEVICE is not set ++# end of Backlight & LCD device support ++ ++# ++# Console display driver support ++# ++CONFIG_DUMMY_CONSOLE=y ++CONFIG_DUMMY_CONSOLE_COLUMNS=80 ++CONFIG_DUMMY_CONSOLE_ROWS=25 ++CONFIG_FRAMEBUFFER_CONSOLE=y ++# CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION is not set ++CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y ++CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y ++# CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set ++# end of Console display driver support ++ ++CONFIG_LOGO=y ++# CONFIG_LOGO_LINUX_MONO is not set ++# CONFIG_LOGO_LINUX_VGA16 is not set ++CONFIG_LOGO_LINUX_CLUT224=y ++# end of Graphics support ++ ++CONFIG_SOUND=y ++# CONFIG_SND is not set ++CONFIG_HID_SUPPORT=y ++CONFIG_HID=y ++CONFIG_HID_BATTERY_STRENGTH=y ++CONFIG_HIDRAW=y ++# CONFIG_UHID is not set ++CONFIG_HID_GENERIC=y ++ ++# ++# Special HID drivers ++# ++# CONFIG_HID_A4TECH is not set ++# CONFIG_HID_ACCUTOUCH is not set ++# CONFIG_HID_ACRUX is not set ++# CONFIG_HID_APPLE is not set ++# CONFIG_HID_APPLEIR is not set ++# CONFIG_HID_ASUS is not set ++# CONFIG_HID_AUREAL is not set ++# CONFIG_HID_BELKIN is not set ++# CONFIG_HID_BETOP_FF is not set ++# CONFIG_HID_BIGBEN_FF is not set ++# CONFIG_HID_CHERRY is not set ++# CONFIG_HID_CHICONY is not set ++# CONFIG_HID_CORSAIR is not set ++# CONFIG_HID_COUGAR is not set ++# CONFIG_HID_MACALLY is not set ++# CONFIG_HID_CMEDIA is not set ++# CONFIG_HID_CP2112 is not set ++# CONFIG_HID_CREATIVE_SB0540 is not set ++# CONFIG_HID_CYPRESS is not set ++# CONFIG_HID_DRAGONRISE is not set ++# CONFIG_HID_EMS_FF is not set ++# CONFIG_HID_ELAN is not set ++# CONFIG_HID_ELECOM is not set ++# CONFIG_HID_ELO is not set ++# CONFIG_HID_EVISION is not set ++# CONFIG_HID_EZKEY is not set ++# CONFIG_HID_FT260 is not set ++# CONFIG_HID_GEMBIRD is not set ++# CONFIG_HID_GFRM is not set ++# CONFIG_HID_GLORIOUS is not set ++# CONFIG_HID_HOLTEK is not set ++# CONFIG_HID_GOODIX_SPI is not set ++# CONFIG_HID_GOOGLE_STADIA_FF is not set ++# CONFIG_HID_VIVALDI is not set ++# CONFIG_HID_GT683R is not set ++# CONFIG_HID_KEYTOUCH is not set ++# CONFIG_HID_KYE is not set ++# CONFIG_HID_UCLOGIC is not set ++# CONFIG_HID_WALTOP is not set ++# CONFIG_HID_VIEWSONIC is not set ++# CONFIG_HID_VRC2 is not set ++# CONFIG_HID_XIAOMI is not set ++# CONFIG_HID_GYRATION is not set ++# CONFIG_HID_ICADE is not set ++# CONFIG_HID_ITE is not set ++# CONFIG_HID_JABRA is not set ++# CONFIG_HID_TWINHAN is not set ++# CONFIG_HID_KENSINGTON is not set ++# CONFIG_HID_LCPOWER is not set ++# CONFIG_HID_LED is not set ++# CONFIG_HID_LENOVO is not set ++# CONFIG_HID_LETSKETCH is not set ++# CONFIG_HID_LOGITECH is not set ++# CONFIG_HID_MAGICMOUSE is not set ++# CONFIG_HID_MALTRON is not set ++# CONFIG_HID_MAYFLASH is not set ++# CONFIG_HID_MEGAWORLD_FF is not set ++# CONFIG_HID_REDRAGON is not set ++# CONFIG_HID_MICROSOFT is not set ++# CONFIG_HID_MONTEREY is not set ++# CONFIG_HID_MULTITOUCH is not set ++# CONFIG_HID_NINTENDO is not set ++# CONFIG_HID_NTI is not set ++# CONFIG_HID_NTRIG is not set ++# CONFIG_HID_ORTEK is not set ++# CONFIG_HID_PANTHERLORD is not set ++# CONFIG_HID_PENMOUNT is not set ++# CONFIG_HID_PETALYNX is not set ++# CONFIG_HID_PICOLCD is not set ++# CONFIG_HID_PLANTRONICS is not set ++# CONFIG_HID_PXRC is not set ++# CONFIG_HID_RAZER is not set ++# CONFIG_HID_PRIMAX is not set ++# CONFIG_HID_RETRODE is not set ++# CONFIG_HID_ROCCAT is not set ++# CONFIG_HID_SAITEK is not set ++# CONFIG_HID_SAMSUNG is not set ++# CONFIG_HID_SEMITEK is not set ++# CONFIG_HID_SIGMAMICRO is not set ++# CONFIG_HID_SONY is not set ++# CONFIG_HID_SPEEDLINK is not set ++# CONFIG_HID_STEAM is not set ++# CONFIG_HID_STEELSERIES is not set ++# CONFIG_HID_SUNPLUS is not set ++# CONFIG_HID_RMI is not set ++# CONFIG_HID_GREENASIA is not set ++# CONFIG_HID_SMARTJOYPLUS is not set ++# CONFIG_HID_TIVO is not set ++# CONFIG_HID_TOPSEED is not set ++# CONFIG_HID_TOPRE is not set ++# CONFIG_HID_THINGM is not set ++# CONFIG_HID_THRUSTMASTER is not set ++# CONFIG_HID_UDRAW_PS3 is not set ++# CONFIG_HID_U2FZERO is not set ++# CONFIG_HID_UNIVERSAL_PIDFF is not set ++# CONFIG_HID_WACOM is not set ++# CONFIG_HID_WIIMOTE is not set ++# CONFIG_HID_WINWING is not set ++# CONFIG_HID_XINMO is not set ++# CONFIG_HID_ZEROPLUS is not set ++# CONFIG_HID_ZYDACRON is not set ++# CONFIG_HID_SENSOR_HUB is not set ++# CONFIG_HID_ALPS is not set ++# CONFIG_HID_MCP2200 is not set ++# CONFIG_HID_MCP2221 is not set ++# end of Special HID drivers ++ ++# ++# HID-BPF support ++# ++# CONFIG_HID_BPF is not set ++# end of HID-BPF support ++ ++# ++# USB HID support ++# ++CONFIG_USB_HID=y ++CONFIG_HID_PID=y ++CONFIG_USB_HIDDEV=y ++# end of USB HID support ++ ++CONFIG_I2C_HID=y ++# CONFIG_I2C_HID_OF is not set ++# CONFIG_I2C_HID_OF_ELAN is not set ++# CONFIG_I2C_HID_OF_GOODIX is not set ++CONFIG_USB_OHCI_LITTLE_ENDIAN=y ++CONFIG_USB_SUPPORT=y ++CONFIG_USB_COMMON=y ++# CONFIG_USB_LED_TRIG is not set ++# CONFIG_USB_ULPI_BUS is not set ++# CONFIG_USB_CONN_GPIO is not set ++CONFIG_USB_ARCH_HAS_HCD=y ++CONFIG_USB=y ++CONFIG_USB_PCI=y ++# CONFIG_USB_PCI_AMD is not set ++CONFIG_USB_ANNOUNCE_NEW_DEVICES=y ++ ++# ++# Miscellaneous USB options ++# ++CONFIG_USB_DEFAULT_PERSIST=y ++# CONFIG_USB_FEW_INIT_RETRIES is not set ++# CONFIG_USB_DYNAMIC_MINORS is not set ++# CONFIG_USB_OTG is not set ++# CONFIG_USB_OTG_PRODUCTLIST is not set ++# CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set ++# CONFIG_USB_LEDS_TRIGGER_USBPORT is not set ++CONFIG_USB_AUTOSUSPEND_DELAY=2 ++CONFIG_USB_DEFAULT_AUTHORIZATION_MODE=1 ++# CONFIG_USB_MON is not set ++ ++# ++# USB Host Controller Drivers ++# ++# CONFIG_USB_C67X00_HCD is not set ++CONFIG_USB_XHCI_HCD=y ++# CONFIG_USB_XHCI_DBGCAP is not set ++CONFIG_USB_XHCI_PCI=y ++# CONFIG_USB_XHCI_PCI_RENESAS is not set ++CONFIG_USB_XHCI_PLATFORM=y ++# CONFIG_USB_BRCMSTB is not set ++# CONFIG_USB_EHCI_HCD is not set ++# CONFIG_USB_OXU210HP_HCD is not set ++# CONFIG_USB_ISP116X_HCD is not set ++# CONFIG_USB_MAX3421_HCD is not set ++# CONFIG_USB_OHCI_HCD is not set ++# CONFIG_USB_UHCI_HCD is not set ++# CONFIG_USB_SL811_HCD is not set ++# CONFIG_USB_R8A66597_HCD is not set ++CONFIG_USB_DWCOTG=y ++# CONFIG_USB_HCD_TEST_MODE is not set ++ ++# ++# USB Device Class drivers ++# ++# CONFIG_USB_ACM is not set ++# CONFIG_USB_PRINTER is not set ++# CONFIG_USB_WDM is not set ++# CONFIG_USB_TMC is not set ++ ++# ++# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may ++# ++ ++# ++# also be needed; see USB_STORAGE Help for more info ++# ++CONFIG_USB_STORAGE=y ++# CONFIG_USB_STORAGE_DEBUG is not set ++# CONFIG_USB_STORAGE_REALTEK is not set ++# CONFIG_USB_STORAGE_DATAFAB is not set ++# CONFIG_USB_STORAGE_FREECOM is not set ++# CONFIG_USB_STORAGE_ISD200 is not set ++# CONFIG_USB_STORAGE_USBAT is not set ++# CONFIG_USB_STORAGE_SDDR09 is not set ++# CONFIG_USB_STORAGE_SDDR55 is not set ++# CONFIG_USB_STORAGE_JUMPSHOT is not set ++# CONFIG_USB_STORAGE_ALAUDA is not set ++# CONFIG_USB_STORAGE_ONETOUCH is not set ++# CONFIG_USB_STORAGE_KARMA is not set ++# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set ++# CONFIG_USB_STORAGE_ENE_UB6250 is not set ++CONFIG_USB_UAS=y ++ ++# ++# USB Imaging devices ++# ++# CONFIG_USB_MDC800 is not set ++# CONFIG_USB_MICROTEK is not set ++# CONFIG_USBIP_CORE is not set ++ ++# ++# USB dual-mode controller drivers ++# ++# CONFIG_USB_CDNS_SUPPORT is not set ++# CONFIG_USB_MUSB_HDRC is not set ++CONFIG_USB_DWC3=y ++# CONFIG_USB_DWC3_HOST is not set ++# CONFIG_USB_DWC3_GADGET is not set ++CONFIG_USB_DWC3_DUAL_ROLE=y ++ ++# ++# Platform Glue Driver Support ++# ++CONFIG_USB_DWC3_HAPS=y ++CONFIG_USB_DWC3_OF_SIMPLE=y ++CONFIG_USB_DWC2=y ++# CONFIG_USB_DWC2_HOST is not set ++ ++# ++# Gadget/Dual-role mode requires USB Gadget support to be enabled ++# ++# CONFIG_USB_DWC2_PERIPHERAL is not set ++CONFIG_USB_DWC2_DUAL_ROLE=y ++# CONFIG_USB_DWC2_PCI is not set ++# CONFIG_USB_DWC2_DEBUG is not set ++# CONFIG_USB_DWC2_TRACK_MISSED_SOFS is not set ++# CONFIG_USB_CHIPIDEA is not set ++# CONFIG_USB_ISP1760 is not set ++ ++# ++# USB port drivers ++# ++# CONFIG_USB_SERIAL is not set ++ ++# ++# USB Miscellaneous drivers ++# ++# CONFIG_USB_EMI62 is not set ++# CONFIG_USB_EMI26 is not set ++# CONFIG_USB_ADUTUX is not set ++# CONFIG_USB_SEVSEG is not set ++# CONFIG_USB_LEGOTOWER is not set ++# CONFIG_USB_LCD is not set ++# CONFIG_USB_CYPRESS_CY7C63 is not set ++# CONFIG_USB_CYTHERM is not set ++# CONFIG_USB_IDMOUSE is not set ++# CONFIG_USB_APPLEDISPLAY is not set ++# CONFIG_APPLE_MFI_FASTCHARGE is not set ++# CONFIG_USB_LD is not set ++# CONFIG_USB_TRANCEVIBRATOR is not set ++# CONFIG_USB_IOWARRIOR is not set ++# CONFIG_USB_TEST is not set ++# CONFIG_USB_EHSET_TEST_FIXTURE is not set ++# CONFIG_USB_ISIGHTFW is not set ++# CONFIG_USB_YUREX is not set ++# CONFIG_USB_EZUSB_FX2 is not set ++# CONFIG_USB_HUB_USB251XB is not set ++# CONFIG_USB_HSIC_USB3503 is not set ++# CONFIG_USB_HSIC_USB4604 is not set ++# CONFIG_USB_LINK_LAYER_TEST is not set ++# CONFIG_USB_CHAOSKEY is not set ++CONFIG_BRCM_USB_PINMAP=y ++# CONFIG_USB_ONBOARD_DEV is not set ++ ++# ++# USB Physical Layer drivers ++# ++CONFIG_USB_PHY=y ++CONFIG_NOP_USB_XCEIV=y ++# CONFIG_USB_GPIO_VBUS is not set ++# CONFIG_USB_ISP1301 is not set ++# CONFIG_USB_ULPI is not set ++# end of USB Physical Layer drivers ++ ++CONFIG_USB_GADGET=y ++# CONFIG_USB_GADGET_DEBUG is not set ++# CONFIG_USB_GADGET_DEBUG_FILES is not set ++# CONFIG_USB_GADGET_DEBUG_FS is not set ++CONFIG_USB_GADGET_VBUS_DRAW=2 ++CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 ++ ++# ++# USB Peripheral Controller ++# ++# CONFIG_USB_GR_UDC is not set ++# CONFIG_USB_R8A66597 is not set ++# CONFIG_USB_PXA27X is not set ++# CONFIG_USB_MV_UDC is not set ++# CONFIG_USB_MV_U3D is not set ++# CONFIG_USB_SNP_UDC_PLAT is not set ++# CONFIG_USB_M66592 is not set ++CONFIG_USB_BDC_UDC=y ++# CONFIG_USB_AMD5536UDC is not set ++# CONFIG_USB_NET2272 is not set ++# CONFIG_USB_NET2280 is not set ++# CONFIG_USB_GOKU is not set ++# CONFIG_USB_EG20T is not set ++# CONFIG_USB_GADGET_XILINX is not set ++# CONFIG_USB_MAX3420_UDC is not set ++# CONFIG_USB_DUMMY_HCD is not set ++# end of USB Peripheral Controller ++ ++# CONFIG_USB_CONFIGFS is not set ++ ++# ++# USB Gadget precomposed configurations ++# ++# CONFIG_USB_ZERO is not set ++# CONFIG_USB_ETH is not set ++# CONFIG_USB_G_NCM is not set ++# CONFIG_USB_GADGETFS is not set ++# CONFIG_USB_FUNCTIONFS is not set ++# CONFIG_USB_MASS_STORAGE is not set ++# CONFIG_USB_G_SERIAL is not set ++# CONFIG_USB_G_PRINTER is not set ++# CONFIG_USB_CDC_COMPOSITE is not set ++# CONFIG_USB_G_ACM_MS is not set ++# CONFIG_USB_G_MULTI is not set ++# CONFIG_USB_G_HID is not set ++# CONFIG_USB_G_DBGP is not set ++# CONFIG_USB_RAW_GADGET is not set ++# end of USB Gadget precomposed configurations ++ ++# CONFIG_TYPEC is not set ++CONFIG_USB_ROLE_SWITCH=y ++CONFIG_MMC=y ++CONFIG_PWRSEQ_EMMC=y ++CONFIG_PWRSEQ_SIMPLE=y ++CONFIG_MMC_BLOCK=y ++CONFIG_MMC_BLOCK_MINORS=32 ++# CONFIG_SDIO_UART is not set ++# CONFIG_MMC_TEST is not set ++ ++# ++# MMC/SD/SDIO Host Controller Drivers ++# ++CONFIG_MMC_BCM2835_MMC=y ++CONFIG_MMC_BCM2835_DMA=y ++CONFIG_MMC_BCM2835_PIO_DMA_BARRIER=2 ++# CONFIG_MMC_BCM2835_SDHOST is not set ++# CONFIG_MMC_DEBUG is not set ++# CONFIG_MMC_ARMMMCI is not set ++CONFIG_MMC_SDHCI=y ++CONFIG_MMC_SDHCI_IO_ACCESSORS=y ++# CONFIG_MMC_SDHCI_PCI is not set ++CONFIG_MMC_SDHCI_PLTFM=y ++# CONFIG_MMC_SDHCI_OF_ARASAN is not set ++# CONFIG_MMC_SDHCI_OF_AT91 is not set ++# CONFIG_MMC_SDHCI_OF_DWCMSHC is not set ++# CONFIG_MMC_SDHCI_CADENCE is not set ++# CONFIG_MMC_SDHCI_F_SDH30 is not set ++# CONFIG_MMC_SDHCI_MILBEAUT is not set ++CONFIG_MMC_SDHCI_IPROC=y ++# CONFIG_MMC_TIFM_SD is not set ++# CONFIG_MMC_SPI is not set ++# CONFIG_MMC_CB710 is not set ++# CONFIG_MMC_VIA_SDMMC is not set ++# CONFIG_MMC_DW is not set ++# CONFIG_MMC_VUB300 is not set ++# CONFIG_MMC_USHC is not set ++# CONFIG_MMC_USDHI6ROL0 is not set ++CONFIG_MMC_CQHCI=y ++CONFIG_MMC_HSQ=y ++# CONFIG_MMC_TOSHIBA_PCI is not set ++CONFIG_MMC_BCM2835=y ++# CONFIG_MMC_MTK is not set ++CONFIG_MMC_SDHCI_BRCMSTB=y ++# CONFIG_MMC_SDHCI_XENON is not set ++# CONFIG_SCSI_UFSHCD is not set ++# CONFIG_MEMSTICK is not set ++CONFIG_NEW_LEDS=y ++CONFIG_LEDS_CLASS=y ++# CONFIG_LEDS_CLASS_FLASH is not set ++# CONFIG_LEDS_CLASS_MULTICOLOR is not set ++# CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set ++ ++# ++# LED drivers ++# ++# CONFIG_LEDS_AN30259A is not set ++# CONFIG_LEDS_AW200XX is not set ++# CONFIG_LEDS_AW2013 is not set ++# CONFIG_LEDS_BCM6328 is not set ++# CONFIG_LEDS_BCM6358 is not set ++# CONFIG_LEDS_CR0014114 is not set ++# CONFIG_LEDS_EL15203000 is not set ++# CONFIG_LEDS_LM3530 is not set ++# CONFIG_LEDS_LM3532 is not set ++# CONFIG_LEDS_LM3642 is not set ++# CONFIG_LEDS_LM3692X is not set ++# CONFIG_LEDS_PCA9532 is not set ++CONFIG_LEDS_GPIO=y ++# CONFIG_LEDS_LP3944 is not set ++# CONFIG_LEDS_LP3952 is not set ++# CONFIG_LEDS_LP8860 is not set ++# CONFIG_LEDS_PCA955X is not set ++# CONFIG_LEDS_PCA963X is not set ++# CONFIG_LEDS_PCA995X is not set ++# CONFIG_LEDS_DAC124S085 is not set ++CONFIG_LEDS_PWM=y ++# CONFIG_LEDS_REGULATOR is not set ++# CONFIG_LEDS_BD2606MVV is not set ++# CONFIG_LEDS_BD2802 is not set ++# CONFIG_LEDS_LT3593 is not set ++# CONFIG_LEDS_TCA6507 is not set ++# CONFIG_LEDS_TLC591XX is not set ++# CONFIG_LEDS_LM355x is not set ++# CONFIG_LEDS_IS31FL319X is not set ++# CONFIG_LEDS_IS31FL32XX is not set ++ ++# ++# LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) ++# ++# CONFIG_LEDS_BLINKM is not set ++# CONFIG_LEDS_SYSCON is not set ++# CONFIG_LEDS_MLXREG is not set ++# CONFIG_LEDS_USER is not set ++# CONFIG_LEDS_SPI_BYTE is not set ++# CONFIG_LEDS_LM3697 is not set ++ ++# ++# Flash and Torch LED drivers ++# ++ ++# ++# RGB LED drivers ++# ++ ++# ++# LED Triggers ++# ++CONFIG_LEDS_TRIGGERS=y ++CONFIG_LEDS_TRIGGER_TIMER=y ++CONFIG_LEDS_TRIGGER_ONESHOT=y ++CONFIG_LEDS_TRIGGER_HEARTBEAT=y ++CONFIG_LEDS_TRIGGER_BACKLIGHT=y ++CONFIG_LEDS_TRIGGER_CPU=y ++# CONFIG_LEDS_TRIGGER_ACTIVITY is not set ++# CONFIG_LEDS_TRIGGER_GPIO is not set ++CONFIG_LEDS_TRIGGER_DEFAULT_ON=y ++ ++# ++# iptables trigger is under Netfilter config (LED target) ++# ++# CONFIG_LEDS_TRIGGER_TRANSIENT is not set ++# CONFIG_LEDS_TRIGGER_CAMERA is not set ++CONFIG_LEDS_TRIGGER_INPUT=y ++CONFIG_LEDS_TRIGGER_PANIC=y ++# CONFIG_LEDS_TRIGGER_NETDEV is not set ++# CONFIG_LEDS_TRIGGER_PATTERN is not set ++# CONFIG_LEDS_TRIGGER_TTY is not set ++# CONFIG_LEDS_TRIGGER_INPUT_EVENTS is not set ++CONFIG_LEDS_TRIGGER_ACTPWR=y ++ ++# ++# Simple LED drivers ++# ++CONFIG_ACCESSIBILITY=y ++# CONFIG_A11Y_BRAILLE_CONSOLE is not set ++ ++# ++# Speakup console speech ++# ++# CONFIG_SPEAKUP is not set ++# end of Speakup console speech ++ ++# CONFIG_INFINIBAND is not set ++CONFIG_EDAC_SUPPORT=y ++# CONFIG_EDAC is not set ++CONFIG_RTC_LIB=y ++CONFIG_RTC_CLASS=y ++CONFIG_RTC_HCTOSYS=y ++CONFIG_RTC_HCTOSYS_DEVICE="rtc0" ++CONFIG_RTC_SYSTOHC=y ++CONFIG_RTC_SYSTOHC_DEVICE="rtc0" ++# CONFIG_RTC_DEBUG is not set ++CONFIG_RTC_NVMEM=y ++ ++# ++# RTC interfaces ++# ++CONFIG_RTC_INTF_SYSFS=y ++CONFIG_RTC_INTF_PROC=y ++CONFIG_RTC_INTF_DEV=y ++# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set ++# CONFIG_RTC_DRV_TEST is not set ++ ++# ++# I2C RTC drivers ++# ++# CONFIG_RTC_DRV_ABB5ZES3 is not set ++# CONFIG_RTC_DRV_ABEOZ9 is not set ++# CONFIG_RTC_DRV_ABX80X is not set ++CONFIG_RTC_DRV_RPI=y ++CONFIG_RTC_DRV_BRCMSTB=y ++# CONFIG_RTC_DRV_DS1307 is not set ++# CONFIG_RTC_DRV_DS1374 is not set ++# CONFIG_RTC_DRV_DS1672 is not set ++# CONFIG_RTC_DRV_HYM8563 is not set ++# CONFIG_RTC_DRV_MAX6900 is not set ++# CONFIG_RTC_DRV_MAX31335 is not set ++# CONFIG_RTC_DRV_NCT3018Y is not set ++# CONFIG_RTC_DRV_RS5C372 is not set ++# CONFIG_RTC_DRV_ISL1208 is not set ++# CONFIG_RTC_DRV_ISL12022 is not set ++# CONFIG_RTC_DRV_ISL12026 is not set ++# CONFIG_RTC_DRV_X1205 is not set ++# CONFIG_RTC_DRV_PCF8523 is not set ++# CONFIG_RTC_DRV_PCF85063 is not set ++# CONFIG_RTC_DRV_PCF85363 is not set ++# CONFIG_RTC_DRV_PCF8563 is not set ++# CONFIG_RTC_DRV_PCF8583 is not set ++# CONFIG_RTC_DRV_M41T80 is not set ++# CONFIG_RTC_DRV_BQ32K is not set ++# CONFIG_RTC_DRV_S35390A is not set ++# CONFIG_RTC_DRV_FM3130 is not set ++# CONFIG_RTC_DRV_RX8010 is not set ++# CONFIG_RTC_DRV_RX8111 is not set ++# CONFIG_RTC_DRV_RX8581 is not set ++# CONFIG_RTC_DRV_RX8025 is not set ++# CONFIG_RTC_DRV_EM3027 is not set ++# CONFIG_RTC_DRV_RV3028 is not set ++# CONFIG_RTC_DRV_RV3032 is not set ++# CONFIG_RTC_DRV_RV8803 is not set ++# CONFIG_RTC_DRV_SD2405AL is not set ++# CONFIG_RTC_DRV_SD3078 is not set ++ ++# ++# SPI RTC drivers ++# ++# CONFIG_RTC_DRV_M41T93 is not set ++# CONFIG_RTC_DRV_M41T94 is not set ++# CONFIG_RTC_DRV_DS1302 is not set ++# CONFIG_RTC_DRV_DS1305 is not set ++# CONFIG_RTC_DRV_DS1343 is not set ++# CONFIG_RTC_DRV_DS1347 is not set ++# CONFIG_RTC_DRV_DS1390 is not set ++# CONFIG_RTC_DRV_MAX6916 is not set ++# CONFIG_RTC_DRV_R9701 is not set ++# CONFIG_RTC_DRV_RX4581 is not set ++# CONFIG_RTC_DRV_RS5C348 is not set ++# CONFIG_RTC_DRV_MAX6902 is not set ++# CONFIG_RTC_DRV_PCF2123 is not set ++# CONFIG_RTC_DRV_MCP795 is not set ++CONFIG_RTC_I2C_AND_SPI=y ++ ++# ++# SPI and I2C RTC drivers ++# ++# CONFIG_RTC_DRV_DS3232 is not set ++# CONFIG_RTC_DRV_PCF2127 is not set ++# CONFIG_RTC_DRV_RV3029C2 is not set ++# CONFIG_RTC_DRV_RX6110 is not set ++ ++# ++# Platform RTC drivers ++# ++# CONFIG_RTC_DRV_DS1286 is not set ++# CONFIG_RTC_DRV_DS1511 is not set ++# CONFIG_RTC_DRV_DS1553 is not set ++# CONFIG_RTC_DRV_DS1685_FAMILY is not set ++# CONFIG_RTC_DRV_DS1742 is not set ++# CONFIG_RTC_DRV_DS2404 is not set ++# CONFIG_RTC_DRV_EFI is not set ++# CONFIG_RTC_DRV_STK17TA8 is not set ++# CONFIG_RTC_DRV_M48T86 is not set ++# CONFIG_RTC_DRV_M48T35 is not set ++# CONFIG_RTC_DRV_M48T59 is not set ++# CONFIG_RTC_DRV_MSM6242 is not set ++# CONFIG_RTC_DRV_RP5C01 is not set ++# CONFIG_RTC_DRV_ZYNQMP is not set ++ ++# ++# on-CPU RTC drivers ++# ++# CONFIG_RTC_DRV_PL030 is not set ++# CONFIG_RTC_DRV_PL031 is not set ++# CONFIG_RTC_DRV_CADENCE is not set ++# CONFIG_RTC_DRV_FTRTC010 is not set ++# CONFIG_RTC_DRV_R7301 is not set ++ ++# ++# HID Sensor RTC drivers ++# ++# CONFIG_RTC_DRV_GOLDFISH is not set ++CONFIG_DMADEVICES=y ++# CONFIG_DMADEVICES_DEBUG is not set ++ ++# ++# DMA Devices ++# ++CONFIG_DMA_ENGINE=y ++CONFIG_DMA_VIRTUAL_CHANNELS=y ++CONFIG_DMA_OF=y ++# CONFIG_ALTERA_MSGDMA is not set ++# CONFIG_AMBA_PL08X is not set ++CONFIG_DMA_BCM2835=y ++CONFIG_DW_AXI_DMAC=y ++# CONFIG_FSL_EDMA is not set ++# CONFIG_FSL_QDMA is not set ++# CONFIG_INTEL_IDMA64 is not set ++# CONFIG_MV_XOR_V2 is not set ++# CONFIG_PL330_DMA is not set ++# CONFIG_PLX_DMA is not set ++CONFIG_DMA_BCM2708=y ++# CONFIG_XILINX_DMA is not set ++# CONFIG_XILINX_XDMA is not set ++# CONFIG_XILINX_ZYNQMP_DMA is not set ++# CONFIG_XILINX_ZYNQMP_DPDMA is not set ++# CONFIG_AMD_QDMA is not set ++# CONFIG_QCOM_HIDMA_MGMT is not set ++# CONFIG_QCOM_HIDMA is not set ++# CONFIG_DW_DMAC is not set ++# CONFIG_DW_DMAC_PCI is not set ++# CONFIG_DW_EDMA is not set ++# CONFIG_SF_PDMA is not set ++ ++# ++# DMA Clients ++# ++# CONFIG_ASYNC_TX_DMA is not set ++# CONFIG_DMATEST is not set ++ ++# ++# DMABUF options ++# ++CONFIG_SYNC_FILE=y ++# CONFIG_SW_SYNC is not set ++CONFIG_UDMABUF=y ++# CONFIG_DMABUF_MOVE_NOTIFY is not set ++# CONFIG_DMABUF_DEBUG is not set ++# CONFIG_DMABUF_SELFTESTS is not set ++CONFIG_DMABUF_HEAPS=y ++# CONFIG_DMABUF_SYSFS_STATS is not set ++CONFIG_DMABUF_HEAPS_SYSTEM=y ++CONFIG_DMABUF_HEAPS_CMA=y ++# end of DMABUF options ++ ++# CONFIG_UIO is not set ++# CONFIG_VFIO is not set ++CONFIG_IRQ_BYPASS_MANAGER=y ++# CONFIG_VIRT_DRIVERS is not set ++CONFIG_VIRTIO_MENU=y ++# CONFIG_VIRTIO_PCI is not set ++# CONFIG_VIRTIO_MMIO is not set ++# CONFIG_VDPA is not set ++CONFIG_VHOST_MENU=y ++# CONFIG_VHOST_NET is not set ++CONFIG_VHOST_CROSS_ENDIAN_LEGACY=y ++CONFIG_VHOST_ENABLE_FORK_OWNER_CONTROL=y ++ ++# ++# Microsoft Hyper-V guest support ++# ++# end of Microsoft Hyper-V guest support ++ ++# CONFIG_GREYBUS is not set ++# CONFIG_COMEDI is not set ++CONFIG_STAGING=y ++# CONFIG_RTLLIB is not set ++# CONFIG_RTS5208 is not set ++# CONFIG_FB_SM750 is not set ++CONFIG_STAGING_MEDIA=y ++# CONFIG_LTE_GDM724X is not set ++# CONFIG_FB_TFT is not set ++CONFIG_BCM_VIDEOCORE=y ++CONFIG_BCM2835_VCHIQ=y ++CONFIG_VCHIQ_CDEV=y ++# CONFIG_BCM_VC_SM_CMA is not set ++# CONFIG_BCM2835_VCHIQ_MMAL is not set ++# CONFIG_XIL_AXIS_FIFO is not set ++# CONFIG_FIELDBUS_DEV is not set ++# CONFIG_VME_BUS is not set ++# CONFIG_GOLDFISH is not set ++# CONFIG_CHROME_PLATFORMS is not set ++# CONFIG_MELLANOX_PLATFORM is not set ++CONFIG_SURFACE_PLATFORMS=y ++CONFIG_ARM64_PLATFORM_DEVICES=y ++CONFIG_HAVE_CLK=y ++CONFIG_HAVE_CLK_PREPARE=y ++CONFIG_COMMON_CLK=y ++ ++# ++# Clock driver for ARM Reference designs ++# ++# CONFIG_CLK_ICST is not set ++# CONFIG_CLK_SP810 is not set ++# end of Clock driver for ARM Reference designs ++ ++# CONFIG_LMK04832 is not set ++# CONFIG_COMMON_CLK_MAX9485 is not set ++CONFIG_COMMON_CLK_RP1=y ++CONFIG_COMMON_CLK_RP1_SDIO=y ++# CONFIG_COMMON_CLK_SI5341 is not set ++# CONFIG_COMMON_CLK_SI5351 is not set ++# CONFIG_COMMON_CLK_SI514 is not set ++# CONFIG_COMMON_CLK_SI544 is not set ++# CONFIG_COMMON_CLK_SI570 is not set ++# CONFIG_COMMON_CLK_CDCE706 is not set ++# CONFIG_COMMON_CLK_CDCE925 is not set ++# CONFIG_COMMON_CLK_CS2000_CP is not set ++# CONFIG_COMMON_CLK_AXI_CLKGEN is not set ++# CONFIG_COMMON_CLK_XGENE is not set ++# CONFIG_COMMON_CLK_PWM is not set ++# CONFIG_COMMON_CLK_RS9_PCIE is not set ++# CONFIG_COMMON_CLK_SI521XX is not set ++# CONFIG_COMMON_CLK_VC3 is not set ++# CONFIG_COMMON_CLK_VC5 is not set ++# CONFIG_COMMON_CLK_VC7 is not set ++# CONFIG_COMMON_CLK_FIXED_MMIO is not set ++CONFIG_CLK_BCM2711_DVP=y ++CONFIG_CLK_BCM2835=y ++CONFIG_CLK_RASPBERRYPI=y ++# CONFIG_XILINX_VCU is not set ++# CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set ++# CONFIG_HWSPINLOCK is not set ++ ++# ++# Clock Source drivers ++# ++CONFIG_TIMER_OF=y ++CONFIG_TIMER_PROBE=y ++CONFIG_CLKSRC_MMIO=y ++CONFIG_ARM_ARCH_TIMER=y ++CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y ++CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND=y ++CONFIG_FSL_ERRATUM_A008585=y ++CONFIG_HISILICON_ERRATUM_161010101=y ++CONFIG_ARM64_ERRATUM_858921=y ++CONFIG_ARM_TIMER_SP804=y ++# end of Clock Source drivers ++ ++CONFIG_MAILBOX=y ++# CONFIG_ARM_MHU is not set ++# CONFIG_ARM_MHU_V2 is not set ++# CONFIG_ARM_MHU_V3 is not set ++# CONFIG_PLATFORM_MHU is not set ++# CONFIG_PL320_MBOX is not set ++# CONFIG_ALTERA_MBOX is not set ++CONFIG_BCM2835_MBOX=y ++# CONFIG_MAILBOX_TEST is not set ++# CONFIG_MBOX_RP1 is not set ++CONFIG_IOMMU_IOVA=y ++CONFIG_IOMMU_API=y ++CONFIG_IOMMU_SUPPORT=y ++ ++# ++# Generic IOMMU Pagetable Support ++# ++# CONFIG_IOMMU_IO_PGTABLE_LPAE is not set ++# CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set ++# CONFIG_IOMMU_IO_PGTABLE_DART is not set ++# end of Generic IOMMU Pagetable Support ++ ++# CONFIG_IOMMU_DEBUGFS is not set ++CONFIG_IOMMU_DEFAULT_DMA_STRICT=y ++# CONFIG_IOMMU_DEFAULT_DMA_LAZY is not set ++# CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set ++CONFIG_OF_IOMMU=y ++CONFIG_IOMMU_DMA=y ++# CONFIG_IOMMUFD is not set ++# CONFIG_ARM_SMMU is not set ++# CONFIG_ARM_SMMU_V3 is not set ++CONFIG_BCM2712_IOMMU=y ++ ++# ++# Remoteproc drivers ++# ++# CONFIG_REMOTEPROC is not set ++# end of Remoteproc drivers ++ ++# ++# Rpmsg drivers ++# ++# CONFIG_RPMSG_QCOM_GLINK_RPM is not set ++# CONFIG_RPMSG_VIRTIO is not set ++# end of Rpmsg drivers ++ ++# CONFIG_SOUNDWIRE is not set ++ ++# ++# SOC (System On Chip) specific Drivers ++# ++ ++# ++# Amlogic SoC drivers ++# ++# end of Amlogic SoC drivers ++ ++# ++# Broadcom SoC drivers ++# ++CONFIG_SOC_BRCMSTB=y ++# end of Broadcom SoC drivers ++ ++# ++# NXP/Freescale QorIQ SoC drivers ++# ++# CONFIG_QUICC_ENGINE is not set ++# end of NXP/Freescale QorIQ SoC drivers ++ ++# ++# fujitsu SoC drivers ++# ++# end of fujitsu SoC drivers ++ ++# ++# i.MX SoC drivers ++# ++# end of i.MX SoC drivers ++ ++# ++# Enable LiteX SoC Builder specific drivers ++# ++# CONFIG_LITEX_SOC_CONTROLLER is not set ++# end of Enable LiteX SoC Builder specific drivers ++ ++# CONFIG_WPCM450_SOC is not set ++ ++# ++# Qualcomm SoC drivers ++# ++# end of Qualcomm SoC drivers ++ ++# CONFIG_SOC_TI is not set ++ ++# ++# Xilinx SoC drivers ++# ++# end of Xilinx SoC drivers ++# end of SOC (System On Chip) specific Drivers ++ ++# ++# PM Domains ++# ++ ++# ++# Amlogic PM Domains ++# ++# end of Amlogic PM Domains ++ ++# ++# Broadcom PM Domains ++# ++CONFIG_BCM2835_POWER=y ++CONFIG_RASPBERRYPI_POWER=y ++# end of Broadcom PM Domains ++ ++# ++# i.MX PM Domains ++# ++# end of i.MX PM Domains ++ ++# ++# Qualcomm PM Domains ++# ++# end of Qualcomm PM Domains ++# end of PM Domains ++ ++# CONFIG_PM_DEVFREQ is not set ++CONFIG_EXTCON=y ++ ++# ++# Extcon Device Drivers ++# ++# CONFIG_EXTCON_FSA9480 is not set ++# CONFIG_EXTCON_GPIO is not set ++# CONFIG_EXTCON_LC824206XA is not set ++# CONFIG_EXTCON_MAX3355 is not set ++# CONFIG_EXTCON_PTN5150 is not set ++# CONFIG_EXTCON_RT8973A is not set ++# CONFIG_EXTCON_SM5502 is not set ++# CONFIG_EXTCON_USB_GPIO is not set ++# CONFIG_MEMORY is not set ++# CONFIG_IIO is not set ++# CONFIG_NTB is not set ++CONFIG_PWM=y ++# CONFIG_PWM_DEBUG is not set ++# CONFIG_PWM_ATMEL_TCB is not set ++# CONFIG_PWM_BCM2835 is not set ++CONFIG_PWM_BRCMSTB=y ++# CONFIG_PWM_CLK is not set ++# CONFIG_PWM_DWC is not set ++# CONFIG_PWM_FSL_FTM is not set ++# CONFIG_PWM_GPIO is not set ++# CONFIG_PWM_PCA9685 is not set ++# CONFIG_PWM_RASPBERRYPI_POE is not set ++CONFIG_PWM_RP1=y ++# CONFIG_PWM_STMPE is not set ++# CONFIG_PWM_XILINX is not set ++ ++# ++# IRQ chip support ++# ++CONFIG_IRQCHIP=y ++CONFIG_ARM_GIC=y ++CONFIG_ARM_GIC_MAX_NR=1 ++CONFIG_ARM_GIC_V2M=y ++CONFIG_ARM_GIC_V3=y ++CONFIG_ARM_GIC_V3_ITS=y ++CONFIG_IRQ_MSI_LIB=y ++# CONFIG_AL_FIC is not set ++CONFIG_BCM2712_MIP=y ++CONFIG_BCM7038_L1_IRQ=y ++CONFIG_BCM7120_L2_IRQ=y ++CONFIG_BRCMSTB_L2_IRQ=y ++# CONFIG_XILINX_INTC is not set ++CONFIG_PARTITION_PERCPU=y ++# end of IRQ chip support ++ ++# CONFIG_IPACK_BUS is not set ++CONFIG_ARCH_HAS_RESET_CONTROLLER=y ++CONFIG_RESET_CONTROLLER=y ++CONFIG_RESET_BRCMSTB=y ++CONFIG_RESET_BRCMSTB_RESCAL=y ++# CONFIG_RESET_GPIO is not set ++CONFIG_RESET_RASPBERRYPI=y ++CONFIG_RESET_SIMPLE=y ++# CONFIG_RESET_TI_SYSCON is not set ++# CONFIG_RESET_TI_TPS380X is not set ++ ++# ++# PHY Subsystem ++# ++CONFIG_GENERIC_PHY=y ++# CONFIG_PHY_CAN_TRANSCEIVER is not set ++ ++# ++# PHY drivers for Broadcom platforms ++# ++# CONFIG_BCM_KONA_USB2_PHY is not set ++# CONFIG_PHY_BRCM_SATA is not set ++CONFIG_PHY_BRCM_USB=y ++# end of PHY drivers for Broadcom platforms ++ ++# CONFIG_PHY_CADENCE_TORRENT is not set ++# CONFIG_PHY_CADENCE_DPHY is not set ++# CONFIG_PHY_CADENCE_DPHY_RX is not set ++# CONFIG_PHY_CADENCE_SIERRA is not set ++# CONFIG_PHY_CADENCE_SALVO is not set ++# CONFIG_PHY_PXA_28NM_HSIC is not set ++# CONFIG_PHY_PXA_28NM_USB2 is not set ++# CONFIG_PHY_LAN966X_SERDES is not set ++# CONFIG_PHY_MAPPHONE_MDM6600 is not set ++# CONFIG_PHY_OCELOT_SERDES is not set ++# CONFIG_PHY_SAMSUNG_USB2 is not set ++# end of PHY Subsystem ++ ++# CONFIG_POWERCAP is not set ++# CONFIG_MCB is not set ++ ++# ++# Performance monitor support ++# ++# CONFIG_ARM_CCI_PMU is not set ++# CONFIG_ARM_CCN is not set ++# CONFIG_ARM_CMN is not set ++# CONFIG_ARM_NI is not set ++CONFIG_ARM_PMU=y ++# CONFIG_ARM_SMMU_V3_PMU is not set ++CONFIG_ARM_PMUV3=y ++# CONFIG_ARM_DSU_PMU is not set ++# CONFIG_ARM_SPE_PMU is not set ++# CONFIG_RPI_AXIPERF is not set ++# CONFIG_HISI_PCIE_PMU is not set ++# CONFIG_HNS3_PMU is not set ++# CONFIG_DWC_PCIE_PMU is not set ++# CONFIG_ARM_CORESIGHT_PMU_ARCH_SYSTEM_PMU is not set ++# end of Performance monitor support ++ ++CONFIG_RAS=y ++# CONFIG_USB4 is not set ++ ++# ++# Android ++# ++CONFIG_ANDROID_BINDER_IPC=y ++CONFIG_ANDROID_BINDERFS=y ++CONFIG_ANDROID_BINDER_DEVICES="binder,hwbinder,vndbinder" ++# CONFIG_ANDROID_BINDER_IPC_SELFTEST is not set ++# end of Android ++ ++# CONFIG_LIBNVDIMM is not set ++# CONFIG_DAX is not set ++CONFIG_NVMEM=y ++CONFIG_NVMEM_SYSFS=y ++CONFIG_NVMEM_LAYOUTS=y ++ ++# ++# Layout Types ++# ++# CONFIG_NVMEM_LAYOUT_SL28_VPD is not set ++# CONFIG_NVMEM_LAYOUT_ONIE_TLV is not set ++# CONFIG_NVMEM_LAYOUT_U_BOOT_ENV is not set ++# end of Layout Types ++ ++CONFIG_NVMEM_RASPBERRYPI_OTP=y ++# CONFIG_NVMEM_RMEM is not set ++ ++# ++# HW tracing support ++# ++# CONFIG_STM is not set ++# CONFIG_INTEL_TH is not set ++# CONFIG_HISI_PTT is not set ++# end of HW tracing support ++ ++# CONFIG_FPGA is not set ++# CONFIG_FSI is not set ++# CONFIG_TEE is not set ++CONFIG_PM_OPP=y ++# CONFIG_SIOX is not set ++# CONFIG_SLIMBUS is not set ++# CONFIG_INTERCONNECT is not set ++# CONFIG_COUNTER is not set ++# CONFIG_MOST is not set ++# CONFIG_PECI is not set ++# CONFIG_HTE is not set ++# CONFIG_CDX_BUS is not set ++# end of Device Drivers ++ ++# ++# File systems ++# ++CONFIG_DCACHE_WORD_ACCESS=y ++# CONFIG_VALIDATE_FS_PARSER is not set ++CONFIG_FS_IOMAP=y ++CONFIG_BUFFER_HEAD=y ++CONFIG_LEGACY_DIRECT_IO=y ++# CONFIG_EXT2_FS is not set ++# CONFIG_EXT3_FS is not set ++CONFIG_EXT4_FS=y ++CONFIG_EXT4_USE_FOR_EXT2=y ++CONFIG_EXT4_FS_POSIX_ACL=y ++CONFIG_EXT4_FS_SECURITY=y ++# CONFIG_EXT4_DEBUG is not set ++CONFIG_JBD2=y ++# CONFIG_JBD2_DEBUG is not set ++CONFIG_FS_MBCACHE=y ++# CONFIG_REISERFS_FS is not set ++# CONFIG_JFS_FS is not set ++# CONFIG_XFS_FS is not set ++# CONFIG_GFS2_FS is not set ++# CONFIG_OCFS2_FS is not set ++# CONFIG_BTRFS_FS is not set ++# CONFIG_NILFS2_FS is not set ++CONFIG_F2FS_FS=y ++CONFIG_F2FS_STAT_FS=y ++CONFIG_F2FS_FS_XATTR=y ++CONFIG_F2FS_FS_POSIX_ACL=y ++CONFIG_F2FS_FS_SECURITY=y ++# CONFIG_F2FS_CHECK_FS is not set ++# CONFIG_F2FS_FAULT_INJECTION is not set ++# CONFIG_F2FS_FS_COMPRESSION is not set ++CONFIG_F2FS_IOSTAT=y ++# CONFIG_F2FS_UNFAIR_RWSEM is not set ++# CONFIG_BCACHEFS_FS is not set ++CONFIG_FS_POSIX_ACL=y ++CONFIG_EXPORTFS=y ++# CONFIG_EXPORTFS_BLOCK_OPS is not set ++CONFIG_FILE_LOCKING=y ++CONFIG_FS_ENCRYPTION=y ++CONFIG_FS_ENCRYPTION_ALGS=y ++# CONFIG_FS_VERITY is not set ++CONFIG_FSNOTIFY=y ++CONFIG_DNOTIFY=y ++CONFIG_INOTIFY_USER=y ++CONFIG_FANOTIFY=y ++# CONFIG_FANOTIFY_ACCESS_PERMISSIONS is not set ++CONFIG_QUOTA=y ++# CONFIG_QUOTA_NETLINK_INTERFACE is not set ++# CONFIG_QUOTA_DEBUG is not set ++# CONFIG_QFMT_V1 is not set ++# CONFIG_QFMT_V2 is not set ++CONFIG_QUOTACTL=y ++CONFIG_AUTOFS_FS=y ++# CONFIG_FUSE_FS is not set ++# CONFIG_OVERLAY_FS is not set ++ ++# ++# Caches ++# ++# end of Caches ++ ++# ++# CD-ROM/DVD Filesystems ++# ++# CONFIG_ISO9660_FS is not set ++# CONFIG_UDF_FS is not set ++# end of CD-ROM/DVD Filesystems ++ ++# ++# DOS/FAT/EXFAT/NT Filesystems ++# ++CONFIG_FAT_FS=y ++CONFIG_MSDOS_FS=y ++CONFIG_VFAT_FS=y ++CONFIG_FAT_DEFAULT_CODEPAGE=437 ++CONFIG_FAT_DEFAULT_IOCHARSET="ascii" ++# CONFIG_FAT_DEFAULT_UTF8 is not set ++# CONFIG_EXFAT_FS is not set ++# CONFIG_NTFS3_FS is not set ++# CONFIG_NTFS_FS is not set ++# end of DOS/FAT/EXFAT/NT Filesystems ++ ++# ++# Pseudo filesystems ++# ++CONFIG_PROC_FS=y ++# CONFIG_PROC_KCORE is not set ++CONFIG_PROC_SYSCTL=y ++CONFIG_PROC_PAGE_MONITOR=y ++CONFIG_PROC_CHILDREN=y ++CONFIG_KERNFS=y ++CONFIG_SYSFS=y ++CONFIG_TMPFS=y ++CONFIG_TMPFS_POSIX_ACL=y ++CONFIG_TMPFS_XATTR=y ++# CONFIG_TMPFS_INODE64 is not set ++# CONFIG_TMPFS_QUOTA is not set ++CONFIG_ARCH_SUPPORTS_HUGETLBFS=y ++# CONFIG_HUGETLBFS is not set ++CONFIG_ARCH_HAS_GIGANTIC_PAGE=y ++CONFIG_CONFIGFS_FS=y ++# CONFIG_EFIVAR_FS is not set ++# end of Pseudo filesystems ++ ++CONFIG_MISC_FILESYSTEMS=y ++# CONFIG_ORANGEFS_FS is not set ++# CONFIG_ADFS_FS is not set ++# CONFIG_AFFS_FS is not set ++# CONFIG_ECRYPT_FS is not set ++# CONFIG_HFS_FS is not set ++# CONFIG_HFSPLUS_FS is not set ++# CONFIG_BEFS_FS is not set ++# CONFIG_BFS_FS is not set ++# CONFIG_EFS_FS is not set ++# CONFIG_CRAMFS is not set ++# CONFIG_SQUASHFS is not set ++# CONFIG_VXFS_FS is not set ++# CONFIG_MINIX_FS is not set ++# CONFIG_OMFS_FS is not set ++# CONFIG_HPFS_FS is not set ++# CONFIG_QNX4FS_FS is not set ++# CONFIG_QNX6FS_FS is not set ++# CONFIG_ROMFS_FS is not set ++CONFIG_PSTORE=y ++CONFIG_PSTORE_DEFAULT_KMSG_BYTES=10240 ++CONFIG_PSTORE_COMPRESS=y ++CONFIG_PSTORE_CONSOLE=y ++# CONFIG_PSTORE_PMSG is not set ++# CONFIG_PSTORE_FTRACE is not set ++CONFIG_PSTORE_RAM=y ++# CONFIG_PSTORE_BLK is not set ++# CONFIG_SYSV_FS is not set ++# CONFIG_UFS_FS is not set ++# CONFIG_EROFS_FS is not set ++CONFIG_NETWORK_FILESYSTEMS=y ++CONFIG_NFS_FS=y ++CONFIG_NFS_V2=y ++CONFIG_NFS_V3=y ++CONFIG_NFS_V3_ACL=y ++CONFIG_NFS_V4=y ++CONFIG_NFS_SWAP=y ++CONFIG_NFS_V4_1=y ++CONFIG_NFS_V4_2=y ++CONFIG_PNFS_FILE_LAYOUT=y ++CONFIG_PNFS_FLEXFILE_LAYOUT=y ++CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" ++# CONFIG_NFS_V4_1_MIGRATION is not set ++CONFIG_NFS_V4_SECURITY_LABEL=y ++CONFIG_ROOT_NFS=y ++# CONFIG_NFS_FSCACHE is not set ++# CONFIG_NFS_USE_LEGACY_DNS is not set ++CONFIG_NFS_USE_KERNEL_DNS=y ++CONFIG_NFS_DISABLE_UDP_SUPPORT=y ++CONFIG_NFS_V4_2_READ_PLUS=y ++# CONFIG_NFSD is not set ++CONFIG_GRACE_PERIOD=y ++CONFIG_LOCKD=y ++CONFIG_LOCKD_V4=y ++CONFIG_NFS_ACL_SUPPORT=y ++CONFIG_NFS_COMMON=y ++CONFIG_NFS_V4_2_SSC_HELPER=y ++CONFIG_SUNRPC=y ++CONFIG_SUNRPC_GSS=y ++CONFIG_SUNRPC_BACKCHANNEL=y ++CONFIG_SUNRPC_SWAP=y ++CONFIG_RPCSEC_GSS_KRB5=y ++# CONFIG_SUNRPC_DEBUG is not set ++# CONFIG_CEPH_FS is not set ++# CONFIG_CIFS is not set ++# CONFIG_SMB_SERVER is not set ++# CONFIG_CODA_FS is not set ++# CONFIG_AFS_FS is not set ++CONFIG_NLS=y ++CONFIG_NLS_DEFAULT="utf8" ++CONFIG_NLS_CODEPAGE_437=y ++# CONFIG_NLS_CODEPAGE_737 is not set ++# CONFIG_NLS_CODEPAGE_775 is not set ++# CONFIG_NLS_CODEPAGE_850 is not set ++# CONFIG_NLS_CODEPAGE_852 is not set ++# CONFIG_NLS_CODEPAGE_855 is not set ++# CONFIG_NLS_CODEPAGE_857 is not set ++# CONFIG_NLS_CODEPAGE_860 is not set ++# CONFIG_NLS_CODEPAGE_861 is not set ++# CONFIG_NLS_CODEPAGE_862 is not set ++# CONFIG_NLS_CODEPAGE_863 is not set ++# CONFIG_NLS_CODEPAGE_864 is not set ++# CONFIG_NLS_CODEPAGE_865 is not set ++# CONFIG_NLS_CODEPAGE_866 is not set ++# CONFIG_NLS_CODEPAGE_869 is not set ++# CONFIG_NLS_CODEPAGE_936 is not set ++# CONFIG_NLS_CODEPAGE_950 is not set ++# CONFIG_NLS_CODEPAGE_932 is not set ++# CONFIG_NLS_CODEPAGE_949 is not set ++# CONFIG_NLS_CODEPAGE_874 is not set ++# CONFIG_NLS_ISO8859_8 is not set ++# CONFIG_NLS_CODEPAGE_1250 is not set ++# CONFIG_NLS_CODEPAGE_1251 is not set ++CONFIG_NLS_ASCII=y ++# CONFIG_NLS_ISO8859_1 is not set ++# CONFIG_NLS_ISO8859_2 is not set ++# CONFIG_NLS_ISO8859_3 is not set ++# CONFIG_NLS_ISO8859_4 is not set ++# CONFIG_NLS_ISO8859_5 is not set ++# CONFIG_NLS_ISO8859_6 is not set ++# CONFIG_NLS_ISO8859_7 is not set ++# CONFIG_NLS_ISO8859_9 is not set ++# CONFIG_NLS_ISO8859_13 is not set ++# CONFIG_NLS_ISO8859_14 is not set ++# CONFIG_NLS_ISO8859_15 is not set ++# CONFIG_NLS_KOI8_R is not set ++# CONFIG_NLS_KOI8_U is not set ++# CONFIG_NLS_MAC_ROMAN is not set ++# CONFIG_NLS_MAC_CELTIC is not set ++# CONFIG_NLS_MAC_CENTEURO is not set ++# CONFIG_NLS_MAC_CROATIAN is not set ++# CONFIG_NLS_MAC_CYRILLIC is not set ++# CONFIG_NLS_MAC_GAELIC is not set ++# CONFIG_NLS_MAC_GREEK is not set ++# CONFIG_NLS_MAC_ICELAND is not set ++# CONFIG_NLS_MAC_INUIT is not set ++# CONFIG_NLS_MAC_ROMANIAN is not set ++# CONFIG_NLS_MAC_TURKISH is not set ++# CONFIG_NLS_UTF8 is not set ++# CONFIG_DLM is not set ++# CONFIG_UNICODE is not set ++CONFIG_IO_WQ=y ++# end of File systems ++ ++# ++# Security options ++# ++CONFIG_KEYS=y ++# CONFIG_KEYS_REQUEST_CACHE is not set ++# CONFIG_PERSISTENT_KEYRINGS is not set ++# CONFIG_TRUSTED_KEYS is not set ++# CONFIG_ENCRYPTED_KEYS is not set ++CONFIG_KEY_DH_OPERATIONS=y ++# CONFIG_SECURITY_DMESG_RESTRICT is not set ++CONFIG_PROC_MEM_ALWAYS_FORCE=y ++# CONFIG_PROC_MEM_FORCE_PTRACE is not set ++# CONFIG_PROC_MEM_NO_FORCE is not set ++CONFIG_SECURITY=y ++CONFIG_SECURITYFS=y ++CONFIG_SECURITY_NETWORK=y ++CONFIG_SECURITY_PATH=y ++# CONFIG_HARDENED_USERCOPY is not set ++# CONFIG_FORTIFY_SOURCE is not set ++# CONFIG_STATIC_USERMODEHELPER is not set ++# CONFIG_SECURITY_SELINUX is not set ++# CONFIG_SECURITY_SMACK is not set ++# CONFIG_SECURITY_TOMOYO is not set ++CONFIG_SECURITY_APPARMOR=y ++# CONFIG_SECURITY_APPARMOR_DEBUG is not set ++CONFIG_SECURITY_APPARMOR_INTROSPECT_POLICY=y ++CONFIG_SECURITY_APPARMOR_HASH=y ++CONFIG_SECURITY_APPARMOR_HASH_DEFAULT=y ++CONFIG_SECURITY_APPARMOR_EXPORT_BINARY=y ++CONFIG_SECURITY_APPARMOR_PARANOID_LOAD=y ++# CONFIG_SECURITY_LOADPIN is not set ++# CONFIG_SECURITY_YAMA is not set ++# CONFIG_SECURITY_SAFESETID is not set ++# CONFIG_SECURITY_LOCKDOWN_LSM is not set ++# CONFIG_SECURITY_LANDLOCK is not set ++# CONFIG_SECURITY_IPE is not set ++CONFIG_INTEGRITY=y ++# CONFIG_INTEGRITY_SIGNATURE is not set ++CONFIG_INTEGRITY_AUDIT=y ++# CONFIG_IMA is not set ++# CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT is not set ++# CONFIG_EVM is not set ++CONFIG_DEFAULT_SECURITY_APPARMOR=y ++# CONFIG_DEFAULT_SECURITY_DAC is not set ++CONFIG_LSM="" ++ ++# ++# Kernel hardening options ++# ++ ++# ++# Memory initialization ++# ++CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y ++CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_BARE=y ++CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y ++# CONFIG_INIT_STACK_NONE is not set ++# CONFIG_INIT_STACK_ALL_PATTERN is not set ++CONFIG_INIT_STACK_ALL_ZERO=y ++# CONFIG_GCC_PLUGIN_STACKLEAK is not set ++# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set ++# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set ++CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y ++# CONFIG_ZERO_CALL_USED_REGS is not set ++# end of Memory initialization ++ ++# ++# Hardening of kernel data structures ++# ++# CONFIG_LIST_HARDENED is not set ++# CONFIG_BUG_ON_DATA_CORRUPTION is not set ++# end of Hardening of kernel data structures ++ ++CONFIG_RANDSTRUCT_NONE=y ++# CONFIG_RANDSTRUCT_FULL is not set ++# CONFIG_RANDSTRUCT_PERFORMANCE is not set ++# end of Kernel hardening options ++# end of Security options ++ ++CONFIG_CRYPTO=y ++ ++# ++# Crypto core or helper ++# ++CONFIG_CRYPTO_ALGAPI=y ++CONFIG_CRYPTO_ALGAPI2=y ++CONFIG_CRYPTO_AEAD2=y ++CONFIG_CRYPTO_SIG=y ++CONFIG_CRYPTO_SIG2=y ++CONFIG_CRYPTO_SKCIPHER=y ++CONFIG_CRYPTO_SKCIPHER2=y ++CONFIG_CRYPTO_HASH=y ++CONFIG_CRYPTO_HASH2=y ++CONFIG_CRYPTO_RNG2=y ++CONFIG_CRYPTO_AKCIPHER2=y ++CONFIG_CRYPTO_AKCIPHER=y ++CONFIG_CRYPTO_KPP2=y ++CONFIG_CRYPTO_KPP=y ++CONFIG_CRYPTO_ACOMP2=y ++CONFIG_CRYPTO_MANAGER=y ++CONFIG_CRYPTO_MANAGER2=y ++# CONFIG_CRYPTO_USER is not set ++CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y ++# CONFIG_CRYPTO_NULL is not set ++# CONFIG_CRYPTO_PCRYPT is not set ++# CONFIG_CRYPTO_CRYPTD is not set ++# CONFIG_CRYPTO_AUTHENC is not set ++# CONFIG_CRYPTO_TEST is not set ++# end of Crypto core or helper ++ ++# ++# Public-key cryptography ++# ++CONFIG_CRYPTO_RSA=y ++CONFIG_CRYPTO_DH=y ++# CONFIG_CRYPTO_DH_RFC7919_GROUPS is not set ++# CONFIG_CRYPTO_ECDH is not set ++# CONFIG_CRYPTO_ECDSA is not set ++# CONFIG_CRYPTO_ECRDSA is not set ++# CONFIG_CRYPTO_CURVE25519 is not set ++# end of Public-key cryptography ++ ++# ++# Block ciphers ++# ++# CONFIG_CRYPTO_AES is not set ++# CONFIG_CRYPTO_AES_TI is not set ++# CONFIG_CRYPTO_ARIA is not set ++# CONFIG_CRYPTO_BLOWFISH is not set ++# CONFIG_CRYPTO_CAMELLIA is not set ++# CONFIG_CRYPTO_CAST5 is not set ++# CONFIG_CRYPTO_CAST6 is not set ++CONFIG_CRYPTO_DES=y ++# CONFIG_CRYPTO_FCRYPT is not set ++# CONFIG_CRYPTO_SERPENT is not set ++# CONFIG_CRYPTO_SM4_GENERIC is not set ++# CONFIG_CRYPTO_TWOFISH is not set ++# end of Block ciphers ++ ++# ++# Length-preserving ciphers and modes ++# ++# CONFIG_CRYPTO_ADIANTUM is not set ++# CONFIG_CRYPTO_CHACHA20 is not set ++# CONFIG_CRYPTO_CBC is not set ++# CONFIG_CRYPTO_CTR is not set ++CONFIG_CRYPTO_CTS=y ++CONFIG_CRYPTO_ECB=y ++# CONFIG_CRYPTO_HCTR2 is not set ++# CONFIG_CRYPTO_KEYWRAP is not set ++# CONFIG_CRYPTO_LRW is not set ++# CONFIG_CRYPTO_PCBC is not set ++CONFIG_CRYPTO_XTS=y ++# end of Length-preserving ciphers and modes ++ ++# ++# AEAD (authenticated encryption with associated data) ciphers ++# ++# CONFIG_CRYPTO_AEGIS128 is not set ++# CONFIG_CRYPTO_CHACHA20POLY1305 is not set ++# CONFIG_CRYPTO_CCM is not set ++# CONFIG_CRYPTO_GCM is not set ++# CONFIG_CRYPTO_SEQIV is not set ++# CONFIG_CRYPTO_ECHAINIV is not set ++# CONFIG_CRYPTO_ESSIV is not set ++# end of AEAD (authenticated encryption with associated data) ciphers ++ ++# ++# Hashes, digests, and MACs ++# ++# CONFIG_CRYPTO_BLAKE2B is not set ++# CONFIG_CRYPTO_CMAC is not set ++# CONFIG_CRYPTO_GHASH is not set ++CONFIG_CRYPTO_HMAC=y ++# CONFIG_CRYPTO_MD4 is not set ++# CONFIG_CRYPTO_MD5 is not set ++# CONFIG_CRYPTO_MICHAEL_MIC is not set ++# CONFIG_CRYPTO_POLY1305 is not set ++# CONFIG_CRYPTO_RMD160 is not set ++# CONFIG_CRYPTO_SHA1 is not set ++CONFIG_CRYPTO_SHA256=y ++# CONFIG_CRYPTO_SHA512 is not set ++# CONFIG_CRYPTO_SHA3 is not set ++# CONFIG_CRYPTO_SM3_GENERIC is not set ++# CONFIG_CRYPTO_STREEBOG is not set ++# CONFIG_CRYPTO_VMAC is not set ++# CONFIG_CRYPTO_WP512 is not set ++# CONFIG_CRYPTO_XCBC is not set ++# CONFIG_CRYPTO_XXHASH is not set ++# end of Hashes, digests, and MACs ++ ++# ++# CRCs (cyclic redundancy checks) ++# ++CONFIG_CRYPTO_CRC32C=y ++CONFIG_CRYPTO_CRC32=y ++CONFIG_CRYPTO_CRCT10DIF=y ++CONFIG_CRYPTO_CRC64_ROCKSOFT=y ++# end of CRCs (cyclic redundancy checks) ++ ++# ++# Compression ++# ++# CONFIG_CRYPTO_DEFLATE is not set ++CONFIG_CRYPTO_LZO=y ++# CONFIG_CRYPTO_842 is not set ++# CONFIG_CRYPTO_LZ4 is not set ++# CONFIG_CRYPTO_LZ4HC is not set ++# CONFIG_CRYPTO_ZSTD is not set ++# end of Compression ++ ++# ++# Random number generation ++# ++# CONFIG_CRYPTO_ANSI_CPRNG is not set ++# CONFIG_CRYPTO_DRBG_MENU is not set ++# CONFIG_CRYPTO_JITTERENTROPY is not set ++CONFIG_CRYPTO_KDF800108_CTR=y ++# end of Random number generation ++ ++# ++# Userspace interface ++# ++# CONFIG_CRYPTO_USER_API_HASH is not set ++# CONFIG_CRYPTO_USER_API_SKCIPHER is not set ++# CONFIG_CRYPTO_USER_API_RNG is not set ++# CONFIG_CRYPTO_USER_API_AEAD is not set ++# end of Userspace interface ++ ++CONFIG_CRYPTO_HASH_INFO=y ++# CONFIG_CRYPTO_NHPOLY1305_NEON is not set ++ ++# ++# Accelerated Cryptographic Algorithms for CPU (arm64) ++# ++# CONFIG_CRYPTO_GHASH_ARM64_CE is not set ++# CONFIG_CRYPTO_SHA1_ARM64_CE is not set ++# CONFIG_CRYPTO_SHA256_ARM64 is not set ++# CONFIG_CRYPTO_SHA2_ARM64_CE is not set ++# CONFIG_CRYPTO_SHA512_ARM64 is not set ++# CONFIG_CRYPTO_SHA512_ARM64_CE is not set ++# CONFIG_CRYPTO_SHA3_ARM64 is not set ++# CONFIG_CRYPTO_SM3_NEON is not set ++# CONFIG_CRYPTO_SM3_ARM64_CE is not set ++# CONFIG_CRYPTO_POLYVAL_ARM64_CE is not set ++# CONFIG_CRYPTO_AES_ARM64 is not set ++# CONFIG_CRYPTO_AES_ARM64_CE is not set ++# CONFIG_CRYPTO_AES_ARM64_CE_BLK is not set ++# CONFIG_CRYPTO_AES_ARM64_NEON_BLK is not set ++# CONFIG_CRYPTO_AES_ARM64_BS is not set ++# CONFIG_CRYPTO_SM4_ARM64_CE is not set ++# CONFIG_CRYPTO_SM4_ARM64_CE_BLK is not set ++# CONFIG_CRYPTO_SM4_ARM64_NEON_BLK is not set ++# CONFIG_CRYPTO_AES_ARM64_CE_CCM is not set ++# CONFIG_CRYPTO_SM4_ARM64_CE_CCM is not set ++# CONFIG_CRYPTO_SM4_ARM64_CE_GCM is not set ++# CONFIG_CRYPTO_CRCT10DIF_ARM64_CE is not set ++# end of Accelerated Cryptographic Algorithms for CPU (arm64) ++ ++# CONFIG_CRYPTO_HW is not set ++CONFIG_ASYMMETRIC_KEY_TYPE=y ++CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y ++CONFIG_X509_CERTIFICATE_PARSER=y ++# CONFIG_PKCS8_PRIVATE_KEY_PARSER is not set ++CONFIG_PKCS7_MESSAGE_PARSER=y ++# CONFIG_FIPS_SIGNATURE_SELFTEST is not set ++ ++# ++# Certificates for signature checking ++# ++CONFIG_SYSTEM_TRUSTED_KEYRING=y ++CONFIG_SYSTEM_TRUSTED_KEYS="" ++# CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set ++# CONFIG_SECONDARY_TRUSTED_KEYRING is not set ++# CONFIG_SYSTEM_BLACKLIST_KEYRING is not set ++# end of Certificates for signature checking ++ ++CONFIG_BINARY_PRINTF=y ++ ++# ++# Library routines ++# ++CONFIG_LINEAR_RANGES=y ++# CONFIG_PACKING is not set ++CONFIG_BITREVERSE=y ++CONFIG_HAVE_ARCH_BITREVERSE=y ++CONFIG_GENERIC_STRNCPY_FROM_USER=y ++CONFIG_GENERIC_STRNLEN_USER=y ++CONFIG_GENERIC_NET_UTILS=y ++# CONFIG_CORDIC is not set ++# CONFIG_PRIME_NUMBERS is not set ++CONFIG_RATIONAL=y ++CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y ++CONFIG_ARCH_HAS_FAST_MULTIPLIER=y ++CONFIG_ARCH_USE_SYM_ANNOTATIONS=y ++# CONFIG_INDIRECT_PIO is not set ++# CONFIG_TRACE_MMIO_ACCESS is not set ++ ++# ++# Crypto library routines ++# ++CONFIG_CRYPTO_LIB_UTILS=y ++CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y ++# CONFIG_CRYPTO_LIB_CHACHA is not set ++# CONFIG_CRYPTO_LIB_CURVE25519 is not set ++CONFIG_CRYPTO_LIB_DES=y ++CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 ++# CONFIG_CRYPTO_LIB_POLY1305 is not set ++# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set ++CONFIG_CRYPTO_LIB_SHA1=y ++CONFIG_CRYPTO_LIB_SHA256=y ++# end of Crypto library routines ++ ++# CONFIG_CRC_CCITT is not set ++CONFIG_CRC16=y ++CONFIG_CRC_T10DIF=y ++CONFIG_CRC64_ROCKSOFT=y ++CONFIG_CRC_ITU_T=y ++CONFIG_CRC32=y ++# CONFIG_CRC32_SELFTEST is not set ++CONFIG_CRC32_SLICEBY8=y ++# CONFIG_CRC32_SLICEBY4 is not set ++# CONFIG_CRC32_SARWATE is not set ++# CONFIG_CRC32_BIT is not set ++CONFIG_CRC64=y ++# CONFIG_CRC4 is not set ++# CONFIG_CRC7 is not set ++CONFIG_LIBCRC32C=y ++# CONFIG_CRC8 is not set ++CONFIG_XXHASH=y ++CONFIG_AUDIT_GENERIC=y ++CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y ++CONFIG_AUDIT_COMPAT_GENERIC=y ++# CONFIG_RANDOM32_SELFTEST is not set ++CONFIG_ZLIB_INFLATE=y ++CONFIG_ZLIB_DEFLATE=y ++CONFIG_LZO_COMPRESS=y ++CONFIG_LZO_DECOMPRESS=y ++CONFIG_LZ4_DECOMPRESS=y ++CONFIG_ZSTD_COMMON=y ++CONFIG_ZSTD_COMPRESS=y ++CONFIG_ZSTD_DECOMPRESS=y ++CONFIG_XZ_DEC=y ++CONFIG_XZ_DEC_X86=y ++CONFIG_XZ_DEC_POWERPC=y ++CONFIG_XZ_DEC_ARM=y ++CONFIG_XZ_DEC_ARMTHUMB=y ++CONFIG_XZ_DEC_ARM64=y ++CONFIG_XZ_DEC_SPARC=y ++CONFIG_XZ_DEC_RISCV=y ++# CONFIG_XZ_DEC_MICROLZMA is not set ++CONFIG_XZ_DEC_BCJ=y ++# CONFIG_XZ_DEC_TEST is not set ++CONFIG_DECOMPRESS_GZIP=y ++CONFIG_DECOMPRESS_BZIP2=y ++CONFIG_DECOMPRESS_LZMA=y ++CONFIG_DECOMPRESS_XZ=y ++CONFIG_DECOMPRESS_LZO=y ++CONFIG_DECOMPRESS_LZ4=y ++CONFIG_DECOMPRESS_ZSTD=y ++CONFIG_GENERIC_ALLOCATOR=y ++CONFIG_REED_SOLOMON=y ++CONFIG_REED_SOLOMON_ENC8=y ++CONFIG_REED_SOLOMON_DEC8=y ++CONFIG_INTERVAL_TREE=y ++CONFIG_ASSOCIATIVE_ARRAY=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_IOPORT=y ++CONFIG_HAS_IOPORT_MAP=y ++CONFIG_HAS_DMA=y ++CONFIG_DMA_OPS_HELPERS=y ++CONFIG_NEED_SG_DMA_FLAGS=y ++CONFIG_NEED_SG_DMA_LENGTH=y ++CONFIG_NEED_DMA_MAP_STATE=y ++CONFIG_ARCH_DMA_ADDR_T_64BIT=y ++CONFIG_DMA_DECLARE_COHERENT=y ++CONFIG_ARCH_HAS_SETUP_DMA_OPS=y ++CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE=y ++CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU=y ++CONFIG_ARCH_HAS_DMA_PREP_COHERENT=y ++CONFIG_SWIOTLB=y ++# CONFIG_SWIOTLB_DYNAMIC is not set ++CONFIG_DMA_NEED_SYNC=y ++# CONFIG_DMA_RESTRICTED_POOL is not set ++CONFIG_DMA_NONCOHERENT_MMAP=y ++CONFIG_DMA_COHERENT_POOL=y ++CONFIG_DMA_DIRECT_REMAP=y ++CONFIG_DMA_CMA=y ++# CONFIG_DMA_NUMA_CMA is not set ++ ++# ++# Default contiguous memory area size: ++# ++CONFIG_CMA_SIZE_MBYTES=5 ++CONFIG_CMA_SIZE_SEL_MBYTES=y ++# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set ++# CONFIG_CMA_SIZE_SEL_MIN is not set ++# CONFIG_CMA_SIZE_SEL_MAX is not set ++CONFIG_CMA_ALIGNMENT=8 ++# CONFIG_DMA_API_DEBUG is not set ++# CONFIG_DMA_MAP_BENCHMARK is not set ++CONFIG_SGL_ALLOC=y ++CONFIG_CPU_RMAP=y ++CONFIG_DQL=y ++CONFIG_GLOB=y ++# CONFIG_GLOB_SELFTEST is not set ++CONFIG_NLATTR=y ++CONFIG_CLZ_TAB=y ++# CONFIG_IRQ_POLL is not set ++CONFIG_MPILIB=y ++CONFIG_DIMLIB=y ++CONFIG_LIBFDT=y ++CONFIG_OID_REGISTRY=y ++CONFIG_UCS2_STRING=y ++CONFIG_HAVE_GENERIC_VDSO=y ++CONFIG_GENERIC_GETTIMEOFDAY=y ++CONFIG_GENERIC_VDSO_TIME_NS=y ++CONFIG_VDSO_GETRANDOM=y ++CONFIG_FONT_SUPPORT=y ++# CONFIG_FONTS is not set ++CONFIG_FONT_8x8=y ++CONFIG_FONT_8x16=y ++CONFIG_SG_POOL=y ++CONFIG_ARCH_STACKWALK=y ++CONFIG_STACKDEPOT=y ++CONFIG_STACKDEPOT_MAX_FRAMES=64 ++CONFIG_SBITMAP=y ++# CONFIG_LWQ_TEST is not set ++# end of Library routines ++ ++CONFIG_GENERIC_IOREMAP=y ++CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y ++ ++# ++# Kernel hacking ++# ++ ++# ++# printk and dmesg options ++# ++CONFIG_PRINTK_TIME=y ++# CONFIG_PRINTK_CALLER is not set ++# CONFIG_STACKTRACE_BUILD_ID is not set ++CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 ++CONFIG_CONSOLE_LOGLEVEL_QUIET=4 ++CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 ++CONFIG_BOOT_PRINTK_DELAY=y ++# CONFIG_DYNAMIC_DEBUG is not set ++# CONFIG_DYNAMIC_DEBUG_CORE is not set ++CONFIG_SYMBOLIC_ERRNAME=y ++CONFIG_DEBUG_BUGVERBOSE=y ++# end of printk and dmesg options ++ ++CONFIG_DEBUG_KERNEL=y ++CONFIG_DEBUG_MISC=y ++ ++# ++# Compile-time checks and compiler options ++# ++CONFIG_AS_HAS_NON_CONST_ULEB128=y ++CONFIG_DEBUG_INFO_NONE=y ++# CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set ++# CONFIG_DEBUG_INFO_DWARF4 is not set ++# CONFIG_DEBUG_INFO_DWARF5 is not set ++CONFIG_FRAME_WARN=2048 ++# CONFIG_STRIP_ASM_SYMS is not set ++# CONFIG_READABLE_ASM is not set ++# CONFIG_HEADERS_INSTALL is not set ++# CONFIG_DEBUG_SECTION_MISMATCH is not set ++CONFIG_SECTION_MISMATCH_WARN_ONLY=y ++# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set ++CONFIG_ARCH_WANT_FRAME_POINTERS=y ++CONFIG_FRAME_POINTER=y ++# CONFIG_VMLINUX_MAP is not set ++# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set ++# end of Compile-time checks and compiler options ++ ++# ++# Generic Kernel Debugging Instruments ++# ++CONFIG_MAGIC_SYSRQ=y ++CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1f6 ++CONFIG_MAGIC_SYSRQ_SERIAL=y ++CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" ++CONFIG_DEBUG_FS=y ++CONFIG_DEBUG_FS_ALLOW_ALL=y ++# CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set ++# CONFIG_DEBUG_FS_ALLOW_NONE is not set ++CONFIG_HAVE_ARCH_KGDB=y ++CONFIG_KGDB=y ++CONFIG_KGDB_HONOUR_BLOCKLIST=y ++CONFIG_KGDB_SERIAL_CONSOLE=y ++# CONFIG_KGDB_TESTS is not set ++CONFIG_KGDB_KDB=y ++CONFIG_KDB_DEFAULT_ENABLE=0x1 ++CONFIG_KDB_KEYBOARD=y ++CONFIG_KDB_CONTINUE_CATASTROPHIC=0 ++CONFIG_ARCH_HAS_UBSAN=y ++# CONFIG_UBSAN is not set ++CONFIG_HAVE_ARCH_KCSAN=y ++CONFIG_HAVE_KCSAN_COMPILER=y ++# CONFIG_KCSAN is not set ++# end of Generic Kernel Debugging Instruments ++ ++# ++# Networking Debugging ++# ++# CONFIG_NET_DEV_REFCNT_TRACKER is not set ++# CONFIG_NET_NS_REFCNT_TRACKER is not set ++# CONFIG_DEBUG_NET is not set ++# end of Networking Debugging ++ ++# ++# Memory Debugging ++# ++# CONFIG_PAGE_EXTENSION is not set ++# CONFIG_DEBUG_PAGEALLOC is not set ++CONFIG_SLUB_DEBUG=y ++# CONFIG_SLUB_DEBUG_ON is not set ++# CONFIG_PAGE_OWNER is not set ++# CONFIG_PAGE_POISONING is not set ++# CONFIG_DEBUG_PAGE_REF is not set ++# CONFIG_DEBUG_RODATA_TEST is not set ++CONFIG_ARCH_HAS_DEBUG_WX=y ++# CONFIG_DEBUG_WX is not set ++CONFIG_GENERIC_PTDUMP=y ++# CONFIG_PTDUMP_DEBUGFS is not set ++CONFIG_HAVE_DEBUG_KMEMLEAK=y ++# CONFIG_DEBUG_KMEMLEAK is not set ++# CONFIG_PER_VMA_LOCK_STATS is not set ++# CONFIG_DEBUG_OBJECTS is not set ++# CONFIG_SHRINKER_DEBUG is not set ++# CONFIG_DEBUG_STACK_USAGE is not set ++# CONFIG_SCHED_STACK_END_CHECK is not set ++CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y ++# CONFIG_DEBUG_VM is not set ++# CONFIG_DEBUG_VM_PGTABLE is not set ++CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y ++# CONFIG_DEBUG_VIRTUAL is not set ++CONFIG_DEBUG_MEMORY_INIT=y ++# CONFIG_DEBUG_PER_CPU_MAPS is not set ++# CONFIG_MEM_ALLOC_PROFILING is not set ++CONFIG_HAVE_ARCH_KASAN=y ++CONFIG_HAVE_ARCH_KASAN_SW_TAGS=y ++CONFIG_HAVE_ARCH_KASAN_HW_TAGS=y ++CONFIG_HAVE_ARCH_KASAN_VMALLOC=y ++CONFIG_CC_HAS_KASAN_GENERIC=y ++CONFIG_CC_HAS_KASAN_SW_TAGS=y ++CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y ++# CONFIG_KASAN is not set ++CONFIG_HAVE_ARCH_KFENCE=y ++# CONFIG_KFENCE is not set ++# end of Memory Debugging ++ ++# CONFIG_DEBUG_SHIRQ is not set ++ ++# ++# Debug Oops, Lockups and Hangs ++# ++# CONFIG_PANIC_ON_OOPS is not set ++CONFIG_PANIC_ON_OOPS_VALUE=0 ++CONFIG_PANIC_TIMEOUT=0 ++# CONFIG_SOFTLOCKUP_DETECTOR is not set ++CONFIG_HAVE_HARDLOCKUP_DETECTOR_BUDDY=y ++# CONFIG_HARDLOCKUP_DETECTOR is not set ++CONFIG_DETECT_HUNG_TASK=y ++CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 ++# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set ++# CONFIG_WQ_WATCHDOG is not set ++# CONFIG_WQ_CPU_INTENSIVE_REPORT is not set ++# CONFIG_TEST_LOCKUP is not set ++# end of Debug Oops, Lockups and Hangs ++ ++# ++# Scheduler Debugging ++# ++CONFIG_SCHED_DEBUG=y ++CONFIG_SCHED_INFO=y ++CONFIG_SCHEDSTATS=y ++# end of Scheduler Debugging ++ ++# CONFIG_DEBUG_PREEMPT is not set ++ ++# ++# Lock Debugging (spinlocks, mutexes, etc...) ++# ++CONFIG_LOCK_DEBUGGING_SUPPORT=y ++# CONFIG_PROVE_LOCKING is not set ++# CONFIG_LOCK_STAT is not set ++# CONFIG_DEBUG_RT_MUTEXES is not set ++# CONFIG_DEBUG_SPINLOCK is not set ++# CONFIG_DEBUG_MUTEXES is not set ++# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set ++# CONFIG_DEBUG_RWSEMS is not set ++# CONFIG_DEBUG_LOCK_ALLOC is not set ++# CONFIG_DEBUG_ATOMIC_SLEEP is not set ++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set ++# CONFIG_LOCK_TORTURE_TEST is not set ++# CONFIG_WW_MUTEX_SELFTEST is not set ++# CONFIG_SCF_TORTURE_TEST is not set ++# CONFIG_CSD_LOCK_WAIT_DEBUG is not set ++# end of Lock Debugging (spinlocks, mutexes, etc...) ++ ++# CONFIG_DEBUG_IRQFLAGS is not set ++CONFIG_STACKTRACE=y ++# CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set ++# CONFIG_DEBUG_KOBJECT is not set ++ ++# ++# Debug kernel data structures ++# ++# CONFIG_DEBUG_LIST is not set ++# CONFIG_DEBUG_PLIST is not set ++# CONFIG_DEBUG_SG is not set ++# CONFIG_DEBUG_NOTIFIERS is not set ++# CONFIG_DEBUG_MAPLE_TREE is not set ++# end of Debug kernel data structures ++ ++# ++# RCU Debugging ++# ++# CONFIG_RCU_SCALE_TEST is not set ++# CONFIG_RCU_TORTURE_TEST is not set ++# CONFIG_RCU_REF_SCALE_TEST is not set ++CONFIG_RCU_CPU_STALL_TIMEOUT=21 ++CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 ++# CONFIG_RCU_CPU_STALL_CPUTIME is not set ++CONFIG_RCU_TRACE=y ++# CONFIG_RCU_EQS_DEBUG is not set ++# end of RCU Debugging ++ ++# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set ++# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set ++CONFIG_LATENCYTOP=y ++# CONFIG_DEBUG_CGROUP_REF is not set ++CONFIG_USER_STACKTRACE_SUPPORT=y ++CONFIG_NOP_TRACER=y ++CONFIG_HAVE_FUNCTION_TRACER=y ++CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y ++CONFIG_HAVE_FUNCTION_GRAPH_RETVAL=y ++CONFIG_HAVE_DYNAMIC_FTRACE=y ++CONFIG_HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y ++CONFIG_HAVE_DYNAMIC_FTRACE_WITH_CALL_OPS=y ++CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y ++CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y ++CONFIG_HAVE_SYSCALL_TRACEPOINTS=y ++CONFIG_HAVE_C_RECORDMCOUNT=y ++CONFIG_TRACER_MAX_TRACE=y ++CONFIG_TRACE_CLOCK=y ++CONFIG_RING_BUFFER=y ++CONFIG_EVENT_TRACING=y ++CONFIG_CONTEXT_SWITCH_TRACER=y ++CONFIG_TRACING=y ++CONFIG_GENERIC_TRACER=y ++CONFIG_TRACING_SUPPORT=y ++CONFIG_FTRACE=y ++# CONFIG_BOOTTIME_TRACING is not set ++CONFIG_FUNCTION_TRACER=y ++CONFIG_FUNCTION_GRAPH_TRACER=y ++# CONFIG_FUNCTION_GRAPH_RETVAL is not set ++CONFIG_DYNAMIC_FTRACE=y ++CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y ++CONFIG_DYNAMIC_FTRACE_WITH_CALL_OPS=y ++CONFIG_DYNAMIC_FTRACE_WITH_ARGS=y ++CONFIG_FUNCTION_PROFILER=y ++CONFIG_STACK_TRACER=y ++# CONFIG_IRQSOFF_TRACER is not set ++# CONFIG_PREEMPT_TRACER is not set ++CONFIG_SCHED_TRACER=y ++# CONFIG_HWLAT_TRACER is not set ++# CONFIG_OSNOISE_TRACER is not set ++# CONFIG_TIMERLAT_TRACER is not set ++CONFIG_FTRACE_SYSCALLS=y ++CONFIG_TRACER_SNAPSHOT=y ++# CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP is not set ++CONFIG_BRANCH_PROFILE_NONE=y ++# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set ++# CONFIG_PROFILE_ALL_BRANCHES is not set ++CONFIG_BLK_DEV_IO_TRACE=y ++CONFIG_KPROBE_EVENTS=y ++# CONFIG_KPROBE_EVENTS_ON_NOTRACE is not set ++# CONFIG_UPROBE_EVENTS is not set ++CONFIG_BPF_EVENTS=y ++CONFIG_DYNAMIC_EVENTS=y ++CONFIG_PROBE_EVENTS=y ++CONFIG_FTRACE_MCOUNT_RECORD=y ++CONFIG_FTRACE_MCOUNT_USE_PATCHABLE_FUNCTION_ENTRY=y ++# CONFIG_SYNTH_EVENTS is not set ++# CONFIG_USER_EVENTS is not set ++# CONFIG_HIST_TRIGGERS is not set ++# CONFIG_TRACE_EVENT_INJECT is not set ++# CONFIG_TRACEPOINT_BENCHMARK is not set ++# CONFIG_RING_BUFFER_BENCHMARK is not set ++# CONFIG_TRACE_EVAL_MAP_FILE is not set ++# CONFIG_FTRACE_RECORD_RECURSION is not set ++# CONFIG_FTRACE_VALIDATE_RCU_IS_WATCHING is not set ++# CONFIG_FTRACE_STARTUP_TEST is not set ++# CONFIG_RING_BUFFER_STARTUP_TEST is not set ++# CONFIG_RING_BUFFER_VALIDATE_TIME_DELTAS is not set ++# CONFIG_PREEMPTIRQ_DELAY_TEST is not set ++# CONFIG_KPROBE_EVENT_GEN_TEST is not set ++# CONFIG_RV is not set ++# CONFIG_SAMPLES is not set ++CONFIG_HAVE_SAMPLE_FTRACE_DIRECT=y ++CONFIG_HAVE_SAMPLE_FTRACE_DIRECT_MULTI=y ++# CONFIG_STRICT_DEVMEM is not set ++ ++# ++# arm64 Debugging ++# ++# CONFIG_PID_IN_CONTEXTIDR is not set ++# CONFIG_ARM64_RELOC_TEST is not set ++# CONFIG_CORESIGHT is not set ++# end of arm64 Debugging ++ ++# ++# Kernel Testing and Coverage ++# ++# CONFIG_KUNIT is not set ++# CONFIG_NOTIFIER_ERROR_INJECTION is not set ++# CONFIG_FUNCTION_ERROR_INJECTION is not set ++# CONFIG_FAULT_INJECTION is not set ++CONFIG_ARCH_HAS_KCOV=y ++CONFIG_CC_HAS_SANCOV_TRACE_PC=y ++# CONFIG_KCOV is not set ++CONFIG_RUNTIME_TESTING_MENU=y ++# CONFIG_TEST_DHRY is not set ++# CONFIG_LKDTM is not set ++# CONFIG_TEST_MIN_HEAP is not set ++# CONFIG_TEST_DIV64 is not set ++# CONFIG_TEST_MULDIV64 is not set ++# CONFIG_BACKTRACE_SELF_TEST is not set ++# CONFIG_TEST_REF_TRACKER is not set ++# CONFIG_RBTREE_TEST is not set ++# CONFIG_REED_SOLOMON_TEST is not set ++# CONFIG_INTERVAL_TREE_TEST is not set ++# CONFIG_PERCPU_TEST is not set ++# CONFIG_ATOMIC64_SELFTEST is not set ++# CONFIG_TEST_HEXDUMP is not set ++# CONFIG_TEST_KSTRTOX is not set ++# CONFIG_TEST_PRINTF is not set ++# CONFIG_TEST_SCANF is not set ++# CONFIG_TEST_BITMAP is not set ++# CONFIG_TEST_UUID is not set ++# CONFIG_TEST_XARRAY is not set ++# CONFIG_TEST_MAPLE_TREE is not set ++# CONFIG_TEST_RHASHTABLE is not set ++# CONFIG_TEST_IDA is not set ++# CONFIG_TEST_LKM is not set ++# CONFIG_TEST_BITOPS is not set ++# CONFIG_TEST_VMALLOC is not set ++# CONFIG_TEST_BPF is not set ++# CONFIG_TEST_BLACKHOLE_DEV is not set ++# CONFIG_FIND_BIT_BENCHMARK is not set ++# CONFIG_TEST_FIRMWARE is not set ++# CONFIG_TEST_SYSCTL is not set ++# CONFIG_TEST_UDELAY is not set ++# CONFIG_TEST_STATIC_KEYS is not set ++# CONFIG_TEST_KMOD is not set ++# CONFIG_TEST_MEMCAT_P is not set ++# CONFIG_TEST_MEMINIT is not set ++# CONFIG_TEST_FREE_PAGES is not set ++# CONFIG_TEST_FPU is not set ++# CONFIG_TEST_OBJPOOL is not set ++CONFIG_ARCH_USE_MEMTEST=y ++# CONFIG_MEMTEST is not set ++# end of Kernel Testing and Coverage ++ ++# ++# Rust hacking ++# ++# end of Rust hacking ++# end of Kernel hacking diff --git a/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0001-bcm2711-rpi-4-b.dts.patch b/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0001-bcm2711-rpi-4-b.dts.patch new file mode 100644 index 0000000..035cdcd --- /dev/null +++ b/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0001-bcm2711-rpi-4-b.dts.patch @@ -0,0 +1,16 @@ +--- /home/rossierd/soo/micofe/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm/boot/dts/broadcom/bcm2711-rpi-4-b.dts 2026-02-08 10:06:33.233425534 +0100 ++++ ./arch/arm/boot/dts/broadcom/bcm2711-rpi-4-b.dts 2026-02-08 10:08:04.534348082 +0100 +@@ -19,11 +19,12 @@ + compatible = "raspberrypi,4-model-b", "brcm,bcm2711"; + model = "Raspberry Pi 4 Model B"; + ++#if 0 + chosen { + /* 8250 auxiliary UART instead of pl011 */ + stdout-path = "serial1:115200n8"; + }; +- ++#endif + cam1_reg: regulator-cam1 { + compatible = "regulator-fixed"; + regulator-name = "cam1-reg"; diff --git a/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0002-bcm270x.dtsi.patch b/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0002-bcm270x.dtsi.patch new file mode 100644 index 0000000..5b58340 --- /dev/null +++ b/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0002-bcm270x.dtsi.patch @@ -0,0 +1,206 @@ +--- /home/rossierd/soo/micofe/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/boot/dts/broadcom/bcm270x.dtsi 1970-01-01 01:00:00.000000000 +0100 ++++ ./arch/arm64/boot/dts/broadcom/bcm270x.dtsi 2026-02-08 09:42:02.534483721 +0100 +@@ -0,0 +1,203 @@ ++/* Downstream bcm283x.dtsi diff */ ++#include ++ ++/ { ++ chosen { ++ bootargs = "coherent_pool=1M snd_bcm2835.enable_compat_alsa=0 snd_bcm2835.enable_hdmi=1"; ++ /delete-property/ stdout-path; ++ }; ++ ++ soc: soc { ++ ++ watchdog: watchdog@7e100000 { ++ /* Add label */ ++ }; ++ ++ random: rng@7e104000 { ++ /* Add label */ ++ }; ++ ++ spi0: spi@7e204000 { ++ /* Add label */ ++ }; ++ ++#ifndef BCM2711 ++ pixelvalve0: pixelvalve@7e206000 { ++ /* Add label */ ++ status = "disabled"; ++ }; ++ ++ pixelvalve1: pixelvalve@7e207000 { ++ /* Add label */ ++ status = "disabled"; ++ }; ++#endif ++ ++ /delete-node/ sdhci@7e300000; ++ ++ sdhci: mmc: mmc@7e300000 { ++ compatible = "brcm,bcm2835-mmc", "brcm,bcm2835-sdhci"; ++ reg = <0x7e300000 0x100>; ++ interrupts = <2 30>; ++ clocks = <&clocks BCM2835_CLOCK_EMMC>; ++ dmas = <&dma 11>; ++ dma-names = "rx-tx"; ++ brcm,overclock-50 = <0>; ++ status = "disabled"; ++ }; ++ ++ /* A clone of mmc but with non-removable set */ ++ mmcnr: mmcnr@7e300000 { ++ compatible = "brcm,bcm2835-mmc", "brcm,bcm2835-sdhci"; ++ reg = <0x7e300000 0x100>; ++ interrupts = <2 30>; ++ clocks = <&clocks BCM2835_CLOCK_EMMC>; ++ dmas = <&dma 11>; ++ dma-names = "rx-tx"; ++ brcm,overclock-50 = <0>; ++ non-removable; ++ status = "disabled"; ++ }; ++ ++ hvs: hvs@7e400000 { ++ /* Add label */ ++ status = "disabled"; ++ }; ++ ++ firmwarekms: firmwarekms@7e600000 { ++ compatible = "raspberrypi,rpi-firmware-kms"; ++ /* SMI interrupt reg */ ++ reg = <0x7e600000 0x100>; ++ interrupts = <2 16>; ++ brcm,firmware = <&firmware>; ++ status = "disabled"; ++ }; ++ ++ smi: smi@7e600000 { ++ compatible = "brcm,bcm2835-smi"; ++ reg = <0x7e600000 0x100>; ++ interrupts = <2 16>; ++ clocks = <&clocks BCM2835_CLOCK_SMI>; ++ assigned-clocks = <&clocks BCM2835_CLOCK_SMI>; ++ assigned-clock-rates = <125000000>; ++ dmas = <&dma 4>; ++ dma-names = "rx-tx"; ++ status = "disabled"; ++ }; ++ ++ csi0: csi@7e800000 { ++ compatible = "brcm,bcm2835-unicam"; ++ reg = <0x7e800000 0x800>, ++ <0x7e802000 0x4>; ++ interrupts = <2 6>; ++ clocks = <&clocks BCM2835_CLOCK_CAM0>, ++ <&firmware_clocks 4>; ++ clock-names = "lp", "vpu"; ++ power-domains = <&power RPI_POWER_DOMAIN_UNICAM0>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ #clock-cells = <1>; ++ status = "disabled"; ++ }; ++ ++ csi1: csi@7e801000 { ++ compatible = "brcm,bcm2835-unicam"; ++ reg = <0x7e801000 0x800>, ++ <0x7e802004 0x4>; ++ interrupts = <2 7>; ++ clocks = <&clocks BCM2835_CLOCK_CAM1>, ++ <&firmware_clocks 4>; ++ clock-names = "lp", "vpu"; ++ power-domains = <&power RPI_POWER_DOMAIN_UNICAM1>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ #clock-cells = <1>; ++ status = "disabled"; ++ }; ++ ++#ifndef BCM2711 ++ pixelvalve2: pixelvalve@7e807000 { ++ /* Add label */ ++ status = "disabled"; ++ }; ++#endif ++ ++ hdmi@7e902000 { /* hdmi */ ++ status = "disabled"; ++ }; ++ ++ usb@7e980000 { /* usb */ ++ compatible = "brcm,bcm2708-usb"; ++ reg = <0x7e980000 0x10000>, ++ <0x7e006000 0x1000>; ++ interrupt-names = "usb", ++ "soft"; ++ interrupts = <1 9>, ++ <2 0>; ++ }; ++ ++#ifndef BCM2711 ++ v3d@7ec00000 { /* vd3 */ ++ compatible = "brcm,vc4-v3d"; ++ power-domains = <&power RPI_POWER_DOMAIN_V3D>; ++ status = "disabled"; ++ }; ++#endif ++ ++ axiperf: axiperf { ++ compatible = "brcm,bcm2835-axiperf"; ++ reg = <0x7e009800 0x100>, ++ <0x7ee08000 0x100>; ++ firmware = <&firmware>; ++ status = "disabled"; ++ }; ++ }; ++ ++ __overrides__ { ++ cam0-pwdn-ctrl; ++ cam0-pwdn; ++ cam0-led-ctrl; ++ cam0-led; ++ }; ++}; ++ ++&gpio { ++ interrupts = <2 17>, <2 18>; ++ ++ dpi_18bit_gpio0: dpi_18bit_gpio0 { ++ brcm,pins = <0 1 2 3 4 5 6 7 8 9 10 11 ++ 12 13 14 15 16 17 18 19 ++ 20 21>; ++ brcm,function = ; ++ }; ++ dpi_18bit_gpio2: dpi_18bit_gpio2 { ++ brcm,pins = <2 3 4 5 6 7 8 9 10 11 ++ 12 13 14 15 16 17 18 19 ++ 20 21>; ++ brcm,function = ; ++ }; ++}; ++ ++&uart0 { ++ /* Enable CTS bug workaround */ ++ cts-event-workaround; ++}; ++ ++&i2s { ++ #sound-dai-cells = <0>; ++ dmas = <&dma 2>, <&dma 3>; ++ dma-names = "tx", "rx"; ++}; ++ ++&sdhost { ++ dmas = <&dma (13|(1<<29))>; ++ dma-names = "rx-tx"; ++ bus-width = <4>; ++ brcm,overclock-50 = <0>; ++ brcm,pio-limit = <1>; ++}; ++ ++&spi0 { ++ dmas = <&dma 6>, <&dma 7>; ++ dma-names = "tx", "rx"; ++}; diff --git a/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0003-bcm270x-rpi.dtsi.patch b/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0003-bcm270x-rpi.dtsi.patch new file mode 100644 index 0000000..c19341d --- /dev/null +++ b/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0003-bcm270x-rpi.dtsi.patch @@ -0,0 +1,160 @@ +--- /home/rossierd/soo/micofe/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/boot/dts/broadcom/bcm270x-rpi.dtsi 1970-01-01 01:00:00.000000000 +0100 ++++ ./arch/arm64/boot/dts/broadcom/bcm270x-rpi.dtsi 2026-02-08 09:42:02.534496569 +0100 +@@ -0,0 +1,157 @@ ++/* Downstream modifications to bcm2835-rpi.dtsi */ ++ ++/ { ++ aliases { ++ audio = &audio; ++ aux = &aux; ++ sound = &sound; ++ soc = &soc; ++ dma = &dma; ++ intc = &intc; ++ watchdog = &watchdog; ++ random = &random; ++ mailbox = &mailbox; ++ ++ /* SOO.tech - avoid a compilation warning */ ++ /*gpio = &gpio;*/ ++ ++ uart0 = &uart0; ++ uart1 = &uart1; ++ sdhost = &sdhost; ++ mmc = &mmc; ++ mmc1 = &mmc; ++ mmc0 = &sdhost; ++ i2s = &i2s; ++ i2c0 = &i2c0; ++ i2c1 = &i2c1; ++ i2c10 = &i2c_csi_dsi; ++ spi0 = &spi0; ++ spi1 = &spi1; ++ spi2 = &spi2; ++ usb = &usb; ++ leds = &leds; ++ fb = &fb; ++ thermal = &thermal; ++ axiperf = &axiperf; ++ }; ++ ++ /* Define these notional regulators for use by overlays */ ++ vdd_3v3_reg: fixedregulator_3v3 { ++ compatible = "regulator-fixed"; ++ regulator-always-on; ++ regulator-max-microvolt = <3300000>; ++ regulator-min-microvolt = <3300000>; ++ regulator-name = "3v3"; ++ }; ++ ++ vdd_5v0_reg: fixedregulator_5v0 { ++ compatible = "regulator-fixed"; ++ regulator-always-on; ++ regulator-max-microvolt = <5000000>; ++ regulator-min-microvolt = <5000000>; ++ regulator-name = "5v0"; ++ }; ++ ++ leds: leds { ++ compatible = "gpio-leds"; ++ }; ++ ++ soc { ++ gpiomem { ++ compatible = "brcm,bcm2835-gpiomem"; ++ reg = <0x7e200000 0x1000>; ++ }; ++ ++ fb: fb { ++ compatible = "brcm,bcm2708-fb"; ++ firmware = <&firmware>; ++ status = "okay"; ++ }; ++ ++ vcsm: vcsm { ++ compatible = "raspberrypi,bcm2835-vcsm"; ++ firmware = <&firmware>; ++ status = "okay"; ++ }; ++ ++ /* External sound card */ ++ sound: sound { ++ status = "disabled"; ++ }; ++ }; ++ ++ __overrides__ { ++ cache_line_size; ++ ++ uart0 = <&uart0>,"status"; ++ uart1 = <&uart1>,"status"; ++ i2s = <&i2s>,"status"; ++ spi = <&spi0>,"status"; ++ i2c0 = <&i2c0if>,"status",<&i2c0mux>,"status"; ++ i2c1 = <&i2c1>,"status"; ++ i2c0_baudrate = <&i2c0if>,"clock-frequency:0"; ++ i2c1_baudrate = <&i2c1>,"clock-frequency:0"; ++ ++ audio = <&audio>,"status"; ++ watchdog = <&watchdog>,"status"; ++ random = <&random>,"status"; ++ sd_overclock = <&sdhost>,"brcm,overclock-50:0"; ++ sd_force_pio = <&sdhost>,"brcm,force-pio?"; ++ sd_pio_limit = <&sdhost>,"brcm,pio-limit:0"; ++ sd_debug = <&sdhost>,"brcm,debug"; ++ sdio_overclock = <&mmc>,"brcm,overclock-50:0", ++ <&mmcnr>,"brcm,overclock-50:0"; ++ axiperf = <&axiperf>,"status"; ++ }; ++}; ++ ++&uart0 { ++ skip-init; ++}; ++ ++&uart1 { ++ skip-init; ++}; ++ ++&txp { ++ status = "disabled"; ++}; ++ ++&i2c0if { ++ status = "disabled"; ++}; ++ ++&i2c0mux { ++ status = "disabled"; ++}; ++ ++&i2c1 { ++ status = "disabled"; ++}; ++ ++&clocks { ++ firmware = <&firmware>; ++}; ++ ++&sdhci { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&emmc_gpio48>; ++ bus-width = <4>; ++}; ++ ++&cpu_thermal { ++ /delete-node/ trips; ++}; ++ ++&vec { ++ status = "disabled"; ++}; ++ ++&vchiq { ++ /* Onboard audio */ ++ audio: bcm2835_audio { ++ compatible = "brcm,bcm2835-audio"; ++ brcm,pwm-channels = <8>; ++ status = "disabled"; ++ }; ++}; diff --git a/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0004-bcm2711.dtsi.patch b/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0004-bcm2711.dtsi.patch new file mode 100644 index 0000000..87c5096 --- /dev/null +++ b/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0004-bcm2711.dtsi.patch @@ -0,0 +1,1164 @@ +--- /home/rossierd/soo/micofe/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/boot/dts/broadcom/bcm2711.dtsi 1970-01-01 01:00:00.000000000 +0100 ++++ ./arch/arm64/boot/dts/broadcom/bcm2711.dtsi 2026-02-08 09:42:02.534510156 +0100 +@@ -0,0 +1,1161 @@ ++// SPDX-License-Identifier: GPL-2.0 ++#include "bcm283x.dtsi" ++ ++#include ++#include ++ ++/ { ++ compatible = "brcm,bcm2711"; ++ ++ #address-cells = <2>; ++ #size-cells = <1>; ++ ++ interrupt-parent = <&gicv2>; ++ ++ vc4: gpu { ++ compatible = "brcm,bcm2711-vc5"; ++ status = "disabled"; ++ }; ++ ++ clk_27MHz: clk-27M { ++ #clock-cells = <0>; ++ compatible = "fixed-clock"; ++ clock-frequency = <27000000>; ++ clock-output-names = "27MHz-clock"; ++ }; ++ ++ clk_108MHz: clk-108M { ++ #clock-cells = <0>; ++ compatible = "fixed-clock"; ++ clock-frequency = <108000000>; ++ clock-output-names = "108MHz-clock"; ++ }; ++ ++ soc { ++ /* ++ * Defined ranges: ++ * Common BCM283x peripherals ++ * BCM2711-specific peripherals ++ * ARM-local peripherals ++ */ ++ ranges = <0x7e000000 0x0 0xfe000000 0x01800000>, ++ <0x7c000000 0x0 0xfc000000 0x02000000>, ++ <0x40000000 0x0 0xff800000 0x00800000>; ++ /* Emulate a contiguous 30-bit address range for DMA */ ++ dma-ranges = <0xc0000000 0x0 0x00000000 0x40000000>; ++ ++ /* ++ * This node is the provider for the enable-method for ++ * bringing up secondary cores. ++ */ ++ local_intc: local_intc@40000000 { ++ compatible = "brcm,bcm2836-l1-intc"; ++ reg = <0x40000000 0x100>; ++ }; ++ ++ gicv2: interrupt-controller@40041000 { ++ interrupt-controller; ++ #interrupt-cells = <3>; ++ compatible = "arm,gic-400"; ++ reg = <0x40041000 0x1000>, ++ <0x40042000 0x2000>, ++ <0x40044000 0x2000>, ++ <0x40046000 0x2000>; ++ interrupts = ; ++ }; ++ ++ avs_monitor: avs-monitor@7d5d2000 { ++ compatible = "brcm,bcm2711-avs-monitor", ++ "syscon", "simple-mfd"; ++ reg = <0x7d5d2000 0xf00>; ++ ++ thermal: thermal { ++ compatible = "brcm,bcm2711-thermal"; ++ #thermal-sensor-cells = <0>; ++ }; ++ }; ++ ++ dma: dma@7e007000 { ++ compatible = "brcm,bcm2835-dma"; ++ reg = <0x7e007000 0xb00>; ++ interrupts = , ++ , ++ , ++ , ++ , ++ , ++ , ++ /* DMA lite 7 - 10 */ ++ , ++ , ++ , ++ ; ++ interrupt-names = "dma0", ++ "dma1", ++ "dma2", ++ "dma3", ++ "dma4", ++ "dma5", ++ "dma6", ++ "dma7", ++ "dma8", ++ "dma9", ++ "dma10"; ++ #dma-cells = <1>; ++ brcm,dma-channel-mask = <0x07f5>; ++ }; ++ ++ pm: watchdog@7e100000 { ++ compatible = "brcm,bcm2835-pm", "brcm,bcm2835-pm-wdt"; ++ #power-domain-cells = <1>; ++ #reset-cells = <1>; ++ reg = <0x7e100000 0x114>, ++ <0x7e00a000 0x24>, ++ <0x7ec11000 0x20>; ++ clocks = <&clocks BCM2835_CLOCK_V3D>, ++ <&clocks BCM2835_CLOCK_PERI_IMAGE>, ++ <&clocks BCM2835_CLOCK_H264>, ++ <&clocks BCM2835_CLOCK_ISP>; ++ clock-names = "v3d", "peri_image", "h264", "isp"; ++ system-power-controller; ++ }; ++ ++ rng@7e104000 { ++ compatible = "brcm,bcm2711-rng200"; ++ reg = <0x7e104000 0x28>; ++ }; ++ ++ uart2: serial@7e201400 { ++ compatible = "arm,pl011", "arm,primecell"; ++ reg = <0x7e201400 0x200>; ++ interrupts = ; ++ clocks = <&clocks BCM2835_CLOCK_UART>, ++ <&clocks BCM2835_CLOCK_VPU>; ++ clock-names = "uartclk", "apb_pclk"; ++ arm,primecell-periphid = <0x00241011>; ++ status = "disabled"; ++ }; ++ ++ uart3: serial@7e201600 { ++ compatible = "arm,pl011", "arm,primecell"; ++ reg = <0x7e201600 0x200>; ++ interrupts = ; ++ clocks = <&clocks BCM2835_CLOCK_UART>, ++ <&clocks BCM2835_CLOCK_VPU>; ++ clock-names = "uartclk", "apb_pclk"; ++ arm,primecell-periphid = <0x00241011>; ++ status = "disabled"; ++ }; ++ ++ uart4: serial@7e201800 { ++ compatible = "arm,pl011", "arm,primecell"; ++ reg = <0x7e201800 0x200>; ++ interrupts = ; ++ clocks = <&clocks BCM2835_CLOCK_UART>, ++ <&clocks BCM2835_CLOCK_VPU>; ++ clock-names = "uartclk", "apb_pclk"; ++ arm,primecell-periphid = <0x00241011>; ++ status = "disabled"; ++ }; ++ ++ uart5: serial@7e201a00 { ++ compatible = "arm,pl011", "arm,primecell"; ++ reg = <0x7e201a00 0x200>; ++ interrupts = ; ++ clocks = <&clocks BCM2835_CLOCK_UART>, ++ <&clocks BCM2835_CLOCK_VPU>; ++ clock-names = "uartclk", "apb_pclk"; ++ arm,primecell-periphid = <0x00241011>; ++ status = "disabled"; ++ }; ++ ++ spi3: spi@7e204600 { ++ compatible = "brcm,bcm2835-spi"; ++ reg = <0x7e204600 0x0200>; ++ interrupts = ; ++ clocks = <&clocks BCM2835_CLOCK_VPU>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "disabled"; ++ }; ++ ++ spi4: spi@7e204800 { ++ compatible = "brcm,bcm2835-spi"; ++ reg = <0x7e204800 0x0200>; ++ interrupts = ; ++ clocks = <&clocks BCM2835_CLOCK_VPU>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "disabled"; ++ }; ++ ++ spi5: spi@7e204a00 { ++ compatible = "brcm,bcm2835-spi"; ++ reg = <0x7e204a00 0x0200>; ++ interrupts = ; ++ clocks = <&clocks BCM2835_CLOCK_VPU>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "disabled"; ++ }; ++ ++ spi6: spi@7e204c00 { ++ compatible = "brcm,bcm2835-spi"; ++ reg = <0x7e204c00 0x0200>; ++ interrupts = ; ++ clocks = <&clocks BCM2835_CLOCK_VPU>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "disabled"; ++ }; ++ ++ i2c3: i2c@7e205600 { ++ compatible = "brcm,bcm2711-i2c", "brcm,bcm2835-i2c"; ++ reg = <0x7e205600 0x200>; ++ interrupts = ; ++ clocks = <&clocks BCM2835_CLOCK_VPU>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "disabled"; ++ }; ++ ++ i2c4: i2c@7e205800 { ++ compatible = "brcm,bcm2711-i2c", "brcm,bcm2835-i2c"; ++ reg = <0x7e205800 0x200>; ++ interrupts = ; ++ clocks = <&clocks BCM2835_CLOCK_VPU>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "disabled"; ++ }; ++ ++ i2c5: i2c@7e205a00 { ++ compatible = "brcm,bcm2711-i2c", "brcm,bcm2835-i2c"; ++ reg = <0x7e205a00 0x200>; ++ interrupts = ; ++ clocks = <&clocks BCM2835_CLOCK_VPU>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "disabled"; ++ }; ++ ++ i2c6: i2c@7e205c00 { ++ compatible = "brcm,bcm2711-i2c", "brcm,bcm2835-i2c"; ++ reg = <0x7e205c00 0x200>; ++ interrupts = ; ++ clocks = <&clocks BCM2835_CLOCK_VPU>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "disabled"; ++ }; ++ ++ pixelvalve0: pixelvalve@7e206000 { ++ compatible = "brcm,bcm2711-pixelvalve0"; ++ reg = <0x7e206000 0x100>; ++ interrupts = ; ++ status = "disabled"; ++ }; ++ ++ pixelvalve1: pixelvalve@7e207000 { ++ compatible = "brcm,bcm2711-pixelvalve1"; ++ reg = <0x7e207000 0x100>; ++ interrupts = ; ++ status = "disabled"; ++ }; ++ ++ pixelvalve2: pixelvalve@7e20a000 { ++ compatible = "brcm,bcm2711-pixelvalve2"; ++ reg = <0x7e20a000 0x100>; ++ interrupts = ; ++ status = "disabled"; ++ }; ++ ++ pwm1: pwm@7e20c800 { ++ compatible = "brcm,bcm2835-pwm"; ++ reg = <0x7e20c800 0x28>; ++ clocks = <&clocks BCM2835_CLOCK_PWM>; ++ assigned-clocks = <&clocks BCM2835_CLOCK_PWM>; ++ assigned-clock-rates = <10000000>; ++ #pwm-cells = <2>; ++ status = "disabled"; ++ }; ++ ++ pixelvalve4: pixelvalve@7e216000 { ++ compatible = "brcm,bcm2711-pixelvalve4"; ++ reg = <0x7e216000 0x100>; ++ interrupts = ; ++ status = "disabled"; ++ }; ++ ++ hvs: hvs@7e400000 { ++ compatible = "brcm,bcm2711-hvs"; ++ interrupts = ; ++ }; ++ ++ pixelvalve3: pixelvalve@7ec12000 { ++ compatible = "brcm,bcm2711-pixelvalve3"; ++ reg = <0x7ec12000 0x100>; ++ interrupts = ; ++ status = "disabled"; ++ }; ++ ++ dvp: clock@7ef00000 { ++ compatible = "brcm,brcm2711-dvp"; ++ reg = <0x7ef00000 0x10>; ++ clocks = <&clk_108MHz>; ++ #clock-cells = <1>; ++ #reset-cells = <1>; ++ }; ++ ++ aon_intr: interrupt-controller@7ef00100 { ++ compatible = "brcm,bcm2711-l2-intc", "brcm,l2-intc"; ++ reg = <0x7ef00100 0x30>; ++ interrupts = ; ++ interrupt-controller; ++ #interrupt-cells = <1>; ++ status = "disabled"; ++ }; ++ ++ hdmi0: hdmi@7ef00700 { ++ compatible = "brcm,bcm2711-hdmi0"; ++ reg = <0x7ef00700 0x300>, ++ <0x7ef00300 0x200>, ++ <0x7ef00f00 0x80>, ++ <0x7ef00f80 0x80>, ++ <0x7ef01b00 0x200>, ++ <0x7ef01f00 0x400>, ++ <0x7ef00200 0x80>, ++ <0x7ef04300 0x100>, ++ <0x7ef20000 0x100>, ++ <0x7ef00100 0x30>; ++ reg-names = "hdmi", ++ "dvp", ++ "phy", ++ "rm", ++ "packet", ++ "metadata", ++ "csc", ++ "cec", ++ "hd", ++ "intr2"; ++ clocks = <&firmware_clocks 13>, ++ <&firmware_clocks 14>, ++ <&dvp 0>, ++ <&clk_27MHz>; ++ clock-names = "hdmi", "bvb", "audio", "cec"; ++ resets = <&dvp 0>; ++ interrupt-parent = <&aon_intr>; ++ interrupts = <0>, <1>, <2>, ++ <3>, <4>, <5>; ++ interrupt-names = "cec-tx", "cec-rx", "cec-low", ++ "wakeup", "hpd-connected", "hpd-removed"; ++ ddc = <&ddc0>; ++ dmas = <&dma 10>; ++ dma-names = "audio-rx"; ++ status = "disabled"; ++ }; ++ ++ ddc0: i2c@7ef04500 { ++ compatible = "brcm,bcm2711-hdmi-i2c"; ++ reg = <0x7ef04500 0x100>, <0x7ef00b00 0x300>; ++ reg-names = "bsc", "auto-i2c"; ++ clock-frequency = <97500>; ++ status = "disabled"; ++ }; ++ ++ hdmi1: hdmi@7ef05700 { ++ compatible = "brcm,bcm2711-hdmi1"; ++ reg = <0x7ef05700 0x300>, ++ <0x7ef05300 0x200>, ++ <0x7ef05f00 0x80>, ++ <0x7ef05f80 0x80>, ++ <0x7ef06b00 0x200>, ++ <0x7ef06f00 0x400>, ++ <0x7ef00280 0x80>, ++ <0x7ef09300 0x100>, ++ <0x7ef20000 0x100>, ++ <0x7ef00100 0x30>; ++ reg-names = "hdmi", ++ "dvp", ++ "phy", ++ "rm", ++ "packet", ++ "metadata", ++ "csc", ++ "cec", ++ "hd", ++ "intr2"; ++ ddc = <&ddc1>; ++ clock-names = "hdmi", "bvb", "audio", "cec"; ++ clocks = <&firmware_clocks 13>, ++ <&firmware_clocks 14>, ++ <&dvp 0>, ++ <&clk_27MHz>; ++ resets = <&dvp 1>; ++ interrupt-parent = <&aon_intr>; ++ interrupts = <8>, <7>, <6>, ++ <9>, <10>, <11>; ++ interrupt-names = "cec-tx", "cec-rx", "cec-low", ++ "wakeup", "hpd-connected", "hpd-removed"; ++ dmas = <&dma 17>; ++ dma-names = "audio-rx"; ++ status = "disabled"; ++ }; ++ ++ ddc1: i2c@7ef09500 { ++ compatible = "brcm,bcm2711-hdmi-i2c"; ++ reg = <0x7ef09500 0x100>, <0x7ef05b00 0x300>; ++ reg-names = "bsc", "auto-i2c"; ++ clock-frequency = <97500>; ++ status = "disabled"; ++ }; ++ }; ++ ++ /* ++ * emmc2 has different DMA constraints based on SoC revisions. It was ++ * moved into its own bus, so as for RPi4's firmware to update them. ++ * The firmware will find whether the emmc2bus alias is defined, and if ++ * so, it'll edit the dma-ranges property below accordingly. ++ */ ++ emmc2bus: emmc2bus { ++ compatible = "simple-bus"; ++ #address-cells = <2>; ++ #size-cells = <1>; ++ ++ ranges = <0x0 0x7e000000 0x0 0xfe000000 0x01800000>; ++ dma-ranges = <0x0 0xc0000000 0x0 0x00000000 0x40000000>; ++ ++ emmc2: emmc2@7e340000 { ++ compatible = "brcm,bcm2711-emmc2"; ++ reg = <0x0 0x7e340000 0x100>; ++ interrupts = ; ++ clocks = <&clocks BCM2711_CLOCK_EMMC2>; ++ status = "disabled"; ++ }; ++ }; ++ ++ arm-pmu { ++ compatible = "arm,cortex-a72-pmu", "arm,armv8-pmuv3"; ++ interrupts = , ++ , ++ , ++ ; ++ interrupt-affinity = <&cpu0>, <&cpu1>, <&cpu2>, <&cpu3>; ++ }; ++ ++ timer { ++ compatible = "arm,armv8-timer"; ++ interrupts = , ++ , ++ , ++ ; ++ /* This only applies to the ARMv7 stub */ ++ arm,cpu-registers-not-fw-configured; ++ }; ++ ++ cpus: cpus { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ enable-method = "brcm,bcm2836-smp"; // for ARM 32-bit ++ ++ cpu0: cpu@0 { ++ device_type = "cpu"; ++ compatible = "arm,cortex-a72"; ++ reg = <0>; ++ enable-method = "spin-table"; ++ cpu-release-addr = <0x0 0x000000d8>; ++ }; ++ ++ cpu1: cpu@1 { ++ device_type = "cpu"; ++ compatible = "arm,cortex-a72"; ++ reg = <1>; ++ enable-method = "spin-table"; ++ cpu-release-addr = <0x0 0x000000e0>; ++ }; ++ ++ cpu2: cpu@2 { ++ device_type = "cpu"; ++ compatible = "arm,cortex-a72"; ++ reg = <2>; ++ enable-method = "spin-table"; ++ cpu-release-addr = <0x0 0x000000e8>; ++ }; ++ ++ cpu3: cpu@3 { ++ device_type = "cpu"; ++ compatible = "arm,cortex-a72"; ++ reg = <3>; ++ enable-method = "spin-table"; ++ cpu-release-addr = <0x0 0x000000f0>; ++ }; ++ }; ++ ++ scb { ++ compatible = "simple-bus"; ++ #address-cells = <2>; ++ #size-cells = <2>; ++ ++ ranges = <0x0 0x7c000000 0x0 0xfc000000 0x0 0x03800000>, ++ <0x6 0x00000000 0x6 0x00000000 0x0 0x40000000>; ++ ++ pcie0: pcie@7d500000 { ++ compatible = "brcm,bcm2711-pcie"; ++ reg = <0x0 0x7d500000 0x0 0x9310>; ++ device_type = "pci"; ++ #address-cells = <3>; ++ #interrupt-cells = <1>; ++ #size-cells = <2>; ++ interrupts = , ++ ; ++ interrupt-names = "pcie", "msi"; ++ interrupt-map-mask = <0x0 0x0 0x0 0x7>; ++ interrupt-map = <0 0 0 1 &gicv2 GIC_SPI 143 ++ IRQ_TYPE_LEVEL_HIGH>; ++ msi-controller; ++ msi-parent = <&pcie0>; ++ ++ ranges = <0x02000000 0x0 0xc0000000 0x6 0x00000000 ++ 0x0 0x40000000>; ++ /* ++ * The wrapper around the PCIe block has a bug ++ * preventing it from accessing beyond the first 3GB of ++ * memory. ++ */ ++ dma-ranges = <0x02000000 0x0 0x00000000 0x0 0x00000000 ++ 0x0 0xc0000000>; ++ brcm,enable-ssc; ++ }; ++ ++#if 1 /* OpenCN */ ++ genet: ethernet@7d580000 { ++ compatible = "brcm,bcm2711-genet-v5"; ++ reg = <0x00 0x7d580000 0x00 0x10000>; ++ #address-cells = <0x01>; ++ #size-cells = <0x01>; ++ interrupts = <0x00 0x9d 0x04 0x00 0x9e 0x04>; ++ status = "okay"; ++ phy-handle = <&phy1>; ++ phy-mode = "rgmii-rxid"; ++ ++ genet_mdio: mdio@e14 { ++ compatible = "brcm,genet-mdio-v5"; ++ reg = <0xe14 0x08>; ++ reg-names = "mdio"; ++ #address-cells = <0x00>; ++ #size-cells = <0x01>; ++ ++ phy1: genet-phy@0 { ++ ++ reg = <0x01>; ++ led-modes = <0x00 0x08>; ++ ++ ++ }; ++ }; ++ }; ++#if 0 ++ genet: ethernet@7d580000 { ++ compatible = "brcm,bcm2711-genet-v5"; ++ reg = <0x0 0x7d580000 0x0 0x10000>; ++ #address-cells = <0x1>; ++ #size-cells = <0x1>; ++ interrupts = , ++ ; ++ status = "okay"; ++ ++ genet_mdio: mdio@e14 { ++ compatible = "brcm,genet-mdio-v5"; ++ reg = <0xe14 0x8>; ++ reg-names = "mdio"; ++ #address-cells = <0x0>; ++ #size-cells = <0x1>; ++ }; ++ }; ++#endif ++#else ++ genet: genet@7d580000 { ++ compatible = "brcm,bcm2711-genet-v5"; ++ reg = <0x0 0x7d580000 0x0 0x10000>; ++ #address-cells = <0x1>; ++ #size-cells = <0x1>; ++ interrupts = , ++ ; ++ status = "okay"; ++ ++ phy-handle = <&phy1>; ++ phy-mode = "rgmii"; ++ mdio@e14 { ++ #address-cells = <0x0>; ++ #size-cells = <0x1>; ++ compatible = "brcm,genet-mdio-v5"; ++ reg = <0xe14 0x8>; ++ reg-names = "mdio"; ++ phy1: genet-phy@0 { ++ compatible = "ethernet-phy-ieee802.3-c22"; ++ /* No interrupts - use PHY_POLL */ ++ max-speed = <1000>; ++ reg = <0x1>; ++ led-modes = <0x00 0x08>; /* link/activity link */ ++ }; ++ }; ++ }; ++#endif ++ }; ++}; ++ ++&clk_osc { ++ clock-frequency = <54000000>; ++}; ++ ++&clocks { ++ compatible = "brcm,bcm2711-cprman"; ++}; ++ ++&cpu_thermal { ++ coefficients = <(-487) 410040>; ++ thermal-sensors = <&thermal>; ++}; ++ ++&dsi0 { ++ interrupts = ; ++}; ++ ++&dsi1 { ++ interrupts = ; ++ compatible = "brcm,bcm2711-dsi1"; ++}; ++ ++&gpio { ++ compatible = "brcm,bcm2711-gpio"; ++ interrupts = , ++ , ++ , ++ ; ++ ++ gpclk0_gpio49: gpclk0_gpio49 { ++ pin-gpclk { ++ pins = "gpio49"; ++ function = "alt1"; ++ bias-disable; ++ }; ++ }; ++ gpclk1_gpio50: gpclk1_gpio50 { ++ pin-gpclk { ++ pins = "gpio50"; ++ function = "alt1"; ++ bias-disable; ++ }; ++ }; ++ gpclk2_gpio51: gpclk2_gpio51 { ++ pin-gpclk { ++ pins = "gpio51"; ++ function = "alt1"; ++ bias-disable; ++ }; ++ }; ++ ++ i2c0_gpio46: i2c0_gpio46 { ++ pin-sda { ++ function = "alt0"; ++ pins = "gpio46"; ++ bias-pull-up; ++ }; ++ pin-scl { ++ function = "alt0"; ++ pins = "gpio47"; ++ bias-disable; ++ }; ++ }; ++ i2c1_gpio46: i2c1_gpio46 { ++ pin-sda { ++ function = "alt1"; ++ pins = "gpio46"; ++ bias-pull-up; ++ }; ++ pin-scl { ++ function = "alt1"; ++ pins = "gpio47"; ++ bias-disable; ++ }; ++ }; ++ i2c3_gpio2: i2c3_gpio2 { ++ pin-sda { ++ function = "alt5"; ++ pins = "gpio2"; ++ bias-pull-up; ++ }; ++ pin-scl { ++ function = "alt5"; ++ pins = "gpio3"; ++ bias-disable; ++ }; ++ }; ++ i2c3_gpio4: i2c3_gpio4 { ++ pin-sda { ++ function = "alt5"; ++ pins = "gpio4"; ++ bias-pull-up; ++ }; ++ pin-scl { ++ function = "alt5"; ++ pins = "gpio5"; ++ bias-disable; ++ }; ++ }; ++ i2c4_gpio6: i2c4_gpio6 { ++ pin-sda { ++ function = "alt5"; ++ pins = "gpio6"; ++ bias-pull-up; ++ }; ++ pin-scl { ++ function = "alt5"; ++ pins = "gpio7"; ++ bias-disable; ++ }; ++ }; ++ i2c4_gpio8: i2c4_gpio8 { ++ pin-sda { ++ function = "alt5"; ++ pins = "gpio8"; ++ bias-pull-up; ++ }; ++ pin-scl { ++ function = "alt5"; ++ pins = "gpio9"; ++ bias-disable; ++ }; ++ }; ++ i2c5_gpio10: i2c5_gpio10 { ++ pin-sda { ++ function = "alt5"; ++ pins = "gpio10"; ++ bias-pull-up; ++ }; ++ pin-scl { ++ function = "alt5"; ++ pins = "gpio11"; ++ bias-disable; ++ }; ++ }; ++ i2c5_gpio12: i2c5_gpio12 { ++ pin-sda { ++ function = "alt5"; ++ pins = "gpio12"; ++ bias-pull-up; ++ }; ++ pin-scl { ++ function = "alt5"; ++ pins = "gpio13"; ++ bias-disable; ++ }; ++ }; ++ i2c6_gpio0: i2c6_gpio0 { ++ pin-sda { ++ function = "alt5"; ++ pins = "gpio0"; ++ bias-pull-up; ++ }; ++ pin-scl { ++ function = "alt5"; ++ pins = "gpio1"; ++ bias-disable; ++ }; ++ }; ++ i2c6_gpio22: i2c6_gpio22 { ++ pin-sda { ++ function = "alt5"; ++ pins = "gpio22"; ++ bias-pull-up; ++ }; ++ pin-scl { ++ function = "alt5"; ++ pins = "gpio23"; ++ bias-disable; ++ }; ++ }; ++ i2c_slave_gpio8: i2c_slave_gpio8 { ++ pins-i2c-slave { ++ pins = "gpio8", ++ "gpio9", ++ "gpio10", ++ "gpio11"; ++ function = "alt3"; ++ }; ++ }; ++ ++ jtag_gpio48: jtag_gpio48 { ++ pins-jtag { ++ pins = "gpio48", ++ "gpio49", ++ "gpio50", ++ "gpio51", ++ "gpio52", ++ "gpio53"; ++ function = "alt4"; ++ }; ++ }; ++ ++ mii_gpio28: mii_gpio28 { ++ pins-mii { ++ pins = "gpio28", ++ "gpio29", ++ "gpio30", ++ "gpio31"; ++ function = "alt4"; ++ }; ++ }; ++ mii_gpio36: mii_gpio36 { ++ pins-mii { ++ pins = "gpio36", ++ "gpio37", ++ "gpio38", ++ "gpio39"; ++ function = "alt5"; ++ }; ++ }; ++ ++ pcm_gpio50: pcm_gpio50 { ++ pins-pcm { ++ pins = "gpio50", ++ "gpio51", ++ "gpio52", ++ "gpio53"; ++ function = "alt2"; ++ }; ++ }; ++ ++ pwm0_0_gpio12: pwm0_0_gpio12 { ++ pin-pwm { ++ pins = "gpio12"; ++ function = "alt0"; ++ bias-disable; ++ }; ++ }; ++ pwm0_0_gpio18: pwm0_0_gpio18 { ++ pin-pwm { ++ pins = "gpio18"; ++ function = "alt5"; ++ bias-disable; ++ }; ++ }; ++ pwm1_0_gpio40: pwm1_0_gpio40 { ++ pin-pwm { ++ pins = "gpio40"; ++ function = "alt0"; ++ bias-disable; ++ }; ++ }; ++ pwm0_1_gpio13: pwm0_1_gpio13 { ++ pin-pwm { ++ pins = "gpio13"; ++ function = "alt0"; ++ bias-disable; ++ }; ++ }; ++ pwm0_1_gpio19: pwm0_1_gpio19 { ++ pin-pwm { ++ pins = "gpio19"; ++ function = "alt5"; ++ bias-disable; ++ }; ++ }; ++ pwm1_1_gpio41: pwm1_1_gpio41 { ++ pin-pwm { ++ pins = "gpio41"; ++ function = "alt0"; ++ bias-disable; ++ }; ++ }; ++ pwm0_1_gpio45: pwm0_1_gpio45 { ++ pin-pwm { ++ pins = "gpio45"; ++ function = "alt0"; ++ bias-disable; ++ }; ++ }; ++ pwm0_0_gpio52: pwm0_0_gpio52 { ++ pin-pwm { ++ pins = "gpio52"; ++ function = "alt1"; ++ bias-disable; ++ }; ++ }; ++ pwm0_1_gpio53: pwm0_1_gpio53 { ++ pin-pwm { ++ pins = "gpio53"; ++ function = "alt1"; ++ bias-disable; ++ }; ++ }; ++ ++ rgmii_gpio35: rgmii_gpio35 { ++ pin-start-stop { ++ pins = "gpio35"; ++ function = "alt4"; ++ }; ++ pin-rx-ok { ++ pins = "gpio36"; ++ function = "alt4"; ++ }; ++ }; ++ rgmii_irq_gpio34: rgmii_irq_gpio34 { ++ pin-irq { ++ pins = "gpio34"; ++ function = "alt5"; ++ }; ++ }; ++ rgmii_irq_gpio39: rgmii_irq_gpio39 { ++ pin-irq { ++ pins = "gpio39"; ++ function = "alt4"; ++ }; ++ }; ++ rgmii_mdio_gpio28: rgmii_mdio_gpio28 { ++ pins-mdio { ++ pins = "gpio28", ++ "gpio29"; ++ function = "alt5"; ++ }; ++ }; ++ rgmii_mdio_gpio37: rgmii_mdio_gpio37 { ++ pins-mdio { ++ pins = "gpio37", ++ "gpio38"; ++ function = "alt4"; ++ }; ++ }; ++ ++ spi0_gpio46: spi0_gpio46 { ++ pins-spi { ++ pins = "gpio46", ++ "gpio47", ++ "gpio48", ++ "gpio49"; ++ function = "alt2"; ++ }; ++ }; ++ spi2_gpio46: spi2_gpio46 { ++ pins-spi { ++ pins = "gpio46", ++ "gpio47", ++ "gpio48", ++ "gpio49", ++ "gpio50"; ++ function = "alt5"; ++ }; ++ }; ++ spi3_gpio0: spi3_gpio0 { ++ pins-spi { ++ pins = "gpio0", ++ "gpio1", ++ "gpio2", ++ "gpio3"; ++ function = "alt3"; ++ }; ++ }; ++ spi4_gpio4: spi4_gpio4 { ++ pins-spi { ++ pins = "gpio4", ++ "gpio5", ++ "gpio6", ++ "gpio7"; ++ function = "alt3"; ++ }; ++ }; ++ spi5_gpio12: spi5_gpio12 { ++ pins-spi { ++ pins = "gpio12", ++ "gpio13", ++ "gpio14", ++ "gpio15"; ++ function = "alt3"; ++ }; ++ }; ++ spi6_gpio18: spi6_gpio18 { ++ pins-spi { ++ pins = "gpio18", ++ "gpio19", ++ "gpio20", ++ "gpio21"; ++ function = "alt3"; ++ }; ++ }; ++ ++ uart2_gpio0: uart2_gpio0 { ++ pin-tx { ++ pins = "gpio0"; ++ function = "alt4"; ++ bias-disable; ++ }; ++ pin-rx { ++ pins = "gpio1"; ++ function = "alt4"; ++ bias-pull-up; ++ }; ++ }; ++ uart2_ctsrts_gpio2: uart2_ctsrts_gpio2 { ++ pin-cts { ++ pins = "gpio2"; ++ function = "alt4"; ++ bias-pull-up; ++ }; ++ pin-rts { ++ pins = "gpio3"; ++ function = "alt4"; ++ bias-disable; ++ }; ++ }; ++ uart3_gpio4: uart3_gpio4 { ++ pin-tx { ++ pins = "gpio4"; ++ function = "alt4"; ++ bias-disable; ++ }; ++ pin-rx { ++ pins = "gpio5"; ++ function = "alt4"; ++ bias-pull-up; ++ }; ++ }; ++ uart3_ctsrts_gpio6: uart3_ctsrts_gpio6 { ++ pin-cts { ++ pins = "gpio6"; ++ function = "alt4"; ++ bias-pull-up; ++ }; ++ pin-rts { ++ pins = "gpio7"; ++ function = "alt4"; ++ bias-disable; ++ }; ++ }; ++ uart4_gpio8: uart4_gpio8 { ++ pin-tx { ++ pins = "gpio8"; ++ function = "alt4"; ++ bias-disable; ++ }; ++ pin-rx { ++ pins = "gpio9"; ++ function = "alt4"; ++ bias-pull-up; ++ }; ++ }; ++ uart4_ctsrts_gpio10: uart4_ctsrts_gpio10 { ++ pin-cts { ++ pins = "gpio10"; ++ function = "alt4"; ++ bias-pull-up; ++ }; ++ pin-rts { ++ pins = "gpio11"; ++ function = "alt4"; ++ bias-disable; ++ }; ++ }; ++ uart5_gpio12: uart5_gpio12 { ++ pin-tx { ++ pins = "gpio12"; ++ function = "alt4"; ++ bias-disable; ++ }; ++ pin-rx { ++ pins = "gpio13"; ++ function = "alt4"; ++ bias-pull-up; ++ }; ++ }; ++ uart5_ctsrts_gpio14: uart5_ctsrts_gpio14 { ++ pin-cts { ++ pins = "gpio14"; ++ function = "alt4"; ++ bias-pull-up; ++ }; ++ pin-rts { ++ pins = "gpio15"; ++ function = "alt4"; ++ bias-disable; ++ }; ++ }; ++}; ++ ++&rmem { ++ #address-cells = <2>; ++}; ++ ++&cma { ++ /* ++ * arm64 reserves the CMA by default somewhere in ZONE_DMA32, ++ * that's not good enough for the BCM2711 as some devices can ++ * only address the lower 1G of memory (ZONE_DMA). ++ */ ++ alloc-ranges = <0x0 0x00000000 0x40000000>; ++}; ++ ++&i2c0if { ++ compatible = "brcm,bcm2711-i2c", "brcm,bcm2835-i2c"; ++ interrupts = ; ++}; ++ ++&i2c1 { ++ compatible = "brcm,bcm2711-i2c", "brcm,bcm2835-i2c"; ++ interrupts = ; ++}; ++ ++&mailbox { ++ interrupts = ; ++}; ++ ++&sdhci { ++ interrupts = ; ++}; ++ ++&sdhost { ++ interrupts = ; ++}; ++ ++&spi { ++ interrupts = ; ++}; ++ ++&spi1 { ++ interrupts = ; ++}; ++ ++&spi2 { ++ interrupts = ; ++}; ++ ++&system_timer { ++ interrupts = , ++ , ++ , ++ ; ++}; ++ ++&txp { ++ interrupts = ; ++}; ++ ++&uart0 { ++ interrupts = ; ++}; ++ ++&uart1 { ++ interrupts = ; ++}; ++ ++&usb { ++ interrupts = ; ++}; ++ ++&vec { ++ interrupts = ; ++}; diff --git a/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0005-bcm2711-rpi-4-b.dts.patch b/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0005-bcm2711-rpi-4-b.dts.patch new file mode 100644 index 0000000..3a69ab7 --- /dev/null +++ b/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0005-bcm2711-rpi-4-b.dts.patch @@ -0,0 +1,415 @@ +--- /home/rossierd/soo/infrabase/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dts 2025-09-03 20:23:08.000000000 +0200 ++++ ./arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dts 2025-09-04 17:39:05.169281153 +0200 +@@ -1,2 +1,416 @@ + // SPDX-License-Identifier: GPL-2.0 +-#include "arm/broadcom/bcm2711-rpi-4-b.dts" ++ ++/dts-v1/; ++#include "bcm2711.dtsi" ++#include "bcm2835-rpi.dtsi" ++#include "bcm283x-rpi-usb-peripheral.dtsi" ++ ++#include ++ ++/ { ++ compatible = "raspberrypi,4-model-b", "brcm,bcm2711"; ++ model = "Raspberry Pi 4 Model B"; ++ ++ chosen { ++ /* bootargs = "console=ttyAMA0,115200n8 root=/dev/ram rw slub_debug=PUZ"; */ ++ /* bootargs = "coherent_pool=1M 8250.nr_uarts=1 cma=64M cma=256M smsc95xx.macaddr=DC:A6:32:18:DD:95 vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000 console=serial0,115200 console=tty1 root=/dev/ram elevator=deadline fsck.repair=yes rootwait"; */ ++ /* bootargs = "initcall_debug=1 ignore_loglevel coherent_pool=1M 8250.nr_uarts=1 cma=64M cma=256M smsc95xx.macaddr=DC:A6:32:18:DD:95 vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000 console=ttyS0,115200 root=/dev/ram fsck.repair=yes rootwait"; */ ++ ++ bootargs = "coherent_pool=1M 8250.nr_uarts=1 cma=64M cma=256M smsc95xx.macaddr=DC:A6:32:18:DD:95 vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000 console=ttyS0,115200 root=/dev/ram fsck.repair=yes rootwait"; ++ ++ /* 8250 auxiliary UART instead of pl011 */ ++ /* stdout-path = "serial1:115200n8"; */ ++ ++ }; ++ ++ /* Will be filled by the bootloader */ ++ memory@0 { ++ device_type = "memory"; ++ reg = <0x0 0x10000000 0x20000000>; ++ }; ++ ++ aliases { ++ serial0 = &uart1; ++ serial1 = &uart0; ++ mmc0 = &emmc2; ++ mmc2 = &sdhost; ++ i2c3 = &i2c3; ++ i2c4 = &i2c4; ++ i2c5 = &i2c5; ++ i2c6 = &i2c6; ++ /delete-property/ ethernet; ++ /delete-property/ intc; ++ ethernet0 = &genet; ++ pcie0 = &pcie0; ++ }; ++ ++ leds { ++ act { ++ gpios = <&gpio 42 GPIO_ACTIVE_HIGH>; ++ }; ++ ++ pwr { ++ label = "PWR"; ++ gpios = <&expgpio 2 GPIO_ACTIVE_LOW>; ++ }; ++ }; ++ ++ wifi_pwrseq: wifi-pwrseq { ++ compatible = "mmc-pwrseq-simple"; ++ reset-gpios = <&expgpio 1 GPIO_ACTIVE_LOW>; ++ }; ++ ++ sd_io_1v8_reg: sd_io_1v8_reg { ++ compatible = "regulator-gpio"; ++ regulator-name = "vdd-sd-io"; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-boot-on; ++ regulator-always-on; ++ regulator-settling-time-us = <5000>; ++ gpios = <&expgpio 4 GPIO_ACTIVE_HIGH>; ++ states = <1800000 0x1 ++ 3300000 0x0>; ++ status = "okay"; ++ }; ++}; ++ ++&pcie0 { ++ pci@1,0 { ++ #address-cells = <3>; ++ #size-cells = <2>; ++ ranges; ++ ++ reg = <0 0 0 0 0>; ++ ++ usb@1,0 { ++ reg = <0x10000 0 0 0 0>; ++ resets = <&reset RASPBERRYPI_FIRMWARE_RESET_ID_USB>; ++ }; ++ }; ++}; ++ ++&gpio { ++ spi0_pins: spi0_pins { ++ brcm,pins = <9 10 11>; ++ brcm,function = ; ++ }; ++ ++ spi0_cs_pins: spi0_cs_pins { ++ brcm,pins = <8 7>; ++ brcm,function = ; ++ }; ++ ++ spi3_pins: spi3_pins { ++ brcm,pins = <1 2 3>; ++ brcm,function = ; ++ }; ++ ++ spi3_cs_pins: spi3_cs_pins { ++ brcm,pins = <0 24>; ++ brcm,function = ; ++ }; ++ ++ spi4_pins: spi4_pins { ++ brcm,pins = <5 6 7>; ++ brcm,function = ; ++ }; ++ ++ spi4_cs_pins: spi4_cs_pins { ++ brcm,pins = <4 25>; ++ brcm,function = ; ++ }; ++ ++ spi5_pins: spi5_pins { ++ brcm,pins = <13 14 15>; ++ brcm,function = ; ++ }; ++ ++ spi5_cs_pins: spi5_cs_pins { ++ brcm,pins = <12 26>; ++ brcm,function = ; ++ }; ++ ++ spi6_pins: spi6_pins { ++ brcm,pins = <19 20 21>; ++ brcm,function = ; ++ }; ++ ++ spi6_cs_pins: spi6_cs_pins { ++ brcm,pins = <18 27>; ++ brcm,function = ; ++ }; ++ ++ i2c0_pins: i2c0 { ++ brcm,pins = <0 1>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2c1_pins: i2c1 { ++ brcm,pins = <2 3>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2c3_pins: i2c3 { ++ brcm,pins = <4 5>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2c4_pins: i2c4 { ++ brcm,pins = <8 9>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2c5_pins: i2c5 { ++ brcm,pins = <12 13>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2c6_pins: i2c6 { ++ brcm,pins = <22 23>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2s_pins: i2s { ++ brcm,pins = <18 19 20 21>; ++ brcm,function = ; ++ }; ++ ++ sdio_pins: sdio_pins { ++ brcm,pins = <34 35 36 37 38 39>; ++ brcm,function = ; // alt3 = SD1 ++ brcm,pull = <0 2 2 2 2 2>; ++ }; ++ ++ bt_pins: bt_pins { ++ brcm,pins = "-"; // non-empty to keep btuart happy, //4 = 0 ++ // to fool pinctrl ++ brcm,function = <0>; ++ brcm,pull = <2>; ++ }; ++ ++ uart0_pins: uart0_pins { ++ brcm,pins = <32 33>; ++ brcm,function = ; ++ brcm,pull = <0 2>; ++ }; ++ ++ uart1_pins: uart1_pins { ++ brcm,pins; ++ brcm,function; ++ brcm,pull; ++ }; ++ ++ uart2_pins: uart2_pins { ++ brcm,pins = <0 1>; ++ brcm,function = ; ++ brcm,pull = <0 2>; ++ }; ++ ++ uart3_pins: uart3_pins { ++ brcm,pins = <4 5>; ++ brcm,function = ; ++ brcm,pull = <0 2>; ++ }; ++ ++ uart4_pins: uart4_pins { ++ brcm,pins = <8 9>; ++ brcm,function = ; ++ brcm,pull = <0 2>; ++ }; ++ ++ uart5_pins: uart5_pins { ++ brcm,pins = <12 13>; ++ brcm,function = ; ++ brcm,pull = <0 2>; ++ }; ++ ++ audio_pins: audio_pins { ++ brcm,pins = <40 41>; ++ brcm,function = <4>; ++ }; ++}; ++ ++/* ++&soc { ++ virtgpio: virtgpio { ++ compatible = "brcm,bcm2835-virtgpio"; ++ gpio-controller; ++ #gpio-cells = <2>; ++ firmware = <&firmware>; ++ status = "okay"; ++ }; ++}; ++*/ ++/* ++&mmcnr { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sdio_pins>; ++ bus-width = <4>; ++ status = "disabled"; ++};*/ ++ ++&firmware { ++ expgpio: gpio { ++ compatible = "raspberrypi,firmware-gpio"; ++ gpio-controller; ++ #gpio-cells = <2>; ++ gpio-line-names = "BT_ON", ++ "WL_ON", ++ "PWR_LED_OFF", ++ "GLOBAL_RESET", ++ "VDD_SD_IO_SEL", ++ "CAM_GPIO", ++ "", ++ ""; ++ status = "okay"; ++ }; ++ ++ reset: reset { ++ compatible = "raspberrypi,firmware-reset"; ++ #reset-cells = <1>; ++ }; ++}; ++ ++&pwm1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pwm1_0_gpio40 &pwm1_1_gpio41>; ++ status = "okay"; ++}; ++ ++/* SDHCI is used to control the SDIO for wireless */ ++&sdhci { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&emmc_gpio34>; ++ bus-width = <4>; ++ non-removable; ++ mmc-pwrseq = <&wifi_pwrseq>; ++ status = "okay"; ++ ++ brcmf: wifi@1 { ++ reg = <1>; ++ compatible = "brcm,bcm4329-fmac"; ++ }; ++}; ++ ++/* EMMC2 is used to drive the SD card */ ++&emmc2 { ++ vqmmc-supply = <&sd_io_1v8_reg>; ++ broken-cd; ++ status = "okay"; ++}; ++ ++/* uart0 communicates with the BT module */ ++&uart0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart0_ctsrts_gpio30 &uart0_gpio32>; ++ uart-has-rtscts; ++ status = "okay"; ++ ++ bluetooth { ++ compatible = "brcm,bcm43438-bt"; ++ max-speed = <2000000>; ++ shutdown-gpios = <&expgpio 0 GPIO_ACTIVE_HIGH>; ++ }; ++}; ++ ++/* uart1 is mapped to the pin header */ ++&uart1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart1_gpio14>; ++ status = "okay"; ++}; ++ ++ ++&spi1 { ++ status = "okay"; ++ cs-gpios = <&gpio 18 GPIO_ACTIVE_LOW>; ++ num-cs = <1>; ++ ++ /* SOO.tech */ ++ drv8703q1@0 { ++ compatible = "ti,drv8703q1"; ++ status = "okay"; ++ reg = <0>; ++ spi-max-frequency = <0x7735940>; ++ sleep-gpio = <&gpio 22 GPIO_ACTIVE_HIGH>; ++ mode-gpio = <&gpio 10 GPIO_ACTIVE_HIGH>; ++ }; ++}; ++ ++/* SOO.tech */ ++&i2c4 { ++ status = "okay"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2c4_pins>; ++ clock-frequency = <100000>; ++ ++ ds1050@28 { ++ compatible = "maxim,ds1050"; ++ reg = <0x28>; /* This is due to the control byte (101) + A2, A1, A0 (000) combination (101000 = 0x28) */ ++ }; ++}; ++ ++ ++ ++&i2c1 { ++ compatible = "brcm,bcm2711-i2c", "brcm,bcm2835-i2c"; ++ interrupts = ; ++ ++ status = "okay"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2c1_pins>; ++ clock-frequency = <100000>; ++ ++ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ rpi-sense@46 { ++ compatible = "rpi,rpi-sense"; ++ reg = <0x46>; ++ keys-int-gpios = <&gpio 23 1>; ++ status = "okay"; ++ }; ++ ++ lsm9ds1-magn@1c { ++ compatible = "st,lsm9ds1-magn"; ++ reg = <0x1c>; ++ status = "okay"; ++ }; ++ ++ lsm9ds1-accel@6a { ++ compatible = "st,lsm9ds1-accel"; ++ reg = <0x6a>; ++ status = "okay"; ++ }; ++ ++ lps25h-press@5c { ++ compatible = "st,lps25h-press"; ++ reg = <0x5c>; ++ status = "okay"; ++ }; ++ ++ hts221-humid@5f { ++ compatible = "st,hts221-humid"; ++ reg = <0x5f>; ++ status = "okay"; ++ }; ++}; ++ ++&vchiq { ++ interrupts = ; ++}; diff --git a/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0006-bcm2711-rpi.dtsi.patch b/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0006-bcm2711-rpi.dtsi.patch new file mode 100644 index 0000000..9ccd3aa --- /dev/null +++ b/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0006-bcm2711-rpi.dtsi.patch @@ -0,0 +1,204 @@ +--- /home/rossierd/soo/micofe/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/boot/dts/broadcom/bcm2711-rpi.dtsi 1970-01-01 01:00:00.000000000 +0100 ++++ ./arch/arm64/boot/dts/broadcom/bcm2711-rpi.dtsi 2026-02-08 09:42:02.534446859 +0100 +@@ -0,0 +1,201 @@ ++// SPDX-License-Identifier: GPL-2.0 ++#include "bcm270x-rpi.dtsi" ++ ++/ { ++ __overrides__ { ++ arm_freq; ++ }; ++ ++ v3dbus: v3dbus { ++ compatible = "simple-bus"; ++ #address-cells = <1>; ++ #size-cells = <2>; ++ ranges = <0x7c500000 0x0 0xfc500000 0x0 0x03300000>, ++ <0x40000000 0x0 0xff800000 0x0 0x00800000>; ++ dma-ranges = <0x00000000 0x0 0x00000000 0x4 0x00000000>; ++ ++ v3d: v3d@7ec04000 { ++ compatible = "brcm,2711-v3d"; ++ reg = ++ <0x7ec00000 0x0 0x4000>, ++ <0x7ec04000 0x0 0x4000>; ++ reg-names = "hub", "core0"; ++ ++ power-domains = <&pm BCM2835_POWER_DOMAIN_GRAFX_V3D>; ++ resets = <&pm BCM2835_RESET_V3D>; ++ clocks = <&firmware_clocks 5>; ++ clocks-names = "v3d"; ++ interrupts = ; ++ status = "disabled"; ++ }; ++ }; ++ ++ scb: scb { ++ /* Add a label */ ++ }; ++}; ++ ++&cma { ++ /* Limit cma to the lower 768MB to allow room for HIGHMEM on 32-bit */ ++ alloc-ranges = <0x0 0x00000000 0x30000000>; ++}; ++ ++&scb { ++ ranges = <0x0 0x7c000000 0x0 0xfc000000 0x0 0x03800000>, ++ <0x0 0x40000000 0x0 0xff800000 0x0 0x00800000>, ++ <0x6 0x00000000 0x6 0x00000000 0x0 0x40000000>, ++ <0x0 0x00000000 0x0 0x00000000 0x0 0xfc000000>; ++ dma-ranges = <0x0 0x00000000 0x0 0x00000000 0x4 0x00000000>; ++ ++ dma40: dma@7e007b00 { ++ compatible = "brcm,bcm2711-dma"; ++ reg = <0x0 0x7e007b00 0x0 0x400>; ++ interrupts = ++ , /* dma4 11 */ ++ , /* dma4 12 */ ++ , /* dma4 13 */ ++ ; /* dma4 14 */ ++ interrupt-names = "dma11", ++ "dma12", ++ "dma13", ++ "dma14"; ++ #dma-cells = <1>; ++ brcm,dma-channel-mask = <0x7800>; ++ }; ++ ++ xhci: xhci@7e9c0000 { ++ compatible = "generic-xhci"; ++ status = "disabled"; ++ reg = <0x0 0x7e9c0000 0x0 0x100000>; ++ interrupts = ; ++ power-domains = <&power RPI_POWER_DOMAIN_USB>; ++ }; ++ ++ hevc-decoder@7eb00000 { ++ compatible = "raspberrypi,rpivid-hevc-decoder"; ++ reg = <0x0 0x7eb00000 0x0 0x10000>; ++ status = "okay"; ++ }; ++ ++ rpivid-local-intc@7eb10000 { ++ compatible = "raspberrypi,rpivid-local-intc"; ++ reg = <0x0 0x7eb10000 0x0 0x1000>; ++ status = "okay"; ++ interrupts = ; ++ }; ++ ++ h264-decoder@7eb20000 { ++ compatible = "raspberrypi,rpivid-h264-decoder"; ++ reg = <0x0 0x7eb20000 0x0 0x10000>; ++ status = "okay"; ++ }; ++ ++ vp9-decoder@7eb30000 { ++ compatible = "raspberrypi,rpivid-vp9-decoder"; ++ reg = <0x0 0x7eb30000 0x0 0x10000>; ++ status = "okay"; ++ }; ++}; ++ ++&dma40 { ++ /* The VPU firmware uses DMA channel 11 for VCHIQ */ ++ brcm,dma-channel-mask = <0x7000>; ++}; ++ ++&vchiq { ++ compatible = "brcm,bcm2711-vchiq"; ++}; ++ ++&firmwarekms { ++ compatible = "raspberrypi,rpi-firmware-kms-2711"; ++ interrupts = ; ++}; ++ ++&smi { ++ interrupts = ; ++}; ++ ++&mmc { ++ interrupts = ; ++}; ++ ++&mmcnr { ++ interrupts = ; ++}; ++ ++&csi0 { ++ interrupts = ; ++}; ++ ++&csi1 { ++ interrupts = ; ++}; ++ ++&random { ++ compatible = "brcm,bcm2711-rng200"; ++ status = "okay"; ++}; ++ ++&usb { ++ /* Enable the FIQ support */ ++ reg = <0x7e980000 0x10000>, ++ <0x7e00b200 0x200>; ++ interrupts = , ++ ; ++ status = "disabled"; ++}; ++ ++&gpio { ++ interrupts = , ++ ; ++}; ++ ++&emmc2 { ++ mmc-ddr-3_3v; ++}; ++ ++&vc4 { ++ status = "disabled"; ++}; ++ ++&pixelvalve0 { ++ status = "disabled"; ++}; ++ ++&pixelvalve1 { ++ status = "disabled"; ++}; ++ ++&pixelvalve2 { ++ status = "disabled"; ++}; ++ ++&pixelvalve3 { ++ status = "disabled"; ++}; ++ ++&pixelvalve4 { ++ status = "disabled"; ++}; ++ ++&hdmi0 { ++ dmas = <&dma (10|(1<<27)|(1<<24)|(10<<16)|(15<<20))>; ++ status = "disabled"; ++}; ++ ++&ddc0 { ++ status = "disabled"; ++}; ++ ++&hdmi1 { ++ dmas = <&dma (17|(1<<27)|(1<<24)|(10<<16)|(15<<20))>; ++ status = "disabled"; ++}; ++ ++&ddc1 { ++ status = "disabled"; ++}; ++ ++&dvp { ++ status = "disabled"; ++}; diff --git a/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0007-bcm271x-rpi-bt.dtsi.patch b/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0007-bcm271x-rpi-bt.dtsi.patch new file mode 100644 index 0000000..73196d1 --- /dev/null +++ b/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0007-bcm271x-rpi-bt.dtsi.patch @@ -0,0 +1,29 @@ +--- /home/rossierd/soo/micofe/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/boot/dts/broadcom/bcm271x-rpi-bt.dtsi 1970-01-01 01:00:00.000000000 +0100 ++++ ./arch/arm64/boot/dts/broadcom/bcm271x-rpi-bt.dtsi 2026-02-08 09:42:02.534425173 +0100 +@@ -0,0 +1,26 @@ ++// SPDX-License-Identifier: GPL-2.0 ++ ++&uart0 { ++ bt: bluetooth { ++ compatible = "brcm,bcm43438-bt"; ++ max-speed = <3000000>; ++ shutdown-gpios = <&expgpio 0 GPIO_ACTIVE_HIGH>; ++ status = "disabled"; ++ }; ++}; ++ ++&uart1 { ++ minibt: bluetooth { ++ compatible = "brcm,bcm43438-bt"; ++ max-speed = <460800>; ++ shutdown-gpios = <&expgpio 0 GPIO_ACTIVE_HIGH>; ++ status = "disabled"; ++ }; ++}; ++ ++/ { ++ __overrides__ { ++ krnbt = <&bt>,"status"; ++ krnbt_baudrate = <&bt>,"max-speed:0"; ++ }; ++}; diff --git a/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0008-bcm2835-rpi.dtsi.patch b/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0008-bcm2835-rpi.dtsi.patch new file mode 100644 index 0000000..48dea5e --- /dev/null +++ b/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0008-bcm2835-rpi.dtsi.patch @@ -0,0 +1,93 @@ +--- /home/rossierd/soo/micofe/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/boot/dts/broadcom/bcm2835-rpi.dtsi 1970-01-01 01:00:00.000000000 +0100 ++++ ./arch/arm64/boot/dts/broadcom/bcm2835-rpi.dtsi 2026-02-08 09:42:02.534414611 +0100 +@@ -0,0 +1,90 @@ ++#include ++ ++/ { ++ leds { ++ compatible = "gpio-leds"; ++ ++ act { ++ label = "ACT"; ++ default-state = "keep"; ++ linux,default-trigger = "heartbeat"; ++ }; ++ }; ++ ++ soc { ++ firmware: firmware { ++ compatible = "raspberrypi,bcm2835-firmware", "simple-mfd"; ++ #address-cells = <1>; ++ #size-cells = <1>; ++ ++ mboxes = <&mailbox>; ++ dma-ranges; ++ ++ firmware_clocks: clocks { ++ compatible = "raspberrypi,firmware-clocks"; ++ #clock-cells = <1>; ++ }; ++ }; ++ ++ power: power { ++ compatible = "raspberrypi,bcm2835-power"; ++ firmware = <&firmware>; ++ #power-domain-cells = <1>; ++ }; ++ ++ vchiq: mailbox@7e00b840 { ++ compatible = "brcm,bcm2835-vchiq"; ++ reg = <0x7e00b840 0x3c>; ++ interrupts = <0 2>; ++ }; ++ }; ++}; ++ ++&gpio { ++ pinctrl-names = "default"; ++ ++ gpioout: gpioout { ++ brcm,pins = <6>; ++ brcm,function = ; ++ }; ++ ++ alt0: alt0 { ++ brcm,pins = <4 5 7 8 9 10 11>; ++ brcm,function = ; ++ }; ++}; ++ ++&i2c0if { ++ status = "okay"; ++ clock-frequency = <100000>; ++}; ++ ++&i2c0mux { ++ pinctrl-0 = <&i2c0_gpio0>; ++ /* pinctrl-1 varies based on platform */ ++ status = "okay"; ++}; ++ ++&i2c1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&i2c1_gpio2>; ++ status = "okay"; ++ clock-frequency = <100000>; ++}; ++ ++&usb { ++ power-domains = <&power RPI_POWER_DOMAIN_USB>; ++}; ++ ++&vec { ++ power-domains = <&power RPI_POWER_DOMAIN_VEC>; ++ status = "okay"; ++}; ++ ++&dsi0 { ++ power-domains = <&power RPI_POWER_DOMAIN_DSI0>; ++}; ++ ++&dsi1 { ++ power-domains = <&power RPI_POWER_DOMAIN_DSI1>; ++}; diff --git a/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0009-bcm283x.dtsi.patch b/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0009-bcm283x.dtsi.patch new file mode 100644 index 0000000..56ff471 --- /dev/null +++ b/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0009-bcm283x.dtsi.patch @@ -0,0 +1,536 @@ +--- /home/rossierd/soo/micofe/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/boot/dts/broadcom/bcm283x.dtsi 1970-01-01 01:00:00.000000000 +0100 ++++ ./arch/arm64/boot/dts/broadcom/bcm283x.dtsi 2026-02-08 09:42:02.533630731 +0100 +@@ -0,0 +1,533 @@ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++/* firmware-provided startup stubs live here, where the secondary CPUs are ++ * spinning. ++ */ ++/memreserve/ 0x00000000 0x00001000; ++ ++/* This include file covers the common peripherals and configuration between ++ * bcm2835 and bcm2836 implementations, leaving the CPU configuration to ++ * bcm2835.dtsi and bcm2836.dtsi. ++ */ ++ ++/ { ++ compatible = "brcm,bcm2835"; ++ model = "BCM2835"; ++ #address-cells = <1>; ++ #size-cells = <1>; ++ ++ aliases { ++ serial0 = &uart0; ++ serial1 = &uart1; ++ }; ++ ++ chosen { ++ stdout-path = "serial0:115200n8"; ++ }; ++ ++ rmem: reserved-memory { ++ #address-cells = <1>; ++ #size-cells = <1>; ++ ranges; ++ ++ cma: linux,cma { ++ compatible = "shared-dma-pool"; ++ size = <0x4000000>; /* 64MB */ ++ reusable; ++ linux,cma-default; ++ }; ++ }; ++ ++ thermal-zones { ++ cpu_thermal: cpu-thermal { ++ polling-delay-passive = <0>; ++ polling-delay = <1000>; ++ ++ trips { ++ cpu-crit { ++ temperature = <90000>; ++ hysteresis = <0>; ++ type = "critical"; ++ }; ++ }; ++ ++ cooling-maps { ++ }; ++ }; ++ }; ++ ++ soc { ++ compatible = "simple-bus"; ++ #address-cells = <1>; ++ #size-cells = <1>; ++ ++ system_timer: timer@7e003000 { ++ compatible = "brcm,bcm2835-system-timer"; ++ reg = <0x7e003000 0x1000>; ++ interrupts = <1 0>, <1 1>, <1 2>, <1 3>; ++ /* This could be a reference to BCM2835_CLOCK_TIMER, ++ * but we don't have the driver using the common clock ++ * support yet. ++ */ ++ clock-frequency = <1000000>; ++ }; ++ ++ txp: txp@7e004000 { ++ compatible = "brcm,bcm2835-txp"; ++ reg = <0x7e004000 0x20>; ++ interrupts = <1 11>; ++ }; ++ ++ clocks: cprman@7e101000 { ++ compatible = "brcm,bcm2835-cprman"; ++ #clock-cells = <1>; ++ reg = <0x7e101000 0x2000>; ++ ++ /* CPRMAN derives almost everything from the ++ * platform's oscillator. However, the DSI ++ * pixel clocks come from the DSI analog PHY. ++ */ ++ clocks = <&clk_osc>, ++ <&dsi0 0>, <&dsi0 1>, <&dsi0 2>, ++ <&dsi1 0>, <&dsi1 1>, <&dsi1 2>; ++ }; ++ ++ mailbox: mailbox@7e00b880 { ++ compatible = "brcm,bcm2835-mbox"; ++ reg = <0x7e00b880 0x40>; ++ interrupts = <0 1>; ++ #mbox-cells = <0>; ++ }; ++ ++ gpio: gpio@7e200000 { ++ compatible = "brcm,bcm2835-gpio"; ++ reg = <0x7e200000 0xb4>; ++ /* ++ * The GPIO IP block is designed for 3 banks of GPIOs. ++ * Each bank has a GPIO interrupt for itself. ++ * There is an overall "any bank" interrupt. ++ * In order, these are GIC interrupts 17, 18, 19, 20. ++ * Since the BCM2835 only has 2 banks, the 2nd bank ++ * interrupt output appears to be mirrored onto the ++ * 3rd bank's interrupt signal. ++ * So, a bank0 interrupt shows up on 17, 20, and ++ * a bank1 interrupt shows up on 18, 19, 20! ++ */ ++ interrupts = <2 17>, <2 18>, <2 19>, <2 20>; ++ ++ gpio-controller; ++ #gpio-cells = <2>; ++ ++ interrupt-controller; ++ #interrupt-cells = <2>; ++ ++ /* Defines common pin muxing groups ++ * ++ * While each pin can have its mux selected ++ * for various functions individually, some ++ * groups only make sense to switch to a ++ * particular function together. ++ */ ++ dpi_gpio0: dpi_gpio0 { ++ brcm,pins = <0 1 2 3 4 5 6 7 8 9 10 11 ++ 12 13 14 15 16 17 18 19 ++ 20 21 22 23 24 25 26 27>; ++ brcm,function = ; ++ }; ++ emmc_gpio22: emmc_gpio22 { ++ brcm,pins = <22 23 24 25 26 27>; ++ brcm,function = ; ++ }; ++ emmc_gpio34: emmc_gpio34 { ++ brcm,pins = <34 35 36 37 38 39>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ emmc_gpio48: emmc_gpio48 { ++ brcm,pins = <48 49 50 51 52 53>; ++ brcm,function = ; ++ }; ++ ++ gpclk0_gpio4: gpclk0_gpio4 { ++ brcm,pins = <4>; ++ brcm,function = ; ++ }; ++ gpclk1_gpio5: gpclk1_gpio5 { ++ brcm,pins = <5>; ++ brcm,function = ; ++ }; ++ gpclk1_gpio42: gpclk1_gpio42 { ++ brcm,pins = <42>; ++ brcm,function = ; ++ }; ++ gpclk1_gpio44: gpclk1_gpio44 { ++ brcm,pins = <44>; ++ brcm,function = ; ++ }; ++ gpclk2_gpio6: gpclk2_gpio6 { ++ brcm,pins = <6>; ++ brcm,function = ; ++ }; ++ gpclk2_gpio43: gpclk2_gpio43 { ++ brcm,pins = <43>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ ++ i2c0_gpio0: i2c0_gpio0 { ++ brcm,pins = <0 1>; ++ brcm,function = ; ++ }; ++ i2c0_gpio28: i2c0_gpio28 { ++ brcm,pins = <28 29>; ++ brcm,function = ; ++ }; ++ i2c0_gpio44: i2c0_gpio44 { ++ brcm,pins = <44 45>; ++ brcm,function = ; ++ }; ++ i2c1_gpio2: i2c1_gpio2 { ++ brcm,pins = <2 3>; ++ brcm,function = ; ++ }; ++ i2c1_gpio44: i2c1_gpio44 { ++ brcm,pins = <44 45>; ++ brcm,function = ; ++ }; ++ ++ jtag_gpio22: jtag_gpio22 { ++ brcm,pins = <22 23 24 25 26 27>; ++ brcm,function = ; ++ }; ++ ++ pcm_gpio18: pcm_gpio18 { ++ brcm,pins = <18 19 20 21>; ++ brcm,function = ; ++ }; ++ pcm_gpio28: pcm_gpio28 { ++ brcm,pins = <28 29 30 31>; ++ brcm,function = ; ++ }; ++ ++ sdhost_gpio48: sdhost_gpio48 { ++ brcm,pins = <48 49 50 51 52 53>; ++ brcm,function = ; ++ }; ++ ++ spi0_gpio7: spi0_gpio7 { ++ brcm,pins = <7 8 9 10 11>; ++ brcm,function = ; ++ }; ++ spi0_gpio35: spi0_gpio35 { ++ brcm,pins = <35 36 37 38 39>; ++ brcm,function = ; ++ }; ++ spi1_gpio16: spi1_gpio16 { ++ brcm,pins = <16 17 18 19 20 21>; ++ brcm,function = ; ++ }; ++ spi2_gpio40: spi2_gpio40 { ++ brcm,pins = <40 41 42 43 44 45>; ++ brcm,function = ; ++ }; ++ ++ uart0_gpio14: uart0_gpio14 { ++ brcm,pins = <14 15>; ++ brcm,function = ; ++ }; ++ /* Separate from the uart0_gpio14 group ++ * because it conflicts with spi1_gpio16, and ++ * people often run uart0 on the two pins ++ * without flow control. ++ */ ++ uart0_ctsrts_gpio16: uart0_ctsrts_gpio16 { ++ brcm,pins = <16 17>; ++ brcm,function = ; ++ }; ++ uart0_ctsrts_gpio30: uart0_ctsrts_gpio30 { ++ brcm,pins = <30 31>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ uart0_gpio32: uart0_gpio32 { ++ brcm,pins = <32 33>; ++ brcm,function = ; ++ brcm,pull = ; ++ }; ++ uart0_gpio36: uart0_gpio36 { ++ brcm,pins = <36 37>; ++ brcm,function = ; ++ }; ++ uart0_ctsrts_gpio38: uart0_ctsrts_gpio38 { ++ brcm,pins = <38 39>; ++ brcm,function = ; ++ }; ++ ++ uart1_gpio14: uart1_gpio14 { ++ brcm,pins = <14 15>; ++ brcm,function = ; ++ }; ++ uart1_ctsrts_gpio16: uart1_ctsrts_gpio16 { ++ brcm,pins = <16 17>; ++ brcm,function = ; ++ }; ++ uart1_gpio32: uart1_gpio32 { ++ brcm,pins = <32 33>; ++ brcm,function = ; ++ }; ++ uart1_ctsrts_gpio30: uart1_ctsrts_gpio30 { ++ brcm,pins = <30 31>; ++ brcm,function = ; ++ }; ++ uart1_gpio40: uart1_gpio40 { ++ brcm,pins = <40 41>; ++ brcm,function = ; ++ }; ++ uart1_ctsrts_gpio42: uart1_ctsrts_gpio42 { ++ brcm,pins = <42 43>; ++ brcm,function = ; ++ }; ++ }; ++ ++ uart0: serial@7e201000 { ++ compatible = "arm,pl011", "arm,primecell"; ++ reg = <0x7e201000 0x200>; ++ interrupts = <2 25>; ++ clocks = <&clocks BCM2835_CLOCK_UART>, ++ <&clocks BCM2835_CLOCK_VPU>; ++ clock-names = "uartclk", "apb_pclk"; ++ arm,primecell-periphid = <0x00241011>; ++ }; ++ ++ sdhost: mmc@7e202000 { ++ compatible = "brcm,bcm2835-sdhost"; ++ reg = <0x7e202000 0x100>; ++ interrupts = <2 24>; ++ clocks = <&clocks BCM2835_CLOCK_VPU>; ++ status = "disabled"; ++ }; ++ ++ i2s: i2s@7e203000 { ++ compatible = "brcm,bcm2835-i2s"; ++ reg = <0x7e203000 0x24>; ++ clocks = <&clocks BCM2835_CLOCK_PCM>; ++ status = "disabled"; ++ }; ++ ++ spi: spi@7e204000 { ++ compatible = "brcm,bcm2835-spi"; ++ reg = <0x7e204000 0x200>; ++ interrupts = <2 22>; ++ clocks = <&clocks BCM2835_CLOCK_VPU>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "disabled"; ++ }; ++ ++ i2c0if: i2c@7e205000 { ++ compatible = "brcm,bcm2835-i2c"; ++ reg = <0x7e205000 0x200>; ++ interrupts = <2 21>; ++ clocks = <&clocks BCM2835_CLOCK_VPU>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "disabled"; ++ }; ++ ++ i2c0mux: i2c0mux { ++ compatible = "i2c-mux-pinctrl"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ i2c-parent = <&i2c0if>; ++ ++ pinctrl-names = "i2c0", "i2c_csi_dsi"; ++ ++ status = "disabled"; ++ ++ i2c0: i2c@0 { ++ reg = <0>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ }; ++ ++ i2c_csi_dsi: i2c@1 { ++ reg = <1>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ }; ++ }; ++ ++ dpi: dpi@7e208000 { ++ compatible = "brcm,bcm2835-dpi"; ++ reg = <0x7e208000 0x8c>; ++ clocks = <&clocks BCM2835_CLOCK_VPU>, ++ <&clocks BCM2835_CLOCK_DPI>; ++ clock-names = "core", "pixel"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "disabled"; ++ }; ++ ++ dsi0: dsi@7e209000 { ++ compatible = "brcm,bcm2835-dsi0"; ++ reg = <0x7e209000 0x78>; ++ interrupts = <2 4>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ #clock-cells = <1>; ++ ++ clocks = <&clocks BCM2835_PLLA_DSI0>, ++ <&clocks BCM2835_CLOCK_DSI0E>, ++ <&clocks BCM2835_CLOCK_DSI0P>; ++ clock-names = "phy", "escape", "pixel"; ++ ++ clock-output-names = "dsi0_byte", ++ "dsi0_ddr2", ++ "dsi0_ddr"; ++ ++ status = "disabled"; ++ }; ++ ++ aux: aux@7e215000 { ++ compatible = "brcm,bcm2835-aux"; ++ #clock-cells = <1>; ++ reg = <0x7e215000 0x8>; ++ clocks = <&clocks BCM2835_CLOCK_VPU>; ++ }; ++ ++ uart1: serial@7e215040 { ++ compatible = "brcm,bcm2835-aux-uart"; ++ reg = <0x7e215040 0x40>; ++ interrupts = <1 29>; ++ clocks = <&aux BCM2835_AUX_CLOCK_UART>; ++ status = "disabled"; ++ }; ++ ++ spi1: spi@7e215080 { ++ compatible = "brcm,bcm2835-aux-spi"; ++ reg = <0x7e215080 0x40>; ++ interrupts = <1 29>; ++ clocks = <&aux BCM2835_AUX_CLOCK_SPI1>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "disabled"; ++ }; ++ ++ spi2: spi@7e2150c0 { ++ compatible = "brcm,bcm2835-aux-spi"; ++ reg = <0x7e2150c0 0x40>; ++ interrupts = <1 29>; ++ clocks = <&aux BCM2835_AUX_CLOCK_SPI2>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "disabled"; ++ }; ++ ++ pwm: pwm@7e20c000 { ++ compatible = "brcm,bcm2835-pwm"; ++ reg = <0x7e20c000 0x28>; ++ clocks = <&clocks BCM2835_CLOCK_PWM>; ++ assigned-clocks = <&clocks BCM2835_CLOCK_PWM>; ++ assigned-clock-rates = <10000000>; ++ #pwm-cells = <2>; ++ status = "disabled"; ++ }; ++ ++ sdhci: sdhci@7e300000 { ++ compatible = "brcm,bcm2835-sdhci"; ++ reg = <0x7e300000 0x100>; ++ interrupts = <2 30>; ++ clocks = <&clocks BCM2835_CLOCK_EMMC>; ++ status = "disabled"; ++ }; ++ ++ hvs@7e400000 { ++ compatible = "brcm,bcm2835-hvs"; ++ reg = <0x7e400000 0x6000>; ++ interrupts = <2 1>; ++ }; ++ ++ dsi1: dsi@7e700000 { ++ compatible = "brcm,bcm2835-dsi1"; ++ reg = <0x7e700000 0x8c>; ++ interrupts = <2 12>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ #clock-cells = <1>; ++ ++ clocks = <&clocks BCM2835_PLLD_DSI1>, ++ <&clocks BCM2835_CLOCK_DSI1E>, ++ <&clocks BCM2835_CLOCK_DSI1P>; ++ clock-names = "phy", "escape", "pixel"; ++ ++ clock-output-names = "dsi1_byte", ++ "dsi1_ddr2", ++ "dsi1_ddr"; ++ ++ status = "disabled"; ++ }; ++ ++ i2c1: i2c@7e804000 { ++ compatible = "brcm,bcm2835-i2c"; ++ reg = <0x7e804000 0x1000>; ++ interrupts = <2 21>; ++ clocks = <&clocks BCM2835_CLOCK_VPU>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "disabled"; ++ }; ++ ++ vec: vec@7e806000 { ++ compatible = "brcm,bcm2835-vec"; ++ reg = <0x7e806000 0x1000>; ++ clocks = <&clocks BCM2835_CLOCK_VEC>; ++ interrupts = <2 27>; ++ status = "disabled"; ++ }; ++ ++ usb: usb@7e980000 { ++ compatible = "brcm,bcm2835-usb"; ++ reg = <0x7e980000 0x10000>; ++ interrupts = <1 9>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ clocks = <&clk_usb>; ++ clock-names = "otg"; ++ phys = <&usbphy>; ++ phy-names = "usb2-phy"; ++ }; ++ }; ++ ++ clocks { ++ /* The oscillator is the root of the clock tree. */ ++ clk_osc: clk-osc { ++ compatible = "fixed-clock"; ++ #clock-cells = <0>; ++ clock-output-names = "osc"; ++ clock-frequency = <19200000>; ++ }; ++ ++ clk_usb: clk-usb { ++ compatible = "fixed-clock"; ++ #clock-cells = <0>; ++ clock-output-names = "otg"; ++ clock-frequency = <480000000>; ++ }; ++ }; ++ ++ usbphy: phy { ++ compatible = "usb-nop-xceiv"; ++ #phy-cells = <0>; ++ }; ++}; diff --git a/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0010-bcm283x-rpi-cam1-regulator.dtsi.patch b/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0010-bcm283x-rpi-cam1-regulator.dtsi.patch new file mode 100644 index 0000000..6db8f90 --- /dev/null +++ b/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0010-bcm283x-rpi-cam1-regulator.dtsi.patch @@ -0,0 +1,13 @@ +--- /home/rossierd/soo/micofe/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/boot/dts/broadcom/bcm283x-rpi-cam1-regulator.dtsi 1970-01-01 01:00:00.000000000 +0100 ++++ ./arch/arm64/boot/dts/broadcom/bcm283x-rpi-cam1-regulator.dtsi 2026-02-08 09:42:02.534457721 +0100 +@@ -0,0 +1,10 @@ ++// SPDX-License-Identifier: GPL-2.0 ++ ++/ { ++ cam1_reg: cam1_reg { ++ compatible = "regulator-fixed"; ++ regulator-name = "cam1-reg"; ++ enable-active-high; ++ status = "disabled"; ++ }; ++}; diff --git a/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0011-bcm283x-rpi-csi1-2lane.dtsi.patch b/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0011-bcm283x-rpi-csi1-2lane.dtsi.patch new file mode 100644 index 0000000..148ec00 --- /dev/null +++ b/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0011-bcm283x-rpi-csi1-2lane.dtsi.patch @@ -0,0 +1,7 @@ +--- /home/rossierd/soo/micofe/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/boot/dts/broadcom/bcm283x-rpi-csi1-2lane.dtsi 1970-01-01 01:00:00.000000000 +0100 ++++ ./arch/arm64/boot/dts/broadcom/bcm283x-rpi-csi1-2lane.dtsi 2026-02-08 09:42:02.534436268 +0100 +@@ -0,0 +1,4 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++&csi1 { ++ brcm,num-data-lanes = <2>; ++}; diff --git a/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0012-bcm283x-rpi-i2c0mux_0_44.dtsi.patch b/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0012-bcm283x-rpi-i2c0mux_0_44.dtsi.patch new file mode 100644 index 0000000..55c2aee --- /dev/null +++ b/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0012-bcm283x-rpi-i2c0mux_0_44.dtsi.patch @@ -0,0 +1,7 @@ +--- /home/rossierd/soo/micofe/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/boot/dts/broadcom/bcm283x-rpi-i2c0mux_0_44.dtsi 1970-01-01 01:00:00.000000000 +0100 ++++ ./arch/arm64/boot/dts/broadcom/bcm283x-rpi-i2c0mux_0_44.dtsi 2026-02-08 09:42:02.534403509 +0100 +@@ -0,0 +1,4 @@ ++&i2c0mux { ++ pinctrl-0 = <&i2c0_gpio0>; ++ pinctrl-1 = <&i2c0_gpio44>; ++}; diff --git a/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0013-bcm283x-rpi-usb-peripheral.dtsi.patch b/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0013-bcm283x-rpi-usb-peripheral.dtsi.patch new file mode 100644 index 0000000..888f450 --- /dev/null +++ b/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0013-bcm283x-rpi-usb-peripheral.dtsi.patch @@ -0,0 +1,10 @@ +--- /home/rossierd/soo/micofe/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/boot/dts/broadcom/bcm283x-rpi-usb-peripheral.dtsi 1970-01-01 01:00:00.000000000 +0100 ++++ ./arch/arm64/boot/dts/broadcom/bcm283x-rpi-usb-peripheral.dtsi 2026-02-08 09:42:02.534532772 +0100 +@@ -0,0 +1,7 @@ ++// SPDX-License-Identifier: GPL-2.0 ++&usb { ++ dr_mode = "peripheral"; ++ g-rx-fifo-size = <256>; ++ g-np-tx-fifo-size = <32>; ++ g-tx-fifo-size = <256 256 512 512 512 768 768>; ++}; diff --git a/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0014-rpi4_64_defconfig.patch b/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0014-rpi4_64_defconfig.patch new file mode 100644 index 0000000..5ce299c --- /dev/null +++ b/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0014-rpi4_64_defconfig.patch @@ -0,0 +1,9570 @@ +--- /home/rossierd/soo/micofe/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/configs/rpi4_64_defconfig 1970-01-01 01:00:00.000000000 +0100 ++++ ./arch/arm64/configs/rpi4_64_defconfig 2026-02-08 09:42:02.565101571 +0100 +@@ -0,0 +1,9567 @@ ++# ++# Automatically generated file; DO NOT EDIT. ++# Linux/arm64 6.12.44 Kernel Configuration ++# ++CONFIG_CC_VERSION_TEXT="aarch64-none-linux-gnu-gcc (Arm GNU Toolchain 12.2.Rel1 (Build arm-12.24)) 12.2.1 20221205" ++CONFIG_CC_IS_GCC=y ++CONFIG_GCC_VERSION=120201 ++CONFIG_CLANG_VERSION=0 ++CONFIG_AS_IS_GNU=y ++CONFIG_AS_VERSION=23900 ++CONFIG_LD_IS_BFD=y ++CONFIG_LD_VERSION=23900 ++CONFIG_LLD_VERSION=0 ++CONFIG_RUSTC_VERSION=0 ++CONFIG_RUSTC_LLVM_VERSION=0 ++CONFIG_CC_CAN_LINK=y ++CONFIG_CC_CAN_LINK_STATIC=y ++CONFIG_GCC_ASM_GOTO_OUTPUT_BROKEN=y ++CONFIG_CC_HAS_ASM_INLINE=y ++CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y ++CONFIG_LD_CAN_USE_KEEP_IN_OVERLAY=y ++CONFIG_PAHOLE_VERSION=0 ++CONFIG_IRQ_WORK=y ++CONFIG_BUILDTIME_TABLE_SORT=y ++CONFIG_THREAD_INFO_IN_TASK=y ++ ++# ++# General setup ++# ++CONFIG_INIT_ENV_ARG_LIMIT=32 ++# CONFIG_COMPILE_TEST is not set ++# CONFIG_WERROR is not set ++CONFIG_LOCALVERSION="-v8" ++# CONFIG_LOCALVERSION_AUTO is not set ++CONFIG_BUILD_SALT="" ++CONFIG_DEFAULT_INIT="" ++CONFIG_DEFAULT_HOSTNAME="(none)" ++CONFIG_SYSVIPC=y ++CONFIG_SYSVIPC_SYSCTL=y ++CONFIG_SYSVIPC_COMPAT=y ++CONFIG_POSIX_MQUEUE=y ++CONFIG_POSIX_MQUEUE_SYSCTL=y ++# CONFIG_WATCH_QUEUE is not set ++CONFIG_CROSS_MEMORY_ATTACH=y ++# CONFIG_USELIB is not set ++CONFIG_AUDIT=y ++CONFIG_HAVE_ARCH_AUDITSYSCALL=y ++CONFIG_AUDITSYSCALL=y ++ ++# ++# IRQ subsystem ++# ++CONFIG_GENERIC_IRQ_PROBE=y ++CONFIG_GENERIC_IRQ_SHOW=y ++CONFIG_GENERIC_IRQ_SHOW_LEVEL=y ++CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y ++CONFIG_GENERIC_IRQ_MIGRATION=y ++CONFIG_GENERIC_IRQ_INJECTION=y ++CONFIG_HARDIRQS_SW_RESEND=y ++CONFIG_GENERIC_IRQ_CHIP=y ++CONFIG_IRQ_DOMAIN=y ++CONFIG_IRQ_SIM=y ++CONFIG_IRQ_DOMAIN_HIERARCHY=y ++CONFIG_GENERIC_IRQ_IPI=y ++CONFIG_GENERIC_MSI_IRQ=y ++CONFIG_IRQ_MSI_IOMMU=y ++CONFIG_IRQ_FORCED_THREADING=y ++CONFIG_SPARSE_IRQ=y ++CONFIG_GENERIC_IRQ_DEBUGFS=y ++# end of IRQ subsystem ++ ++CONFIG_GENERIC_TIME_VSYSCALL=y ++CONFIG_GENERIC_CLOCKEVENTS=y ++CONFIG_ARCH_HAS_TICK_BROADCAST=y ++CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y ++CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y ++CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y ++CONFIG_CONTEXT_TRACKING=y ++CONFIG_CONTEXT_TRACKING_IDLE=y ++ ++# ++# Timers subsystem ++# ++CONFIG_TICK_ONESHOT=y ++CONFIG_NO_HZ_COMMON=y ++# CONFIG_HZ_PERIODIC is not set ++CONFIG_NO_HZ_IDLE=y ++# CONFIG_NO_HZ_FULL is not set ++CONFIG_NO_HZ=y ++CONFIG_HIGH_RES_TIMERS=y ++# end of Timers subsystem ++ ++CONFIG_BPF=y ++CONFIG_HAVE_EBPF_JIT=y ++CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y ++ ++# ++# BPF subsystem ++# ++CONFIG_BPF_SYSCALL=y ++CONFIG_BPF_JIT=y ++# CONFIG_BPF_JIT_ALWAYS_ON is not set ++CONFIG_BPF_JIT_DEFAULT_ON=y ++CONFIG_BPF_UNPRIV_DEFAULT_OFF=y ++# CONFIG_BPF_PRELOAD is not set ++# CONFIG_BPF_LSM is not set ++# end of BPF subsystem ++ ++CONFIG_PREEMPT_BUILD=y ++# CONFIG_PREEMPT_NONE is not set ++# CONFIG_PREEMPT_VOLUNTARY is not set ++CONFIG_PREEMPT=y ++# CONFIG_PREEMPT_RT is not set ++CONFIG_PREEMPT_COUNT=y ++CONFIG_PREEMPTION=y ++# CONFIG_PREEMPT_DYNAMIC is not set ++ ++# ++# CPU/Task time and stats accounting ++# ++CONFIG_TICK_CPU_ACCOUNTING=y ++# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set ++# CONFIG_IRQ_TIME_ACCOUNTING is not set ++CONFIG_BSD_PROCESS_ACCT=y ++CONFIG_BSD_PROCESS_ACCT_V3=y ++CONFIG_TASKSTATS=y ++CONFIG_TASK_DELAY_ACCT=y ++CONFIG_TASK_XACCT=y ++CONFIG_TASK_IO_ACCOUNTING=y ++CONFIG_PSI=y ++CONFIG_PSI_DEFAULT_DISABLED=y ++# end of CPU/Task time and stats accounting ++ ++CONFIG_CPU_ISOLATION=y ++ ++# ++# RCU Subsystem ++# ++CONFIG_TREE_RCU=y ++CONFIG_PREEMPT_RCU=y ++# CONFIG_RCU_EXPERT is not set ++CONFIG_TREE_SRCU=y ++CONFIG_TASKS_RCU_GENERIC=y ++CONFIG_NEED_TASKS_RCU=y ++CONFIG_TASKS_RCU=y ++CONFIG_TASKS_RUDE_RCU=y ++CONFIG_TASKS_TRACE_RCU=y ++CONFIG_RCU_STALL_COMMON=y ++CONFIG_RCU_NEED_SEGCBLIST=y ++# end of RCU Subsystem ++ ++CONFIG_IKCONFIG=m ++CONFIG_IKCONFIG_PROC=y ++# CONFIG_IKHEADERS is not set ++CONFIG_LOG_BUF_SHIFT=17 ++CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 ++# CONFIG_PRINTK_INDEX is not set ++CONFIG_GENERIC_SCHED_CLOCK=y ++ ++# ++# Scheduler features ++# ++# CONFIG_UCLAMP_TASK is not set ++# end of Scheduler features ++ ++CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y ++CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y ++CONFIG_CC_HAS_INT128=y ++CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" ++CONFIG_GCC10_NO_ARRAY_BOUNDS=y ++CONFIG_CC_NO_ARRAY_BOUNDS=y ++CONFIG_GCC_NO_STRINGOP_OVERFLOW=y ++CONFIG_CC_NO_STRINGOP_OVERFLOW=y ++CONFIG_ARCH_SUPPORTS_INT128=y ++# CONFIG_NUMA_BALANCING is not set ++CONFIG_SLAB_OBJ_EXT=y ++CONFIG_CGROUPS=y ++CONFIG_PAGE_COUNTER=y ++# CONFIG_CGROUP_FAVOR_DYNMODS is not set ++CONFIG_MEMCG=y ++# CONFIG_MEMCG_V1 is not set ++CONFIG_BLK_CGROUP=y ++CONFIG_CGROUP_WRITEBACK=y ++CONFIG_CGROUP_SCHED=y ++CONFIG_GROUP_SCHED_WEIGHT=y ++CONFIG_FAIR_GROUP_SCHED=y ++CONFIG_CFS_BANDWIDTH=y ++# CONFIG_RT_GROUP_SCHED is not set ++CONFIG_SCHED_MM_CID=y ++CONFIG_CGROUP_PIDS=y ++# CONFIG_CGROUP_RDMA is not set ++CONFIG_CGROUP_FREEZER=y ++CONFIG_CPUSETS=y ++CONFIG_CPUSETS_V1=y ++CONFIG_PROC_PID_CPUSET=y ++CONFIG_CGROUP_DEVICE=y ++CONFIG_CGROUP_CPUACCT=y ++CONFIG_CGROUP_PERF=y ++CONFIG_CGROUP_BPF=y ++# CONFIG_CGROUP_MISC is not set ++# CONFIG_CGROUP_DEBUG is not set ++CONFIG_SOCK_CGROUP_DATA=y ++CONFIG_NAMESPACES=y ++CONFIG_UTS_NS=y ++CONFIG_TIME_NS=y ++CONFIG_IPC_NS=y ++CONFIG_USER_NS=y ++CONFIG_PID_NS=y ++CONFIG_NET_NS=y ++CONFIG_CHECKPOINT_RESTORE=y ++CONFIG_SCHED_AUTOGROUP=y ++CONFIG_RELAY=y ++CONFIG_BLK_DEV_INITRD=y ++CONFIG_INITRAMFS_SOURCE="" ++CONFIG_RD_GZIP=y ++CONFIG_RD_BZIP2=y ++CONFIG_RD_LZMA=y ++CONFIG_RD_XZ=y ++CONFIG_RD_LZO=y ++CONFIG_RD_LZ4=y ++CONFIG_RD_ZSTD=y ++# CONFIG_BOOT_CONFIG is not set ++CONFIG_INITRAMFS_PRESERVE_MTIME=y ++CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y ++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set ++CONFIG_LD_ORPHAN_WARN=y ++CONFIG_LD_ORPHAN_WARN_LEVEL="warn" ++CONFIG_SYSCTL=y ++CONFIG_HAVE_UID16=y ++CONFIG_SYSCTL_EXCEPTION_TRACE=y ++CONFIG_EXPERT=y ++CONFIG_UID16=y ++CONFIG_MULTIUSER=y ++# CONFIG_SGETMASK_SYSCALL is not set ++CONFIG_SYSFS_SYSCALL=y ++CONFIG_FHANDLE=y ++CONFIG_POSIX_TIMERS=y ++CONFIG_PRINTK=y ++CONFIG_BUG=y ++CONFIG_ELF_CORE=y ++# CONFIG_BASE_SMALL is not set ++CONFIG_FUTEX=y ++CONFIG_FUTEX_PI=y ++CONFIG_EPOLL=y ++CONFIG_SIGNALFD=y ++CONFIG_TIMERFD=y ++CONFIG_EVENTFD=y ++CONFIG_SHMEM=y ++CONFIG_AIO=y ++CONFIG_IO_URING=y ++CONFIG_ADVISE_SYSCALLS=y ++CONFIG_MEMBARRIER=y ++CONFIG_KCMP=y ++CONFIG_RSEQ=y ++# CONFIG_DEBUG_RSEQ is not set ++CONFIG_CACHESTAT_SYSCALL=y ++# CONFIG_PC104 is not set ++CONFIG_KALLSYMS=y ++# CONFIG_KALLSYMS_SELFTEST is not set ++CONFIG_KALLSYMS_ALL=y ++CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y ++CONFIG_HAVE_PERF_EVENTS=y ++CONFIG_GUEST_PERF_EVENTS=y ++ ++# ++# Kernel Performance Events And Counters ++# ++CONFIG_PERF_EVENTS=y ++# CONFIG_DEBUG_PERF_USE_VMALLOC is not set ++# end of Kernel Performance Events And Counters ++ ++CONFIG_SYSTEM_DATA_VERIFICATION=y ++CONFIG_PROFILING=y ++CONFIG_TRACEPOINTS=y ++ ++# ++# Kexec and crash features ++# ++# CONFIG_KEXEC_FILE is not set ++# end of Kexec and crash features ++# end of General setup ++ ++CONFIG_ARM64=y ++CONFIG_RUSTC_SUPPORTS_ARM64=y ++CONFIG_GCC_SUPPORTS_DYNAMIC_FTRACE_WITH_ARGS=y ++CONFIG_64BIT=y ++CONFIG_MMU=y ++CONFIG_ARM64_CONT_PTE_SHIFT=4 ++CONFIG_ARM64_CONT_PMD_SHIFT=4 ++CONFIG_ARCH_MMAP_RND_BITS_MIN=18 ++CONFIG_ARCH_MMAP_RND_BITS_MAX=24 ++CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11 ++CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 ++CONFIG_STACKTRACE_SUPPORT=y ++CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 ++CONFIG_LOCKDEP_SUPPORT=y ++CONFIG_GENERIC_BUG=y ++CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y ++CONFIG_GENERIC_HWEIGHT=y ++CONFIG_GENERIC_CSUM=y ++CONFIG_GENERIC_CALIBRATE_DELAY=y ++CONFIG_SMP=y ++CONFIG_KERNEL_MODE_NEON=y ++CONFIG_FIX_EARLYCON_MEM=y ++CONFIG_PGTABLE_LEVELS=3 ++CONFIG_ARCH_SUPPORTS_UPROBES=y ++CONFIG_ARCH_PROC_KCORE_TEXT=y ++CONFIG_BUILTIN_RETURN_ADDRESS_STRIPS_PAC=y ++ ++# ++# Platform selection ++# ++# CONFIG_ARCH_ACTIONS is not set ++# CONFIG_ARCH_AIROHA is not set ++# CONFIG_ARCH_SUNXI is not set ++# CONFIG_ARCH_ALPINE is not set ++# CONFIG_ARCH_APPLE is not set ++CONFIG_ARCH_BCM=y ++CONFIG_ARCH_BCM2835=y ++# CONFIG_ARCH_BCM_IPROC is not set ++# CONFIG_ARCH_BCMBCA is not set ++CONFIG_ARCH_BRCMSTB=y ++# CONFIG_ARCH_BERLIN is not set ++# CONFIG_ARCH_BITMAIN is not set ++# CONFIG_ARCH_EXYNOS is not set ++# CONFIG_ARCH_SPARX5 is not set ++# CONFIG_ARCH_K3 is not set ++# CONFIG_ARCH_LG1K is not set ++# CONFIG_ARCH_HISI is not set ++# CONFIG_ARCH_KEEMBAY is not set ++# CONFIG_ARCH_MEDIATEK is not set ++# CONFIG_ARCH_MESON is not set ++# CONFIG_ARCH_MVEBU is not set ++# CONFIG_ARCH_NXP is not set ++# CONFIG_ARCH_MA35 is not set ++# CONFIG_ARCH_NPCM is not set ++# CONFIG_ARCH_PENSANDO is not set ++# CONFIG_ARCH_QCOM is not set ++# CONFIG_ARCH_REALTEK is not set ++# CONFIG_ARCH_RENESAS is not set ++# CONFIG_ARCH_ROCKCHIP is not set ++# CONFIG_ARCH_SEATTLE is not set ++# CONFIG_ARCH_INTEL_SOCFPGA is not set ++# CONFIG_ARCH_STM32 is not set ++# CONFIG_ARCH_SYNQUACER is not set ++# CONFIG_ARCH_TEGRA is not set ++# CONFIG_ARCH_SPRD is not set ++# CONFIG_ARCH_THUNDER is not set ++# CONFIG_ARCH_THUNDER2 is not set ++# CONFIG_ARCH_UNIPHIER is not set ++# CONFIG_ARCH_VEXPRESS is not set ++# CONFIG_ARCH_VISCONTI is not set ++# CONFIG_ARCH_XGENE is not set ++# CONFIG_ARCH_ZYNQMP is not set ++# end of Platform selection ++ ++# ++# Kernel Features ++# ++ ++# ++# ARM errata workarounds via the alternatives framework ++# ++CONFIG_AMPERE_ERRATUM_AC03_CPU_38=y ++CONFIG_ARM64_WORKAROUND_CLEAN_CACHE=y ++CONFIG_ARM64_ERRATUM_826319=y ++CONFIG_ARM64_ERRATUM_827319=y ++CONFIG_ARM64_ERRATUM_824069=y ++CONFIG_ARM64_ERRATUM_819472=y ++CONFIG_ARM64_ERRATUM_832075=y ++CONFIG_ARM64_ERRATUM_834220=y ++CONFIG_ARM64_ERRATUM_1742098=y ++CONFIG_ARM64_ERRATUM_845719=y ++CONFIG_ARM64_ERRATUM_843419=y ++CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y ++CONFIG_ARM64_ERRATUM_1024718=y ++CONFIG_ARM64_ERRATUM_1418040=y ++CONFIG_ARM64_WORKAROUND_SPECULATIVE_AT=y ++CONFIG_ARM64_ERRATUM_1165522=y ++CONFIG_ARM64_ERRATUM_1319367=y ++CONFIG_ARM64_ERRATUM_1530923=y ++CONFIG_ARM64_WORKAROUND_REPEAT_TLBI=y ++CONFIG_ARM64_ERRATUM_2441007=y ++CONFIG_ARM64_ERRATUM_1286807=y ++CONFIG_ARM64_ERRATUM_1463225=y ++CONFIG_ARM64_ERRATUM_1542419=y ++CONFIG_ARM64_ERRATUM_1508412=y ++CONFIG_ARM64_ERRATUM_2051678=y ++CONFIG_ARM64_ERRATUM_2077057=y ++CONFIG_ARM64_ERRATUM_2658417=y ++CONFIG_ARM64_WORKAROUND_TSB_FLUSH_FAILURE=y ++CONFIG_ARM64_ERRATUM_2054223=y ++CONFIG_ARM64_ERRATUM_2067961=y ++CONFIG_ARM64_ERRATUM_2441009=y ++CONFIG_ARM64_ERRATUM_2457168=y ++CONFIG_ARM64_ERRATUM_2645198=y ++CONFIG_ARM64_WORKAROUND_SPECULATIVE_UNPRIV_LOAD=y ++CONFIG_ARM64_ERRATUM_2966298=y ++CONFIG_ARM64_ERRATUM_3117295=y ++CONFIG_ARM64_ERRATUM_3194386=y ++# CONFIG_CAVIUM_ERRATUM_22375 is not set ++CONFIG_CAVIUM_ERRATUM_23144=y ++# CONFIG_CAVIUM_ERRATUM_23154 is not set ++# CONFIG_CAVIUM_ERRATUM_27456 is not set ++CONFIG_CAVIUM_ERRATUM_30115=y ++CONFIG_CAVIUM_TX2_ERRATUM_219=y ++CONFIG_FUJITSU_ERRATUM_010001=y ++CONFIG_HISILICON_ERRATUM_161600802=y ++CONFIG_HISILICON_ERRATUM_162100801=y ++CONFIG_QCOM_FALKOR_ERRATUM_1003=y ++CONFIG_QCOM_FALKOR_ERRATUM_1009=y ++CONFIG_QCOM_QDF2400_ERRATUM_0065=y ++CONFIG_QCOM_FALKOR_ERRATUM_E1041=y ++CONFIG_NVIDIA_CARMEL_CNP_ERRATUM=y ++CONFIG_ROCKCHIP_ERRATUM_3588001=y ++CONFIG_SOCIONEXT_SYNQUACER_PREITS=y ++# end of ARM errata workarounds via the alternatives framework ++ ++CONFIG_ARM64_4K_PAGES=y ++# CONFIG_ARM64_16K_PAGES is not set ++# CONFIG_ARM64_64K_PAGES is not set ++CONFIG_ARM64_VA_BITS_39=y ++# CONFIG_ARM64_VA_BITS_48 is not set ++# CONFIG_ARM64_VA_BITS_52 is not set ++CONFIG_ARM64_VA_BITS=39 ++CONFIG_ARM64_PA_BITS_48=y ++CONFIG_ARM64_PA_BITS=48 ++# CONFIG_CPU_BIG_ENDIAN is not set ++CONFIG_CPU_LITTLE_ENDIAN=y ++# CONFIG_SCHED_MC is not set ++# CONFIG_SCHED_CLUSTER is not set ++# CONFIG_SCHED_SMT is not set ++CONFIG_NR_CPUS=4 ++CONFIG_HOTPLUG_CPU=y ++CONFIG_NUMA=y ++CONFIG_NODES_SHIFT=4 ++# CONFIG_HZ_100 is not set ++CONFIG_HZ_250=y ++# CONFIG_HZ_300 is not set ++# CONFIG_HZ_1000 is not set ++CONFIG_HZ=250 ++CONFIG_SCHED_HRTICK=y ++CONFIG_ARCH_SPARSEMEM_ENABLE=y ++CONFIG_HW_PERF_EVENTS=y ++CONFIG_CC_HAVE_SHADOW_CALL_STACK=y ++# CONFIG_PARAVIRT is not set ++# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set ++CONFIG_ARCH_SUPPORTS_KEXEC_FILE=y ++CONFIG_ARCH_SUPPORTS_KEXEC_SIG=y ++CONFIG_ARCH_SUPPORTS_KEXEC_IMAGE_VERIFY_SIG=y ++CONFIG_ARCH_DEFAULT_KEXEC_IMAGE_VERIFY_SIG=y ++CONFIG_ARCH_SUPPORTS_CRASH_DUMP=y ++CONFIG_ARCH_DEFAULT_CRASH_DUMP=y ++# CONFIG_XEN is not set ++CONFIG_ARCH_FORCE_MAX_ORDER=10 ++CONFIG_UNMAP_KERNEL_AT_EL0=y ++CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY=y ++CONFIG_RODATA_FULL_DEFAULT_ENABLED=y ++# CONFIG_ARM64_SW_TTBR0_PAN is not set ++CONFIG_ARM64_TAGGED_ADDR_ABI=y ++CONFIG_COMPAT=y ++CONFIG_KUSER_HELPERS=y ++# CONFIG_COMPAT_ALIGNMENT_FIXUPS is not set ++CONFIG_ARMV8_DEPRECATED=y ++CONFIG_SWP_EMULATION=y ++CONFIG_CP15_BARRIER_EMULATION=y ++CONFIG_SETEND_EMULATION=y ++ ++# ++# ARMv8.1 architectural features ++# ++CONFIG_ARM64_HW_AFDBM=y ++CONFIG_ARM64_PAN=y ++CONFIG_AS_HAS_LSE_ATOMICS=y ++CONFIG_ARM64_LSE_ATOMICS=y ++CONFIG_ARM64_USE_LSE_ATOMICS=y ++# end of ARMv8.1 architectural features ++ ++# ++# ARMv8.2 architectural features ++# ++CONFIG_AS_HAS_ARMV8_2=y ++CONFIG_AS_HAS_SHA3=y ++# CONFIG_ARM64_PMEM is not set ++CONFIG_ARM64_RAS_EXTN=y ++CONFIG_ARM64_CNP=y ++# end of ARMv8.2 architectural features ++ ++# ++# ARMv8.3 architectural features ++# ++CONFIG_ARM64_PTR_AUTH=y ++CONFIG_ARM64_PTR_AUTH_KERNEL=y ++CONFIG_CC_HAS_BRANCH_PROT_PAC_RET=y ++CONFIG_CC_HAS_SIGN_RETURN_ADDRESS=y ++CONFIG_AS_HAS_ARMV8_3=y ++CONFIG_AS_HAS_CFI_NEGATE_RA_STATE=y ++CONFIG_AS_HAS_LDAPR=y ++# end of ARMv8.3 architectural features ++ ++# ++# ARMv8.4 architectural features ++# ++CONFIG_ARM64_AMU_EXTN=y ++CONFIG_AS_HAS_ARMV8_4=y ++CONFIG_ARM64_TLB_RANGE=y ++# end of ARMv8.4 architectural features ++ ++# ++# ARMv8.5 architectural features ++# ++CONFIG_AS_HAS_ARMV8_5=y ++CONFIG_ARM64_BTI=y ++CONFIG_CC_HAS_BRANCH_PROT_PAC_RET_BTI=y ++CONFIG_ARM64_E0PD=y ++CONFIG_ARM64_AS_HAS_MTE=y ++CONFIG_ARM64_MTE=y ++# end of ARMv8.5 architectural features ++ ++# ++# ARMv8.7 architectural features ++# ++CONFIG_ARM64_EPAN=y ++# end of ARMv8.7 architectural features ++ ++# ++# ARMv8.9 architectural features ++# ++CONFIG_ARM64_POE=y ++CONFIG_ARCH_PKEY_BITS=3 ++# end of ARMv8.9 architectural features ++ ++CONFIG_ARM64_SVE=y ++# CONFIG_ARM64_PSEUDO_NMI is not set ++CONFIG_RELOCATABLE=y ++CONFIG_RANDOMIZE_BASE=y ++CONFIG_RANDOMIZE_MODULE_REGION_FULL=y ++CONFIG_CC_HAVE_STACKPROTECTOR_SYSREG=y ++CONFIG_STACKPROTECTOR_PER_TASK=y ++# end of Kernel Features ++ ++# ++# Boot options ++# ++CONFIG_CMDLINE="console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait" ++CONFIG_CMDLINE_FROM_BOOTLOADER=y ++# CONFIG_CMDLINE_FORCE is not set ++CONFIG_EFI_STUB=y ++CONFIG_EFI=y ++# CONFIG_COMPRESSED_INSTALL is not set ++CONFIG_DMI=y ++# end of Boot options ++ ++# ++# Power management options ++# ++# CONFIG_SUSPEND is not set ++# CONFIG_HIBERNATION is not set ++CONFIG_PM=y ++CONFIG_PM_DEBUG=y ++# CONFIG_PM_ADVANCED_DEBUG is not set ++# CONFIG_DPM_WATCHDOG is not set ++CONFIG_PM_CLK=y ++CONFIG_PM_GENERIC_DOMAINS=y ++# CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set ++CONFIG_PM_GENERIC_DOMAINS_OF=y ++CONFIG_CPU_PM=y ++# CONFIG_ENERGY_MODEL is not set ++CONFIG_ARCH_HIBERNATION_POSSIBLE=y ++CONFIG_ARCH_SUSPEND_POSSIBLE=y ++# end of Power management options ++ ++# ++# CPU Power Management ++# ++ ++# ++# CPU Idle ++# ++CONFIG_CPU_IDLE=y ++# CONFIG_CPU_IDLE_GOV_LADDER is not set ++CONFIG_CPU_IDLE_GOV_MENU=y ++# CONFIG_CPU_IDLE_GOV_TEO is not set ++ ++# ++# ARM CPU Idle Drivers ++# ++# CONFIG_ARM_PSCI_CPUIDLE is not set ++# end of ARM CPU Idle Drivers ++# end of CPU Idle ++ ++# ++# CPU Frequency scaling ++# ++CONFIG_CPU_FREQ=y ++CONFIG_CPU_FREQ_GOV_ATTR_SET=y ++CONFIG_CPU_FREQ_GOV_COMMON=y ++CONFIG_CPU_FREQ_STAT=y ++# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set ++# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set ++# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set ++CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y ++# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set ++# CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set ++CONFIG_CPU_FREQ_GOV_PERFORMANCE=y ++CONFIG_CPU_FREQ_GOV_POWERSAVE=y ++CONFIG_CPU_FREQ_GOV_USERSPACE=y ++CONFIG_CPU_FREQ_GOV_ONDEMAND=y ++CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y ++CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y ++ ++# ++# CPU frequency scaling drivers ++# ++CONFIG_CPUFREQ_DT=y ++CONFIG_CPUFREQ_DT_PLATDEV=y ++CONFIG_ARM_BRCMSTB_AVS_CPUFREQ=y ++CONFIG_ARM_RASPBERRYPI_CPUFREQ=y ++# end of CPU Frequency scaling ++# end of CPU Power Management ++ ++CONFIG_ARCH_SUPPORTS_ACPI=y ++# CONFIG_ACPI is not set ++CONFIG_KVM_COMMON=y ++CONFIG_HAVE_KVM_IRQCHIP=y ++CONFIG_HAVE_KVM_IRQ_ROUTING=y ++CONFIG_HAVE_KVM_DIRTY_RING=y ++CONFIG_HAVE_KVM_DIRTY_RING_ACQ_REL=y ++CONFIG_NEED_KVM_DIRTY_RING_WITH_BITMAP=y ++CONFIG_KVM_MMIO=y ++CONFIG_HAVE_KVM_MSI=y ++CONFIG_HAVE_KVM_READONLY_MEM=y ++CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT=y ++CONFIG_KVM_VFIO=y ++CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y ++CONFIG_HAVE_KVM_IRQ_BYPASS=y ++CONFIG_HAVE_KVM_VCPU_RUN_PID_CHANGE=y ++CONFIG_KVM_XFER_TO_GUEST_WORK=y ++CONFIG_KVM_GENERIC_HARDWARE_ENABLING=y ++CONFIG_KVM_GENERIC_MMU_NOTIFIER=y ++CONFIG_VIRTUALIZATION=y ++CONFIG_KVM=y ++# CONFIG_NVHE_EL2_DEBUG is not set ++# CONFIG_PTDUMP_STAGE2_DEBUGFS is not set ++CONFIG_CPU_MITIGATIONS=y ++ ++# ++# General architecture-dependent options ++# ++CONFIG_ARCH_HAS_SUBPAGE_FAULTS=y ++CONFIG_HOTPLUG_CORE_SYNC=y ++CONFIG_HOTPLUG_CORE_SYNC_DEAD=y ++CONFIG_KPROBES=y ++CONFIG_JUMP_LABEL=y ++# CONFIG_STATIC_KEYS_SELFTEST is not set ++CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y ++CONFIG_KRETPROBES=y ++CONFIG_HAVE_IOREMAP_PROT=y ++CONFIG_HAVE_KPROBES=y ++CONFIG_HAVE_KRETPROBES=y ++CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y ++CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y ++CONFIG_HAVE_NMI=y ++CONFIG_TRACE_IRQFLAGS_SUPPORT=y ++CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y ++CONFIG_HAVE_ARCH_TRACEHOOK=y ++CONFIG_HAVE_DMA_CONTIGUOUS=y ++CONFIG_GENERIC_SMP_IDLE_THREAD=y ++CONFIG_GENERIC_IDLE_POLL_SETUP=y ++CONFIG_ARCH_HAS_FORTIFY_SOURCE=y ++CONFIG_ARCH_HAS_KEEPINITRD=y ++CONFIG_ARCH_HAS_SET_MEMORY=y ++CONFIG_ARCH_HAS_SET_DIRECT_MAP=y ++CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y ++CONFIG_ARCH_WANTS_NO_INSTR=y ++CONFIG_HAVE_ASM_MODVERSIONS=y ++CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y ++CONFIG_HAVE_RSEQ=y ++CONFIG_HAVE_RUST=y ++CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y ++CONFIG_HAVE_HW_BREAKPOINT=y ++CONFIG_HAVE_PERF_REGS=y ++CONFIG_HAVE_PERF_USER_STACK_DUMP=y ++CONFIG_HAVE_ARCH_JUMP_LABEL=y ++CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y ++CONFIG_MMU_GATHER_TABLE_FREE=y ++CONFIG_MMU_GATHER_RCU_TABLE_FREE=y ++CONFIG_MMU_LAZY_TLB_REFCOUNT=y ++CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y ++CONFIG_ARCH_HAS_NMI_SAFE_THIS_CPU_OPS=y ++CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y ++CONFIG_HAVE_CMPXCHG_LOCAL=y ++CONFIG_HAVE_CMPXCHG_DOUBLE=y ++CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y ++CONFIG_HAVE_ARCH_SECCOMP=y ++CONFIG_HAVE_ARCH_SECCOMP_FILTER=y ++CONFIG_SECCOMP=y ++CONFIG_SECCOMP_FILTER=y ++# CONFIG_SECCOMP_CACHE_DEBUG is not set ++CONFIG_HAVE_ARCH_STACKLEAK=y ++CONFIG_HAVE_STACKPROTECTOR=y ++CONFIG_STACKPROTECTOR=y ++CONFIG_STACKPROTECTOR_STRONG=y ++CONFIG_ARCH_SUPPORTS_SHADOW_CALL_STACK=y ++# CONFIG_SHADOW_CALL_STACK is not set ++CONFIG_ARCH_SUPPORTS_LTO_CLANG=y ++CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y ++CONFIG_LTO_NONE=y ++CONFIG_ARCH_SUPPORTS_CFI_CLANG=y ++CONFIG_HAVE_CONTEXT_TRACKING_USER=y ++CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y ++CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y ++CONFIG_HAVE_MOVE_PUD=y ++CONFIG_HAVE_MOVE_PMD=y ++CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y ++CONFIG_HAVE_ARCH_HUGE_VMAP=y ++CONFIG_HAVE_ARCH_HUGE_VMALLOC=y ++CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y ++CONFIG_HAVE_MOD_ARCH_SPECIFIC=y ++CONFIG_MODULES_USE_ELF_RELA=y ++CONFIG_ARCH_WANTS_EXECMEM_LATE=y ++CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y ++CONFIG_SOFTIRQ_ON_OWN_STACK=y ++CONFIG_ARCH_HAS_ELF_RANDOMIZE=y ++CONFIG_HAVE_ARCH_MMAP_RND_BITS=y ++CONFIG_ARCH_MMAP_RND_BITS=18 ++CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y ++CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11 ++CONFIG_HAVE_PAGE_SIZE_4KB=y ++CONFIG_PAGE_SIZE_4KB=y ++CONFIG_PAGE_SIZE_LESS_THAN_64KB=y ++CONFIG_PAGE_SIZE_LESS_THAN_256KB=y ++CONFIG_PAGE_SHIFT=12 ++CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y ++CONFIG_CLONE_BACKWARDS=y ++CONFIG_OLD_SIGSUSPEND3=y ++CONFIG_COMPAT_OLD_SIGACTION=y ++CONFIG_COMPAT_32BIT_TIME=y ++CONFIG_ARCH_SUPPORTS_RT=y ++CONFIG_HAVE_ARCH_VMAP_STACK=y ++CONFIG_VMAP_STACK=y ++CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y ++CONFIG_RANDOMIZE_KSTACK_OFFSET=y ++# CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set ++CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y ++CONFIG_STRICT_KERNEL_RWX=y ++CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y ++CONFIG_STRICT_MODULE_RWX=y ++CONFIG_HAVE_ARCH_COMPILER_H=y ++CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y ++CONFIG_ARCH_USE_MEMREMAP_PROT=y ++# CONFIG_LOCK_EVENT_COUNTS is not set ++CONFIG_ARCH_HAS_RELR=y ++CONFIG_ARCH_HAS_MEM_ENCRYPT=y ++CONFIG_HAVE_PREEMPT_DYNAMIC=y ++CONFIG_HAVE_PREEMPT_DYNAMIC_KEY=y ++CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y ++CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y ++CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y ++CONFIG_ARCH_HAVE_TRACE_MMIO_ACCESS=y ++CONFIG_ARCH_HAS_HW_PTE_YOUNG=y ++CONFIG_ARCH_HAS_KERNEL_FPU_SUPPORT=y ++ ++# ++# GCOV-based kernel profiling ++# ++# CONFIG_GCOV_KERNEL is not set ++CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y ++# end of GCOV-based kernel profiling ++ ++CONFIG_HAVE_GCC_PLUGINS=y ++CONFIG_GCC_PLUGINS=y ++# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set ++CONFIG_FUNCTION_ALIGNMENT_4B=y ++CONFIG_FUNCTION_ALIGNMENT_8B=y ++CONFIG_FUNCTION_ALIGNMENT=8 ++# end of General architecture-dependent options ++ ++CONFIG_RT_MUTEXES=y ++CONFIG_MODULES=y ++# CONFIG_MODULE_DEBUG is not set ++# CONFIG_MODULE_FORCE_LOAD is not set ++CONFIG_MODULE_UNLOAD=y ++# CONFIG_MODULE_FORCE_UNLOAD is not set ++# CONFIG_MODULE_UNLOAD_TAINT_TRACKING is not set ++CONFIG_MODVERSIONS=y ++CONFIG_ASM_MODVERSIONS=y ++CONFIG_MODULE_SRCVERSION_ALL=y ++# CONFIG_MODULE_SIG is not set ++CONFIG_MODULE_COMPRESS=y ++# CONFIG_MODULE_COMPRESS_GZIP is not set ++CONFIG_MODULE_COMPRESS_XZ=y ++# CONFIG_MODULE_COMPRESS_ZSTD is not set ++CONFIG_MODULE_COMPRESS_ALL=y ++# CONFIG_MODULE_DECOMPRESS is not set ++# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set ++CONFIG_MODPROBE_PATH="/sbin/modprobe" ++# CONFIG_TRIM_UNUSED_KSYMS is not set ++CONFIG_MODULES_TREE_LOOKUP=y ++CONFIG_BLOCK=y ++CONFIG_BLOCK_LEGACY_AUTOLOAD=y ++CONFIG_BLK_CGROUP_RWSTAT=y ++CONFIG_BLK_CGROUP_PUNT_BIO=y ++CONFIG_BLK_DEV_BSG_COMMON=y ++CONFIG_BLK_ICQ=y ++CONFIG_BLK_DEV_BSGLIB=y ++CONFIG_BLK_DEV_INTEGRITY=y ++CONFIG_BLK_DEV_WRITE_MOUNTED=y ++# CONFIG_BLK_DEV_ZONED is not set ++CONFIG_BLK_DEV_THROTTLING=y ++# CONFIG_BLK_WBT is not set ++# CONFIG_BLK_CGROUP_IOLATENCY is not set ++# CONFIG_BLK_CGROUP_IOCOST is not set ++# CONFIG_BLK_CGROUP_IOPRIO is not set ++CONFIG_BLK_DEBUG_FS=y ++# CONFIG_BLK_SED_OPAL is not set ++# CONFIG_BLK_INLINE_ENCRYPTION is not set ++ ++# ++# Partition Types ++# ++CONFIG_PARTITION_ADVANCED=y ++# CONFIG_ACORN_PARTITION is not set ++# CONFIG_AIX_PARTITION is not set ++# CONFIG_OSF_PARTITION is not set ++# CONFIG_AMIGA_PARTITION is not set ++# CONFIG_ATARI_PARTITION is not set ++CONFIG_MAC_PARTITION=y ++CONFIG_MSDOS_PARTITION=y ++# CONFIG_BSD_DISKLABEL is not set ++# CONFIG_MINIX_SUBPARTITION is not set ++# CONFIG_SOLARIS_X86_PARTITION is not set ++# CONFIG_UNIXWARE_DISKLABEL is not set ++# CONFIG_LDM_PARTITION is not set ++# CONFIG_SGI_PARTITION is not set ++# CONFIG_ULTRIX_PARTITION is not set ++# CONFIG_SUN_PARTITION is not set ++# CONFIG_KARMA_PARTITION is not set ++CONFIG_EFI_PARTITION=y ++# CONFIG_SYSV68_PARTITION is not set ++# CONFIG_CMDLINE_PARTITION is not set ++# end of Partition Types ++ ++CONFIG_BLK_MQ_PCI=y ++CONFIG_BLK_PM=y ++CONFIG_BLOCK_HOLDER_DEPRECATED=y ++CONFIG_BLK_MQ_STACKING=y ++ ++# ++# IO Schedulers ++# ++CONFIG_MQ_IOSCHED_DEADLINE=y ++CONFIG_MQ_IOSCHED_KYBER=y ++CONFIG_IOSCHED_BFQ=y ++CONFIG_BFQ_GROUP_IOSCHED=y ++# CONFIG_BFQ_CGROUP_DEBUG is not set ++# end of IO Schedulers ++ ++CONFIG_PREEMPT_NOTIFIERS=y ++CONFIG_ASN1=y ++CONFIG_UNINLINE_SPIN_UNLOCK=y ++CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y ++CONFIG_MUTEX_SPIN_ON_OWNER=y ++CONFIG_RWSEM_SPIN_ON_OWNER=y ++CONFIG_LOCK_SPIN_ON_OWNER=y ++CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y ++CONFIG_QUEUED_SPINLOCKS=y ++CONFIG_ARCH_USE_QUEUED_RWLOCKS=y ++CONFIG_QUEUED_RWLOCKS=y ++CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y ++CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y ++CONFIG_FREEZER=y ++ ++# ++# Executable file formats ++# ++CONFIG_BINFMT_ELF=y ++CONFIG_COMPAT_BINFMT_ELF=y ++CONFIG_ARCH_BINFMT_ELF_STATE=y ++CONFIG_ARCH_BINFMT_ELF_EXTRA_PHDRS=y ++CONFIG_ARCH_HAVE_ELF_PROT=y ++CONFIG_ARCH_USE_GNU_PROPERTY=y ++CONFIG_ELFCORE=y ++CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y ++CONFIG_BINFMT_SCRIPT=y ++CONFIG_BINFMT_MISC=m ++CONFIG_COREDUMP=y ++# end of Executable file formats ++ ++# ++# Memory Management options ++# ++CONFIG_ZPOOL=y ++CONFIG_SWAP=y ++CONFIG_ZSWAP=y ++# CONFIG_ZSWAP_DEFAULT_ON is not set ++# CONFIG_ZSWAP_SHRINKER_DEFAULT_ON is not set ++# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_DEFLATE is not set ++CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZO=y ++# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_842 is not set ++# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZ4 is not set ++# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZ4HC is not set ++# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_ZSTD is not set ++CONFIG_ZSWAP_COMPRESSOR_DEFAULT="lzo" ++# CONFIG_ZSWAP_ZPOOL_DEFAULT_ZBUD is not set ++# CONFIG_ZSWAP_ZPOOL_DEFAULT_Z3FOLD_DEPRECATED is not set ++CONFIG_ZSWAP_ZPOOL_DEFAULT_ZSMALLOC=y ++CONFIG_ZSWAP_ZPOOL_DEFAULT="zsmalloc" ++# CONFIG_ZBUD is not set ++# CONFIG_Z3FOLD_DEPRECATED is not set ++CONFIG_ZSMALLOC=y ++# CONFIG_ZSMALLOC_STAT is not set ++CONFIG_ZSMALLOC_CHAIN_SIZE=8 ++ ++# ++# Slab allocator options ++# ++CONFIG_SLUB=y ++# CONFIG_SLUB_TINY is not set ++CONFIG_SLAB_MERGE_DEFAULT=y ++# CONFIG_SLAB_FREELIST_RANDOM is not set ++# CONFIG_SLAB_FREELIST_HARDENED is not set ++# CONFIG_SLAB_BUCKETS is not set ++# CONFIG_SLUB_STATS is not set ++CONFIG_SLUB_CPU_PARTIAL=y ++# CONFIG_RANDOM_KMALLOC_CACHES is not set ++# end of Slab allocator options ++ ++# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set ++# CONFIG_COMPAT_BRK is not set ++CONFIG_SPARSEMEM=y ++CONFIG_SPARSEMEM_EXTREME=y ++CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y ++CONFIG_SPARSEMEM_VMEMMAP=y ++CONFIG_HAVE_GUP_FAST=y ++CONFIG_ARCH_KEEP_MEMBLOCK=y ++CONFIG_MEMORY_ISOLATION=y ++CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y ++CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y ++# CONFIG_MEMORY_HOTPLUG is not set ++CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y ++CONFIG_SPLIT_PTE_PTLOCKS=y ++CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y ++CONFIG_SPLIT_PMD_PTLOCKS=y ++CONFIG_COMPACTION=y ++CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1 ++# CONFIG_PAGE_REPORTING is not set ++CONFIG_MIGRATION=y ++CONFIG_CONTIG_ALLOC=y ++CONFIG_PCP_BATCH_SCALE_MAX=5 ++CONFIG_PHYS_ADDR_T_64BIT=y ++CONFIG_MMU_NOTIFIER=y ++# CONFIG_KSM is not set ++CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 ++CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y ++# CONFIG_MEMORY_FAILURE is not set ++CONFIG_ARCH_WANTS_THP_SWAP=y ++# CONFIG_TRANSPARENT_HUGEPAGE is not set ++CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y ++CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y ++CONFIG_USE_PERCPU_NUMA_NODE_ID=y ++CONFIG_HAVE_SETUP_PER_CPU_AREA=y ++CONFIG_CMA=y ++# CONFIG_CMA_DEBUGFS is not set ++# CONFIG_CMA_SYSFS is not set ++CONFIG_CMA_AREAS=7 ++CONFIG_GENERIC_EARLY_IOREMAP=y ++# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set ++# CONFIG_IDLE_PAGE_TRACKING is not set ++CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y ++CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y ++CONFIG_ARCH_HAS_PTE_DEVMAP=y ++CONFIG_ARCH_HAS_ZONE_DMA_SET=y ++CONFIG_ZONE_DMA=y ++CONFIG_ZONE_DMA32=y ++CONFIG_VMAP_PFN=y ++CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y ++CONFIG_ARCH_HAS_PKEYS=y ++CONFIG_ARCH_USES_PG_ARCH_2=y ++CONFIG_ARCH_USES_PG_ARCH_3=y ++CONFIG_VM_EVENT_COUNTERS=y ++# CONFIG_PERCPU_STATS is not set ++# CONFIG_GUP_TEST is not set ++# CONFIG_DMAPOOL_TEST is not set ++CONFIG_ARCH_HAS_PTE_SPECIAL=y ++CONFIG_MEMFD_CREATE=y ++CONFIG_SECRETMEM=y ++# CONFIG_ANON_VMA_NAME is not set ++# CONFIG_USERFAULTFD is not set ++CONFIG_LRU_GEN=y ++CONFIG_LRU_GEN_ENABLED=y ++# CONFIG_LRU_GEN_STATS is not set ++CONFIG_LRU_GEN_WALKS_MMU=y ++CONFIG_ARCH_SUPPORTS_PER_VMA_LOCK=y ++CONFIG_PER_VMA_LOCK=y ++CONFIG_LOCK_MM_AND_FIND_VMA=y ++CONFIG_EXECMEM=y ++CONFIG_NUMA_MEMBLKS=y ++CONFIG_NUMA_EMU=y ++ ++# ++# Data Access Monitoring ++# ++# CONFIG_DAMON is not set ++# end of Data Access Monitoring ++# end of Memory Management options ++ ++CONFIG_NET=y ++CONFIG_COMPAT_NETLINK_MESSAGES=y ++CONFIG_NET_INGRESS=y ++CONFIG_NET_EGRESS=y ++CONFIG_NET_XGRESS=y ++CONFIG_NET_REDIRECT=y ++CONFIG_SKB_EXTENSIONS=y ++CONFIG_NET_DEVMEM=y ++ ++# ++# Networking options ++# ++CONFIG_PACKET=y ++# CONFIG_PACKET_DIAG is not set ++CONFIG_UNIX=y ++CONFIG_AF_UNIX_OOB=y ++# CONFIG_UNIX_DIAG is not set ++# CONFIG_TLS is not set ++CONFIG_XFRM=y ++CONFIG_XFRM_OFFLOAD=y ++CONFIG_XFRM_ALGO=m ++CONFIG_XFRM_USER=m ++CONFIG_XFRM_INTERFACE=m ++CONFIG_XFRM_SUB_POLICY=y ++# CONFIG_XFRM_MIGRATE is not set ++CONFIG_XFRM_STATISTICS=y ++CONFIG_XFRM_AH=m ++CONFIG_XFRM_ESP=m ++CONFIG_XFRM_IPCOMP=m ++CONFIG_NET_KEY=m ++# CONFIG_NET_KEY_MIGRATE is not set ++# CONFIG_XDP_SOCKETS is not set ++CONFIG_NET_HANDSHAKE=y ++CONFIG_INET=y ++CONFIG_IP_MULTICAST=y ++CONFIG_IP_ADVANCED_ROUTER=y ++# CONFIG_IP_FIB_TRIE_STATS is not set ++CONFIG_IP_MULTIPLE_TABLES=y ++CONFIG_IP_ROUTE_MULTIPATH=y ++CONFIG_IP_ROUTE_VERBOSE=y ++CONFIG_IP_ROUTE_CLASSID=y ++CONFIG_IP_PNP=y ++CONFIG_IP_PNP_DHCP=y ++# CONFIG_IP_PNP_BOOTP is not set ++CONFIG_IP_PNP_RARP=y ++CONFIG_NET_IPIP=m ++CONFIG_NET_IPGRE_DEMUX=m ++CONFIG_NET_IP_TUNNEL=m ++CONFIG_NET_IPGRE=m ++# CONFIG_NET_IPGRE_BROADCAST is not set ++CONFIG_IP_MROUTE_COMMON=y ++CONFIG_IP_MROUTE=y ++CONFIG_IP_MROUTE_MULTIPLE_TABLES=y ++CONFIG_IP_PIMSM_V1=y ++CONFIG_IP_PIMSM_V2=y ++CONFIG_SYN_COOKIES=y ++CONFIG_NET_IPVTI=m ++CONFIG_NET_UDP_TUNNEL=m ++CONFIG_NET_FOU=m ++CONFIG_NET_FOU_IP_TUNNELS=y ++CONFIG_INET_AH=m ++CONFIG_INET_ESP=m ++# CONFIG_INET_ESP_OFFLOAD is not set ++# CONFIG_INET_ESPINTCP is not set ++CONFIG_INET_IPCOMP=m ++CONFIG_INET_TABLE_PERTURB_ORDER=16 ++CONFIG_INET_XFRM_TUNNEL=m ++CONFIG_INET_TUNNEL=m ++CONFIG_INET_DIAG=m ++CONFIG_INET_TCP_DIAG=m ++# CONFIG_INET_UDP_DIAG is not set ++# CONFIG_INET_RAW_DIAG is not set ++# CONFIG_INET_DIAG_DESTROY is not set ++CONFIG_TCP_CONG_ADVANCED=y ++CONFIG_TCP_CONG_BIC=m ++CONFIG_TCP_CONG_CUBIC=y ++CONFIG_TCP_CONG_WESTWOOD=m ++CONFIG_TCP_CONG_HTCP=m ++# CONFIG_TCP_CONG_HSTCP is not set ++# CONFIG_TCP_CONG_HYBLA is not set ++# CONFIG_TCP_CONG_VEGAS is not set ++# CONFIG_TCP_CONG_NV is not set ++# CONFIG_TCP_CONG_SCALABLE is not set ++# CONFIG_TCP_CONG_LP is not set ++# CONFIG_TCP_CONG_VENO is not set ++# CONFIG_TCP_CONG_YEAH is not set ++# CONFIG_TCP_CONG_ILLINOIS is not set ++# CONFIG_TCP_CONG_DCTCP is not set ++# CONFIG_TCP_CONG_CDG is not set ++CONFIG_TCP_CONG_BBR=m ++CONFIG_DEFAULT_CUBIC=y ++# CONFIG_DEFAULT_RENO is not set ++CONFIG_DEFAULT_TCP_CONG="cubic" ++# CONFIG_TCP_MD5SIG is not set ++CONFIG_IPV6=m ++CONFIG_IPV6_ROUTER_PREF=y ++CONFIG_IPV6_ROUTE_INFO=y ++# CONFIG_IPV6_OPTIMISTIC_DAD is not set ++CONFIG_INET6_AH=m ++CONFIG_INET6_ESP=m ++CONFIG_INET6_ESP_OFFLOAD=m ++# CONFIG_INET6_ESPINTCP is not set ++CONFIG_INET6_IPCOMP=m ++# CONFIG_IPV6_MIP6 is not set ++CONFIG_IPV6_ILA=m ++CONFIG_INET6_XFRM_TUNNEL=m ++CONFIG_INET6_TUNNEL=m ++CONFIG_IPV6_VTI=m ++CONFIG_IPV6_SIT=m ++CONFIG_IPV6_SIT_6RD=y ++CONFIG_IPV6_NDISC_NODETYPE=y ++CONFIG_IPV6_TUNNEL=m ++CONFIG_IPV6_GRE=m ++CONFIG_IPV6_FOU=m ++CONFIG_IPV6_FOU_TUNNEL=m ++CONFIG_IPV6_MULTIPLE_TABLES=y ++CONFIG_IPV6_SUBTREES=y ++CONFIG_IPV6_MROUTE=y ++CONFIG_IPV6_MROUTE_MULTIPLE_TABLES=y ++CONFIG_IPV6_PIMSM_V2=y ++# CONFIG_IPV6_SEG6_LWTUNNEL is not set ++# CONFIG_IPV6_SEG6_HMAC is not set ++# CONFIG_IPV6_RPL_LWTUNNEL is not set ++# CONFIG_IPV6_IOAM6_LWTUNNEL is not set ++# CONFIG_NETLABEL is not set ++CONFIG_MPTCP=y ++CONFIG_INET_MPTCP_DIAG=m ++# CONFIG_NETWORK_SECMARK is not set ++CONFIG_NET_PTP_CLASSIFY=y ++CONFIG_NETWORK_PHY_TIMESTAMPING=y ++CONFIG_NETFILTER=y ++CONFIG_NETFILTER_ADVANCED=y ++CONFIG_BRIDGE_NETFILTER=m ++ ++# ++# Core Netfilter Configuration ++# ++CONFIG_NETFILTER_INGRESS=y ++CONFIG_NETFILTER_EGRESS=y ++CONFIG_NETFILTER_SKIP_EGRESS=y ++CONFIG_NETFILTER_NETLINK=m ++CONFIG_NETFILTER_FAMILY_BRIDGE=y ++CONFIG_NETFILTER_FAMILY_ARP=y ++CONFIG_NETFILTER_BPF_LINK=y ++# CONFIG_NETFILTER_NETLINK_HOOK is not set ++CONFIG_NETFILTER_NETLINK_ACCT=m ++CONFIG_NETFILTER_NETLINK_QUEUE=m ++CONFIG_NETFILTER_NETLINK_LOG=m ++CONFIG_NETFILTER_NETLINK_OSF=m ++CONFIG_NF_CONNTRACK=m ++CONFIG_NF_LOG_SYSLOG=m ++CONFIG_NETFILTER_CONNCOUNT=m ++CONFIG_NF_CONNTRACK_MARK=y ++CONFIG_NF_CONNTRACK_ZONES=y ++# CONFIG_NF_CONNTRACK_PROCFS is not set ++CONFIG_NF_CONNTRACK_EVENTS=y ++# CONFIG_NF_CONNTRACK_TIMEOUT is not set ++CONFIG_NF_CONNTRACK_TIMESTAMP=y ++CONFIG_NF_CONNTRACK_LABELS=y ++CONFIG_NF_CONNTRACK_OVS=y ++CONFIG_NF_CT_PROTO_DCCP=y ++CONFIG_NF_CT_PROTO_GRE=y ++CONFIG_NF_CT_PROTO_SCTP=y ++CONFIG_NF_CT_PROTO_UDPLITE=y ++CONFIG_NF_CONNTRACK_AMANDA=m ++CONFIG_NF_CONNTRACK_FTP=m ++CONFIG_NF_CONNTRACK_H323=m ++CONFIG_NF_CONNTRACK_IRC=m ++CONFIG_NF_CONNTRACK_BROADCAST=m ++CONFIG_NF_CONNTRACK_NETBIOS_NS=m ++CONFIG_NF_CONNTRACK_SNMP=m ++CONFIG_NF_CONNTRACK_PPTP=m ++CONFIG_NF_CONNTRACK_SANE=m ++CONFIG_NF_CONNTRACK_SIP=m ++CONFIG_NF_CONNTRACK_TFTP=m ++CONFIG_NF_CT_NETLINK=m ++# CONFIG_NETFILTER_NETLINK_GLUE_CT is not set ++CONFIG_NF_NAT=m ++CONFIG_NF_NAT_AMANDA=m ++CONFIG_NF_NAT_FTP=m ++CONFIG_NF_NAT_IRC=m ++CONFIG_NF_NAT_SIP=m ++CONFIG_NF_NAT_TFTP=m ++CONFIG_NF_NAT_REDIRECT=y ++CONFIG_NF_NAT_MASQUERADE=y ++CONFIG_NF_NAT_OVS=y ++CONFIG_NETFILTER_SYNPROXY=m ++CONFIG_NF_TABLES=m ++CONFIG_NF_TABLES_INET=y ++CONFIG_NF_TABLES_NETDEV=y ++CONFIG_NFT_NUMGEN=m ++CONFIG_NFT_CT=m ++CONFIG_NFT_FLOW_OFFLOAD=m ++CONFIG_NFT_CONNLIMIT=m ++CONFIG_NFT_LOG=m ++CONFIG_NFT_LIMIT=m ++CONFIG_NFT_MASQ=m ++CONFIG_NFT_REDIR=m ++CONFIG_NFT_NAT=m ++CONFIG_NFT_TUNNEL=m ++CONFIG_NFT_QUEUE=m ++CONFIG_NFT_QUOTA=m ++CONFIG_NFT_REJECT=m ++CONFIG_NFT_REJECT_INET=m ++CONFIG_NFT_COMPAT=m ++CONFIG_NFT_HASH=m ++CONFIG_NFT_FIB=m ++CONFIG_NFT_FIB_INET=m ++CONFIG_NFT_XFRM=m ++CONFIG_NFT_SOCKET=m ++CONFIG_NFT_OSF=m ++CONFIG_NFT_TPROXY=m ++CONFIG_NFT_SYNPROXY=m ++CONFIG_NF_DUP_NETDEV=m ++CONFIG_NFT_DUP_NETDEV=m ++CONFIG_NFT_FWD_NETDEV=m ++CONFIG_NFT_FIB_NETDEV=m ++# CONFIG_NFT_REJECT_NETDEV is not set ++CONFIG_NF_FLOW_TABLE_INET=m ++CONFIG_NF_FLOW_TABLE=m ++# CONFIG_NF_FLOW_TABLE_PROCFS is not set ++CONFIG_NETFILTER_XTABLES=m ++CONFIG_NETFILTER_XTABLES_COMPAT=y ++ ++# ++# Xtables combined modules ++# ++CONFIG_NETFILTER_XT_MARK=m ++CONFIG_NETFILTER_XT_CONNMARK=m ++CONFIG_NETFILTER_XT_SET=m ++ ++# ++# Xtables targets ++# ++# CONFIG_NETFILTER_XT_TARGET_AUDIT is not set ++CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m ++CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m ++CONFIG_NETFILTER_XT_TARGET_CONNMARK=m ++CONFIG_NETFILTER_XT_TARGET_CT=m ++CONFIG_NETFILTER_XT_TARGET_DSCP=m ++CONFIG_NETFILTER_XT_TARGET_HL=m ++CONFIG_NETFILTER_XT_TARGET_HMARK=m ++CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m ++CONFIG_NETFILTER_XT_TARGET_LED=m ++CONFIG_NETFILTER_XT_TARGET_LOG=m ++CONFIG_NETFILTER_XT_TARGET_MARK=m ++CONFIG_NETFILTER_XT_NAT=m ++CONFIG_NETFILTER_XT_TARGET_NETMAP=m ++CONFIG_NETFILTER_XT_TARGET_NFLOG=m ++CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m ++CONFIG_NETFILTER_XT_TARGET_NOTRACK=m ++CONFIG_NETFILTER_XT_TARGET_RATEEST=m ++CONFIG_NETFILTER_XT_TARGET_REDIRECT=m ++CONFIG_NETFILTER_XT_TARGET_MASQUERADE=m ++CONFIG_NETFILTER_XT_TARGET_TEE=m ++CONFIG_NETFILTER_XT_TARGET_TPROXY=m ++CONFIG_NETFILTER_XT_TARGET_TRACE=m ++CONFIG_NETFILTER_XT_TARGET_TCPMSS=m ++CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m ++ ++# ++# Xtables matches ++# ++CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m ++CONFIG_NETFILTER_XT_MATCH_BPF=m ++# CONFIG_NETFILTER_XT_MATCH_CGROUP is not set ++CONFIG_NETFILTER_XT_MATCH_CLUSTER=m ++CONFIG_NETFILTER_XT_MATCH_COMMENT=m ++CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m ++CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m ++CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m ++CONFIG_NETFILTER_XT_MATCH_CONNMARK=m ++CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m ++CONFIG_NETFILTER_XT_MATCH_CPU=m ++CONFIG_NETFILTER_XT_MATCH_DCCP=m ++CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m ++CONFIG_NETFILTER_XT_MATCH_DSCP=m ++CONFIG_NETFILTER_XT_MATCH_ECN=m ++CONFIG_NETFILTER_XT_MATCH_ESP=m ++CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m ++CONFIG_NETFILTER_XT_MATCH_HELPER=m ++CONFIG_NETFILTER_XT_MATCH_HL=m ++# CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set ++CONFIG_NETFILTER_XT_MATCH_IPRANGE=m ++CONFIG_NETFILTER_XT_MATCH_IPVS=m ++CONFIG_NETFILTER_XT_MATCH_L2TP=m ++CONFIG_NETFILTER_XT_MATCH_LENGTH=m ++CONFIG_NETFILTER_XT_MATCH_LIMIT=m ++CONFIG_NETFILTER_XT_MATCH_MAC=m ++CONFIG_NETFILTER_XT_MATCH_MARK=m ++CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m ++CONFIG_NETFILTER_XT_MATCH_NFACCT=m ++CONFIG_NETFILTER_XT_MATCH_OSF=m ++CONFIG_NETFILTER_XT_MATCH_OWNER=m ++CONFIG_NETFILTER_XT_MATCH_POLICY=m ++CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m ++CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m ++CONFIG_NETFILTER_XT_MATCH_QUOTA=m ++CONFIG_NETFILTER_XT_MATCH_RATEEST=m ++CONFIG_NETFILTER_XT_MATCH_REALM=m ++CONFIG_NETFILTER_XT_MATCH_RECENT=m ++CONFIG_NETFILTER_XT_MATCH_SCTP=m ++CONFIG_NETFILTER_XT_MATCH_SOCKET=m ++CONFIG_NETFILTER_XT_MATCH_STATE=m ++CONFIG_NETFILTER_XT_MATCH_STATISTIC=m ++CONFIG_NETFILTER_XT_MATCH_STRING=m ++CONFIG_NETFILTER_XT_MATCH_TCPMSS=m ++CONFIG_NETFILTER_XT_MATCH_TIME=m ++CONFIG_NETFILTER_XT_MATCH_U32=m ++# end of Core Netfilter Configuration ++ ++CONFIG_IP_SET=m ++CONFIG_IP_SET_MAX=256 ++CONFIG_IP_SET_BITMAP_IP=m ++CONFIG_IP_SET_BITMAP_IPMAC=m ++CONFIG_IP_SET_BITMAP_PORT=m ++CONFIG_IP_SET_HASH_IP=m ++# CONFIG_IP_SET_HASH_IPMARK is not set ++CONFIG_IP_SET_HASH_IPPORT=m ++CONFIG_IP_SET_HASH_IPPORTIP=m ++CONFIG_IP_SET_HASH_IPPORTNET=m ++# CONFIG_IP_SET_HASH_IPMAC is not set ++# CONFIG_IP_SET_HASH_MAC is not set ++# CONFIG_IP_SET_HASH_NETPORTNET is not set ++CONFIG_IP_SET_HASH_NET=m ++# CONFIG_IP_SET_HASH_NETNET is not set ++CONFIG_IP_SET_HASH_NETPORT=m ++CONFIG_IP_SET_HASH_NETIFACE=m ++CONFIG_IP_SET_LIST_SET=m ++CONFIG_IP_VS=m ++CONFIG_IP_VS_IPV6=y ++# CONFIG_IP_VS_DEBUG is not set ++CONFIG_IP_VS_TAB_BITS=12 ++ ++# ++# IPVS transport protocol load balancing support ++# ++CONFIG_IP_VS_PROTO_TCP=y ++CONFIG_IP_VS_PROTO_UDP=y ++CONFIG_IP_VS_PROTO_AH_ESP=y ++CONFIG_IP_VS_PROTO_ESP=y ++CONFIG_IP_VS_PROTO_AH=y ++CONFIG_IP_VS_PROTO_SCTP=y ++ ++# ++# IPVS scheduler ++# ++CONFIG_IP_VS_RR=m ++CONFIG_IP_VS_WRR=m ++CONFIG_IP_VS_LC=m ++CONFIG_IP_VS_WLC=m ++# CONFIG_IP_VS_FO is not set ++# CONFIG_IP_VS_OVF is not set ++CONFIG_IP_VS_LBLC=m ++CONFIG_IP_VS_LBLCR=m ++CONFIG_IP_VS_DH=m ++CONFIG_IP_VS_SH=m ++# CONFIG_IP_VS_MH is not set ++CONFIG_IP_VS_SED=m ++CONFIG_IP_VS_NQ=m ++# CONFIG_IP_VS_TWOS is not set ++ ++# ++# IPVS SH scheduler ++# ++CONFIG_IP_VS_SH_TAB_BITS=8 ++ ++# ++# IPVS MH scheduler ++# ++CONFIG_IP_VS_MH_TAB_INDEX=12 ++ ++# ++# IPVS application helper ++# ++CONFIG_IP_VS_FTP=m ++CONFIG_IP_VS_NFCT=y ++CONFIG_IP_VS_PE_SIP=m ++ ++# ++# IP: Netfilter Configuration ++# ++CONFIG_NF_DEFRAG_IPV4=m ++CONFIG_IP_NF_IPTABLES_LEGACY=m ++CONFIG_NF_SOCKET_IPV4=m ++CONFIG_NF_TPROXY_IPV4=m ++CONFIG_NF_TABLES_IPV4=y ++CONFIG_NFT_REJECT_IPV4=m ++CONFIG_NFT_DUP_IPV4=m ++CONFIG_NFT_FIB_IPV4=m ++CONFIG_NF_TABLES_ARP=y ++CONFIG_NF_DUP_IPV4=m ++CONFIG_NF_LOG_ARP=m ++CONFIG_NF_LOG_IPV4=m ++CONFIG_NF_REJECT_IPV4=m ++CONFIG_NF_NAT_SNMP_BASIC=m ++CONFIG_NF_NAT_PPTP=m ++CONFIG_NF_NAT_H323=m ++CONFIG_IP_NF_IPTABLES=m ++CONFIG_IP_NF_MATCH_AH=m ++CONFIG_IP_NF_MATCH_ECN=m ++CONFIG_IP_NF_MATCH_RPFILTER=m ++CONFIG_IP_NF_MATCH_TTL=m ++CONFIG_IP_NF_FILTER=m ++CONFIG_IP_NF_TARGET_REJECT=m ++CONFIG_IP_NF_TARGET_SYNPROXY=m ++CONFIG_IP_NF_NAT=m ++CONFIG_IP_NF_TARGET_MASQUERADE=m ++CONFIG_IP_NF_TARGET_NETMAP=m ++CONFIG_IP_NF_TARGET_REDIRECT=m ++CONFIG_IP_NF_MANGLE=m ++CONFIG_IP_NF_TARGET_ECN=m ++CONFIG_IP_NF_TARGET_TTL=m ++CONFIG_IP_NF_RAW=m ++# CONFIG_IP_NF_SECURITY is not set ++CONFIG_IP_NF_ARPTABLES=m ++CONFIG_NFT_COMPAT_ARP=m ++CONFIG_IP_NF_ARPFILTER=m ++CONFIG_IP_NF_ARP_MANGLE=m ++# end of IP: Netfilter Configuration ++ ++# ++# IPv6: Netfilter Configuration ++# ++CONFIG_IP6_NF_IPTABLES_LEGACY=m ++CONFIG_NF_SOCKET_IPV6=m ++CONFIG_NF_TPROXY_IPV6=m ++CONFIG_NF_TABLES_IPV6=y ++CONFIG_NFT_REJECT_IPV6=m ++CONFIG_NFT_DUP_IPV6=m ++CONFIG_NFT_FIB_IPV6=m ++CONFIG_NF_DUP_IPV6=m ++CONFIG_NF_REJECT_IPV6=m ++CONFIG_NF_LOG_IPV6=m ++CONFIG_IP6_NF_IPTABLES=m ++CONFIG_IP6_NF_MATCH_AH=m ++CONFIG_IP6_NF_MATCH_EUI64=m ++CONFIG_IP6_NF_MATCH_FRAG=m ++CONFIG_IP6_NF_MATCH_OPTS=m ++CONFIG_IP6_NF_MATCH_HL=m ++CONFIG_IP6_NF_MATCH_IPV6HEADER=m ++CONFIG_IP6_NF_MATCH_MH=m ++CONFIG_IP6_NF_MATCH_RPFILTER=m ++CONFIG_IP6_NF_MATCH_RT=m ++CONFIG_IP6_NF_MATCH_SRH=m ++CONFIG_IP6_NF_TARGET_HL=m ++CONFIG_IP6_NF_FILTER=m ++CONFIG_IP6_NF_TARGET_REJECT=m ++CONFIG_IP6_NF_TARGET_SYNPROXY=m ++CONFIG_IP6_NF_MANGLE=m ++CONFIG_IP6_NF_RAW=m ++CONFIG_IP6_NF_SECURITY=m ++CONFIG_IP6_NF_NAT=m ++CONFIG_IP6_NF_TARGET_MASQUERADE=m ++CONFIG_IP6_NF_TARGET_NPT=m ++# end of IPv6: Netfilter Configuration ++ ++CONFIG_NF_DEFRAG_IPV6=m ++CONFIG_NF_TABLES_BRIDGE=m ++# CONFIG_NFT_BRIDGE_META is not set ++CONFIG_NFT_BRIDGE_REJECT=m ++# CONFIG_NF_CONNTRACK_BRIDGE is not set ++CONFIG_BRIDGE_NF_EBTABLES_LEGACY=m ++CONFIG_BRIDGE_NF_EBTABLES=m ++CONFIG_BRIDGE_EBT_BROUTE=m ++CONFIG_BRIDGE_EBT_T_FILTER=m ++CONFIG_BRIDGE_EBT_T_NAT=m ++CONFIG_BRIDGE_EBT_802_3=m ++CONFIG_BRIDGE_EBT_AMONG=m ++CONFIG_BRIDGE_EBT_ARP=m ++CONFIG_BRIDGE_EBT_IP=m ++CONFIG_BRIDGE_EBT_IP6=m ++CONFIG_BRIDGE_EBT_LIMIT=m ++CONFIG_BRIDGE_EBT_MARK=m ++CONFIG_BRIDGE_EBT_PKTTYPE=m ++CONFIG_BRIDGE_EBT_STP=m ++CONFIG_BRIDGE_EBT_VLAN=m ++CONFIG_BRIDGE_EBT_ARPREPLY=m ++CONFIG_BRIDGE_EBT_DNAT=m ++CONFIG_BRIDGE_EBT_MARK_T=m ++CONFIG_BRIDGE_EBT_REDIRECT=m ++CONFIG_BRIDGE_EBT_SNAT=m ++CONFIG_BRIDGE_EBT_LOG=m ++CONFIG_BRIDGE_EBT_NFLOG=m ++# CONFIG_IP_DCCP is not set ++CONFIG_IP_SCTP=m ++# CONFIG_SCTP_DBG_OBJCNT is not set ++CONFIG_SCTP_DEFAULT_COOKIE_HMAC_MD5=y ++# CONFIG_SCTP_DEFAULT_COOKIE_HMAC_SHA1 is not set ++# CONFIG_SCTP_DEFAULT_COOKIE_HMAC_NONE is not set ++CONFIG_SCTP_COOKIE_HMAC_MD5=y ++CONFIG_SCTP_COOKIE_HMAC_SHA1=y ++CONFIG_INET_SCTP_DIAG=m ++# CONFIG_RDS is not set ++# CONFIG_TIPC is not set ++CONFIG_ATM=m ++# CONFIG_ATM_CLIP is not set ++# CONFIG_ATM_LANE is not set ++# CONFIG_ATM_BR2684 is not set ++CONFIG_L2TP=m ++# CONFIG_L2TP_DEBUGFS is not set ++CONFIG_L2TP_V3=y ++CONFIG_L2TP_IP=m ++CONFIG_L2TP_ETH=m ++CONFIG_STP=m ++CONFIG_GARP=m ++CONFIG_BRIDGE=m ++CONFIG_BRIDGE_IGMP_SNOOPING=y ++CONFIG_BRIDGE_VLAN_FILTERING=y ++# CONFIG_BRIDGE_MRP is not set ++# CONFIG_BRIDGE_CFM is not set ++CONFIG_NET_DSA=m ++# CONFIG_NET_DSA_TAG_NONE is not set ++# CONFIG_NET_DSA_TAG_AR9331 is not set ++# CONFIG_NET_DSA_TAG_BRCM is not set ++# CONFIG_NET_DSA_TAG_BRCM_LEGACY is not set ++# CONFIG_NET_DSA_TAG_BRCM_PREPEND is not set ++# CONFIG_NET_DSA_TAG_HELLCREEK is not set ++# CONFIG_NET_DSA_TAG_GSWIP is not set ++# CONFIG_NET_DSA_TAG_DSA is not set ++# CONFIG_NET_DSA_TAG_EDSA is not set ++# CONFIG_NET_DSA_TAG_MTK is not set ++# CONFIG_NET_DSA_TAG_KSZ is not set ++# CONFIG_NET_DSA_TAG_OCELOT is not set ++# CONFIG_NET_DSA_TAG_OCELOT_8021Q is not set ++# CONFIG_NET_DSA_TAG_QCA is not set ++# CONFIG_NET_DSA_TAG_RTL4_A is not set ++# CONFIG_NET_DSA_TAG_RTL8_4 is not set ++# CONFIG_NET_DSA_TAG_RZN1_A5PSW is not set ++# CONFIG_NET_DSA_TAG_LAN9303 is not set ++# CONFIG_NET_DSA_TAG_SJA1105 is not set ++# CONFIG_NET_DSA_TAG_TRAILER is not set ++# CONFIG_NET_DSA_TAG_VSC73XX_8021Q is not set ++# CONFIG_NET_DSA_TAG_XRS700X is not set ++CONFIG_VLAN_8021Q=m ++CONFIG_VLAN_8021Q_GVRP=y ++# CONFIG_VLAN_8021Q_MVRP is not set ++CONFIG_LLC=m ++# CONFIG_LLC2 is not set ++CONFIG_ATALK=m ++# CONFIG_X25 is not set ++# CONFIG_LAPB is not set ++# CONFIG_PHONET is not set ++CONFIG_6LOWPAN=m ++# CONFIG_6LOWPAN_DEBUGFS is not set ++CONFIG_6LOWPAN_NHC=m ++CONFIG_6LOWPAN_NHC_DEST=m ++CONFIG_6LOWPAN_NHC_FRAGMENT=m ++CONFIG_6LOWPAN_NHC_HOP=m ++CONFIG_6LOWPAN_NHC_IPV6=m ++CONFIG_6LOWPAN_NHC_MOBILITY=m ++CONFIG_6LOWPAN_NHC_ROUTING=m ++CONFIG_6LOWPAN_NHC_UDP=m ++# CONFIG_6LOWPAN_GHC_EXT_HDR_HOP is not set ++# CONFIG_6LOWPAN_GHC_UDP is not set ++# CONFIG_6LOWPAN_GHC_ICMPV6 is not set ++# CONFIG_6LOWPAN_GHC_EXT_HDR_DEST is not set ++# CONFIG_6LOWPAN_GHC_EXT_HDR_FRAG is not set ++# CONFIG_6LOWPAN_GHC_EXT_HDR_ROUTE is not set ++CONFIG_IEEE802154=m ++# CONFIG_IEEE802154_NL802154_EXPERIMENTAL is not set ++CONFIG_IEEE802154_SOCKET=m ++CONFIG_IEEE802154_6LOWPAN=m ++CONFIG_MAC802154=m ++CONFIG_NET_SCHED=y ++ ++# ++# Queueing/Scheduling ++# ++CONFIG_NET_SCH_HTB=m ++CONFIG_NET_SCH_HFSC=m ++CONFIG_NET_SCH_PRIO=m ++CONFIG_NET_SCH_MULTIQ=m ++CONFIG_NET_SCH_RED=m ++CONFIG_NET_SCH_SFB=m ++CONFIG_NET_SCH_SFQ=m ++CONFIG_NET_SCH_TEQL=m ++CONFIG_NET_SCH_TBF=m ++# CONFIG_NET_SCH_CBS is not set ++# CONFIG_NET_SCH_ETF is not set ++CONFIG_NET_SCH_MQPRIO_LIB=m ++# CONFIG_NET_SCH_TAPRIO is not set ++CONFIG_NET_SCH_GRED=m ++CONFIG_NET_SCH_NETEM=m ++CONFIG_NET_SCH_DRR=m ++CONFIG_NET_SCH_MQPRIO=m ++# CONFIG_NET_SCH_SKBPRIO is not set ++CONFIG_NET_SCH_CHOKE=m ++CONFIG_NET_SCH_QFQ=m ++CONFIG_NET_SCH_CODEL=m ++CONFIG_NET_SCH_FQ_CODEL=m ++CONFIG_NET_SCH_CAKE=m ++CONFIG_NET_SCH_FQ=m ++CONFIG_NET_SCH_HHF=m ++CONFIG_NET_SCH_PIE=m ++# CONFIG_NET_SCH_FQ_PIE is not set ++CONFIG_NET_SCH_INGRESS=m ++CONFIG_NET_SCH_PLUG=m ++# CONFIG_NET_SCH_ETS is not set ++# CONFIG_NET_SCH_DEFAULT is not set ++ ++# ++# Classification ++# ++CONFIG_NET_CLS=y ++CONFIG_NET_CLS_BASIC=m ++CONFIG_NET_CLS_ROUTE4=m ++CONFIG_NET_CLS_FW=m ++CONFIG_NET_CLS_U32=m ++CONFIG_CLS_U32_PERF=y ++CONFIG_CLS_U32_MARK=y ++CONFIG_NET_CLS_FLOW=m ++CONFIG_NET_CLS_CGROUP=m ++CONFIG_NET_CLS_BPF=y ++CONFIG_NET_CLS_FLOWER=m ++CONFIG_NET_CLS_MATCHALL=m ++CONFIG_NET_EMATCH=y ++CONFIG_NET_EMATCH_STACK=32 ++CONFIG_NET_EMATCH_CMP=m ++CONFIG_NET_EMATCH_NBYTE=m ++CONFIG_NET_EMATCH_U32=m ++CONFIG_NET_EMATCH_META=m ++CONFIG_NET_EMATCH_TEXT=m ++# CONFIG_NET_EMATCH_CANID is not set ++CONFIG_NET_EMATCH_IPSET=m ++# CONFIG_NET_EMATCH_IPT is not set ++CONFIG_NET_CLS_ACT=y ++CONFIG_NET_ACT_POLICE=m ++CONFIG_NET_ACT_GACT=m ++CONFIG_GACT_PROB=y ++CONFIG_NET_ACT_MIRRED=m ++# CONFIG_NET_ACT_SAMPLE is not set ++CONFIG_NET_ACT_NAT=m ++CONFIG_NET_ACT_PEDIT=m ++CONFIG_NET_ACT_SIMP=m ++CONFIG_NET_ACT_SKBEDIT=m ++CONFIG_NET_ACT_CSUM=m ++# CONFIG_NET_ACT_MPLS is not set ++# CONFIG_NET_ACT_VLAN is not set ++# CONFIG_NET_ACT_BPF is not set ++# CONFIG_NET_ACT_CONNMARK is not set ++# CONFIG_NET_ACT_CTINFO is not set ++# CONFIG_NET_ACT_SKBMOD is not set ++# CONFIG_NET_ACT_IFE is not set ++# CONFIG_NET_ACT_TUNNEL_KEY is not set ++# CONFIG_NET_ACT_CT is not set ++# CONFIG_NET_ACT_GATE is not set ++# CONFIG_NET_TC_SKB_EXT is not set ++CONFIG_NET_SCH_FIFO=y ++# CONFIG_DCB is not set ++CONFIG_DNS_RESOLVER=y ++CONFIG_BATMAN_ADV=m ++CONFIG_BATMAN_ADV_BATMAN_V=y ++CONFIG_BATMAN_ADV_BLA=y ++CONFIG_BATMAN_ADV_DAT=y ++# CONFIG_BATMAN_ADV_NC is not set ++CONFIG_BATMAN_ADV_MCAST=y ++# CONFIG_BATMAN_ADV_DEBUG is not set ++# CONFIG_BATMAN_ADV_TRACING is not set ++CONFIG_OPENVSWITCH=m ++CONFIG_OPENVSWITCH_GRE=m ++CONFIG_OPENVSWITCH_VXLAN=m ++CONFIG_VSOCKETS=m ++CONFIG_VSOCKETS_DIAG=m ++CONFIG_VSOCKETS_LOOPBACK=m ++CONFIG_VIRTIO_VSOCKETS_COMMON=m ++# CONFIG_NETLINK_DIAG is not set ++CONFIG_MPLS=y ++CONFIG_NET_MPLS_GSO=m ++# CONFIG_MPLS_ROUTING is not set ++CONFIG_NET_NSH=m ++# CONFIG_HSR is not set ++CONFIG_NET_SWITCHDEV=y ++CONFIG_NET_L3_MASTER_DEV=y ++# CONFIG_QRTR is not set ++# CONFIG_NET_NCSI is not set ++CONFIG_PCPU_DEV_REFCNT=y ++CONFIG_MAX_SKB_FRAGS=17 ++CONFIG_RPS=y ++CONFIG_RFS_ACCEL=y ++CONFIG_SOCK_RX_QUEUE_MAPPING=y ++CONFIG_XPS=y ++CONFIG_CGROUP_NET_PRIO=y ++CONFIG_CGROUP_NET_CLASSID=y ++CONFIG_NET_RX_BUSY_POLL=y ++CONFIG_BQL=y ++# CONFIG_BPF_STREAM_PARSER is not set ++CONFIG_NET_FLOW_LIMIT=y ++ ++# ++# Network testing ++# ++CONFIG_NET_PKTGEN=m ++# CONFIG_NET_DROP_MONITOR is not set ++# end of Network testing ++# end of Networking options ++ ++CONFIG_HAMRADIO=y ++ ++# ++# Packet Radio protocols ++# ++CONFIG_AX25=m ++CONFIG_AX25_DAMA_SLAVE=y ++CONFIG_NETROM=m ++CONFIG_ROSE=m ++ ++# ++# AX.25 network device drivers ++# ++CONFIG_MKISS=m ++CONFIG_6PACK=m ++CONFIG_BPQETHER=m ++CONFIG_BAYCOM_SER_FDX=m ++CONFIG_BAYCOM_SER_HDX=m ++CONFIG_YAM=m ++# end of AX.25 network device drivers ++ ++CONFIG_CAN=m ++CONFIG_CAN_RAW=m ++CONFIG_CAN_BCM=m ++CONFIG_CAN_GW=m ++CONFIG_CAN_J1939=m ++CONFIG_CAN_ISOTP=m ++CONFIG_BT=m ++CONFIG_BT_BREDR=y ++CONFIG_BT_RFCOMM=m ++CONFIG_BT_RFCOMM_TTY=y ++CONFIG_BT_BNEP=m ++CONFIG_BT_BNEP_MC_FILTER=y ++CONFIG_BT_BNEP_PROTO_FILTER=y ++CONFIG_BT_HIDP=m ++CONFIG_BT_LE=y ++CONFIG_BT_LE_L2CAP_ECRED=y ++CONFIG_BT_6LOWPAN=m ++# CONFIG_BT_LEDS is not set ++# CONFIG_BT_MSFTEXT is not set ++# CONFIG_BT_AOSPEXT is not set ++CONFIG_BT_DEBUGFS=y ++# CONFIG_BT_SELFTEST is not set ++# CONFIG_BT_FEATURE_DEBUG is not set ++ ++# ++# Bluetooth device drivers ++# ++CONFIG_BT_INTEL=m ++CONFIG_BT_BCM=m ++CONFIG_BT_RTL=m ++CONFIG_BT_MTK=m ++CONFIG_BT_HCIBTUSB=m ++# CONFIG_BT_HCIBTUSB_AUTOSUSPEND is not set ++CONFIG_BT_HCIBTUSB_POLL_SYNC=y ++CONFIG_BT_HCIBTUSB_BCM=y ++CONFIG_BT_HCIBTUSB_MTK=y ++CONFIG_BT_HCIBTUSB_RTL=y ++# CONFIG_BT_HCIBTSDIO is not set ++CONFIG_BT_HCIUART=m ++CONFIG_BT_HCIUART_SERDEV=y ++CONFIG_BT_HCIUART_H4=y ++# CONFIG_BT_HCIUART_NOKIA is not set ++# CONFIG_BT_HCIUART_BCSP is not set ++# CONFIG_BT_HCIUART_ATH3K is not set ++# CONFIG_BT_HCIUART_LL is not set ++CONFIG_BT_HCIUART_3WIRE=y ++# CONFIG_BT_HCIUART_INTEL is not set ++CONFIG_BT_HCIUART_BCM=y ++# CONFIG_BT_HCIUART_RTL is not set ++# CONFIG_BT_HCIUART_QCA is not set ++# CONFIG_BT_HCIUART_AG6XX is not set ++# CONFIG_BT_HCIUART_MRVL is not set ++# CONFIG_BT_HCIUART_AML is not set ++CONFIG_BT_HCIBCM203X=m ++# CONFIG_BT_HCIBCM4377 is not set ++CONFIG_BT_HCIBPA10X=m ++CONFIG_BT_HCIBFUSB=m ++CONFIG_BT_HCIVHCI=m ++CONFIG_BT_MRVL=m ++CONFIG_BT_MRVL_SDIO=m ++CONFIG_BT_ATH3K=m ++# CONFIG_BT_MTKSDIO is not set ++# CONFIG_BT_MTKUART is not set ++# CONFIG_BT_NXPUART is not set ++# CONFIG_BT_INTEL_PCIE is not set ++# end of Bluetooth device drivers ++ ++# CONFIG_AF_RXRPC is not set ++# CONFIG_AF_KCM is not set ++# CONFIG_MCTP is not set ++CONFIG_FIB_RULES=y ++CONFIG_WIRELESS=y ++CONFIG_WIRELESS_EXT=y ++CONFIG_WEXT_CORE=y ++CONFIG_WEXT_PROC=y ++CONFIG_WEXT_PRIV=y ++CONFIG_CFG80211=m ++# CONFIG_NL80211_TESTMODE is not set ++# CONFIG_CFG80211_DEVELOPER_WARNINGS is not set ++# CONFIG_CFG80211_CERTIFICATION_ONUS is not set ++CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y ++CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y ++CONFIG_CFG80211_DEFAULT_PS=y ++# CONFIG_CFG80211_DEBUGFS is not set ++CONFIG_CFG80211_CRDA_SUPPORT=y ++CONFIG_CFG80211_WEXT=y ++CONFIG_LIB80211=m ++# CONFIG_LIB80211_DEBUG is not set ++CONFIG_MAC80211=m ++CONFIG_MAC80211_HAS_RC=y ++CONFIG_MAC80211_RC_MINSTREL=y ++CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y ++CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" ++CONFIG_MAC80211_MESH=y ++CONFIG_MAC80211_LEDS=y ++# CONFIG_MAC80211_MESSAGE_TRACING is not set ++# CONFIG_MAC80211_DEBUG_MENU is not set ++CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 ++CONFIG_RFKILL=m ++CONFIG_RFKILL_LEDS=y ++CONFIG_RFKILL_INPUT=y ++# CONFIG_RFKILL_GPIO is not set ++CONFIG_NET_9P=m ++CONFIG_NET_9P_FD=m ++# CONFIG_NET_9P_USBG is not set ++# CONFIG_NET_9P_DEBUG is not set ++# CONFIG_CAIF is not set ++CONFIG_CEPH_LIB=m ++# CONFIG_CEPH_LIB_PRETTYDEBUG is not set ++# CONFIG_CEPH_LIB_USE_DNS_RESOLVER is not set ++CONFIG_NFC=m ++# CONFIG_NFC_DIGITAL is not set ++# CONFIG_NFC_NCI is not set ++# CONFIG_NFC_HCI is not set ++ ++# ++# Near Field Communication (NFC) devices ++# ++# CONFIG_NFC_PN533_USB is not set ++# CONFIG_NFC_PN533_I2C is not set ++# CONFIG_NFC_PN532_UART is not set ++# end of Near Field Communication (NFC) devices ++ ++# CONFIG_PSAMPLE is not set ++# CONFIG_NET_IFE is not set ++CONFIG_LWTUNNEL=y ++CONFIG_LWTUNNEL_BPF=y ++CONFIG_DST_CACHE=y ++CONFIG_GRO_CELLS=y ++CONFIG_NET_SELFTESTS=y ++CONFIG_NET_SOCK_MSG=y ++CONFIG_NET_DEVLINK=y ++CONFIG_PAGE_POOL=y ++# CONFIG_PAGE_POOL_STATS is not set ++# CONFIG_FAILOVER is not set ++CONFIG_ETHTOOL_NETLINK=y ++ ++# ++# Device Drivers ++# ++CONFIG_ARM_AMBA=y ++CONFIG_HAVE_PCI=y ++CONFIG_GENERIC_PCI_IOMAP=y ++CONFIG_PCI=y ++CONFIG_PCI_DOMAINS=y ++CONFIG_PCI_DOMAINS_GENERIC=y ++CONFIG_PCI_SYSCALL=y ++CONFIG_PCIEPORTBUS=y ++CONFIG_PCIEAER=y ++# CONFIG_PCIEAER_INJECT is not set ++# CONFIG_PCIE_ECRC is not set ++CONFIG_PCIEASPM=y ++# CONFIG_PCIEASPM_DEFAULT is not set ++CONFIG_PCIEASPM_POWERSAVE=y ++# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set ++# CONFIG_PCIEASPM_PERFORMANCE is not set ++CONFIG_PCIE_PME=y ++CONFIG_PCIE_DPC=y ++# CONFIG_PCIE_PTM is not set ++CONFIG_PCI_MSI=y ++CONFIG_PCI_QUIRKS=y ++# CONFIG_PCI_DEBUG is not set ++# CONFIG_PCI_STUB is not set ++# CONFIG_PCI_IOV is not set ++# CONFIG_PCI_NPEM is not set ++# CONFIG_PCI_PRI is not set ++# CONFIG_PCI_PASID is not set ++CONFIG_PCI_LABEL=y ++# CONFIG_PCI_DYNAMIC_OF_NODES is not set ++# CONFIG_PCIE_BUS_TUNE_OFF is not set ++CONFIG_PCIE_BUS_DEFAULT=y ++# CONFIG_PCIE_BUS_SAFE is not set ++# CONFIG_PCIE_BUS_PERFORMANCE is not set ++# CONFIG_PCIE_BUS_PEER2PEER is not set ++CONFIG_VGA_ARB=y ++CONFIG_VGA_ARB_MAX_GPUS=16 ++# CONFIG_HOTPLUG_PCI is not set ++ ++# ++# PCI controller drivers ++# ++# CONFIG_PCIE_ALTERA is not set ++CONFIG_PCIE_BRCMSTB=y ++# CONFIG_PCI_HOST_THUNDER_PEM is not set ++# CONFIG_PCI_HOST_THUNDER_ECAM is not set ++# CONFIG_PCI_FTPCI100 is not set ++# CONFIG_PCI_HOST_GENERIC is not set ++# CONFIG_PCI_XGENE is not set ++# CONFIG_PCIE_XILINX is not set ++ ++# ++# Cadence-based PCIe controllers ++# ++# CONFIG_PCIE_CADENCE_PLAT_HOST is not set ++# end of Cadence-based PCIe controllers ++ ++# ++# DesignWare-based PCIe controllers ++# ++# CONFIG_PCIE_AL is not set ++# CONFIG_PCI_MESON is not set ++# CONFIG_PCI_HISI is not set ++# CONFIG_PCIE_KIRIN is not set ++# CONFIG_PCIE_DW_PLAT_HOST is not set ++# end of DesignWare-based PCIe controllers ++ ++# ++# Mobiveil-based PCIe controllers ++# ++# end of Mobiveil-based PCIe controllers ++ ++# ++# PLDA-based PCIe controllers ++# ++# CONFIG_PCIE_MICROCHIP_HOST is not set ++# end of PLDA-based PCIe controllers ++# end of PCI controller drivers ++ ++# ++# PCI Endpoint ++# ++# CONFIG_PCI_ENDPOINT is not set ++# end of PCI Endpoint ++ ++# ++# PCI switch controller drivers ++# ++# CONFIG_PCI_SW_SWITCHTEC is not set ++# end of PCI switch controller drivers ++ ++# CONFIG_CXL_BUS is not set ++# CONFIG_PCCARD is not set ++# CONFIG_RAPIDIO is not set ++ ++# ++# Generic Driver Options ++# ++CONFIG_AUXILIARY_BUS=y ++CONFIG_UEVENT_HELPER=y ++CONFIG_UEVENT_HELPER_PATH="" ++CONFIG_DEVTMPFS=y ++CONFIG_DEVTMPFS_MOUNT=y ++# CONFIG_DEVTMPFS_SAFE is not set ++CONFIG_STANDALONE=y ++CONFIG_PREVENT_FIRMWARE_BUILD=y ++ ++# ++# Firmware loader ++# ++CONFIG_FW_LOADER=y ++CONFIG_EXTRA_FIRMWARE="" ++# CONFIG_FW_LOADER_USER_HELPER is not set ++# CONFIG_FW_LOADER_COMPRESS is not set ++# CONFIG_FW_UPLOAD is not set ++# end of Firmware loader ++ ++CONFIG_WANT_DEV_COREDUMP=y ++CONFIG_ALLOW_DEV_COREDUMP=y ++CONFIG_DEV_COREDUMP=y ++# CONFIG_DEBUG_DRIVER is not set ++# CONFIG_DEBUG_DEVRES is not set ++# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set ++# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set ++CONFIG_GENERIC_CPU_DEVICES=y ++CONFIG_GENERIC_CPU_AUTOPROBE=y ++CONFIG_GENERIC_CPU_VULNERABILITIES=y ++CONFIG_SOC_BUS=y ++CONFIG_REGMAP=y ++CONFIG_REGMAP_I2C=m ++CONFIG_REGMAP_SPI=m ++CONFIG_REGMAP_MMIO=y ++CONFIG_REGMAP_IRQ=y ++CONFIG_DMA_SHARED_BUFFER=y ++# CONFIG_DMA_FENCE_TRACE is not set ++CONFIG_GENERIC_ARCH_TOPOLOGY=y ++CONFIG_GENERIC_ARCH_NUMA=y ++# CONFIG_FW_DEVLINK_SYNC_STATE_TIMEOUT is not set ++# end of Generic Driver Options ++ ++# ++# Bus devices ++# ++# CONFIG_BRCMSTB_GISB_ARB is not set ++# CONFIG_MOXTET is not set ++# CONFIG_VEXPRESS_CONFIG is not set ++# CONFIG_MHI_BUS is not set ++# CONFIG_MHI_BUS_EP is not set ++# end of Bus devices ++ ++# ++# Cache Drivers ++# ++# end of Cache Drivers ++ ++CONFIG_CONNECTOR=m ++ ++# ++# Firmware Drivers ++# ++ ++# ++# ARM System Control and Management Interface Protocol ++# ++# CONFIG_ARM_SCMI_PROTOCOL is not set ++# end of ARM System Control and Management Interface Protocol ++ ++# CONFIG_ARM_SCPI_PROTOCOL is not set ++# CONFIG_ARM_SDE_INTERFACE is not set ++# CONFIG_FIRMWARE_MEMMAP is not set ++CONFIG_DMIID=y ++# CONFIG_DMI_SYSFS is not set ++CONFIG_RASPBERRYPI_FIRMWARE=y ++CONFIG_FIRMWARE_RP1=m ++# CONFIG_FW_CFG_SYSFS is not set ++# CONFIG_SYSFB_SIMPLEFB is not set ++# CONFIG_ARM_FFA_TRANSPORT is not set ++CONFIG_FW_CS_DSP=m ++# CONFIG_GOOGLE_FIRMWARE is not set ++ ++# ++# EFI (Extensible Firmware Interface) Support ++# ++CONFIG_EFI_ESRT=y ++# CONFIG_EFI_VARS_PSTORE is not set ++CONFIG_EFI_PARAMS_FROM_FDT=y ++CONFIG_EFI_RUNTIME_WRAPPERS=y ++CONFIG_EFI_GENERIC_STUB=y ++# CONFIG_EFI_ZBOOT is not set ++CONFIG_EFI_ARMSTUB_DTB_LOADER=y ++# CONFIG_EFI_BOOTLOADER_CONTROL is not set ++# CONFIG_EFI_CAPSULE_LOADER is not set ++# CONFIG_EFI_TEST is not set ++# CONFIG_RESET_ATTACK_MITIGATION is not set ++# CONFIG_EFI_DISABLE_PCI_DMA is not set ++CONFIG_EFI_EARLYCON=y ++# CONFIG_EFI_DISABLE_RUNTIME is not set ++# CONFIG_EFI_COCO_SECRET is not set ++# end of EFI (Extensible Firmware Interface) Support ++ ++CONFIG_ARM_PSCI_FW=y ++# CONFIG_ARM_PSCI_CHECKER is not set ++ ++# ++# Qualcomm firmware drivers ++# ++# end of Qualcomm firmware drivers ++ ++CONFIG_HAVE_ARM_SMCCC=y ++CONFIG_HAVE_ARM_SMCCC_DISCOVERY=y ++CONFIG_ARM_SMCCC_SOC_ID=y ++ ++# ++# Tegra firmware driver ++# ++# end of Tegra firmware driver ++# end of Firmware Drivers ++ ++# CONFIG_GNSS is not set ++CONFIG_MTD=m ++# CONFIG_MTD_TESTS is not set ++ ++# ++# Partition parsers ++# ++# CONFIG_MTD_CMDLINE_PARTS is not set ++CONFIG_MTD_OF_PARTS=m ++# CONFIG_MTD_AFS_PARTS is not set ++# CONFIG_MTD_REDBOOT_PARTS is not set ++# end of Partition parsers ++ ++# ++# User Modules And Translation Layers ++# ++CONFIG_MTD_BLKDEVS=m ++CONFIG_MTD_BLOCK=m ++# CONFIG_MTD_BLOCK_RO is not set ++ ++# ++# Note that in some cases UBI block is preferred. See MTD_UBI_BLOCK. ++# ++# CONFIG_FTL is not set ++# CONFIG_NFTL is not set ++# CONFIG_INFTL is not set ++# CONFIG_RFD_FTL is not set ++# CONFIG_SSFDC is not set ++# CONFIG_SM_FTL is not set ++# CONFIG_MTD_OOPS is not set ++# CONFIG_MTD_SWAP is not set ++# CONFIG_MTD_PARTITIONED_MASTER is not set ++ ++# ++# RAM/ROM/Flash chip drivers ++# ++# CONFIG_MTD_CFI is not set ++# CONFIG_MTD_JEDECPROBE is not set ++CONFIG_MTD_MAP_BANK_WIDTH_1=y ++CONFIG_MTD_MAP_BANK_WIDTH_2=y ++CONFIG_MTD_MAP_BANK_WIDTH_4=y ++CONFIG_MTD_CFI_I1=y ++CONFIG_MTD_CFI_I2=y ++# CONFIG_MTD_RAM is not set ++# CONFIG_MTD_ROM is not set ++# CONFIG_MTD_ABSENT is not set ++# end of RAM/ROM/Flash chip drivers ++ ++# ++# Mapping drivers for chip access ++# ++# CONFIG_MTD_COMPLEX_MAPPINGS is not set ++# CONFIG_MTD_PLATRAM is not set ++# end of Mapping drivers for chip access ++ ++# ++# Self-contained MTD device drivers ++# ++# CONFIG_MTD_PMC551 is not set ++# CONFIG_MTD_DATAFLASH is not set ++# CONFIG_MTD_MCHP23K256 is not set ++# CONFIG_MTD_MCHP48L640 is not set ++# CONFIG_MTD_SST25L is not set ++# CONFIG_MTD_SLRAM is not set ++# CONFIG_MTD_PHRAM is not set ++# CONFIG_MTD_MTDRAM is not set ++CONFIG_MTD_BLOCK2MTD=m ++ ++# ++# Disk-On-Chip Device Drivers ++# ++# CONFIG_MTD_DOCG3 is not set ++# end of Self-contained MTD device drivers ++ ++# ++# NAND ++# ++CONFIG_MTD_NAND_CORE=m ++# CONFIG_MTD_ONENAND is not set ++# CONFIG_MTD_RAW_NAND is not set ++CONFIG_MTD_SPI_NAND=m ++ ++# ++# ECC engine support ++# ++CONFIG_MTD_NAND_ECC=y ++# CONFIG_MTD_NAND_ECC_SW_HAMMING is not set ++# CONFIG_MTD_NAND_ECC_SW_BCH is not set ++# CONFIG_MTD_NAND_ECC_MXIC is not set ++# end of ECC engine support ++# end of NAND ++ ++# ++# LPDDR & LPDDR2 PCM memory drivers ++# ++# CONFIG_MTD_LPDDR is not set ++# end of LPDDR & LPDDR2 PCM memory drivers ++ ++CONFIG_MTD_SPI_NOR=m ++CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y ++# CONFIG_MTD_SPI_NOR_SWP_DISABLE is not set ++CONFIG_MTD_SPI_NOR_SWP_DISABLE_ON_VOLATILE=y ++# CONFIG_MTD_SPI_NOR_SWP_KEEP is not set ++CONFIG_MTD_UBI=m ++CONFIG_MTD_UBI_WL_THRESHOLD=4096 ++CONFIG_MTD_UBI_BEB_LIMIT=20 ++# CONFIG_MTD_UBI_FASTMAP is not set ++# CONFIG_MTD_UBI_GLUEBI is not set ++# CONFIG_MTD_UBI_BLOCK is not set ++# CONFIG_MTD_UBI_NVMEM is not set ++# CONFIG_MTD_HYPERBUS is not set ++CONFIG_DTC=y ++CONFIG_OF=y ++# CONFIG_OF_UNITTEST is not set ++CONFIG_OF_FLATTREE=y ++CONFIG_OF_EARLY_FLATTREE=y ++CONFIG_OF_KOBJ=y ++CONFIG_OF_DYNAMIC=y ++CONFIG_OF_ADDRESS=y ++CONFIG_OF_IRQ=y ++CONFIG_OF_RESERVED_MEM=y ++CONFIG_OF_RESOLVE=y ++CONFIG_OF_OVERLAY=y ++CONFIG_OF_NUMA=y ++CONFIG_OF_CONFIGFS=y ++# CONFIG_PARPORT is not set ++CONFIG_BLK_DEV=y ++# CONFIG_BLK_DEV_NULL_BLK is not set ++CONFIG_CDROM=m ++# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set ++CONFIG_ZRAM=m ++CONFIG_ZRAM_BACKEND_LZ4=y ++# CONFIG_ZRAM_BACKEND_LZ4HC is not set ++CONFIG_ZRAM_BACKEND_ZSTD=y ++# CONFIG_ZRAM_BACKEND_DEFLATE is not set ++# CONFIG_ZRAM_BACKEND_842 is not set ++CONFIG_ZRAM_BACKEND_LZO=y ++# CONFIG_ZRAM_DEF_COMP_LZORLE is not set ++# CONFIG_ZRAM_DEF_COMP_LZO is not set ++# CONFIG_ZRAM_DEF_COMP_LZ4 is not set ++CONFIG_ZRAM_DEF_COMP_ZSTD=y ++CONFIG_ZRAM_DEF_COMP="zstd" ++CONFIG_ZRAM_WRITEBACK=y ++# CONFIG_ZRAM_TRACK_ENTRY_ACTIME is not set ++# CONFIG_ZRAM_MEMORY_TRACKING is not set ++CONFIG_ZRAM_MULTI_COMP=y ++CONFIG_BLK_DEV_LOOP=y ++CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 ++CONFIG_BLK_DEV_DRBD=m ++# CONFIG_DRBD_FAULT_INJECTION is not set ++CONFIG_BLK_DEV_NBD=m ++CONFIG_BLK_DEV_RAM=y ++CONFIG_BLK_DEV_RAM_COUNT=16 ++CONFIG_BLK_DEV_RAM_SIZE=4096 ++# CONFIG_CDROM_PKTCDVD is not set ++CONFIG_ATA_OVER_ETH=m ++CONFIG_BLK_DEV_RBD=m ++# CONFIG_BLK_DEV_UBLK is not set ++ ++# ++# NVME Support ++# ++CONFIG_NVME_CORE=y ++CONFIG_BLK_DEV_NVME=y ++# CONFIG_NVME_MULTIPATH is not set ++# CONFIG_NVME_VERBOSE_ERRORS is not set ++CONFIG_NVME_HWMON=y ++# CONFIG_NVME_FC is not set ++# CONFIG_NVME_TCP is not set ++# CONFIG_NVME_HOST_AUTH is not set ++# CONFIG_NVME_TARGET is not set ++# end of NVME Support ++ ++# ++# Misc devices ++# ++CONFIG_BCM2835_SMI=m ++CONFIG_RP1_PIO=m ++CONFIG_WS2812_PIO_RP1=m ++# CONFIG_AD525X_DPOT is not set ++# CONFIG_DUMMY_IRQ is not set ++# CONFIG_PHANTOM is not set ++# CONFIG_RPMB is not set ++# CONFIG_TIFM_CORE is not set ++# CONFIG_ICS932S401 is not set ++# CONFIG_ENCLOSURE_SERVICES is not set ++# CONFIG_HP_ILO is not set ++# CONFIG_APDS9802ALS is not set ++# CONFIG_ISL29003 is not set ++# CONFIG_ISL29020 is not set ++# CONFIG_SENSORS_TSL2550 is not set ++# CONFIG_SENSORS_BH1770 is not set ++# CONFIG_SENSORS_APDS990X is not set ++# CONFIG_HMC6352 is not set ++# CONFIG_DS1682 is not set ++# CONFIG_LATTICE_ECP3_CONFIG is not set ++CONFIG_SRAM=y ++# CONFIG_DW_XDATA_PCIE is not set ++# CONFIG_PCI_ENDPOINT_TEST is not set ++# CONFIG_XILINX_SDFEC is not set ++# CONFIG_HISI_HIKEY_USB is not set ++# CONFIG_OPEN_DICE is not set ++# CONFIG_VCPU_STALL_DETECTOR is not set ++# CONFIG_C2PORT is not set ++ ++# ++# EEPROM support ++# ++CONFIG_EEPROM_AT24=m ++CONFIG_EEPROM_AT25=m ++# CONFIG_EEPROM_MAX6875 is not set ++CONFIG_EEPROM_93CX6=m ++# CONFIG_EEPROM_93XX46 is not set ++# CONFIG_EEPROM_IDT_89HPESX is not set ++# CONFIG_EEPROM_EE1004 is not set ++# end of EEPROM support ++ ++# CONFIG_CB710_CORE is not set ++ ++# ++# Texas Instruments shared transport line discipline ++# ++CONFIG_TI_ST=m ++# end of Texas Instruments shared transport line discipline ++ ++# CONFIG_SENSORS_LIS3_SPI is not set ++# CONFIG_SENSORS_LIS3_I2C is not set ++# CONFIG_ALTERA_STAPL is not set ++# CONFIG_VMWARE_VMCI is not set ++# CONFIG_GENWQE is not set ++# CONFIG_ECHO is not set ++# CONFIG_BCM_VK is not set ++# CONFIG_MISC_ALCOR_PCI is not set ++# CONFIG_MISC_RTSX_PCI is not set ++# CONFIG_MISC_RTSX_USB is not set ++# CONFIG_UACCE is not set ++# CONFIG_PVPANIC is not set ++# CONFIG_GP_PCI1XXXX is not set ++# CONFIG_KEBA_CP500 is not set ++# end of Misc devices ++ ++# ++# SCSI device support ++# ++CONFIG_SCSI_MOD=y ++# CONFIG_RAID_ATTRS is not set ++CONFIG_SCSI_COMMON=y ++CONFIG_SCSI=y ++CONFIG_SCSI_DMA=y ++# CONFIG_SCSI_PROC_FS is not set ++ ++# ++# SCSI support type (disk, tape, CD-ROM) ++# ++CONFIG_BLK_DEV_SD=y ++CONFIG_CHR_DEV_ST=m ++CONFIG_BLK_DEV_SR=m ++CONFIG_CHR_DEV_SG=m ++CONFIG_BLK_DEV_BSG=y ++# CONFIG_CHR_DEV_SCH is not set ++# CONFIG_SCSI_CONSTANTS is not set ++# CONFIG_SCSI_LOGGING is not set ++# CONFIG_SCSI_SCAN_ASYNC is not set ++ ++# ++# SCSI Transports ++# ++# CONFIG_SCSI_SPI_ATTRS is not set ++# CONFIG_SCSI_FC_ATTRS is not set ++CONFIG_SCSI_ISCSI_ATTRS=y ++# CONFIG_SCSI_SAS_ATTRS is not set ++# CONFIG_SCSI_SAS_LIBSAS is not set ++# CONFIG_SCSI_SRP_ATTRS is not set ++# end of SCSI Transports ++ ++CONFIG_SCSI_LOWLEVEL=y ++CONFIG_ISCSI_TCP=m ++CONFIG_ISCSI_BOOT_SYSFS=m ++# CONFIG_SCSI_CXGB3_ISCSI is not set ++# CONFIG_SCSI_CXGB4_ISCSI is not set ++# CONFIG_SCSI_BNX2_ISCSI is not set ++# CONFIG_BE2ISCSI is not set ++# CONFIG_BLK_DEV_3W_XXXX_RAID is not set ++# CONFIG_SCSI_HPSA is not set ++# CONFIG_SCSI_3W_9XXX is not set ++# CONFIG_SCSI_3W_SAS is not set ++# CONFIG_SCSI_ACARD is not set ++# CONFIG_SCSI_AACRAID is not set ++# CONFIG_SCSI_AIC7XXX is not set ++# CONFIG_SCSI_AIC79XX is not set ++# CONFIG_SCSI_AIC94XX is not set ++# CONFIG_SCSI_HISI_SAS is not set ++# CONFIG_SCSI_MVSAS is not set ++# CONFIG_SCSI_MVUMI is not set ++# CONFIG_SCSI_ADVANSYS is not set ++# CONFIG_SCSI_ARCMSR is not set ++# CONFIG_SCSI_ESAS2R is not set ++# CONFIG_MEGARAID_NEWGEN is not set ++# CONFIG_MEGARAID_LEGACY is not set ++# CONFIG_MEGARAID_SAS is not set ++# CONFIG_SCSI_MPT3SAS is not set ++# CONFIG_SCSI_MPT2SAS is not set ++# CONFIG_SCSI_MPI3MR is not set ++# CONFIG_SCSI_SMARTPQI is not set ++# CONFIG_SCSI_HPTIOP is not set ++# CONFIG_SCSI_BUSLOGIC is not set ++# CONFIG_SCSI_MYRB is not set ++# CONFIG_SCSI_MYRS is not set ++# CONFIG_SCSI_SNIC is not set ++# CONFIG_SCSI_DMX3191D is not set ++# CONFIG_SCSI_FDOMAIN_PCI is not set ++# CONFIG_SCSI_IPS is not set ++# CONFIG_SCSI_INITIO is not set ++# CONFIG_SCSI_INIA100 is not set ++# CONFIG_SCSI_STEX is not set ++# CONFIG_SCSI_SYM53C8XX_2 is not set ++# CONFIG_SCSI_IPR is not set ++# CONFIG_SCSI_QLOGIC_1280 is not set ++# CONFIG_SCSI_QLA_ISCSI is not set ++# CONFIG_SCSI_DC395x is not set ++# CONFIG_SCSI_AM53C974 is not set ++# CONFIG_SCSI_WD719X is not set ++# CONFIG_SCSI_DEBUG is not set ++# CONFIG_SCSI_PMCRAID is not set ++# CONFIG_SCSI_PM8001 is not set ++# CONFIG_SCSI_DH is not set ++# end of SCSI device support ++ ++CONFIG_ATA=m ++CONFIG_SATA_HOST=y ++CONFIG_ATA_VERBOSE_ERROR=y ++CONFIG_ATA_FORCE=y ++CONFIG_SATA_PMP=y ++ ++# ++# Controllers with non-SFF native interface ++# ++CONFIG_SATA_AHCI=m ++CONFIG_SATA_MOBILE_LPM_POLICY=3 ++# CONFIG_SATA_AHCI_PLATFORM is not set ++# CONFIG_AHCI_BRCM is not set ++# CONFIG_AHCI_DWC is not set ++# CONFIG_AHCI_CEVA is not set ++# CONFIG_SATA_INIC162X is not set ++# CONFIG_SATA_ACARD_AHCI is not set ++# CONFIG_SATA_SIL24 is not set ++CONFIG_ATA_SFF=y ++ ++# ++# SFF controllers with custom DMA interface ++# ++# CONFIG_PDC_ADMA is not set ++# CONFIG_SATA_QSTOR is not set ++# CONFIG_SATA_SX4 is not set ++CONFIG_ATA_BMDMA=y ++ ++# ++# SATA SFF controllers with BMDMA ++# ++# CONFIG_ATA_PIIX is not set ++# CONFIG_SATA_DWC is not set ++CONFIG_SATA_MV=m ++# CONFIG_SATA_NV is not set ++# CONFIG_SATA_PROMISE is not set ++# CONFIG_SATA_SIL is not set ++# CONFIG_SATA_SIS is not set ++# CONFIG_SATA_SVW is not set ++# CONFIG_SATA_ULI is not set ++# CONFIG_SATA_VIA is not set ++# CONFIG_SATA_VITESSE is not set ++ ++# ++# PATA SFF controllers with BMDMA ++# ++# CONFIG_PATA_ALI is not set ++# CONFIG_PATA_AMD is not set ++# CONFIG_PATA_ARTOP is not set ++# CONFIG_PATA_ATIIXP is not set ++# CONFIG_PATA_ATP867X is not set ++# CONFIG_PATA_CMD64X is not set ++# CONFIG_PATA_CYPRESS is not set ++# CONFIG_PATA_EFAR is not set ++# CONFIG_PATA_HPT366 is not set ++# CONFIG_PATA_HPT37X is not set ++# CONFIG_PATA_HPT3X2N is not set ++# CONFIG_PATA_HPT3X3 is not set ++# CONFIG_PATA_IT8213 is not set ++# CONFIG_PATA_IT821X is not set ++# CONFIG_PATA_JMICRON is not set ++# CONFIG_PATA_MARVELL is not set ++# CONFIG_PATA_NETCELL is not set ++# CONFIG_PATA_NINJA32 is not set ++# CONFIG_PATA_NS87415 is not set ++# CONFIG_PATA_OLDPIIX is not set ++# CONFIG_PATA_OPTIDMA is not set ++# CONFIG_PATA_PDC2027X is not set ++# CONFIG_PATA_PDC_OLD is not set ++# CONFIG_PATA_RADISYS is not set ++# CONFIG_PATA_RDC is not set ++# CONFIG_PATA_SCH is not set ++# CONFIG_PATA_SERVERWORKS is not set ++# CONFIG_PATA_SIL680 is not set ++# CONFIG_PATA_SIS is not set ++# CONFIG_PATA_TOSHIBA is not set ++# CONFIG_PATA_TRIFLEX is not set ++# CONFIG_PATA_VIA is not set ++# CONFIG_PATA_WINBOND is not set ++ ++# ++# PIO-only SFF controllers ++# ++# CONFIG_PATA_CMD640_PCI is not set ++# CONFIG_PATA_MPIIX is not set ++# CONFIG_PATA_NS87410 is not set ++# CONFIG_PATA_OPTI is not set ++# CONFIG_PATA_OF_PLATFORM is not set ++# CONFIG_PATA_RZ1000 is not set ++ ++# ++# Generic fallback / legacy drivers ++# ++# CONFIG_ATA_GENERIC is not set ++# CONFIG_PATA_LEGACY is not set ++CONFIG_MD=y ++CONFIG_BLK_DEV_MD=m ++CONFIG_MD_BITMAP_FILE=y ++# CONFIG_MD_LINEAR is not set ++CONFIG_MD_RAID0=m ++CONFIG_MD_RAID1=m ++CONFIG_MD_RAID10=m ++CONFIG_MD_RAID456=m ++# CONFIG_MD_CLUSTER is not set ++CONFIG_BCACHE=m ++# CONFIG_BCACHE_DEBUG is not set ++# CONFIG_BCACHE_ASYNC_REGISTRATION is not set ++CONFIG_BLK_DEV_DM_BUILTIN=y ++CONFIG_BLK_DEV_DM=m ++# CONFIG_DM_DEBUG is not set ++CONFIG_DM_BUFIO=m ++# CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING is not set ++CONFIG_DM_BIO_PRISON=m ++CONFIG_DM_PERSISTENT_DATA=m ++# CONFIG_DM_UNSTRIPED is not set ++CONFIG_DM_CRYPT=m ++CONFIG_DM_SNAPSHOT=m ++CONFIG_DM_THIN_PROVISIONING=m ++CONFIG_DM_CACHE=m ++CONFIG_DM_CACHE_SMQ=m ++CONFIG_DM_WRITECACHE=m ++# CONFIG_DM_EBS is not set ++# CONFIG_DM_ERA is not set ++# CONFIG_DM_CLONE is not set ++CONFIG_DM_MIRROR=m ++CONFIG_DM_LOG_USERSPACE=m ++CONFIG_DM_RAID=m ++CONFIG_DM_ZERO=m ++CONFIG_DM_MULTIPATH=m ++# CONFIG_DM_MULTIPATH_QL is not set ++# CONFIG_DM_MULTIPATH_ST is not set ++# CONFIG_DM_MULTIPATH_HST is not set ++# CONFIG_DM_MULTIPATH_IOA is not set ++CONFIG_DM_DELAY=m ++# CONFIG_DM_DUST is not set ++# CONFIG_DM_UEVENT is not set ++# CONFIG_DM_FLAKEY is not set ++CONFIG_DM_VERITY=m ++# CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG is not set ++# CONFIG_DM_VERITY_FEC is not set ++# CONFIG_DM_SWITCH is not set ++# CONFIG_DM_LOG_WRITES is not set ++CONFIG_DM_INTEGRITY=m ++CONFIG_DM_AUDIT=y ++# CONFIG_DM_VDO is not set ++# CONFIG_TARGET_CORE is not set ++# CONFIG_FUSION is not set ++ ++# ++# IEEE 1394 (FireWire) support ++# ++# CONFIG_FIREWIRE is not set ++# CONFIG_FIREWIRE_NOSY is not set ++# end of IEEE 1394 (FireWire) support ++ ++CONFIG_NETDEVICES=y ++CONFIG_MII=y ++CONFIG_NET_CORE=y ++CONFIG_BONDING=m ++CONFIG_DUMMY=m ++CONFIG_WIREGUARD=m ++# CONFIG_WIREGUARD_DEBUG is not set ++# CONFIG_EQUALIZER is not set ++# CONFIG_NET_FC is not set ++CONFIG_IFB=m ++# CONFIG_NET_TEAM is not set ++CONFIG_MACVLAN=m ++CONFIG_MACVTAP=m ++CONFIG_IPVLAN_L3S=y ++CONFIG_IPVLAN=m ++# CONFIG_IPVTAP is not set ++CONFIG_VXLAN=m ++# CONFIG_GENEVE is not set ++# CONFIG_BAREUDP is not set ++# CONFIG_GTP is not set ++# CONFIG_PFCP is not set ++# CONFIG_AMT is not set ++# CONFIG_MACSEC is not set ++CONFIG_NETCONSOLE=m ++# CONFIG_NETCONSOLE_DYNAMIC is not set ++# CONFIG_NETCONSOLE_EXTENDED_LOG is not set ++CONFIG_NETPOLL=y ++CONFIG_NET_POLL_CONTROLLER=y ++CONFIG_TUN=m ++CONFIG_TAP=m ++# CONFIG_TUN_VNET_CROSS_LE is not set ++CONFIG_VETH=m ++# CONFIG_NLMON is not set ++CONFIG_NETKIT=y ++CONFIG_NET_VRF=m ++CONFIG_VSOCKMON=m ++# CONFIG_ARCNET is not set ++CONFIG_ATM_DRIVERS=y ++# CONFIG_ATM_DUMMY is not set ++# CONFIG_ATM_TCP is not set ++# CONFIG_ATM_LANAI is not set ++# CONFIG_ATM_ENI is not set ++# CONFIG_ATM_NICSTAR is not set ++# CONFIG_ATM_IDT77252 is not set ++# CONFIG_ATM_IA is not set ++# CONFIG_ATM_FORE200E is not set ++# CONFIG_ATM_HE is not set ++# CONFIG_ATM_SOLOS is not set ++ ++# ++# Distributed Switch Architecture drivers ++# ++# CONFIG_B53 is not set ++# CONFIG_NET_DSA_BCM_SF2 is not set ++# CONFIG_NET_DSA_LOOP is not set ++# CONFIG_NET_DSA_LANTIQ_GSWIP is not set ++# CONFIG_NET_DSA_MT7530 is not set ++# CONFIG_NET_DSA_MV88E6060 is not set ++# CONFIG_NET_DSA_MICROCHIP_KSZ_COMMON is not set ++# CONFIG_NET_DSA_MV88E6XXX is not set ++# CONFIG_NET_DSA_MSCC_OCELOT_EXT is not set ++# CONFIG_NET_DSA_MSCC_SEVILLE is not set ++# CONFIG_NET_DSA_AR9331 is not set ++# CONFIG_NET_DSA_QCA8K is not set ++# CONFIG_NET_DSA_SJA1105 is not set ++# CONFIG_NET_DSA_XRS700X_I2C is not set ++# CONFIG_NET_DSA_XRS700X_MDIO is not set ++# CONFIG_NET_DSA_REALTEK is not set ++# CONFIG_NET_DSA_SMSC_LAN9303_I2C is not set ++# CONFIG_NET_DSA_SMSC_LAN9303_MDIO is not set ++# CONFIG_NET_DSA_VITESSE_VSC73XX_SPI is not set ++# CONFIG_NET_DSA_VITESSE_VSC73XX_PLATFORM is not set ++# end of Distributed Switch Architecture drivers ++ ++CONFIG_ETHERNET=y ++CONFIG_MDIO=m ++CONFIG_NET_VENDOR_3COM=y ++# CONFIG_VORTEX is not set ++# CONFIG_TYPHOON is not set ++CONFIG_NET_VENDOR_ADAPTEC=y ++# CONFIG_ADAPTEC_STARFIRE is not set ++CONFIG_NET_VENDOR_AGERE=y ++# CONFIG_ET131X is not set ++CONFIG_NET_VENDOR_ALACRITECH=y ++# CONFIG_SLICOSS is not set ++CONFIG_NET_VENDOR_ALTEON=y ++# CONFIG_ACENIC is not set ++# CONFIG_ALTERA_TSE is not set ++CONFIG_NET_VENDOR_AMAZON=y ++# CONFIG_ENA_ETHERNET is not set ++CONFIG_NET_VENDOR_AMD=y ++# CONFIG_AMD8111_ETH is not set ++# CONFIG_PCNET32 is not set ++# CONFIG_AMD_XGBE is not set ++# CONFIG_PDS_CORE is not set ++CONFIG_NET_VENDOR_AQUANTIA=y ++# CONFIG_AQTION is not set ++CONFIG_NET_VENDOR_ARC=y ++CONFIG_NET_VENDOR_ASIX=y ++# CONFIG_SPI_AX88796C is not set ++CONFIG_NET_VENDOR_ATHEROS=y ++# CONFIG_ATL2 is not set ++# CONFIG_ATL1 is not set ++# CONFIG_ATL1E is not set ++# CONFIG_ATL1C is not set ++# CONFIG_ALX is not set ++CONFIG_NET_VENDOR_BROADCOM=y ++# CONFIG_B44 is not set ++CONFIG_BCMGENET=y ++# CONFIG_BNX2 is not set ++# CONFIG_CNIC is not set ++# CONFIG_TIGON3 is not set ++# CONFIG_BNX2X is not set ++# CONFIG_SYSTEMPORT is not set ++# CONFIG_BNXT is not set ++CONFIG_BCMASP=y ++CONFIG_NET_VENDOR_CADENCE=y ++CONFIG_MACB=y ++CONFIG_MACB_USE_HWSTAMP=y ++# CONFIG_MACB_PCI is not set ++CONFIG_NET_VENDOR_CAVIUM=y ++# CONFIG_THUNDER_NIC_PF is not set ++# CONFIG_THUNDER_NIC_VF is not set ++# CONFIG_THUNDER_NIC_BGX is not set ++# CONFIG_THUNDER_NIC_RGX is not set ++# CONFIG_CAVIUM_PTP is not set ++# CONFIG_LIQUIDIO is not set ++# CONFIG_LIQUIDIO_VF is not set ++CONFIG_NET_VENDOR_CHELSIO=y ++# CONFIG_CHELSIO_T1 is not set ++# CONFIG_CHELSIO_T3 is not set ++# CONFIG_CHELSIO_T4 is not set ++# CONFIG_CHELSIO_T4VF is not set ++CONFIG_NET_VENDOR_CISCO=y ++# CONFIG_ENIC is not set ++CONFIG_NET_VENDOR_CORTINA=y ++# CONFIG_GEMINI_ETHERNET is not set ++CONFIG_NET_VENDOR_DAVICOM=y ++# CONFIG_DM9051 is not set ++# CONFIG_DNET is not set ++CONFIG_NET_VENDOR_DEC=y ++# CONFIG_NET_TULIP is not set ++CONFIG_NET_VENDOR_DLINK=y ++# CONFIG_DL2K is not set ++# CONFIG_SUNDANCE is not set ++CONFIG_NET_VENDOR_EMULEX=y ++# CONFIG_BE2NET is not set ++CONFIG_NET_VENDOR_ENGLEDER=y ++# CONFIG_TSNEP is not set ++CONFIG_NET_VENDOR_EZCHIP=y ++# CONFIG_EZCHIP_NPS_MANAGEMENT_ENET is not set ++CONFIG_NET_VENDOR_FUNGIBLE=y ++# CONFIG_FUN_ETH is not set ++CONFIG_NET_VENDOR_GOOGLE=y ++# CONFIG_GVE is not set ++CONFIG_NET_VENDOR_HISILICON=y ++# CONFIG_HIX5HD2_GMAC is not set ++# CONFIG_HISI_FEMAC is not set ++# CONFIG_HIP04_ETH is not set ++# CONFIG_HNS_DSAF is not set ++# CONFIG_HNS_ENET is not set ++# CONFIG_HNS3 is not set ++CONFIG_NET_VENDOR_HUAWEI=y ++# CONFIG_HINIC is not set ++CONFIG_NET_VENDOR_I825XX=y ++CONFIG_NET_VENDOR_INTEL=y ++CONFIG_LIBETH=m ++CONFIG_LIBIE=m ++# CONFIG_E100 is not set ++# CONFIG_E1000 is not set ++# CONFIG_E1000E is not set ++CONFIG_IGB=m ++CONFIG_IGB_HWMON=y ++# CONFIG_IGBVF is not set ++CONFIG_IXGBE=m ++CONFIG_IXGBE_HWMON=y ++CONFIG_IXGBE_IPSEC=y ++# CONFIG_IXGBEVF is not set ++CONFIG_I40E=m ++# CONFIG_I40EVF is not set ++# CONFIG_ICE is not set ++# CONFIG_FM10K is not set ++CONFIG_IGC=m ++CONFIG_IGC_LEDS=y ++# CONFIG_IDPF is not set ++# CONFIG_JME is not set ++CONFIG_NET_VENDOR_ADI=y ++# CONFIG_ADIN1110 is not set ++CONFIG_NET_VENDOR_LITEX=y ++# CONFIG_LITEX_LITEETH is not set ++CONFIG_NET_VENDOR_MARVELL=y ++# CONFIG_MVMDIO is not set ++# CONFIG_SKGE is not set ++# CONFIG_SKY2 is not set ++# CONFIG_OCTEONTX2_AF is not set ++# CONFIG_OCTEONTX2_PF is not set ++# CONFIG_OCTEON_EP is not set ++# CONFIG_OCTEON_EP_VF is not set ++# CONFIG_PRESTERA is not set ++CONFIG_NET_VENDOR_MELLANOX=y ++# CONFIG_MLX4_EN is not set ++# CONFIG_MLX5_CORE is not set ++# CONFIG_MLXSW_CORE is not set ++# CONFIG_MLXFW is not set ++CONFIG_NET_VENDOR_META=y ++CONFIG_NET_VENDOR_MICREL=y ++# CONFIG_KS8842 is not set ++# CONFIG_KS8851 is not set ++# CONFIG_KS8851_MLL is not set ++# CONFIG_KSZ884X_PCI is not set ++CONFIG_NET_VENDOR_MICROCHIP=y ++CONFIG_ENC28J60=m ++# CONFIG_ENC28J60_WRITEVERIFY is not set ++# CONFIG_ENCX24J600 is not set ++CONFIG_LAN743X=m ++# CONFIG_LAN865X is not set ++# CONFIG_LAN966X_SWITCH is not set ++# CONFIG_VCAP is not set ++CONFIG_NET_VENDOR_MICROSEMI=y ++# CONFIG_MSCC_OCELOT_SWITCH is not set ++CONFIG_NET_VENDOR_MICROSOFT=y ++CONFIG_NET_VENDOR_MYRI=y ++# CONFIG_MYRI10GE is not set ++# CONFIG_FEALNX is not set ++CONFIG_NET_VENDOR_NI=y ++# CONFIG_NI_XGE_MANAGEMENT_ENET is not set ++CONFIG_NET_VENDOR_NATSEMI=y ++# CONFIG_NATSEMI is not set ++# CONFIG_NS83820 is not set ++CONFIG_NET_VENDOR_NETERION=y ++# CONFIG_S2IO is not set ++CONFIG_NET_VENDOR_NETRONOME=y ++# CONFIG_NFP is not set ++CONFIG_NET_VENDOR_8390=y ++# CONFIG_NE2K_PCI is not set ++CONFIG_NET_VENDOR_NVIDIA=y ++# CONFIG_FORCEDETH is not set ++CONFIG_NET_VENDOR_OKI=y ++# CONFIG_ETHOC is not set ++# CONFIG_OA_TC6 is not set ++CONFIG_NET_VENDOR_PACKET_ENGINES=y ++# CONFIG_HAMACHI is not set ++# CONFIG_YELLOWFIN is not set ++CONFIG_NET_VENDOR_PENSANDO=y ++# CONFIG_IONIC is not set ++CONFIG_NET_VENDOR_QLOGIC=y ++# CONFIG_QLA3XXX is not set ++# CONFIG_QLCNIC is not set ++# CONFIG_NETXEN_NIC is not set ++# CONFIG_QED is not set ++CONFIG_NET_VENDOR_BROCADE=y ++# CONFIG_BNA is not set ++CONFIG_NET_VENDOR_QUALCOMM=y ++CONFIG_QCA7000=m ++CONFIG_QCA7000_SPI=m ++CONFIG_QCA7000_UART=m ++# CONFIG_QCOM_EMAC is not set ++# CONFIG_RMNET is not set ++CONFIG_NET_VENDOR_RDC=y ++# CONFIG_R6040 is not set ++CONFIG_NET_VENDOR_REALTEK=y ++# CONFIG_8139CP is not set ++# CONFIG_8139TOO is not set ++CONFIG_R8169=m ++CONFIG_R8169_LEDS=y ++# CONFIG_RTASE is not set ++CONFIG_NET_VENDOR_RENESAS=y ++CONFIG_NET_VENDOR_ROCKER=y ++# CONFIG_ROCKER is not set ++CONFIG_NET_VENDOR_SAMSUNG=y ++# CONFIG_SXGBE_ETH is not set ++CONFIG_NET_VENDOR_SEEQ=y ++CONFIG_NET_VENDOR_SILAN=y ++# CONFIG_SC92031 is not set ++CONFIG_NET_VENDOR_SIS=y ++# CONFIG_SIS900 is not set ++# CONFIG_SIS190 is not set ++CONFIG_NET_VENDOR_SOLARFLARE=y ++# CONFIG_SFC is not set ++# CONFIG_SFC_FALCON is not set ++# CONFIG_SFC_SIENA is not set ++CONFIG_NET_VENDOR_SMSC=y ++# CONFIG_SMC91X is not set ++# CONFIG_EPIC100 is not set ++# CONFIG_SMSC911X is not set ++# CONFIG_SMSC9420 is not set ++CONFIG_NET_VENDOR_SOCIONEXT=y ++CONFIG_NET_VENDOR_STMICRO=y ++# CONFIG_STMMAC_ETH is not set ++CONFIG_NET_VENDOR_SUN=y ++# CONFIG_HAPPYMEAL is not set ++# CONFIG_SUNGEM is not set ++# CONFIG_CASSINI is not set ++# CONFIG_NIU is not set ++CONFIG_NET_VENDOR_SYNOPSYS=y ++# CONFIG_DWC_XLGMAC is not set ++CONFIG_NET_VENDOR_TEHUTI=y ++# CONFIG_TEHUTI is not set ++# CONFIG_TEHUTI_TN40 is not set ++CONFIG_NET_VENDOR_TI=y ++# CONFIG_TI_CPSW_PHY_SEL is not set ++# CONFIG_TLAN is not set ++CONFIG_NET_VENDOR_VERTEXCOM=y ++CONFIG_MSE102X=m ++CONFIG_NET_VENDOR_VIA=y ++# CONFIG_VIA_RHINE is not set ++# CONFIG_VIA_VELOCITY is not set ++CONFIG_NET_VENDOR_WANGXUN=y ++# CONFIG_NGBE is not set ++# CONFIG_TXGBE is not set ++CONFIG_NET_VENDOR_WIZNET=y ++CONFIG_WIZNET_W5100=m ++# CONFIG_WIZNET_W5300 is not set ++# CONFIG_WIZNET_BUS_DIRECT is not set ++# CONFIG_WIZNET_BUS_INDIRECT is not set ++CONFIG_WIZNET_BUS_ANY=y ++CONFIG_WIZNET_W5100_SPI=m ++CONFIG_NET_VENDOR_XILINX=y ++# CONFIG_XILINX_EMACLITE is not set ++# CONFIG_XILINX_LL_TEMAC is not set ++# CONFIG_FDDI is not set ++# CONFIG_HIPPI is not set ++CONFIG_PHYLINK=y ++CONFIG_PHYLIB=y ++CONFIG_SWPHY=y ++# CONFIG_LED_TRIGGER_PHY is not set ++CONFIG_PHYLIB_LEDS=y ++CONFIG_FIXED_PHY=y ++# CONFIG_SFP is not set ++ ++# ++# MII PHY device drivers ++# ++# CONFIG_AIR_EN8811H_PHY is not set ++# CONFIG_AMD_PHY is not set ++# CONFIG_ADIN_PHY is not set ++# CONFIG_ADIN1100_PHY is not set ++# CONFIG_AQUANTIA_PHY is not set ++CONFIG_AX88796B_PHY=m ++CONFIG_BROADCOM_PHY=y ++# CONFIG_BCM54140_PHY is not set ++CONFIG_BCM7XXX_PHY=y ++# CONFIG_BCM84881_PHY is not set ++# CONFIG_BCM87XX_PHY is not set ++CONFIG_BCM_NET_PHYLIB=y ++CONFIG_BCM_NET_PHYPTP=y ++# CONFIG_CICADA_PHY is not set ++# CONFIG_CORTINA_PHY is not set ++# CONFIG_DAVICOM_PHY is not set ++# CONFIG_ICPLUS_PHY is not set ++# CONFIG_LXT_PHY is not set ++# CONFIG_INTEL_XWAY_PHY is not set ++# CONFIG_LSI_ET1011C_PHY is not set ++# CONFIG_MARVELL_PHY is not set ++# CONFIG_MARVELL_10G_PHY is not set ++# CONFIG_MARVELL_88Q2XXX_PHY is not set ++# CONFIG_MARVELL_88X2222_PHY is not set ++# CONFIG_MAXLINEAR_GPHY is not set ++# CONFIG_MEDIATEK_GE_PHY is not set ++CONFIG_MICREL_PHY=y ++# CONFIG_MICROCHIP_T1S_PHY is not set ++CONFIG_MICROCHIP_PHY=y ++# CONFIG_MICROCHIP_T1_PHY is not set ++# CONFIG_MICROSEMI_PHY is not set ++# CONFIG_MOTORCOMM_PHY is not set ++# CONFIG_NATIONAL_PHY is not set ++# CONFIG_NXP_CBTX_PHY is not set ++# CONFIG_NXP_C45_TJA11XX_PHY is not set ++# CONFIG_NXP_TJA11XX_PHY is not set ++# CONFIG_NCN26000_PHY is not set ++# CONFIG_AT803X_PHY is not set ++# CONFIG_QCA83XX_PHY is not set ++# CONFIG_QCA808X_PHY is not set ++# CONFIG_QCA807X_PHY is not set ++# CONFIG_QSEMI_PHY is not set ++CONFIG_REALTEK_PHY=m ++# CONFIG_RENESAS_PHY is not set ++# CONFIG_ROCKCHIP_PHY is not set ++CONFIG_SMSC_PHY=y ++# CONFIG_STE10XP is not set ++# CONFIG_TERANETICS_PHY is not set ++# CONFIG_DP83822_PHY is not set ++# CONFIG_DP83TC811_PHY is not set ++# CONFIG_DP83848_PHY is not set ++# CONFIG_DP83867_PHY is not set ++# CONFIG_DP83869_PHY is not set ++# CONFIG_DP83TD510_PHY is not set ++# CONFIG_DP83TG720_PHY is not set ++# CONFIG_VITESSE_PHY is not set ++# CONFIG_XILINX_GMII2RGMII is not set ++# CONFIG_MICREL_KS8995MA is not set ++# CONFIG_PSE_CONTROLLER is not set ++CONFIG_CAN_DEV=m ++CONFIG_CAN_VCAN=m ++# CONFIG_CAN_VXCAN is not set ++CONFIG_CAN_NETLINK=y ++CONFIG_CAN_CALC_BITTIMING=y ++CONFIG_CAN_RX_OFFLOAD=y ++# CONFIG_CAN_CAN327 is not set ++# CONFIG_CAN_FLEXCAN is not set ++# CONFIG_CAN_GRCAN is not set ++# CONFIG_CAN_KVASER_PCIEFD is not set ++CONFIG_CAN_SLCAN=m ++# CONFIG_CAN_XILINXCAN is not set ++# CONFIG_CAN_C_CAN is not set ++# CONFIG_CAN_CC770 is not set ++# CONFIG_CAN_CTUCANFD_PCI is not set ++# CONFIG_CAN_CTUCANFD_PLATFORM is not set ++# CONFIG_CAN_ESD_402_PCI is not set ++# CONFIG_CAN_IFI_CANFD is not set ++# CONFIG_CAN_M_CAN is not set ++# CONFIG_CAN_PEAK_PCIEFD is not set ++# CONFIG_CAN_SJA1000 is not set ++# CONFIG_CAN_SOFTING is not set ++ ++# ++# CAN SPI interfaces ++# ++# CONFIG_CAN_HI311X is not set ++CONFIG_CAN_MCP251X=m ++CONFIG_CAN_MCP251XFD=m ++# CONFIG_CAN_MCP251XFD_SANITY is not set ++# end of CAN SPI interfaces ++ ++# ++# CAN USB interfaces ++# ++CONFIG_CAN_8DEV_USB=m ++CONFIG_CAN_EMS_USB=m ++# CONFIG_CAN_ESD_USB is not set ++# CONFIG_CAN_ETAS_ES58X is not set ++# CONFIG_CAN_F81604 is not set ++CONFIG_CAN_GS_USB=m ++# CONFIG_CAN_KVASER_USB is not set ++# CONFIG_CAN_MCBA_USB is not set ++CONFIG_CAN_PEAK_USB=m ++# CONFIG_CAN_UCAN is not set ++# end of CAN USB interfaces ++ ++# CONFIG_CAN_DEBUG_DEVICES is not set ++CONFIG_MDIO_DEVICE=y ++CONFIG_MDIO_BUS=y ++CONFIG_FWNODE_MDIO=y ++CONFIG_OF_MDIO=y ++CONFIG_MDIO_DEVRES=y ++CONFIG_MDIO_BITBANG=m ++CONFIG_MDIO_BCM_UNIMAC=y ++# CONFIG_MDIO_GPIO is not set ++# CONFIG_MDIO_HISI_FEMAC is not set ++# CONFIG_MDIO_MVUSB is not set ++# CONFIG_MDIO_MSCC_MIIM is not set ++# CONFIG_MDIO_OCTEON is not set ++# CONFIG_MDIO_IPQ4019 is not set ++# CONFIG_MDIO_IPQ8064 is not set ++# CONFIG_MDIO_THUNDER is not set ++ ++# ++# MDIO Multiplexers ++# ++# CONFIG_MDIO_BUS_MUX_GPIO is not set ++# CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set ++# CONFIG_MDIO_BUS_MUX_MMIOREG is not set ++ ++# ++# PCS device drivers ++# ++# CONFIG_PCS_XPCS is not set ++# end of PCS device drivers ++ ++CONFIG_PPP=m ++CONFIG_PPP_BSDCOMP=m ++CONFIG_PPP_DEFLATE=m ++CONFIG_PPP_FILTER=y ++CONFIG_PPP_MPPE=m ++CONFIG_PPP_MULTILINK=y ++CONFIG_PPPOATM=m ++CONFIG_PPPOE=m ++# CONFIG_PPPOE_HASH_BITS_1 is not set ++# CONFIG_PPPOE_HASH_BITS_2 is not set ++CONFIG_PPPOE_HASH_BITS_4=y ++# CONFIG_PPPOE_HASH_BITS_8 is not set ++CONFIG_PPPOE_HASH_BITS=4 ++# CONFIG_PPTP is not set ++CONFIG_PPPOL2TP=m ++CONFIG_PPP_ASYNC=m ++CONFIG_PPP_SYNC_TTY=m ++CONFIG_SLIP=m ++CONFIG_SLHC=m ++CONFIG_SLIP_COMPRESSED=y ++CONFIG_SLIP_SMART=y ++# CONFIG_SLIP_MODE_SLIP6 is not set ++CONFIG_USB_NET_DRIVERS=y ++CONFIG_USB_CATC=m ++CONFIG_USB_KAWETH=m ++CONFIG_USB_PEGASUS=m ++CONFIG_USB_RTL8150=m ++CONFIG_USB_RTL8152=m ++CONFIG_USB_LAN78XX=y ++CONFIG_USB_USBNET=y ++CONFIG_USB_NET_AX8817X=m ++CONFIG_USB_NET_AX88179_178A=m ++CONFIG_USB_NET_CDCETHER=m ++CONFIG_USB_NET_CDC_EEM=m ++CONFIG_USB_NET_CDC_NCM=m ++CONFIG_USB_NET_HUAWEI_CDC_NCM=m ++CONFIG_USB_NET_CDC_MBIM=m ++CONFIG_USB_NET_DM9601=m ++CONFIG_USB_NET_SR9700=m ++CONFIG_USB_NET_SR9800=m ++CONFIG_USB_NET_SMSC75XX=m ++CONFIG_USB_NET_SMSC95XX=y ++CONFIG_USB_NET_GL620A=m ++CONFIG_USB_NET_NET1080=m ++CONFIG_USB_NET_PLUSB=m ++CONFIG_USB_NET_MCS7830=m ++CONFIG_USB_NET_RNDIS_HOST=m ++CONFIG_USB_NET_CDC_SUBSET_ENABLE=m ++CONFIG_USB_NET_CDC_SUBSET=m ++CONFIG_USB_ALI_M5632=y ++CONFIG_USB_AN2720=y ++CONFIG_USB_BELKIN=y ++CONFIG_USB_ARMLINUX=y ++CONFIG_USB_EPSON2888=y ++CONFIG_USB_KC2190=y ++CONFIG_USB_NET_ZAURUS=m ++CONFIG_USB_NET_CX82310_ETH=m ++CONFIG_USB_NET_KALMIA=m ++CONFIG_USB_NET_QMI_WWAN=m ++CONFIG_USB_HSO=m ++CONFIG_USB_NET_INT51X1=m ++CONFIG_USB_IPHETH=m ++CONFIG_USB_SIERRA_NET=m ++CONFIG_USB_VL600=m ++# CONFIG_USB_NET_CH9200 is not set ++CONFIG_USB_NET_AQC111=m ++CONFIG_USB_RTL8153_ECM=m ++CONFIG_WLAN=y ++CONFIG_WLAN_VENDOR_ADMTEK=y ++# CONFIG_ADM8211 is not set ++CONFIG_ATH_COMMON=m ++CONFIG_WLAN_VENDOR_ATH=y ++# CONFIG_ATH_DEBUG is not set ++# CONFIG_ATH5K is not set ++# CONFIG_ATH5K_PCI is not set ++CONFIG_ATH9K_HW=m ++CONFIG_ATH9K_COMMON=m ++CONFIG_ATH9K_BTCOEX_SUPPORT=y ++CONFIG_ATH9K=m ++CONFIG_ATH9K_PCI=y ++# CONFIG_ATH9K_AHB is not set ++# CONFIG_ATH9K_DYNACK is not set ++# CONFIG_ATH9K_WOW is not set ++CONFIG_ATH9K_RFKILL=y ++# CONFIG_ATH9K_CHANNEL_CONTEXT is not set ++CONFIG_ATH9K_PCOEM=y ++# CONFIG_ATH9K_PCI_NO_EEPROM is not set ++CONFIG_ATH9K_HTC=m ++# CONFIG_ATH9K_HTC_DEBUGFS is not set ++# CONFIG_ATH9K_HWRNG is not set ++CONFIG_CARL9170=m ++CONFIG_CARL9170_LEDS=y ++CONFIG_CARL9170_WPC=y ++# CONFIG_CARL9170_HWRNG is not set ++CONFIG_ATH6KL=m ++# CONFIG_ATH6KL_SDIO is not set ++CONFIG_ATH6KL_USB=m ++# CONFIG_ATH6KL_DEBUG is not set ++# CONFIG_ATH6KL_TRACING is not set ++CONFIG_AR5523=m ++# CONFIG_WIL6210 is not set ++# CONFIG_ATH10K is not set ++# CONFIG_WCN36XX is not set ++# CONFIG_ATH11K is not set ++# CONFIG_ATH12K is not set ++CONFIG_WLAN_VENDOR_ATMEL=y ++CONFIG_AT76C50X_USB=m ++CONFIG_WLAN_VENDOR_BROADCOM=y ++CONFIG_B43=m ++CONFIG_B43_BCMA=y ++CONFIG_B43_SSB=y ++CONFIG_B43_BUSES_BCMA_AND_SSB=y ++# CONFIG_B43_BUSES_BCMA is not set ++# CONFIG_B43_BUSES_SSB is not set ++CONFIG_B43_PCI_AUTOSELECT=y ++CONFIG_B43_PCICORE_AUTOSELECT=y ++# CONFIG_B43_SDIO is not set ++CONFIG_B43_BCMA_PIO=y ++CONFIG_B43_PIO=y ++CONFIG_B43_PHY_G=y ++# CONFIG_B43_PHY_N is not set ++CONFIG_B43_PHY_LP=y ++CONFIG_B43_PHY_HT=y ++CONFIG_B43_LEDS=y ++CONFIG_B43_HWRNG=y ++# CONFIG_B43_DEBUG is not set ++CONFIG_B43LEGACY=m ++CONFIG_B43LEGACY_PCI_AUTOSELECT=y ++CONFIG_B43LEGACY_PCICORE_AUTOSELECT=y ++CONFIG_B43LEGACY_LEDS=y ++CONFIG_B43LEGACY_HWRNG=y ++CONFIG_B43LEGACY_DEBUG=y ++CONFIG_B43LEGACY_DMA=y ++CONFIG_B43LEGACY_PIO=y ++CONFIG_B43LEGACY_DMA_AND_PIO_MODE=y ++# CONFIG_B43LEGACY_DMA_MODE is not set ++# CONFIG_B43LEGACY_PIO_MODE is not set ++CONFIG_BRCMUTIL=m ++# CONFIG_BRCMSMAC is not set ++CONFIG_BRCMFMAC=m ++CONFIG_BRCMFMAC_PROTO_BCDC=y ++CONFIG_BRCMFMAC_SDIO=y ++CONFIG_BRCMFMAC_USB=y ++# CONFIG_BRCMFMAC_PCIE is not set ++# CONFIG_BRCM_TRACING is not set ++CONFIG_BRCMDBG=y ++CONFIG_WLAN_VENDOR_INTEL=y ++# CONFIG_IPW2100 is not set ++# CONFIG_IPW2200 is not set ++# CONFIG_IWL4965 is not set ++# CONFIG_IWL3945 is not set ++CONFIG_IWLWIFI=m ++CONFIG_IWLWIFI_LEDS=y ++CONFIG_IWLDVM=m ++CONFIG_IWLMVM=m ++CONFIG_IWLWIFI_OPMODE_MODULAR=y ++ ++# ++# Debugging Options ++# ++# CONFIG_IWLWIFI_DEBUG is not set ++CONFIG_IWLWIFI_DEVICE_TRACING=y ++# end of Debugging Options ++ ++CONFIG_WLAN_VENDOR_INTERSIL=y ++CONFIG_P54_COMMON=m ++CONFIG_P54_USB=m ++# CONFIG_P54_PCI is not set ++# CONFIG_P54_SPI is not set ++CONFIG_P54_LEDS=y ++CONFIG_WLAN_VENDOR_MARVELL=y ++CONFIG_LIBERTAS=m ++CONFIG_LIBERTAS_USB=m ++CONFIG_LIBERTAS_SDIO=m ++# CONFIG_LIBERTAS_SPI is not set ++# CONFIG_LIBERTAS_DEBUG is not set ++# CONFIG_LIBERTAS_MESH is not set ++CONFIG_LIBERTAS_THINFIRM=m ++# CONFIG_LIBERTAS_THINFIRM_DEBUG is not set ++CONFIG_LIBERTAS_THINFIRM_USB=m ++CONFIG_MWIFIEX=m ++CONFIG_MWIFIEX_SDIO=m ++# CONFIG_MWIFIEX_PCIE is not set ++# CONFIG_MWIFIEX_USB is not set ++# CONFIG_MWL8K is not set ++CONFIG_WLAN_VENDOR_MEDIATEK=y ++CONFIG_MT7601U=m ++CONFIG_MT76_CORE=m ++CONFIG_MT76_LEDS=y ++CONFIG_MT76_USB=m ++CONFIG_MT76x02_LIB=m ++CONFIG_MT76x02_USB=m ++CONFIG_MT76_CONNAC_LIB=m ++CONFIG_MT792x_LIB=m ++CONFIG_MT792x_USB=m ++CONFIG_MT76x0_COMMON=m ++CONFIG_MT76x0U=m ++# CONFIG_MT76x0E is not set ++CONFIG_MT76x2_COMMON=m ++# CONFIG_MT76x2E is not set ++CONFIG_MT76x2U=m ++# CONFIG_MT7603E is not set ++# CONFIG_MT7615E is not set ++# CONFIG_MT7663U is not set ++# CONFIG_MT7663S is not set ++# CONFIG_MT7915E is not set ++CONFIG_MT7921_COMMON=m ++# CONFIG_MT7921E is not set ++# CONFIG_MT7921S is not set ++CONFIG_MT7921U=m ++# CONFIG_MT7996E is not set ++CONFIG_MT7925_COMMON=m ++# CONFIG_MT7925E is not set ++CONFIG_MT7925U=m ++CONFIG_WLAN_VENDOR_MICROCHIP=y ++# CONFIG_WILC1000_SDIO is not set ++# CONFIG_WILC1000_SPI is not set ++CONFIG_WLAN_VENDOR_PURELIFI=y ++# CONFIG_PLFXLC is not set ++CONFIG_WLAN_VENDOR_RALINK=y ++CONFIG_RT2X00=m ++# CONFIG_RT2400PCI is not set ++# CONFIG_RT2500PCI is not set ++# CONFIG_RT61PCI is not set ++# CONFIG_RT2800PCI is not set ++CONFIG_RT2500USB=m ++CONFIG_RT73USB=m ++CONFIG_RT2800USB=m ++CONFIG_RT2800USB_RT33XX=y ++CONFIG_RT2800USB_RT35XX=y ++CONFIG_RT2800USB_RT3573=y ++CONFIG_RT2800USB_RT53XX=y ++CONFIG_RT2800USB_RT55XX=y ++CONFIG_RT2800USB_UNKNOWN=y ++CONFIG_RT2800_LIB=m ++CONFIG_RT2X00_LIB_USB=m ++CONFIG_RT2X00_LIB=m ++CONFIG_RT2X00_LIB_FIRMWARE=y ++CONFIG_RT2X00_LIB_CRYPTO=y ++CONFIG_RT2X00_LIB_LEDS=y ++# CONFIG_RT2X00_DEBUG is not set ++CONFIG_WLAN_VENDOR_REALTEK=y ++# CONFIG_RTL8180 is not set ++CONFIG_RTL8187=m ++CONFIG_RTL8187_LEDS=y ++CONFIG_RTL_CARDS=m ++# CONFIG_RTL8192CE is not set ++# CONFIG_RTL8192SE is not set ++# CONFIG_RTL8192DE is not set ++# CONFIG_RTL8723AE is not set ++# CONFIG_RTL8723BE is not set ++# CONFIG_RTL8188EE is not set ++# CONFIG_RTL8192EE is not set ++# CONFIG_RTL8821AE is not set ++CONFIG_RTL8192CU=m ++# CONFIG_RTL8192DU is not set ++CONFIG_RTLWIFI=m ++CONFIG_RTLWIFI_USB=m ++CONFIG_RTLWIFI_DEBUG=y ++CONFIG_RTL8192C_COMMON=m ++CONFIG_RTL8XXXU=m ++# CONFIG_RTL8XXXU_UNTESTED is not set ++CONFIG_RTW88=m ++CONFIG_RTW88_CORE=m ++CONFIG_RTW88_PCI=m ++CONFIG_RTW88_USB=m ++CONFIG_RTW88_8822B=m ++CONFIG_RTW88_8822C=m ++CONFIG_RTW88_8723X=m ++CONFIG_RTW88_8723D=m ++CONFIG_RTW88_8821C=m ++CONFIG_RTW88_8822BE=m ++# CONFIG_RTW88_8822BS is not set ++CONFIG_RTW88_8822BU=m ++CONFIG_RTW88_8822CE=m ++# CONFIG_RTW88_8822CS is not set ++CONFIG_RTW88_8822CU=m ++CONFIG_RTW88_8723DE=m ++# CONFIG_RTW88_8723DS is not set ++# CONFIG_RTW88_8723CS is not set ++CONFIG_RTW88_8723DU=m ++CONFIG_RTW88_8821CE=m ++# CONFIG_RTW88_8821CS is not set ++CONFIG_RTW88_8821CU=m ++# CONFIG_RTW88_DEBUG is not set ++# CONFIG_RTW88_DEBUGFS is not set ++CONFIG_RTW89=m ++CONFIG_RTW89_CORE=m ++CONFIG_RTW89_PCI=m ++CONFIG_RTW89_8851B=m ++CONFIG_RTW89_8852A=m ++CONFIG_RTW89_8852B_COMMON=m ++CONFIG_RTW89_8852B=m ++CONFIG_RTW89_8852BT=m ++CONFIG_RTW89_8852C=m ++CONFIG_RTW89_8922A=m ++CONFIG_RTW89_8851BE=m ++CONFIG_RTW89_8852AE=m ++CONFIG_RTW89_8852BE=m ++CONFIG_RTW89_8852BTE=m ++CONFIG_RTW89_8852CE=m ++CONFIG_RTW89_8922AE=m ++# CONFIG_RTW89_DEBUGMSG is not set ++# CONFIG_RTW89_DEBUGFS is not set ++CONFIG_WLAN_VENDOR_RSI=y ++# CONFIG_RSI_91X is not set ++CONFIG_WLAN_VENDOR_SILABS=y ++# CONFIG_WFX is not set ++CONFIG_WLAN_VENDOR_ST=y ++# CONFIG_CW1200 is not set ++CONFIG_WLAN_VENDOR_TI=y ++# CONFIG_WL1251 is not set ++# CONFIG_WL12XX is not set ++# CONFIG_WL18XX is not set ++# CONFIG_WLCORE is not set ++CONFIG_WLAN_VENDOR_ZYDAS=y ++CONFIG_ZD1211RW=m ++# CONFIG_ZD1211RW_DEBUG is not set ++CONFIG_WLAN_VENDOR_QUANTENNA=y ++# CONFIG_QTNFMAC_PCIE is not set ++CONFIG_MAC80211_HWSIM=m ++# CONFIG_VIRT_WIFI is not set ++# CONFIG_WAN is not set ++CONFIG_IEEE802154_DRIVERS=m ++# CONFIG_IEEE802154_FAKELB is not set ++CONFIG_IEEE802154_AT86RF230=m ++CONFIG_IEEE802154_MRF24J40=m ++CONFIG_IEEE802154_CC2520=m ++# CONFIG_IEEE802154_ATUSB is not set ++# CONFIG_IEEE802154_ADF7242 is not set ++# CONFIG_IEEE802154_CA8210 is not set ++# CONFIG_IEEE802154_MCR20A is not set ++# CONFIG_IEEE802154_HWSIM is not set ++ ++# ++# Wireless WAN ++# ++# CONFIG_WWAN is not set ++# end of Wireless WAN ++ ++# CONFIG_VMXNET3 is not set ++# CONFIG_NETDEVSIM is not set ++# CONFIG_NET_FAILOVER is not set ++# CONFIG_ISDN is not set ++ ++# ++# Input device support ++# ++CONFIG_INPUT=y ++CONFIG_INPUT_LEDS=y ++CONFIG_INPUT_FF_MEMLESS=m ++# CONFIG_INPUT_SPARSEKMAP is not set ++CONFIG_INPUT_MATRIXKMAP=m ++ ++# ++# Userland interfaces ++# ++CONFIG_INPUT_MOUSEDEV=y ++# CONFIG_INPUT_MOUSEDEV_PSAUX is not set ++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 ++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 ++CONFIG_INPUT_JOYDEV=m ++CONFIG_INPUT_EVDEV=y ++# CONFIG_INPUT_EVBUG is not set ++ ++# ++# Input Device Drivers ++# ++CONFIG_INPUT_KEYBOARD=y ++# CONFIG_KEYBOARD_ADC is not set ++# CONFIG_KEYBOARD_ADP5588 is not set ++# CONFIG_KEYBOARD_ADP5589 is not set ++# CONFIG_KEYBOARD_ATKBD is not set ++# CONFIG_KEYBOARD_QT1050 is not set ++# CONFIG_KEYBOARD_QT1070 is not set ++# CONFIG_KEYBOARD_QT2160 is not set ++# CONFIG_KEYBOARD_DLINK_DIR685 is not set ++# CONFIG_KEYBOARD_LKKBD is not set ++CONFIG_KEYBOARD_GPIO=m ++# CONFIG_KEYBOARD_GPIO_POLLED is not set ++CONFIG_KEYBOARD_TCA6416=m ++CONFIG_KEYBOARD_TCA8418=m ++CONFIG_KEYBOARD_MATRIX=m ++# CONFIG_KEYBOARD_LM8323 is not set ++# CONFIG_KEYBOARD_LM8333 is not set ++# CONFIG_KEYBOARD_MAX7359 is not set ++# CONFIG_KEYBOARD_MPR121 is not set ++# CONFIG_KEYBOARD_NEWTON is not set ++# CONFIG_KEYBOARD_OPENCORES is not set ++# CONFIG_KEYBOARD_PINEPHONE is not set ++# CONFIG_KEYBOARD_SAMSUNG is not set ++# CONFIG_KEYBOARD_STOWAWAY is not set ++# CONFIG_KEYBOARD_SUNKBD is not set ++# CONFIG_KEYBOARD_STMPE is not set ++# CONFIG_KEYBOARD_OMAP4 is not set ++# CONFIG_KEYBOARD_TM2_TOUCHKEY is not set ++# CONFIG_KEYBOARD_XTKBD is not set ++CONFIG_KEYBOARD_CAP11XX=m ++# CONFIG_KEYBOARD_BCM is not set ++# CONFIG_KEYBOARD_CYPRESS_SF is not set ++# CONFIG_INPUT_MOUSE is not set ++CONFIG_INPUT_JOYSTICK=y ++# CONFIG_JOYSTICK_ANALOG is not set ++# CONFIG_JOYSTICK_A3D is not set ++# CONFIG_JOYSTICK_ADC is not set ++# CONFIG_JOYSTICK_ADI is not set ++# CONFIG_JOYSTICK_COBRA is not set ++# CONFIG_JOYSTICK_GF2K is not set ++# CONFIG_JOYSTICK_GRIP is not set ++# CONFIG_JOYSTICK_GRIP_MP is not set ++# CONFIG_JOYSTICK_GUILLEMOT is not set ++# CONFIG_JOYSTICK_INTERACT is not set ++# CONFIG_JOYSTICK_SIDEWINDER is not set ++# CONFIG_JOYSTICK_TMDC is not set ++CONFIG_JOYSTICK_IFORCE=m ++CONFIG_JOYSTICK_IFORCE_USB=m ++# CONFIG_JOYSTICK_IFORCE_232 is not set ++# CONFIG_JOYSTICK_WARRIOR is not set ++# CONFIG_JOYSTICK_MAGELLAN is not set ++# CONFIG_JOYSTICK_SPACEORB is not set ++# CONFIG_JOYSTICK_SPACEBALL is not set ++# CONFIG_JOYSTICK_STINGER is not set ++# CONFIG_JOYSTICK_TWIDJOY is not set ++# CONFIG_JOYSTICK_ZHENHUA is not set ++# CONFIG_JOYSTICK_AS5011 is not set ++# CONFIG_JOYSTICK_JOYDUMP is not set ++CONFIG_JOYSTICK_XPAD=m ++CONFIG_JOYSTICK_XPAD_FF=y ++CONFIG_JOYSTICK_XPAD_LEDS=y ++CONFIG_JOYSTICK_PSXPAD_SPI=m ++CONFIG_JOYSTICK_PSXPAD_SPI_FF=y ++# CONFIG_JOYSTICK_PXRC is not set ++# CONFIG_JOYSTICK_QWIIC is not set ++CONFIG_JOYSTICK_FSIA6B=m ++CONFIG_JOYSTICK_SENSEHAT=m ++# CONFIG_JOYSTICK_SEESAW is not set ++# CONFIG_INPUT_TABLET is not set ++CONFIG_INPUT_TOUCHSCREEN=y ++CONFIG_TOUCHSCREEN_ADS7846=m ++# CONFIG_TOUCHSCREEN_AD7877 is not set ++# CONFIG_TOUCHSCREEN_AD7879 is not set ++# CONFIG_TOUCHSCREEN_ADC is not set ++# CONFIG_TOUCHSCREEN_AR1021_I2C is not set ++CONFIG_TOUCHSCREEN_ATMEL_MXT=m ++# CONFIG_TOUCHSCREEN_ATMEL_MXT_T37 is not set ++# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set ++# CONFIG_TOUCHSCREEN_BU21013 is not set ++# CONFIG_TOUCHSCREEN_BU21029 is not set ++# CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set ++# CONFIG_TOUCHSCREEN_CY8CTMA140 is not set ++# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set ++# CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set ++# CONFIG_TOUCHSCREEN_CYTTSP5 is not set ++# CONFIG_TOUCHSCREEN_DYNAPRO is not set ++# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set ++# CONFIG_TOUCHSCREEN_EETI is not set ++CONFIG_TOUCHSCREEN_EGALAX=m ++# CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set ++CONFIG_TOUCHSCREEN_EXC3000=m ++# CONFIG_TOUCHSCREEN_FUJITSU is not set ++CONFIG_TOUCHSCREEN_GOODIX=m ++# CONFIG_TOUCHSCREEN_GOODIX_BERLIN_I2C is not set ++# CONFIG_TOUCHSCREEN_GOODIX_BERLIN_SPI is not set ++# CONFIG_TOUCHSCREEN_HIDEEP is not set ++# CONFIG_TOUCHSCREEN_HYCON_HY46XX is not set ++# CONFIG_TOUCHSCREEN_HYNITRON_CSTXXX is not set ++CONFIG_TOUCHSCREEN_ILI210X=m ++# CONFIG_TOUCHSCREEN_ILITEK is not set ++# CONFIG_TOUCHSCREEN_S6SY761 is not set ++# CONFIG_TOUCHSCREEN_GUNZE is not set ++# CONFIG_TOUCHSCREEN_EKTF2127 is not set ++# CONFIG_TOUCHSCREEN_ELAN is not set ++# CONFIG_TOUCHSCREEN_ELO is not set ++# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set ++# CONFIG_TOUCHSCREEN_WACOM_I2C is not set ++# CONFIG_TOUCHSCREEN_MAX11801 is not set ++# CONFIG_TOUCHSCREEN_MMS114 is not set ++# CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set ++# CONFIG_TOUCHSCREEN_MSG2638 is not set ++# CONFIG_TOUCHSCREEN_MTOUCH is not set ++# CONFIG_TOUCHSCREEN_NOVATEK_NVT_TS is not set ++# CONFIG_TOUCHSCREEN_IMAGIS is not set ++# CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set ++# CONFIG_TOUCHSCREEN_INEXIO is not set ++# CONFIG_TOUCHSCREEN_PENMOUNT is not set ++CONFIG_TOUCHSCREEN_EDT_FT5X06=m ++CONFIG_TOUCHSCREEN_RASPBERRYPI_FW=m ++# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set ++# CONFIG_TOUCHSCREEN_TOUCHWIN is not set ++# CONFIG_TOUCHSCREEN_PIXCIR is not set ++# CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set ++CONFIG_TOUCHSCREEN_USB_COMPOSITE=m ++CONFIG_TOUCHSCREEN_USB_EGALAX=y ++CONFIG_TOUCHSCREEN_USB_PANJIT=y ++CONFIG_TOUCHSCREEN_USB_3M=y ++CONFIG_TOUCHSCREEN_USB_ITM=y ++CONFIG_TOUCHSCREEN_USB_ETURBO=y ++CONFIG_TOUCHSCREEN_USB_GUNZE=y ++CONFIG_TOUCHSCREEN_USB_DMC_TSC10=y ++CONFIG_TOUCHSCREEN_USB_IRTOUCH=y ++CONFIG_TOUCHSCREEN_USB_IDEALTEK=y ++CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH=y ++CONFIG_TOUCHSCREEN_USB_GOTOP=y ++CONFIG_TOUCHSCREEN_USB_JASTEC=y ++CONFIG_TOUCHSCREEN_USB_ELO=y ++CONFIG_TOUCHSCREEN_USB_E2I=y ++CONFIG_TOUCHSCREEN_USB_ZYTRONIC=y ++CONFIG_TOUCHSCREEN_USB_ETT_TC45USB=y ++CONFIG_TOUCHSCREEN_USB_NEXIO=y ++CONFIG_TOUCHSCREEN_USB_EASYTOUCH=y ++# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set ++# CONFIG_TOUCHSCREEN_TSC_SERIO is not set ++# CONFIG_TOUCHSCREEN_TSC2004 is not set ++# CONFIG_TOUCHSCREEN_TSC2005 is not set ++CONFIG_TOUCHSCREEN_TSC2007=m ++CONFIG_TOUCHSCREEN_TSC2007_IIO=y ++# CONFIG_TOUCHSCREEN_RM_TS is not set ++# CONFIG_TOUCHSCREEN_SILEAD is not set ++# CONFIG_TOUCHSCREEN_SIS_I2C is not set ++# CONFIG_TOUCHSCREEN_ST1232 is not set ++# CONFIG_TOUCHSCREEN_STMFTS is not set ++CONFIG_TOUCHSCREEN_STMPE=m ++# CONFIG_TOUCHSCREEN_SUR40 is not set ++# CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set ++# CONFIG_TOUCHSCREEN_SX8654 is not set ++# CONFIG_TOUCHSCREEN_TPS6507X is not set ++# CONFIG_TOUCHSCREEN_ZET6223 is not set ++# CONFIG_TOUCHSCREEN_ZFORCE is not set ++# CONFIG_TOUCHSCREEN_COLIBRI_VF50 is not set ++# CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set ++CONFIG_TOUCHSCREEN_IQS5XX=m ++# CONFIG_TOUCHSCREEN_IQS7211 is not set ++# CONFIG_TOUCHSCREEN_ZINITIX is not set ++# CONFIG_TOUCHSCREEN_HIMAX_HX83112B is not set ++CONFIG_INPUT_MISC=y ++CONFIG_INPUT_AD714X=m ++CONFIG_INPUT_AD714X_I2C=m ++CONFIG_INPUT_AD714X_SPI=m ++# CONFIG_INPUT_ARIZONA_HAPTICS is not set ++# CONFIG_INPUT_ATMEL_CAPTOUCH is not set ++# CONFIG_INPUT_BMA150 is not set ++# CONFIG_INPUT_E3X0_BUTTON is not set ++# CONFIG_INPUT_MMA8450 is not set ++# CONFIG_INPUT_GPIO_BEEPER is not set ++# CONFIG_INPUT_GPIO_DECODER is not set ++# CONFIG_INPUT_GPIO_VIBRA is not set ++CONFIG_INPUT_ATI_REMOTE2=m ++CONFIG_INPUT_KEYSPAN_REMOTE=m ++# CONFIG_INPUT_KXTJ9 is not set ++CONFIG_INPUT_POWERMATE=m ++CONFIG_INPUT_YEALINK=m ++CONFIG_INPUT_CM109=m ++# CONFIG_INPUT_REGULATOR_HAPTIC is not set ++CONFIG_INPUT_UINPUT=m ++# CONFIG_INPUT_PCF8574 is not set ++# CONFIG_INPUT_PWM_BEEPER is not set ++# CONFIG_INPUT_PWM_VIBRA is not set ++CONFIG_INPUT_GPIO_ROTARY_ENCODER=m ++# CONFIG_INPUT_DA7280_HAPTICS is not set ++CONFIG_INPUT_ADXL34X=m ++CONFIG_INPUT_ADXL34X_I2C=m ++CONFIG_INPUT_ADXL34X_SPI=m ++# CONFIG_INPUT_IMS_PCU is not set ++# CONFIG_INPUT_IQS269A is not set ++# CONFIG_INPUT_IQS626A is not set ++# CONFIG_INPUT_IQS7222 is not set ++CONFIG_INPUT_CMA3000=m ++# CONFIG_INPUT_CMA3000_I2C is not set ++# CONFIG_INPUT_DRV260X_HAPTICS is not set ++# CONFIG_INPUT_DRV2665_HAPTICS is not set ++# CONFIG_INPUT_DRV2667_HAPTICS is not set ++# CONFIG_RMI4_CORE is not set ++ ++# ++# Hardware I/O ports ++# ++CONFIG_SERIO=m ++CONFIG_SERIO_SERPORT=m ++# CONFIG_SERIO_AMBAKMI is not set ++# CONFIG_SERIO_PCIPS2 is not set ++# CONFIG_SERIO_LIBPS2 is not set ++CONFIG_SERIO_RAW=m ++# CONFIG_SERIO_ALTERA_PS2 is not set ++# CONFIG_SERIO_PS2MULT is not set ++# CONFIG_SERIO_ARC_PS2 is not set ++# CONFIG_SERIO_APBPS2 is not set ++# CONFIG_SERIO_GPIO_PS2 is not set ++# CONFIG_USERIO is not set ++CONFIG_GAMEPORT=m ++# CONFIG_GAMEPORT_EMU10K1 is not set ++# CONFIG_GAMEPORT_FM801 is not set ++# end of Hardware I/O ports ++# end of Input device support ++ ++# ++# Character devices ++# ++CONFIG_BRCM_CHAR_DRIVERS=y ++CONFIG_BCM2708_VCMEM=y ++CONFIG_BCM_VCIO=y ++CONFIG_BCM2835_SMI_DEV=m ++CONFIG_TTY=y ++CONFIG_VT=y ++CONFIG_CONSOLE_TRANSLATIONS=y ++CONFIG_VT_CONSOLE=y ++CONFIG_VT_HW_CONSOLE_BINDING=y ++CONFIG_UNIX98_PTYS=y ++# CONFIG_LEGACY_PTYS is not set ++CONFIG_LEGACY_TIOCSTI=y ++CONFIG_LDISC_AUTOLOAD=y ++ ++# ++# Serial drivers ++# ++CONFIG_SERIAL_EARLYCON=y ++CONFIG_SERIAL_8250=y ++# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set ++CONFIG_SERIAL_8250_16550A_VARIANTS=y ++# CONFIG_SERIAL_8250_FINTEK is not set ++CONFIG_SERIAL_8250_CONSOLE=y ++# CONFIG_SERIAL_8250_DMA is not set ++CONFIG_SERIAL_8250_PCILIB=y ++CONFIG_SERIAL_8250_PCI=y ++CONFIG_SERIAL_8250_EXAR=y ++CONFIG_SERIAL_8250_NR_UARTS=5 ++CONFIG_SERIAL_8250_RUNTIME_UARTS=0 ++CONFIG_SERIAL_8250_EXTENDED=y ++# CONFIG_SERIAL_8250_MANY_PORTS is not set ++# CONFIG_SERIAL_8250_PCI1XXXX is not set ++CONFIG_SERIAL_8250_SHARE_IRQ=y ++# CONFIG_SERIAL_8250_DETECT_IRQ is not set ++# CONFIG_SERIAL_8250_RSA is not set ++CONFIG_SERIAL_8250_BCM2835AUX=y ++CONFIG_SERIAL_8250_FSL=y ++# CONFIG_SERIAL_8250_DW is not set ++# CONFIG_SERIAL_8250_RT288X is not set ++CONFIG_SERIAL_8250_PERICOM=y ++CONFIG_SERIAL_8250_BCM7271=y ++CONFIG_SERIAL_OF_PLATFORM=y ++ ++# ++# Non-8250 serial port support ++# ++# CONFIG_SERIAL_AMBA_PL010 is not set ++CONFIG_SERIAL_AMBA_PL011=y ++CONFIG_SERIAL_AMBA_PL011_CONSOLE=y ++# CONFIG_SERIAL_EARLYCON_SEMIHOST is not set ++# CONFIG_SERIAL_KGDB_NMI is not set ++# CONFIG_SERIAL_MAX3100 is not set ++# CONFIG_SERIAL_MAX310X is not set ++# CONFIG_SERIAL_UARTLITE is not set ++CONFIG_SERIAL_CORE=y ++CONFIG_SERIAL_CORE_CONSOLE=y ++CONFIG_CONSOLE_POLL=y ++# CONFIG_SERIAL_JSM is not set ++# CONFIG_SERIAL_SIFIVE is not set ++# CONFIG_SERIAL_SCCNXP is not set ++CONFIG_SERIAL_SC16IS7XX=m ++CONFIG_SERIAL_SC16IS7XX_I2C=m ++CONFIG_SERIAL_SC16IS7XX_SPI=m ++# CONFIG_SERIAL_ALTERA_JTAGUART is not set ++# CONFIG_SERIAL_ALTERA_UART is not set ++# CONFIG_SERIAL_XILINX_PS_UART is not set ++# CONFIG_SERIAL_ARC is not set ++# CONFIG_SERIAL_RP2 is not set ++# CONFIG_SERIAL_FSL_LPUART is not set ++# CONFIG_SERIAL_FSL_LINFLEXUART is not set ++# CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set ++# CONFIG_SERIAL_SPRD is not set ++CONFIG_SERIAL_RPI_FW=m ++# end of Serial drivers ++ ++CONFIG_SERIAL_MCTRL_GPIO=y ++# CONFIG_SERIAL_NONSTANDARD is not set ++# CONFIG_N_GSM is not set ++# CONFIG_NOZOMI is not set ++# CONFIG_NULL_TTY is not set ++# CONFIG_HVC_DCC is not set ++CONFIG_SERIAL_DEV_BUS=y ++CONFIG_SERIAL_DEV_CTRL_TTYPORT=y ++CONFIG_TTY_PRINTK=y ++CONFIG_TTY_PRINTK_LEVEL=6 ++# CONFIG_VIRTIO_CONSOLE is not set ++# CONFIG_IPMI_HANDLER is not set ++CONFIG_HW_RANDOM=y ++# CONFIG_HW_RANDOM_TIMERIOMEM is not set ++# CONFIG_HW_RANDOM_BA431 is not set ++CONFIG_HW_RANDOM_BCM2835=y ++CONFIG_HW_RANDOM_IPROC_RNG200=y ++# CONFIG_HW_RANDOM_CCTRNG is not set ++# CONFIG_HW_RANDOM_XIPHERA is not set ++CONFIG_HW_RANDOM_ARM_SMCCC_TRNG=y ++# CONFIG_HW_RANDOM_CN10K is not set ++# CONFIG_APPLICOM is not set ++CONFIG_DEVMEM=y ++CONFIG_DEVPORT=y ++CONFIG_TCG_TPM=m ++# CONFIG_TCG_TPM2_HMAC is not set ++CONFIG_HW_RANDOM_TPM=y ++CONFIG_TCG_TIS_CORE=m ++# CONFIG_TCG_TIS is not set ++CONFIG_TCG_TIS_SPI=m ++# CONFIG_TCG_TIS_SPI_CR50 is not set ++CONFIG_TCG_TIS_I2C=m ++# CONFIG_TCG_TIS_I2C_CR50 is not set ++# CONFIG_TCG_TIS_I2C_ATMEL is not set ++# CONFIG_TCG_TIS_I2C_INFINEON is not set ++# CONFIG_TCG_TIS_I2C_NUVOTON is not set ++# CONFIG_TCG_ATMEL is not set ++# CONFIG_TCG_VTPM_PROXY is not set ++# CONFIG_TCG_TIS_ST33ZP24_I2C is not set ++# CONFIG_TCG_TIS_ST33ZP24_SPI is not set ++CONFIG_XILLYBUS_CLASS=m ++CONFIG_XILLYBUS=m ++CONFIG_XILLYBUS_PCIE=m ++# CONFIG_XILLYBUS_OF is not set ++CONFIG_XILLYUSB=m ++CONFIG_RASPBERRYPI_GPIOMEM=m ++# end of Character devices ++ ++# ++# I2C support ++# ++CONFIG_I2C=y ++CONFIG_I2C_BOARDINFO=y ++CONFIG_I2C_CHARDEV=m ++CONFIG_I2C_MUX=m ++ ++# ++# Multiplexer I2C Chip support ++# ++# CONFIG_I2C_ARB_GPIO_CHALLENGE is not set ++# CONFIG_I2C_MUX_GPIO is not set ++CONFIG_I2C_MUX_GPMUX=m ++# CONFIG_I2C_MUX_LTC4306 is not set ++# CONFIG_I2C_MUX_PCA9541 is not set ++CONFIG_I2C_MUX_PCA954x=m ++CONFIG_I2C_MUX_PINCTRL=m ++# CONFIG_I2C_MUX_REG is not set ++# CONFIG_I2C_DEMUX_PINCTRL is not set ++# CONFIG_I2C_MUX_MLXCPLD is not set ++# end of Multiplexer I2C Chip support ++ ++CONFIG_I2C_HELPER_AUTO=y ++CONFIG_I2C_ALGOBIT=m ++ ++# ++# I2C Hardware Bus support ++# ++ ++# ++# PC SMBus host controller drivers ++# ++CONFIG_I2C_BCM2708=m ++CONFIG_I2C_BCM2708_BAUDRATE=100000 ++# CONFIG_I2C_ALI1535 is not set ++# CONFIG_I2C_ALI1563 is not set ++# CONFIG_I2C_ALI15X3 is not set ++# CONFIG_I2C_AMD756 is not set ++# CONFIG_I2C_AMD8111 is not set ++# CONFIG_I2C_I801 is not set ++# CONFIG_I2C_ISCH is not set ++# CONFIG_I2C_PIIX4 is not set ++# CONFIG_I2C_NFORCE2 is not set ++# CONFIG_I2C_NVIDIA_GPU is not set ++# CONFIG_I2C_SIS5595 is not set ++# CONFIG_I2C_SIS630 is not set ++# CONFIG_I2C_SIS96X is not set ++# CONFIG_I2C_VIA is not set ++# CONFIG_I2C_VIAPRO is not set ++ ++# ++# I2C system bus drivers (mostly embedded / system-on-chip) ++# ++CONFIG_I2C_BCM2835=m ++CONFIG_I2C_BRCMSTB=m ++# CONFIG_I2C_CADENCE is not set ++# CONFIG_I2C_CBUS_GPIO is not set ++CONFIG_I2C_DESIGNWARE_CORE=m ++# CONFIG_I2C_DESIGNWARE_SLAVE is not set ++CONFIG_I2C_DESIGNWARE_PLATFORM=m ++# CONFIG_I2C_DESIGNWARE_PCI is not set ++# CONFIG_I2C_EMEV2 is not set ++CONFIG_I2C_GPIO=m ++# CONFIG_I2C_GPIO_FAULT_INJECTOR is not set ++# CONFIG_I2C_HISI is not set ++# CONFIG_I2C_NOMADIK is not set ++# CONFIG_I2C_OCORES is not set ++# CONFIG_I2C_PCA_PLATFORM is not set ++# CONFIG_I2C_RK3X is not set ++# CONFIG_I2C_SIMTEC is not set ++# CONFIG_I2C_THUNDERX is not set ++# CONFIG_I2C_XILINX is not set ++ ++# ++# External I2C/SMBus adapter drivers ++# ++# CONFIG_I2C_DIOLAN_U2C is not set ++# CONFIG_I2C_CP2615 is not set ++# CONFIG_I2C_PCI1XXXX is not set ++CONFIG_I2C_ROBOTFUZZ_OSIF=m ++# CONFIG_I2C_TAOS_EVM is not set ++CONFIG_I2C_TINY_USB=m ++ ++# ++# Other I2C/SMBus bus drivers ++# ++# CONFIG_I2C_VIRTIO is not set ++# end of I2C Hardware Bus support ++ ++# CONFIG_I2C_STUB is not set ++# CONFIG_I2C_SLAVE is not set ++# CONFIG_I2C_DEBUG_CORE is not set ++# CONFIG_I2C_DEBUG_ALGO is not set ++# CONFIG_I2C_DEBUG_BUS is not set ++# end of I2C support ++ ++# CONFIG_I3C is not set ++CONFIG_SPI=y ++# CONFIG_SPI_DEBUG is not set ++CONFIG_SPI_MASTER=y ++CONFIG_SPI_MEM=y ++ ++# ++# SPI Master Controller Drivers ++# ++# CONFIG_SPI_ALTERA is not set ++# CONFIG_SPI_AXI_SPI_ENGINE is not set ++CONFIG_SPI_BCM2835=m ++CONFIG_SPI_BCM2835AUX=m ++# CONFIG_SPI_BCM_QSPI is not set ++CONFIG_SPI_BITBANG=m ++# CONFIG_SPI_CADENCE is not set ++# CONFIG_SPI_CADENCE_QUADSPI is not set ++# CONFIG_SPI_CADENCE_XSPI is not set ++# CONFIG_SPI_CH341 is not set ++CONFIG_SPI_DESIGNWARE=m ++CONFIG_SPI_DW_DMA=y ++# CONFIG_SPI_DW_PCI is not set ++CONFIG_SPI_DW_MMIO=m ++CONFIG_SPI_GPIO=m ++# CONFIG_SPI_FSL_SPI is not set ++# CONFIG_SPI_MICROCHIP_CORE is not set ++# CONFIG_SPI_MICROCHIP_CORE_QSPI is not set ++# CONFIG_SPI_OC_TINY is not set ++# CONFIG_SPI_PCI1XXXX is not set ++# CONFIG_SPI_PL022 is not set ++CONFIG_SPI_RP2040_GPIO_BRIDGE=m ++# CONFIG_SPI_SC18IS602 is not set ++# CONFIG_SPI_SIFIVE is not set ++# CONFIG_SPI_SN_F_OSPI is not set ++# CONFIG_SPI_MXIC is not set ++# CONFIG_SPI_THUNDERX is not set ++# CONFIG_SPI_XCOMM is not set ++# CONFIG_SPI_XILINX is not set ++# CONFIG_SPI_ZYNQMP_GQSPI is not set ++# CONFIG_SPI_AMD is not set ++ ++# ++# SPI Multiplexer support ++# ++# CONFIG_SPI_MUX is not set ++ ++# ++# SPI Protocol Masters ++# ++CONFIG_SPI_SPIDEV=m ++# CONFIG_SPI_LOOPBACK_TEST is not set ++# CONFIG_SPI_TLE62X0 is not set ++CONFIG_SPI_SLAVE=y ++# CONFIG_SPI_SLAVE_TIME is not set ++# CONFIG_SPI_SLAVE_SYSTEM_CONTROL is not set ++CONFIG_SPI_DYNAMIC=y ++# CONFIG_SPMI is not set ++# CONFIG_HSI is not set ++CONFIG_PPS=y ++# CONFIG_PPS_DEBUG is not set ++ ++# ++# PPS clients support ++# ++# CONFIG_PPS_CLIENT_KTIMER is not set ++CONFIG_PPS_CLIENT_LDISC=m ++CONFIG_PPS_CLIENT_GPIO=m ++ ++# ++# PPS generators support ++# ++ ++# ++# PTP clock support ++# ++CONFIG_PTP_1588_CLOCK=y ++CONFIG_PTP_1588_CLOCK_OPTIONAL=y ++# CONFIG_DP83640_PHY is not set ++# CONFIG_PTP_1588_CLOCK_INES is not set ++CONFIG_PTP_1588_CLOCK_KVM=y ++# CONFIG_PTP_1588_CLOCK_IDT82P33 is not set ++# CONFIG_PTP_1588_CLOCK_IDTCM is not set ++# CONFIG_PTP_1588_CLOCK_FC3W is not set ++# CONFIG_PTP_1588_CLOCK_MOCK is not set ++# CONFIG_PTP_1588_CLOCK_OCP is not set ++# end of PTP clock support ++ ++CONFIG_PINCTRL=y ++CONFIG_PINMUX=y ++CONFIG_PINCONF=y ++CONFIG_GENERIC_PINCONF=y ++# CONFIG_DEBUG_PINCTRL is not set ++# CONFIG_PINCTRL_AW9523 is not set ++# CONFIG_PINCTRL_CY8C95X0 is not set ++CONFIG_PINCTRL_MCP23S08_I2C=m ++CONFIG_PINCTRL_MCP23S08_SPI=m ++CONFIG_PINCTRL_MCP23S08=m ++# CONFIG_PINCTRL_MICROCHIP_SGPIO is not set ++# CONFIG_PINCTRL_OCELOT is not set ++# CONFIG_PINCTRL_SINGLE is not set ++# CONFIG_PINCTRL_STMFX is not set ++# CONFIG_PINCTRL_SX150X is not set ++CONFIG_PINCTRL_RP1=y ++CONFIG_PINCTRL_BCM2712=y ++CONFIG_PINCTRL_BCM2835=y ++ ++# ++# Renesas pinctrl drivers ++# ++# end of Renesas pinctrl drivers ++ ++CONFIG_GPIOLIB=y ++CONFIG_GPIOLIB_FASTPATH_LIMIT=512 ++CONFIG_OF_GPIO=y ++CONFIG_GPIOLIB_IRQCHIP=y ++# CONFIG_DEBUG_GPIO is not set ++CONFIG_GPIO_SYSFS=y ++CONFIG_GPIO_CDEV=y ++CONFIG_GPIO_CDEV_V1=y ++CONFIG_GPIO_GENERIC=y ++CONFIG_GPIO_REGMAP=m ++CONFIG_GPIO_MAX730X=m ++ ++# ++# Memory mapped GPIO drivers ++# ++# CONFIG_GPIO_74XX_MMIO is not set ++# CONFIG_GPIO_ALTERA is not set ++CONFIG_GPIO_RASPBERRYPI_EXP=y ++CONFIG_GPIO_BCM_VIRT=y ++CONFIG_GPIO_BRCMSTB=y ++# CONFIG_GPIO_CADENCE is not set ++# CONFIG_GPIO_DWAPB is not set ++# CONFIG_GPIO_EXAR is not set ++# CONFIG_GPIO_FTGPIO010 is not set ++# CONFIG_GPIO_GENERIC_PLATFORM is not set ++# CONFIG_GPIO_GRGPIO is not set ++# CONFIG_GPIO_HISI is not set ++# CONFIG_GPIO_HLWD is not set ++# CONFIG_GPIO_LOGICVC is not set ++# CONFIG_GPIO_MB86S7X is not set ++# CONFIG_GPIO_PL061 is not set ++# CONFIG_GPIO_PWM is not set ++# CONFIG_GPIO_SIFIVE is not set ++# CONFIG_GPIO_SYSCON is not set ++# CONFIG_GPIO_XGENE is not set ++# CONFIG_GPIO_XILINX is not set ++# CONFIG_GPIO_AMD_FCH is not set ++# end of Memory mapped GPIO drivers ++ ++# ++# I2C GPIO expanders ++# ++# CONFIG_GPIO_ADNP is not set ++CONFIG_GPIO_FXL6408=m ++# CONFIG_GPIO_DS4520 is not set ++# CONFIG_GPIO_GW_PLD is not set ++CONFIG_GPIO_MAX7300=m ++# CONFIG_GPIO_MAX732X is not set ++CONFIG_GPIO_PCA953X=m ++CONFIG_GPIO_PCA953X_IRQ=y ++# CONFIG_GPIO_PCA9570 is not set ++CONFIG_GPIO_PCF857X=m ++# CONFIG_GPIO_TPIC2810 is not set ++# end of I2C GPIO expanders ++ ++# ++# MFD GPIO expanders ++# ++CONFIG_GPIO_ARIZONA=m ++CONFIG_GPIO_FSM=m ++CONFIG_GPIO_STMPE=y ++# end of MFD GPIO expanders ++ ++# ++# PCI GPIO expanders ++# ++# CONFIG_GPIO_BT8XX is not set ++# CONFIG_GPIO_PCI_IDIO_16 is not set ++# CONFIG_GPIO_PCIE_IDIO_24 is not set ++# CONFIG_GPIO_RDC321X is not set ++# end of PCI GPIO expanders ++ ++# ++# SPI GPIO expanders ++# ++# CONFIG_GPIO_74X164 is not set ++# CONFIG_GPIO_MAX3191X is not set ++CONFIG_GPIO_MAX7301=m ++# CONFIG_GPIO_MC33880 is not set ++# CONFIG_GPIO_PISOSR is not set ++# CONFIG_GPIO_XRA1403 is not set ++# end of SPI GPIO expanders ++ ++# ++# USB GPIO expanders ++# ++# end of USB GPIO expanders ++ ++# ++# Virtual GPIO drivers ++# ++# CONFIG_GPIO_AGGREGATOR is not set ++# CONFIG_GPIO_LATCH is not set ++CONFIG_GPIO_MOCKUP=m ++# CONFIG_GPIO_SIM is not set ++# end of Virtual GPIO drivers ++ ++# ++# GPIO Debugging utilities ++# ++# CONFIG_GPIO_SLOPPY_LOGIC_ANALYZER is not set ++# CONFIG_GPIO_VIRTUSER is not set ++# end of GPIO Debugging utilities ++ ++CONFIG_W1=m ++CONFIG_W1_CON=y ++ ++# ++# 1-wire Bus Masters ++# ++# CONFIG_W1_MASTER_AMD_AXI is not set ++# CONFIG_W1_MASTER_MATROX is not set ++CONFIG_W1_MASTER_DS2490=m ++CONFIG_W1_MASTER_DS2482=m ++CONFIG_W1_MASTER_GPIO=m ++# CONFIG_W1_MASTER_SGI is not set ++# CONFIG_W1_MASTER_UART is not set ++# end of 1-wire Bus Masters ++ ++# ++# 1-wire Slaves ++# ++CONFIG_W1_SLAVE_THERM=m ++CONFIG_W1_SLAVE_SMEM=m ++# CONFIG_W1_SLAVE_DS2405 is not set ++CONFIG_W1_SLAVE_DS2408=m ++CONFIG_W1_SLAVE_DS2408_READBACK=y ++CONFIG_W1_SLAVE_DS2413=m ++CONFIG_W1_SLAVE_DS2406=m ++CONFIG_W1_SLAVE_DS2423=m ++# CONFIG_W1_SLAVE_DS2805 is not set ++# CONFIG_W1_SLAVE_DS2430 is not set ++CONFIG_W1_SLAVE_DS2431=m ++CONFIG_W1_SLAVE_DS2433=m ++# CONFIG_W1_SLAVE_DS2433_CRC is not set ++CONFIG_W1_SLAVE_DS2438=m ++# CONFIG_W1_SLAVE_DS250X is not set ++CONFIG_W1_SLAVE_DS2780=m ++CONFIG_W1_SLAVE_DS2781=m ++CONFIG_W1_SLAVE_DS28E04=m ++CONFIG_W1_SLAVE_DS28E17=m ++# end of 1-wire Slaves ++ ++CONFIG_POWER_RESET=y ++# CONFIG_POWER_RESET_BRCMSTB is not set ++CONFIG_POWER_RESET_GPIO=y ++# CONFIG_POWER_RESET_GPIO_RESTART is not set ++# CONFIG_POWER_RESET_LTC2952 is not set ++# CONFIG_POWER_RESET_REGULATOR is not set ++# CONFIG_POWER_RESET_RESTART is not set ++# CONFIG_POWER_RESET_XGENE is not set ++# CONFIG_POWER_RESET_SYSCON is not set ++# CONFIG_POWER_RESET_SYSCON_POWEROFF is not set ++# CONFIG_SYSCON_REBOOT_MODE is not set ++# CONFIG_NVMEM_REBOOT_MODE is not set ++# CONFIG_POWER_SEQUENCING is not set ++CONFIG_POWER_SUPPLY=y ++# CONFIG_POWER_SUPPLY_DEBUG is not set ++CONFIG_POWER_SUPPLY_HWMON=y ++CONFIG_RPI_POE_POWER=m ++# CONFIG_GENERIC_ADC_BATTERY is not set ++# CONFIG_IP5XXX_POWER is not set ++# CONFIG_TEST_POWER is not set ++# CONFIG_CHARGER_ADP5061 is not set ++# CONFIG_BATTERY_CW2015 is not set ++CONFIG_BATTERY_DS2760=m ++# CONFIG_BATTERY_DS2780 is not set ++# CONFIG_BATTERY_DS2781 is not set ++# CONFIG_BATTERY_DS2782 is not set ++# CONFIG_BATTERY_SAMSUNG_SDI is not set ++# CONFIG_BATTERY_SBS is not set ++# CONFIG_CHARGER_SBS is not set ++# CONFIG_MANAGER_SBS is not set ++# CONFIG_BATTERY_BQ27XXX is not set ++CONFIG_BATTERY_MAX17040=m ++# CONFIG_BATTERY_MAX17042 is not set ++# CONFIG_BATTERY_MAX1720X is not set ++# CONFIG_BATTERY_MAX1721X is not set ++# CONFIG_CHARGER_ISP1704 is not set ++# CONFIG_CHARGER_MAX8903 is not set ++# CONFIG_CHARGER_LP8727 is not set ++CONFIG_CHARGER_GPIO=m ++# CONFIG_CHARGER_MANAGER is not set ++# CONFIG_CHARGER_LT3651 is not set ++# CONFIG_CHARGER_LTC4162L is not set ++# CONFIG_CHARGER_DETECTOR_MAX14656 is not set ++# CONFIG_CHARGER_MAX77976 is not set ++# CONFIG_CHARGER_BQ2415X is not set ++# CONFIG_CHARGER_BQ24190 is not set ++# CONFIG_CHARGER_BQ24257 is not set ++# CONFIG_CHARGER_BQ24735 is not set ++# CONFIG_CHARGER_BQ2515X is not set ++# CONFIG_CHARGER_BQ25890 is not set ++# CONFIG_CHARGER_BQ25980 is not set ++# CONFIG_CHARGER_BQ256XX is not set ++# CONFIG_CHARGER_SMB347 is not set ++CONFIG_BATTERY_GAUGE_LTC2941=m ++# CONFIG_BATTERY_GOLDFISH is not set ++# CONFIG_BATTERY_RT5033 is not set ++# CONFIG_CHARGER_RT9455 is not set ++# CONFIG_CHARGER_RT9467 is not set ++# CONFIG_CHARGER_RT9471 is not set ++# CONFIG_CHARGER_UCS1002 is not set ++# CONFIG_CHARGER_BD99954 is not set ++# CONFIG_BATTERY_UG3105 is not set ++# CONFIG_FUEL_GAUGE_MM8013 is not set ++CONFIG_HWMON=y ++# CONFIG_HWMON_DEBUG_CHIP is not set ++ ++# ++# Native drivers ++# ++# CONFIG_SENSORS_AD7314 is not set ++# CONFIG_SENSORS_AD7414 is not set ++# CONFIG_SENSORS_AD7418 is not set ++# CONFIG_SENSORS_ADM1025 is not set ++# CONFIG_SENSORS_ADM1026 is not set ++# CONFIG_SENSORS_ADM1029 is not set ++# CONFIG_SENSORS_ADM1031 is not set ++# CONFIG_SENSORS_ADM1177 is not set ++# CONFIG_SENSORS_ADM9240 is not set ++CONFIG_SENSORS_ADT7X10=m ++# CONFIG_SENSORS_ADT7310 is not set ++CONFIG_SENSORS_ADT7410=m ++# CONFIG_SENSORS_ADT7411 is not set ++# CONFIG_SENSORS_ADT7462 is not set ++# CONFIG_SENSORS_ADT7470 is not set ++# CONFIG_SENSORS_ADT7475 is not set ++CONFIG_SENSORS_AHT10=m ++# CONFIG_SENSORS_AQUACOMPUTER_D5NEXT is not set ++# CONFIG_SENSORS_AS370 is not set ++# CONFIG_SENSORS_ASC7621 is not set ++# CONFIG_SENSORS_ASUS_ROG_RYUJIN is not set ++# CONFIG_SENSORS_AXI_FAN_CONTROL is not set ++# CONFIG_SENSORS_ATXP1 is not set ++CONFIG_SENSORS_CHIPCAP2=m ++# CONFIG_SENSORS_CORSAIR_CPRO is not set ++# CONFIG_SENSORS_CORSAIR_PSU is not set ++CONFIG_SENSORS_DRIVETEMP=m ++# CONFIG_SENSORS_DS620 is not set ++CONFIG_SENSORS_DS1621=m ++# CONFIG_SENSORS_I5K_AMB is not set ++# CONFIG_SENSORS_F71805F is not set ++# CONFIG_SENSORS_F71882FG is not set ++# CONFIG_SENSORS_F75375S is not set ++# CONFIG_SENSORS_FTSTEUTATES is not set ++# CONFIG_SENSORS_GIGABYTE_WATERFORCE is not set ++# CONFIG_SENSORS_GL518SM is not set ++# CONFIG_SENSORS_GL520SM is not set ++# CONFIG_SENSORS_G760A is not set ++# CONFIG_SENSORS_G762 is not set ++CONFIG_SENSORS_GPIO_FAN=m ++# CONFIG_SENSORS_HIH6130 is not set ++# CONFIG_SENSORS_HS3001 is not set ++CONFIG_SENSORS_IIO_HWMON=m ++# CONFIG_SENSORS_IT87 is not set ++CONFIG_SENSORS_JC42=m ++CONFIG_SENSORS_POWERZ=m ++# CONFIG_SENSORS_POWR1220 is not set ++# CONFIG_SENSORS_LINEAGE is not set ++# CONFIG_SENSORS_LTC2945 is not set ++# CONFIG_SENSORS_LTC2947_I2C is not set ++# CONFIG_SENSORS_LTC2947_SPI is not set ++# CONFIG_SENSORS_LTC2990 is not set ++# CONFIG_SENSORS_LTC2991 is not set ++# CONFIG_SENSORS_LTC2992 is not set ++# CONFIG_SENSORS_LTC4151 is not set ++# CONFIG_SENSORS_LTC4215 is not set ++# CONFIG_SENSORS_LTC4222 is not set ++# CONFIG_SENSORS_LTC4245 is not set ++# CONFIG_SENSORS_LTC4260 is not set ++# CONFIG_SENSORS_LTC4261 is not set ++# CONFIG_SENSORS_LTC4282 is not set ++# CONFIG_SENSORS_MAX1111 is not set ++# CONFIG_SENSORS_MAX127 is not set ++# CONFIG_SENSORS_MAX16065 is not set ++# CONFIG_SENSORS_MAX1619 is not set ++# CONFIG_SENSORS_MAX1668 is not set ++# CONFIG_SENSORS_MAX197 is not set ++# CONFIG_SENSORS_MAX31722 is not set ++# CONFIG_SENSORS_MAX31730 is not set ++# CONFIG_SENSORS_MAX31760 is not set ++# CONFIG_MAX31827 is not set ++# CONFIG_SENSORS_MAX6620 is not set ++# CONFIG_SENSORS_MAX6621 is not set ++# CONFIG_SENSORS_MAX6639 is not set ++# CONFIG_SENSORS_MAX6650 is not set ++# CONFIG_SENSORS_MAX6697 is not set ++# CONFIG_SENSORS_MAX31790 is not set ++# CONFIG_SENSORS_MC34VR500 is not set ++# CONFIG_SENSORS_MCP3021 is not set ++# CONFIG_SENSORS_TC654 is not set ++# CONFIG_SENSORS_TPS23861 is not set ++# CONFIG_SENSORS_MR75203 is not set ++# CONFIG_SENSORS_ADCXX is not set ++# CONFIG_SENSORS_LM63 is not set ++# CONFIG_SENSORS_LM70 is not set ++# CONFIG_SENSORS_LM73 is not set ++CONFIG_SENSORS_LM75=m ++# CONFIG_SENSORS_LM77 is not set ++# CONFIG_SENSORS_LM78 is not set ++# CONFIG_SENSORS_LM80 is not set ++# CONFIG_SENSORS_LM83 is not set ++# CONFIG_SENSORS_LM85 is not set ++# CONFIG_SENSORS_LM87 is not set ++# CONFIG_SENSORS_LM90 is not set ++# CONFIG_SENSORS_LM92 is not set ++# CONFIG_SENSORS_LM93 is not set ++# CONFIG_SENSORS_LM95234 is not set ++# CONFIG_SENSORS_LM95241 is not set ++# CONFIG_SENSORS_LM95245 is not set ++# CONFIG_SENSORS_PC87360 is not set ++# CONFIG_SENSORS_PC87427 is not set ++# CONFIG_SENSORS_NTC_THERMISTOR is not set ++# CONFIG_SENSORS_NCT6683 is not set ++# CONFIG_SENSORS_NCT6775 is not set ++# CONFIG_SENSORS_NCT6775_I2C is not set ++# CONFIG_SENSORS_NCT7802 is not set ++# CONFIG_SENSORS_NCT7904 is not set ++# CONFIG_SENSORS_NPCM7XX is not set ++# CONFIG_SENSORS_NZXT_KRAKEN2 is not set ++# CONFIG_SENSORS_NZXT_KRAKEN3 is not set ++# CONFIG_SENSORS_NZXT_SMART2 is not set ++# CONFIG_SENSORS_OCC_P8_I2C is not set ++# CONFIG_SENSORS_PCF8591 is not set ++# CONFIG_PMBUS is not set ++# CONFIG_SENSORS_PT5161L is not set ++CONFIG_SENSORS_PWM_FAN=m ++CONFIG_SENSORS_RASPBERRYPI_HWMON=m ++# CONFIG_SENSORS_SBTSI is not set ++# CONFIG_SENSORS_SBRMI is not set ++# CONFIG_SENSORS_SHT15 is not set ++CONFIG_SENSORS_SHT21=m ++CONFIG_SENSORS_SHT3x=m ++CONFIG_SENSORS_SHT4x=m ++CONFIG_SENSORS_SHTC1=m ++# CONFIG_SENSORS_SIS5595 is not set ++# CONFIG_SENSORS_DME1737 is not set ++# CONFIG_SENSORS_EMC1403 is not set ++# CONFIG_SENSORS_EMC2103 is not set ++CONFIG_SENSORS_EMC2305=m ++# CONFIG_SENSORS_EMC6W201 is not set ++# CONFIG_SENSORS_SMSC47M1 is not set ++# CONFIG_SENSORS_SMSC47M192 is not set ++# CONFIG_SENSORS_SMSC47B397 is not set ++# CONFIG_SENSORS_SCH5627 is not set ++# CONFIG_SENSORS_SCH5636 is not set ++# CONFIG_SENSORS_STTS751 is not set ++# CONFIG_SENSORS_ADC128D818 is not set ++CONFIG_SENSORS_ADS7828=m ++# CONFIG_SENSORS_ADS7871 is not set ++# CONFIG_SENSORS_AMC6821 is not set ++# CONFIG_SENSORS_INA209 is not set ++CONFIG_SENSORS_INA2XX=m ++CONFIG_SENSORS_INA238=m ++# CONFIG_SENSORS_INA3221 is not set ++# CONFIG_SENSORS_SPD5118 is not set ++# CONFIG_SENSORS_TC74 is not set ++# CONFIG_SENSORS_THMC50 is not set ++CONFIG_SENSORS_TMP102=m ++# CONFIG_SENSORS_TMP103 is not set ++# CONFIG_SENSORS_TMP108 is not set ++# CONFIG_SENSORS_TMP401 is not set ++# CONFIG_SENSORS_TMP421 is not set ++# CONFIG_SENSORS_TMP464 is not set ++# CONFIG_SENSORS_TMP513 is not set ++# CONFIG_SENSORS_VIA686A is not set ++# CONFIG_SENSORS_VT1211 is not set ++# CONFIG_SENSORS_VT8231 is not set ++# CONFIG_SENSORS_W83773G is not set ++# CONFIG_SENSORS_W83781D is not set ++# CONFIG_SENSORS_W83791D is not set ++# CONFIG_SENSORS_W83792D is not set ++# CONFIG_SENSORS_W83793 is not set ++# CONFIG_SENSORS_W83795 is not set ++# CONFIG_SENSORS_W83L785TS is not set ++# CONFIG_SENSORS_W83L786NG is not set ++# CONFIG_SENSORS_W83627HF is not set ++# CONFIG_SENSORS_W83627EHF is not set ++CONFIG_SENSORS_RP1_ADC=m ++CONFIG_THERMAL=y ++# CONFIG_THERMAL_NETLINK is not set ++# CONFIG_THERMAL_STATISTICS is not set ++# CONFIG_THERMAL_DEBUGFS is not set ++# CONFIG_THERMAL_CORE_TESTING is not set ++CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 ++CONFIG_THERMAL_HWMON=y ++CONFIG_THERMAL_OF=y ++CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y ++# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set ++# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set ++# CONFIG_THERMAL_GOV_FAIR_SHARE is not set ++CONFIG_THERMAL_GOV_STEP_WISE=y ++# CONFIG_THERMAL_GOV_BANG_BANG is not set ++# CONFIG_THERMAL_GOV_USER_SPACE is not set ++# CONFIG_CPU_THERMAL is not set ++# CONFIG_THERMAL_EMULATION is not set ++# CONFIG_THERMAL_MMIO is not set ++ ++# ++# Broadcom thermal drivers ++# ++CONFIG_BCM2711_THERMAL=y ++CONFIG_BCM2835_THERMAL=y ++# CONFIG_BRCMSTB_THERMAL is not set ++# end of Broadcom thermal drivers ++ ++# CONFIG_GENERIC_ADC_THERMAL is not set ++CONFIG_WATCHDOG=y ++CONFIG_WATCHDOG_CORE=y ++# CONFIG_WATCHDOG_NOWAYOUT is not set ++CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y ++CONFIG_WATCHDOG_OPEN_TIMEOUT=0 ++CONFIG_WATCHDOG_SYSFS=y ++# CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT is not set ++ ++# ++# Watchdog Pretimeout Governors ++# ++# CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set ++ ++# ++# Watchdog Device Drivers ++# ++# CONFIG_SOFT_WATCHDOG is not set ++CONFIG_GPIO_WATCHDOG=m ++# CONFIG_XILINX_WATCHDOG is not set ++# CONFIG_XILINX_WINDOW_WATCHDOG is not set ++# CONFIG_ZIIRAVE_WATCHDOG is not set ++# CONFIG_ARM_SP805_WATCHDOG is not set ++# CONFIG_ARM_SBSA_WATCHDOG is not set ++# CONFIG_CADENCE_WATCHDOG is not set ++# CONFIG_DW_WATCHDOG is not set ++# CONFIG_MAX63XX_WATCHDOG is not set ++# CONFIG_ARM_SMC_WATCHDOG is not set ++# CONFIG_ALIM7101_WDT is not set ++# CONFIG_I6300ESB_WDT is not set ++# CONFIG_HP_WATCHDOG is not set ++CONFIG_BCM2835_WDT=y ++# CONFIG_BCM7038_WDT is not set ++# CONFIG_MEN_A21_WDT is not set ++ ++# ++# PCI-based Watchdog Cards ++# ++# CONFIG_PCIPCWATCHDOG is not set ++# CONFIG_WDTPCI is not set ++ ++# ++# USB-based Watchdog Cards ++# ++# CONFIG_USBPCWATCHDOG is not set ++CONFIG_SSB_POSSIBLE=y ++CONFIG_SSB=m ++CONFIG_SSB_SPROM=y ++CONFIG_SSB_BLOCKIO=y ++CONFIG_SSB_PCIHOST_POSSIBLE=y ++CONFIG_SSB_PCIHOST=y ++CONFIG_SSB_B43_PCI_BRIDGE=y ++CONFIG_SSB_SDIOHOST_POSSIBLE=y ++# CONFIG_SSB_SDIOHOST is not set ++CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y ++CONFIG_SSB_DRIVER_PCICORE=y ++# CONFIG_SSB_DRIVER_GPIO is not set ++CONFIG_BCMA_POSSIBLE=y ++CONFIG_BCMA=m ++CONFIG_BCMA_BLOCKIO=y ++CONFIG_BCMA_HOST_PCI_POSSIBLE=y ++CONFIG_BCMA_HOST_PCI=y ++# CONFIG_BCMA_HOST_SOC is not set ++CONFIG_BCMA_DRIVER_PCI=y ++# CONFIG_BCMA_DRIVER_GMAC_CMN is not set ++# CONFIG_BCMA_DRIVER_GPIO is not set ++# CONFIG_BCMA_DEBUG is not set ++ ++# ++# Multifunction device drivers ++# ++CONFIG_MFD_CORE=y ++# CONFIG_MFD_ADP5585 is not set ++# CONFIG_MFD_ACT8945A is not set ++# CONFIG_MFD_AS3711 is not set ++# CONFIG_MFD_SMPRO is not set ++# CONFIG_MFD_AS3722 is not set ++# CONFIG_PMIC_ADP5520 is not set ++# CONFIG_MFD_AAT2870_CORE is not set ++# CONFIG_MFD_ATMEL_FLEXCOM is not set ++# CONFIG_MFD_ATMEL_HLCDC is not set ++# CONFIG_MFD_BCM590XX is not set ++# CONFIG_MFD_BD9571MWV is not set ++# CONFIG_MFD_AXP20X_I2C is not set ++# CONFIG_MFD_CS42L43_I2C is not set ++# CONFIG_MFD_MADERA is not set ++# CONFIG_MFD_MAX5970 is not set ++# CONFIG_PMIC_DA903X is not set ++# CONFIG_MFD_DA9052_SPI is not set ++# CONFIG_MFD_DA9052_I2C is not set ++# CONFIG_MFD_DA9055 is not set ++# CONFIG_MFD_DA9062 is not set ++# CONFIG_MFD_DA9063 is not set ++# CONFIG_MFD_DA9150 is not set ++# CONFIG_MFD_DLN2 is not set ++# CONFIG_MFD_GATEWORKS_GSC is not set ++# CONFIG_MFD_MC13XXX_SPI is not set ++# CONFIG_MFD_MC13XXX_I2C is not set ++# CONFIG_MFD_MP2629 is not set ++# CONFIG_MFD_HI6421_PMIC is not set ++# CONFIG_LPC_ICH is not set ++# CONFIG_LPC_SCH is not set ++# CONFIG_MFD_IQS62X is not set ++# CONFIG_MFD_JANZ_CMODIO is not set ++# CONFIG_MFD_KEMPLD is not set ++# CONFIG_MFD_88PM800 is not set ++# CONFIG_MFD_88PM805 is not set ++# CONFIG_MFD_88PM860X is not set ++# CONFIG_MFD_88PM886_PMIC is not set ++# CONFIG_MFD_MAX14577 is not set ++# CONFIG_MFD_MAX77541 is not set ++# CONFIG_MFD_MAX77620 is not set ++# CONFIG_MFD_MAX77650 is not set ++# CONFIG_MFD_MAX77686 is not set ++# CONFIG_MFD_MAX77693 is not set ++# CONFIG_MFD_MAX77714 is not set ++# CONFIG_MFD_MAX77843 is not set ++# CONFIG_MFD_MAX8907 is not set ++# CONFIG_MFD_MAX8925 is not set ++# CONFIG_MFD_MAX8997 is not set ++# CONFIG_MFD_MAX8998 is not set ++# CONFIG_MFD_MT6360 is not set ++# CONFIG_MFD_MT6370 is not set ++# CONFIG_MFD_MT6397 is not set ++# CONFIG_MFD_MENF21BMC is not set ++# CONFIG_MFD_OCELOT is not set ++# CONFIG_EZX_PCAP is not set ++# CONFIG_MFD_CPCAP is not set ++# CONFIG_MFD_VIPERBOARD is not set ++# CONFIG_MFD_NTXEC is not set ++# CONFIG_MFD_RETU is not set ++# CONFIG_MFD_PCF50633 is not set ++# CONFIG_MFD_SY7636A is not set ++CONFIG_MFD_RASPBERRYPI_POE_HAT=m ++# CONFIG_MFD_RDC321X is not set ++# CONFIG_MFD_RT4831 is not set ++# CONFIG_MFD_RT5033 is not set ++# CONFIG_MFD_RT5120 is not set ++# CONFIG_MFD_RC5T583 is not set ++# CONFIG_MFD_RK8XX_I2C is not set ++# CONFIG_MFD_RK8XX_SPI is not set ++# CONFIG_MFD_RN5T618 is not set ++# CONFIG_MFD_SEC_CORE is not set ++# CONFIG_MFD_SI476X_CORE is not set ++CONFIG_MFD_SIMPLE_MFD_I2C=m ++# CONFIG_MFD_SM501 is not set ++# CONFIG_MFD_SKY81452 is not set ++CONFIG_MFD_STMPE=y ++ ++# ++# STMicroelectronics STMPE Interface Drivers ++# ++CONFIG_STMPE_I2C=y ++CONFIG_STMPE_SPI=y ++# end of STMicroelectronics STMPE Interface Drivers ++ ++CONFIG_MFD_SYSCON=y ++# CONFIG_MFD_LP3943 is not set ++# CONFIG_MFD_LP8788 is not set ++# CONFIG_MFD_TI_LMU is not set ++# CONFIG_MFD_PALMAS is not set ++# CONFIG_TPS6105X is not set ++# CONFIG_TPS65010 is not set ++# CONFIG_TPS6507X is not set ++# CONFIG_MFD_TPS65086 is not set ++# CONFIG_MFD_TPS65090 is not set ++# CONFIG_MFD_TPS65217 is not set ++# CONFIG_MFD_TI_LP873X is not set ++# CONFIG_MFD_TI_LP87565 is not set ++# CONFIG_MFD_TPS65218 is not set ++# CONFIG_MFD_TPS65219 is not set ++# CONFIG_MFD_TPS6586X is not set ++# CONFIG_MFD_TPS65910 is not set ++# CONFIG_MFD_TPS65912_I2C is not set ++# CONFIG_MFD_TPS65912_SPI is not set ++# CONFIG_MFD_TPS6594_I2C is not set ++# CONFIG_MFD_TPS6594_SPI is not set ++# CONFIG_TWL4030_CORE is not set ++# CONFIG_TWL6040_CORE is not set ++CONFIG_MFD_WL1273_CORE=m ++# CONFIG_MFD_LM3533 is not set ++# CONFIG_MFD_TC3589X is not set ++# CONFIG_MFD_TQMX86 is not set ++# CONFIG_MFD_VX855 is not set ++# CONFIG_MFD_LOCHNAGAR is not set ++CONFIG_MFD_ARIZONA=m ++CONFIG_MFD_ARIZONA_I2C=m ++CONFIG_MFD_ARIZONA_SPI=m ++# CONFIG_MFD_CS47L24 is not set ++CONFIG_MFD_WM5102=y ++# CONFIG_MFD_WM5110 is not set ++# CONFIG_MFD_WM8997 is not set ++# CONFIG_MFD_WM8998 is not set ++# CONFIG_MFD_WM8400 is not set ++# CONFIG_MFD_WM831X_I2C is not set ++# CONFIG_MFD_WM831X_SPI is not set ++# CONFIG_MFD_WM8350_I2C is not set ++# CONFIG_MFD_WM8994 is not set ++# CONFIG_MFD_ROHM_BD718XX is not set ++# CONFIG_MFD_ROHM_BD71828 is not set ++# CONFIG_MFD_ROHM_BD957XMUF is not set ++# CONFIG_MFD_ROHM_BD96801 is not set ++# CONFIG_MFD_STPMIC1 is not set ++# CONFIG_MFD_STMFX is not set ++# CONFIG_MFD_ATC260X_I2C is not set ++# CONFIG_MFD_QCOM_PM8008 is not set ++# CONFIG_MFD_CS40L50_I2C is not set ++# CONFIG_MFD_CS40L50_SPI is not set ++# CONFIG_RAVE_SP_CORE is not set ++# CONFIG_MFD_INTEL_M10_BMC_SPI is not set ++CONFIG_MFD_RP1=y ++# CONFIG_MFD_RSMU_I2C is not set ++# CONFIG_MFD_RSMU_SPI is not set ++# end of Multifunction device drivers ++ ++CONFIG_REGULATOR=y ++# CONFIG_REGULATOR_DEBUG is not set ++CONFIG_REGULATOR_FIXED_VOLTAGE=y ++# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set ++# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set ++# CONFIG_REGULATOR_NETLINK_EVENTS is not set ++# CONFIG_REGULATOR_88PG86X is not set ++# CONFIG_REGULATOR_ACT8865 is not set ++# CONFIG_REGULATOR_AD5398 is not set ++CONFIG_REGULATOR_ARIZONA_LDO1=m ++CONFIG_REGULATOR_ARIZONA_MICSUPP=m ++# CONFIG_REGULATOR_AW37503 is not set ++# CONFIG_REGULATOR_DA9121 is not set ++# CONFIG_REGULATOR_DA9210 is not set ++# CONFIG_REGULATOR_DA9211 is not set ++# CONFIG_REGULATOR_FAN53555 is not set ++# CONFIG_REGULATOR_FAN53880 is not set ++CONFIG_REGULATOR_GPIO=y ++# CONFIG_REGULATOR_ISL9305 is not set ++# CONFIG_REGULATOR_ISL6271A is not set ++# CONFIG_REGULATOR_LP3971 is not set ++# CONFIG_REGULATOR_LP3972 is not set ++# CONFIG_REGULATOR_LP872X is not set ++# CONFIG_REGULATOR_LP8755 is not set ++# CONFIG_REGULATOR_LTC3589 is not set ++# CONFIG_REGULATOR_LTC3676 is not set ++# CONFIG_REGULATOR_MAX1586 is not set ++# CONFIG_REGULATOR_MAX77503 is not set ++# CONFIG_REGULATOR_MAX77857 is not set ++# CONFIG_REGULATOR_MAX8649 is not set ++# CONFIG_REGULATOR_MAX8660 is not set ++# CONFIG_REGULATOR_MAX8893 is not set ++# CONFIG_REGULATOR_MAX8952 is not set ++# CONFIG_REGULATOR_MAX8973 is not set ++# CONFIG_REGULATOR_MAX20086 is not set ++# CONFIG_REGULATOR_MAX20411 is not set ++# CONFIG_REGULATOR_MAX77826 is not set ++# CONFIG_REGULATOR_MCP16502 is not set ++# CONFIG_REGULATOR_MP5416 is not set ++# CONFIG_REGULATOR_MP8859 is not set ++# CONFIG_REGULATOR_MP886X is not set ++# CONFIG_REGULATOR_MPQ7920 is not set ++# CONFIG_REGULATOR_MT6311 is not set ++# CONFIG_REGULATOR_PCA9450 is not set ++# CONFIG_REGULATOR_PF8X00 is not set ++# CONFIG_REGULATOR_PFUZE100 is not set ++# CONFIG_REGULATOR_PV88060 is not set ++# CONFIG_REGULATOR_PV88080 is not set ++# CONFIG_REGULATOR_PV88090 is not set ++# CONFIG_REGULATOR_PWM is not set ++# CONFIG_REGULATOR_RAA215300 is not set ++CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY=m ++CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_V2=m ++CONFIG_REGULATOR_WAVESHARE_TOUCHSCREEN=m ++# CONFIG_REGULATOR_RT4801 is not set ++# CONFIG_REGULATOR_RT4803 is not set ++# CONFIG_REGULATOR_RT5190A is not set ++# CONFIG_REGULATOR_RT5739 is not set ++# CONFIG_REGULATOR_RT5759 is not set ++# CONFIG_REGULATOR_RT6160 is not set ++# CONFIG_REGULATOR_RT6190 is not set ++# CONFIG_REGULATOR_RT6245 is not set ++# CONFIG_REGULATOR_RTQ2134 is not set ++# CONFIG_REGULATOR_RTMV20 is not set ++# CONFIG_REGULATOR_RTQ6752 is not set ++# CONFIG_REGULATOR_RTQ2208 is not set ++# CONFIG_REGULATOR_SLG51000 is not set ++# CONFIG_REGULATOR_SY8106A is not set ++# CONFIG_REGULATOR_SY8824X is not set ++# CONFIG_REGULATOR_SY8827N is not set ++# CONFIG_REGULATOR_TPS51632 is not set ++# CONFIG_REGULATOR_TPS62360 is not set ++# CONFIG_REGULATOR_TPS6286X is not set ++# CONFIG_REGULATOR_TPS6287X is not set ++# CONFIG_REGULATOR_TPS65023 is not set ++# CONFIG_REGULATOR_TPS6507X is not set ++# CONFIG_REGULATOR_TPS65132 is not set ++# CONFIG_REGULATOR_TPS6524X is not set ++# CONFIG_REGULATOR_VCTRL is not set ++CONFIG_RC_CORE=y ++CONFIG_BPF_LIRC_MODE2=y ++CONFIG_LIRC=y ++CONFIG_RC_MAP=y ++CONFIG_RC_DECODERS=y ++CONFIG_IR_IMON_DECODER=m ++CONFIG_IR_JVC_DECODER=m ++CONFIG_IR_MCE_KBD_DECODER=m ++CONFIG_IR_NEC_DECODER=m ++CONFIG_IR_RC5_DECODER=m ++CONFIG_IR_RC6_DECODER=m ++# CONFIG_IR_RCMM_DECODER is not set ++CONFIG_IR_SANYO_DECODER=m ++CONFIG_IR_SHARP_DECODER=m ++CONFIG_IR_SONY_DECODER=m ++CONFIG_IR_XMP_DECODER=m ++CONFIG_RC_DEVICES=y ++CONFIG_IR_GPIO_CIR=m ++CONFIG_IR_GPIO_TX=m ++# CONFIG_IR_HIX5HD2 is not set ++# CONFIG_IR_IGORPLUGUSB is not set ++CONFIG_IR_IGUANA=m ++CONFIG_IR_IMON=m ++# CONFIG_IR_IMON_RAW is not set ++CONFIG_IR_MCEUSB=m ++CONFIG_IR_PWM_TX=m ++CONFIG_IR_REDRAT3=m ++# CONFIG_IR_SERIAL is not set ++# CONFIG_IR_SPI is not set ++CONFIG_IR_STREAMZAP=m ++CONFIG_IR_TOY=m ++CONFIG_IR_TTUSBIR=m ++CONFIG_RC_ATI_REMOTE=m ++CONFIG_RC_LOOPBACK=m ++# CONFIG_RC_XBOX_DVD is not set ++CONFIG_CEC_CORE=m ++ ++# ++# CEC support ++# ++CONFIG_MEDIA_CEC_RC=y ++CONFIG_MEDIA_CEC_SUPPORT=y ++# CONFIG_CEC_CH7322 is not set ++# CONFIG_CEC_GPIO is not set ++# CONFIG_USB_EXTRON_DA_HD_4K_PLUS_CEC is not set ++# CONFIG_USB_PULSE8_CEC is not set ++# CONFIG_USB_RAINSHADOW_CEC is not set ++# end of CEC support ++ ++CONFIG_MEDIA_SUPPORT=m ++# CONFIG_MEDIA_SUPPORT_FILTER is not set ++# CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set ++ ++# ++# Media device types ++# ++CONFIG_MEDIA_CAMERA_SUPPORT=y ++CONFIG_MEDIA_ANALOG_TV_SUPPORT=y ++CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y ++CONFIG_MEDIA_RADIO_SUPPORT=y ++CONFIG_MEDIA_SDR_SUPPORT=y ++CONFIG_MEDIA_PLATFORM_SUPPORT=y ++CONFIG_MEDIA_TEST_SUPPORT=y ++# end of Media device types ++ ++# ++# Media core support ++# ++CONFIG_VIDEO_DEV=m ++CONFIG_MEDIA_CONTROLLER=y ++CONFIG_DVB_CORE=m ++# end of Media core support ++ ++# ++# Video4Linux options ++# ++CONFIG_VIDEO_V4L2_I2C=y ++CONFIG_VIDEO_V4L2_SUBDEV_API=y ++# CONFIG_VIDEO_ADV_DEBUG is not set ++# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set ++CONFIG_VIDEO_TUNER=m ++CONFIG_V4L2_MEM2MEM_DEV=m ++CONFIG_V4L2_FWNODE=m ++CONFIG_V4L2_ASYNC=m ++CONFIG_V4L2_CCI=m ++CONFIG_V4L2_CCI_I2C=m ++# end of Video4Linux options ++ ++# ++# Media controller options ++# ++CONFIG_MEDIA_CONTROLLER_DVB=y ++# end of Media controller options ++ ++# ++# Digital TV options ++# ++# CONFIG_DVB_MMAP is not set ++CONFIG_DVB_NET=y ++CONFIG_DVB_MAX_ADAPTERS=16 ++CONFIG_DVB_DYNAMIC_MINORS=y ++# CONFIG_DVB_DEMUX_SECTION_LOSS_LOG is not set ++# CONFIG_DVB_ULE_DEBUG is not set ++# end of Digital TV options ++ ++# ++# Media drivers ++# ++ ++# ++# Media drivers ++# ++CONFIG_MEDIA_USB_SUPPORT=y ++ ++# ++# Webcam devices ++# ++CONFIG_USB_GSPCA=m ++CONFIG_USB_GSPCA_BENQ=m ++CONFIG_USB_GSPCA_CONEX=m ++CONFIG_USB_GSPCA_CPIA1=m ++CONFIG_USB_GSPCA_DTCS033=m ++CONFIG_USB_GSPCA_ETOMS=m ++CONFIG_USB_GSPCA_FINEPIX=m ++CONFIG_USB_GSPCA_JEILINJ=m ++CONFIG_USB_GSPCA_JL2005BCD=m ++CONFIG_USB_GSPCA_KINECT=m ++CONFIG_USB_GSPCA_KONICA=m ++CONFIG_USB_GSPCA_MARS=m ++CONFIG_USB_GSPCA_MR97310A=m ++CONFIG_USB_GSPCA_NW80X=m ++CONFIG_USB_GSPCA_OV519=m ++CONFIG_USB_GSPCA_OV534=m ++CONFIG_USB_GSPCA_OV534_9=m ++CONFIG_USB_GSPCA_PAC207=m ++CONFIG_USB_GSPCA_PAC7302=m ++CONFIG_USB_GSPCA_PAC7311=m ++CONFIG_USB_GSPCA_SE401=m ++CONFIG_USB_GSPCA_SN9C2028=m ++CONFIG_USB_GSPCA_SN9C20X=m ++CONFIG_USB_GSPCA_SONIXB=m ++CONFIG_USB_GSPCA_SONIXJ=m ++CONFIG_USB_GSPCA_SPCA1528=m ++CONFIG_USB_GSPCA_SPCA500=m ++CONFIG_USB_GSPCA_SPCA501=m ++CONFIG_USB_GSPCA_SPCA505=m ++CONFIG_USB_GSPCA_SPCA506=m ++CONFIG_USB_GSPCA_SPCA508=m ++CONFIG_USB_GSPCA_SPCA561=m ++CONFIG_USB_GSPCA_SQ905=m ++CONFIG_USB_GSPCA_SQ905C=m ++CONFIG_USB_GSPCA_SQ930X=m ++CONFIG_USB_GSPCA_STK014=m ++CONFIG_USB_GSPCA_STK1135=m ++CONFIG_USB_GSPCA_STV0680=m ++CONFIG_USB_GSPCA_SUNPLUS=m ++CONFIG_USB_GSPCA_T613=m ++CONFIG_USB_GSPCA_TOPRO=m ++CONFIG_USB_GSPCA_TOUPTEK=m ++CONFIG_USB_GSPCA_TV8532=m ++CONFIG_USB_GSPCA_VC032X=m ++CONFIG_USB_GSPCA_VICAM=m ++CONFIG_USB_GSPCA_XIRLINK_CIT=m ++CONFIG_USB_GSPCA_ZC3XX=m ++CONFIG_USB_GL860=m ++CONFIG_USB_M5602=m ++CONFIG_USB_STV06XX=m ++CONFIG_USB_PWC=m ++# CONFIG_USB_PWC_DEBUG is not set ++CONFIG_USB_PWC_INPUT_EVDEV=y ++CONFIG_USB_S2255=m ++CONFIG_VIDEO_USBTV=m ++CONFIG_USB_VIDEO_CLASS=m ++CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y ++ ++# ++# Analog TV USB devices ++# ++CONFIG_VIDEO_GO7007=m ++CONFIG_VIDEO_GO7007_USB=m ++CONFIG_VIDEO_GO7007_LOADER=m ++CONFIG_VIDEO_GO7007_USB_S2250_BOARD=m ++CONFIG_VIDEO_HDPVR=m ++CONFIG_VIDEO_PVRUSB2=m ++CONFIG_VIDEO_PVRUSB2_SYSFS=y ++CONFIG_VIDEO_PVRUSB2_DVB=y ++# CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set ++CONFIG_VIDEO_STK1160=m ++ ++# ++# Analog/digital TV USB devices ++# ++CONFIG_VIDEO_AU0828=m ++CONFIG_VIDEO_AU0828_V4L2=y ++CONFIG_VIDEO_AU0828_RC=y ++CONFIG_VIDEO_CX231XX=m ++CONFIG_VIDEO_CX231XX_RC=y ++CONFIG_VIDEO_CX231XX_ALSA=m ++CONFIG_VIDEO_CX231XX_DVB=m ++ ++# ++# Digital TV USB devices ++# ++CONFIG_DVB_AS102=m ++CONFIG_DVB_B2C2_FLEXCOP_USB=m ++# CONFIG_DVB_B2C2_FLEXCOP_USB_DEBUG is not set ++CONFIG_DVB_USB_V2=m ++CONFIG_DVB_USB_AF9015=m ++CONFIG_DVB_USB_AF9035=m ++CONFIG_DVB_USB_ANYSEE=m ++CONFIG_DVB_USB_AU6610=m ++CONFIG_DVB_USB_AZ6007=m ++CONFIG_DVB_USB_CE6230=m ++CONFIG_DVB_USB_DVBSKY=m ++CONFIG_DVB_USB_EC168=m ++CONFIG_DVB_USB_GL861=m ++CONFIG_DVB_USB_LME2510=m ++CONFIG_DVB_USB_MXL111SF=m ++CONFIG_DVB_USB_RTL28XXU=m ++# CONFIG_DVB_USB_ZD1301 is not set ++CONFIG_DVB_USB=m ++# CONFIG_DVB_USB_DEBUG is not set ++CONFIG_DVB_USB_A800=m ++CONFIG_DVB_USB_AF9005=m ++CONFIG_DVB_USB_AF9005_REMOTE=m ++CONFIG_DVB_USB_AZ6027=m ++CONFIG_DVB_USB_CINERGY_T2=m ++CONFIG_DVB_USB_CXUSB=m ++# CONFIG_DVB_USB_CXUSB_ANALOG is not set ++CONFIG_DVB_USB_DIB0700=m ++CONFIG_DVB_USB_DIB3000MC=m ++CONFIG_DVB_USB_DIBUSB_MB=m ++CONFIG_DVB_USB_DIBUSB_MB_FAULTY=y ++CONFIG_DVB_USB_DIBUSB_MC=m ++CONFIG_DVB_USB_DIGITV=m ++CONFIG_DVB_USB_DTT200U=m ++CONFIG_DVB_USB_DTV5100=m ++CONFIG_DVB_USB_DW2102=m ++CONFIG_DVB_USB_GP8PSK=m ++CONFIG_DVB_USB_M920X=m ++CONFIG_DVB_USB_NOVA_T_USB2=m ++CONFIG_DVB_USB_OPERA1=m ++CONFIG_DVB_USB_PCTV452E=m ++CONFIG_DVB_USB_TECHNISAT_USB2=m ++CONFIG_DVB_USB_TTUSB2=m ++CONFIG_DVB_USB_UMT_010=m ++CONFIG_DVB_USB_VP702X=m ++CONFIG_DVB_USB_VP7045=m ++CONFIG_SMS_USB_DRV=m ++# CONFIG_DVB_TTUSB_BUDGET is not set ++# CONFIG_DVB_TTUSB_DEC is not set ++ ++# ++# Webcam, TV (analog/digital) USB devices ++# ++CONFIG_VIDEO_EM28XX=m ++CONFIG_VIDEO_EM28XX_V4L2=m ++CONFIG_VIDEO_EM28XX_ALSA=m ++CONFIG_VIDEO_EM28XX_DVB=m ++CONFIG_VIDEO_EM28XX_RC=m ++ ++# ++# Software defined radio USB devices ++# ++# CONFIG_USB_AIRSPY is not set ++# CONFIG_USB_HACKRF is not set ++# CONFIG_USB_MSI2500 is not set ++CONFIG_MEDIA_PCI_SUPPORT=y ++ ++# ++# Media capture support ++# ++# CONFIG_VIDEO_MGB4 is not set ++# CONFIG_VIDEO_SOLO6X10 is not set ++# CONFIG_VIDEO_TW5864 is not set ++# CONFIG_VIDEO_TW68 is not set ++# CONFIG_VIDEO_TW686X is not set ++# CONFIG_VIDEO_ZORAN is not set ++ ++# ++# Media capture/analog TV support ++# ++# CONFIG_VIDEO_DT3155 is not set ++# CONFIG_VIDEO_IVTV is not set ++# CONFIG_VIDEO_HEXIUM_GEMINI is not set ++# CONFIG_VIDEO_HEXIUM_ORION is not set ++# CONFIG_VIDEO_MXB is not set ++ ++# ++# Media capture/analog/hybrid TV support ++# ++# CONFIG_VIDEO_BT848 is not set ++# CONFIG_VIDEO_CX18 is not set ++# CONFIG_VIDEO_CX23885 is not set ++# CONFIG_VIDEO_CX25821 is not set ++# CONFIG_VIDEO_CX88 is not set ++# CONFIG_VIDEO_SAA7134 is not set ++# CONFIG_VIDEO_SAA7164 is not set ++ ++# ++# Media digital TV PCI Adapters ++# ++# CONFIG_DVB_B2C2_FLEXCOP_PCI is not set ++# CONFIG_DVB_DDBRIDGE is not set ++# CONFIG_DVB_DM1105 is not set ++# CONFIG_MANTIS_CORE is not set ++# CONFIG_DVB_NETUP_UNIDVB is not set ++# CONFIG_DVB_NGENE is not set ++# CONFIG_DVB_PLUTO2 is not set ++# CONFIG_DVB_PT1 is not set ++# CONFIG_DVB_PT3 is not set ++# CONFIG_DVB_SMIPCIE is not set ++# CONFIG_DVB_BUDGET_CORE is not set ++CONFIG_MEDIA_PCI_HAILO=m ++CONFIG_RADIO_ADAPTERS=m ++# CONFIG_RADIO_MAXIRADIO is not set ++CONFIG_RADIO_SAA7706H=m ++CONFIG_RADIO_SHARK=m ++CONFIG_RADIO_SHARK2=m ++CONFIG_RADIO_SI4713=m ++CONFIG_RADIO_TEA575X=m ++CONFIG_RADIO_TEA5764=m ++CONFIG_RADIO_TEF6862=m ++CONFIG_RADIO_WL1273=m ++CONFIG_USB_DSBR=m ++CONFIG_USB_KEENE=m ++CONFIG_USB_MA901=m ++CONFIG_USB_MR800=m ++# CONFIG_USB_RAREMONO is not set ++CONFIG_RADIO_SI470X=m ++CONFIG_USB_SI470X=m ++CONFIG_I2C_SI470X=m ++# CONFIG_USB_SI4713 is not set ++# CONFIG_PLATFORM_SI4713 is not set ++CONFIG_I2C_SI4713=m ++CONFIG_RADIO_WL128X=m ++CONFIG_MEDIA_PLATFORM_DRIVERS=y ++CONFIG_V4L_PLATFORM_DRIVERS=y ++# CONFIG_SDR_PLATFORM_DRIVERS is not set ++# CONFIG_DVB_PLATFORM_DRIVERS is not set ++# CONFIG_V4L_MEM2MEM_DRIVERS is not set ++CONFIG_VIDEO_MUX=m ++ ++# ++# Allegro DVT media platform drivers ++# ++ ++# ++# Amlogic media platform drivers ++# ++ ++# ++# Amphion drivers ++# ++ ++# ++# Aspeed media platform drivers ++# ++ ++# ++# Atmel media platform drivers ++# ++CONFIG_VIDEO_BCM2835_UNICAM_LEGACY=m ++CONFIG_VIDEO_BCM2835_UNICAM=m ++ ++# ++# Cadence media platform drivers ++# ++# CONFIG_VIDEO_CADENCE_CSI2RX is not set ++# CONFIG_VIDEO_CADENCE_CSI2TX is not set ++ ++# ++# Chips&Media media platform drivers ++# ++ ++# ++# Intel media platform drivers ++# ++ ++# ++# Marvell media platform drivers ++# ++# CONFIG_VIDEO_CAFE_CCIC is not set ++ ++# ++# Mediatek media platform drivers ++# ++ ++# ++# Microchip Technology, Inc. media platform drivers ++# ++ ++# ++# Nuvoton media platform drivers ++# ++ ++# ++# NVidia media platform drivers ++# ++ ++# ++# NXP media platform drivers ++# ++ ++# ++# Qualcomm media platform drivers ++# ++ ++# ++# Raspberry Pi media platform drivers ++# ++CONFIG_VIDEO_RPI_HEVC_DEC=m ++CONFIG_VIDEO_RASPBERRYPI_PISP_BE=m ++CONFIG_VIDEO_RP1_CFE=m ++ ++# ++# Renesas media platform drivers ++# ++ ++# ++# Rockchip media platform drivers ++# ++ ++# ++# Samsung media platform drivers ++# ++ ++# ++# STMicroelectronics media platform drivers ++# ++ ++# ++# Sunxi media platform drivers ++# ++ ++# ++# Texas Instruments drivers ++# ++ ++# ++# Verisilicon media platform drivers ++# ++ ++# ++# VIA media platform drivers ++# ++ ++# ++# Xilinx media platform drivers ++# ++# CONFIG_VIDEO_XILINX is not set ++ ++# ++# MMC/SDIO DVB adapters ++# ++# CONFIG_SMS_SDIO_DRV is not set ++CONFIG_V4L_TEST_DRIVERS=y ++CONFIG_VIDEO_VIM2M=m ++CONFIG_VIDEO_VICODEC=m ++CONFIG_VIDEO_VIMC=m ++CONFIG_VIDEO_VIVID=m ++# CONFIG_VIDEO_VIVID_CEC is not set ++CONFIG_VIDEO_VIVID_MAX_DEVS=64 ++# CONFIG_VIDEO_VISL is not set ++# CONFIG_DVB_TEST_DRIVERS is not set ++CONFIG_MEDIA_COMMON_OPTIONS=y ++ ++# ++# common driver options ++# ++CONFIG_CYPRESS_FIRMWARE=m ++CONFIG_TTPCI_EEPROM=m ++CONFIG_UVC_COMMON=m ++CONFIG_VIDEO_CX2341X=m ++CONFIG_VIDEO_TVEEPROM=m ++CONFIG_DVB_B2C2_FLEXCOP=m ++CONFIG_SMS_SIANO_MDTV=m ++CONFIG_SMS_SIANO_RC=y ++CONFIG_VIDEO_V4L2_TPG=m ++CONFIG_VIDEOBUF2_CORE=m ++CONFIG_VIDEOBUF2_V4L2=m ++CONFIG_VIDEOBUF2_MEMOPS=m ++CONFIG_VIDEOBUF2_DMA_CONTIG=m ++CONFIG_VIDEOBUF2_VMALLOC=m ++CONFIG_VIDEOBUF2_DMA_SG=m ++# end of Media drivers ++ ++# ++# Media ancillary drivers ++# ++CONFIG_MEDIA_ATTACH=y ++CONFIG_VIDEO_IR_I2C=m ++CONFIG_VIDEO_CAMERA_SENSOR=y ++# CONFIG_VIDEO_ALVIUM_CSI2 is not set ++# CONFIG_VIDEO_AR0521 is not set ++# CONFIG_VIDEO_GC0308 is not set ++# CONFIG_VIDEO_GC05A2 is not set ++# CONFIG_VIDEO_GC08A3 is not set ++# CONFIG_VIDEO_GC2145 is not set ++CONFIG_VIDEO_ARDUCAM_64MP=m ++CONFIG_VIDEO_ARDUCAM_PIVARIETY=m ++# CONFIG_VIDEO_HI556 is not set ++# CONFIG_VIDEO_HI846 is not set ++# CONFIG_VIDEO_HI847 is not set ++# CONFIG_VIDEO_IMX208 is not set ++# CONFIG_VIDEO_IMX214 is not set ++CONFIG_VIDEO_IMX219=m ++CONFIG_VIDEO_IMX258=m ++# CONFIG_VIDEO_IMX274 is not set ++CONFIG_VIDEO_IMX283=m ++CONFIG_VIDEO_IMX290=m ++CONFIG_VIDEO_IMX296=m ++# CONFIG_VIDEO_IMX319 is not set ++# CONFIG_VIDEO_IMX334 is not set ++CONFIG_VIDEO_IMX335=m ++# CONFIG_VIDEO_IMX355 is not set ++# CONFIG_VIDEO_IMX412 is not set ++CONFIG_VIDEO_IMX415=m ++CONFIG_VIDEO_IMX477=m ++CONFIG_VIDEO_IMX500=m ++CONFIG_VIDEO_IMX519=m ++CONFIG_VIDEO_IMX708=m ++CONFIG_VIDEO_MIRA220=m ++# CONFIG_VIDEO_MT9M001 is not set ++# CONFIG_VIDEO_MT9M111 is not set ++# CONFIG_VIDEO_MT9M114 is not set ++# CONFIG_VIDEO_MT9P031 is not set ++# CONFIG_VIDEO_MT9T112 is not set ++CONFIG_VIDEO_MT9V011=m ++# CONFIG_VIDEO_MT9V032 is not set ++# CONFIG_VIDEO_MT9V111 is not set ++# CONFIG_VIDEO_OG01A1B is not set ++# CONFIG_VIDEO_OV01A10 is not set ++# CONFIG_VIDEO_OV02A10 is not set ++# CONFIG_VIDEO_OV08D10 is not set ++# CONFIG_VIDEO_OV08X40 is not set ++# CONFIG_VIDEO_OV13858 is not set ++# CONFIG_VIDEO_OV13B10 is not set ++CONFIG_VIDEO_OV2311=m ++# CONFIG_VIDEO_OV2640 is not set ++# CONFIG_VIDEO_OV2659 is not set ++# CONFIG_VIDEO_OV2680 is not set ++# CONFIG_VIDEO_OV2685 is not set ++# CONFIG_VIDEO_OV4689 is not set ++# CONFIG_VIDEO_OV5640 is not set ++# CONFIG_VIDEO_OV5645 is not set ++CONFIG_VIDEO_OV5647=m ++# CONFIG_VIDEO_OV5648 is not set ++# CONFIG_VIDEO_OV5670 is not set ++# CONFIG_VIDEO_OV5675 is not set ++# CONFIG_VIDEO_OV5693 is not set ++# CONFIG_VIDEO_OV5695 is not set ++CONFIG_VIDEO_OV64A40=m ++# CONFIG_VIDEO_OV6650 is not set ++CONFIG_VIDEO_OV7251=m ++CONFIG_VIDEO_OV7640=m ++# CONFIG_VIDEO_OV7670 is not set ++# CONFIG_VIDEO_OV772X is not set ++# CONFIG_VIDEO_OV7740 is not set ++# CONFIG_VIDEO_OV8856 is not set ++# CONFIG_VIDEO_OV8858 is not set ++# CONFIG_VIDEO_OV8865 is not set ++CONFIG_VIDEO_OV9282=m ++# CONFIG_VIDEO_OV9640 is not set ++# CONFIG_VIDEO_OV9650 is not set ++# CONFIG_VIDEO_RDACM20 is not set ++# CONFIG_VIDEO_RDACM21 is not set ++# CONFIG_VIDEO_RJ54N1 is not set ++# CONFIG_VIDEO_S5C73M3 is not set ++# CONFIG_VIDEO_S5K5BAF is not set ++# CONFIG_VIDEO_S5K6A3 is not set ++# CONFIG_VIDEO_VGXY61 is not set ++# CONFIG_VIDEO_CCS is not set ++# CONFIG_VIDEO_ET8EK8 is not set ++ ++# ++# Camera ISPs ++# ++# CONFIG_VIDEO_THP7312 is not set ++# end of Camera ISPs ++ ++# ++# Lens drivers ++# ++CONFIG_VIDEO_AD5398=m ++# CONFIG_VIDEO_AD5820 is not set ++CONFIG_VIDEO_AK7375=m ++CONFIG_VIDEO_BU64754=m ++# CONFIG_VIDEO_DW9714 is not set ++# CONFIG_VIDEO_DW9719 is not set ++# CONFIG_VIDEO_DW9768 is not set ++CONFIG_VIDEO_DW9807_VCM=m ++# end of Lens drivers ++ ++# ++# Flash devices ++# ++# CONFIG_VIDEO_ADP1653 is not set ++# CONFIG_VIDEO_LM3560 is not set ++# CONFIG_VIDEO_LM3646 is not set ++# end of Flash devices ++ ++# ++# Audio decoders, processors and mixers ++# ++# CONFIG_VIDEO_CS3308 is not set ++# CONFIG_VIDEO_CS5345 is not set ++CONFIG_VIDEO_CS53L32A=m ++CONFIG_VIDEO_MSP3400=m ++CONFIG_VIDEO_SONY_BTF_MPX=m ++# CONFIG_VIDEO_TDA1997X is not set ++# CONFIG_VIDEO_TDA7432 is not set ++# CONFIG_VIDEO_TDA9840 is not set ++# CONFIG_VIDEO_TEA6415C is not set ++# CONFIG_VIDEO_TEA6420 is not set ++# CONFIG_VIDEO_TLV320AIC23B is not set ++# CONFIG_VIDEO_TVAUDIO is not set ++CONFIG_VIDEO_UDA1342=m ++# CONFIG_VIDEO_VP27SMPX is not set ++# CONFIG_VIDEO_WM8739 is not set ++CONFIG_VIDEO_WM8775=m ++# end of Audio decoders, processors and mixers ++ ++# ++# RDS decoders ++# ++# CONFIG_VIDEO_SAA6588 is not set ++# end of RDS decoders ++ ++# ++# Video decoders ++# ++CONFIG_VIDEO_ADV7180=m ++# CONFIG_VIDEO_ADV7183 is not set ++# CONFIG_VIDEO_ADV748X is not set ++# CONFIG_VIDEO_ADV7604 is not set ++# CONFIG_VIDEO_ADV7842 is not set ++# CONFIG_VIDEO_BT819 is not set ++# CONFIG_VIDEO_BT856 is not set ++# CONFIG_VIDEO_BT866 is not set ++# CONFIG_VIDEO_ISL7998X is not set ++# CONFIG_VIDEO_KS0127 is not set ++# CONFIG_VIDEO_MAX9286 is not set ++# CONFIG_VIDEO_ML86V7667 is not set ++# CONFIG_VIDEO_SAA7110 is not set ++CONFIG_VIDEO_SAA711X=m ++CONFIG_VIDEO_TC358743=m ++# CONFIG_VIDEO_TC358743_CEC is not set ++# CONFIG_VIDEO_TC358746 is not set ++# CONFIG_VIDEO_TVP514X is not set ++CONFIG_VIDEO_TVP5150=m ++# CONFIG_VIDEO_TVP7002 is not set ++CONFIG_VIDEO_TW2804=m ++# CONFIG_VIDEO_TW9900 is not set ++CONFIG_VIDEO_TW9903=m ++CONFIG_VIDEO_TW9906=m ++# CONFIG_VIDEO_TW9910 is not set ++CONFIG_VIDEO_IRS1125=m ++# CONFIG_VIDEO_VPX3220 is not set ++ ++# ++# Video and audio decoders ++# ++# CONFIG_VIDEO_SAA717X is not set ++CONFIG_VIDEO_CX25840=m ++# end of Video decoders ++ ++# ++# Video encoders ++# ++# CONFIG_VIDEO_ADV7170 is not set ++# CONFIG_VIDEO_ADV7175 is not set ++# CONFIG_VIDEO_ADV7343 is not set ++# CONFIG_VIDEO_ADV7393 is not set ++# CONFIG_VIDEO_ADV7511 is not set ++# CONFIG_VIDEO_AK881X is not set ++# CONFIG_VIDEO_SAA7127 is not set ++# CONFIG_VIDEO_SAA7185 is not set ++# CONFIG_VIDEO_THS8200 is not set ++# end of Video encoders ++ ++# ++# Video improvement chips ++# ++# CONFIG_VIDEO_UPD64031A is not set ++# CONFIG_VIDEO_UPD64083 is not set ++# end of Video improvement chips ++ ++# ++# Audio/Video compression chips ++# ++# CONFIG_VIDEO_SAA6752HS is not set ++# end of Audio/Video compression chips ++ ++# ++# SDR tuner chips ++# ++# CONFIG_SDR_MAX2175 is not set ++# end of SDR tuner chips ++ ++# ++# Miscellaneous helper chips ++# ++CONFIG_VIDEO_I2C=m ++# CONFIG_VIDEO_M52790 is not set ++# CONFIG_VIDEO_ST_MIPID02 is not set ++# CONFIG_VIDEO_THS7303 is not set ++# end of Miscellaneous helper chips ++ ++# ++# Video serializers and deserializers ++# ++# CONFIG_VIDEO_DS90UB913 is not set ++# CONFIG_VIDEO_DS90UB953 is not set ++# CONFIG_VIDEO_DS90UB960 is not set ++# CONFIG_VIDEO_MAX96714 is not set ++# CONFIG_VIDEO_MAX96717 is not set ++# end of Video serializers and deserializers ++ ++# ++# Media SPI Adapters ++# ++CONFIG_CXD2880_SPI_DRV=m ++# CONFIG_VIDEO_GS1662 is not set ++# end of Media SPI Adapters ++ ++CONFIG_MEDIA_TUNER=m ++ ++# ++# Customize TV tuners ++# ++CONFIG_MEDIA_TUNER_E4000=m ++CONFIG_MEDIA_TUNER_FC0011=m ++CONFIG_MEDIA_TUNER_FC0012=m ++CONFIG_MEDIA_TUNER_FC0013=m ++CONFIG_MEDIA_TUNER_FC2580=m ++CONFIG_MEDIA_TUNER_IT913X=m ++CONFIG_MEDIA_TUNER_M88RS6000T=m ++CONFIG_MEDIA_TUNER_MAX2165=m ++CONFIG_MEDIA_TUNER_MC44S803=m ++CONFIG_MEDIA_TUNER_MSI001=m ++CONFIG_MEDIA_TUNER_MT2060=m ++CONFIG_MEDIA_TUNER_MT2063=m ++CONFIG_MEDIA_TUNER_MT20XX=m ++CONFIG_MEDIA_TUNER_MT2131=m ++CONFIG_MEDIA_TUNER_MT2266=m ++CONFIG_MEDIA_TUNER_MXL301RF=m ++CONFIG_MEDIA_TUNER_MXL5005S=m ++CONFIG_MEDIA_TUNER_MXL5007T=m ++CONFIG_MEDIA_TUNER_QM1D1B0004=m ++CONFIG_MEDIA_TUNER_QM1D1C0042=m ++CONFIG_MEDIA_TUNER_QT1010=m ++CONFIG_MEDIA_TUNER_R820T=m ++CONFIG_MEDIA_TUNER_SI2157=m ++CONFIG_MEDIA_TUNER_SIMPLE=m ++CONFIG_MEDIA_TUNER_TDA18212=m ++CONFIG_MEDIA_TUNER_TDA18218=m ++CONFIG_MEDIA_TUNER_TDA18250=m ++CONFIG_MEDIA_TUNER_TDA18271=m ++CONFIG_MEDIA_TUNER_TDA827X=m ++CONFIG_MEDIA_TUNER_TDA8290=m ++CONFIG_MEDIA_TUNER_TDA9887=m ++CONFIG_MEDIA_TUNER_TEA5761=m ++CONFIG_MEDIA_TUNER_TEA5767=m ++CONFIG_MEDIA_TUNER_TUA9001=m ++CONFIG_MEDIA_TUNER_XC2028=m ++CONFIG_MEDIA_TUNER_XC4000=m ++CONFIG_MEDIA_TUNER_XC5000=m ++# end of Customize TV tuners ++ ++# ++# Customise DVB Frontends ++# ++ ++# ++# Multistandard (satellite) frontends ++# ++CONFIG_DVB_M88DS3103=m ++CONFIG_DVB_MXL5XX=m ++CONFIG_DVB_STB0899=m ++CONFIG_DVB_STB6100=m ++CONFIG_DVB_STV090x=m ++CONFIG_DVB_STV0910=m ++CONFIG_DVB_STV6110x=m ++CONFIG_DVB_STV6111=m ++ ++# ++# Multistandard (cable + terrestrial) frontends ++# ++CONFIG_DVB_DRXK=m ++CONFIG_DVB_MN88472=m ++CONFIG_DVB_MN88473=m ++CONFIG_DVB_SI2165=m ++CONFIG_DVB_TDA18271C2DD=m ++ ++# ++# DVB-S (satellite) frontends ++# ++CONFIG_DVB_CX24110=m ++CONFIG_DVB_CX24116=m ++CONFIG_DVB_CX24117=m ++CONFIG_DVB_CX24120=m ++CONFIG_DVB_CX24123=m ++CONFIG_DVB_DS3000=m ++CONFIG_DVB_MB86A16=m ++CONFIG_DVB_MT312=m ++CONFIG_DVB_S5H1420=m ++CONFIG_DVB_SI21XX=m ++CONFIG_DVB_STB6000=m ++CONFIG_DVB_STV0288=m ++CONFIG_DVB_STV0299=m ++CONFIG_DVB_STV0900=m ++CONFIG_DVB_STV6110=m ++CONFIG_DVB_TDA10071=m ++CONFIG_DVB_TDA10086=m ++CONFIG_DVB_TDA8083=m ++CONFIG_DVB_TDA8261=m ++CONFIG_DVB_TDA826X=m ++CONFIG_DVB_TS2020=m ++CONFIG_DVB_TUA6100=m ++CONFIG_DVB_TUNER_CX24113=m ++CONFIG_DVB_TUNER_ITD1000=m ++CONFIG_DVB_VES1X93=m ++CONFIG_DVB_ZL10036=m ++CONFIG_DVB_ZL10039=m ++ ++# ++# DVB-T (terrestrial) frontends ++# ++CONFIG_DVB_AF9013=m ++CONFIG_DVB_AS102_FE=m ++CONFIG_DVB_CX22700=m ++CONFIG_DVB_CX22702=m ++CONFIG_DVB_CXD2820R=m ++CONFIG_DVB_CXD2841ER=m ++CONFIG_DVB_DIB3000MB=m ++CONFIG_DVB_DIB3000MC=m ++CONFIG_DVB_DIB7000M=m ++CONFIG_DVB_DIB7000P=m ++CONFIG_DVB_DIB9000=m ++CONFIG_DVB_DRXD=m ++CONFIG_DVB_EC100=m ++CONFIG_DVB_GP8PSK_FE=m ++CONFIG_DVB_L64781=m ++CONFIG_DVB_MT352=m ++CONFIG_DVB_NXT6000=m ++CONFIG_DVB_RTL2830=m ++CONFIG_DVB_RTL2832=m ++CONFIG_DVB_RTL2832_SDR=m ++CONFIG_DVB_S5H1432=m ++CONFIG_DVB_SI2168=m ++CONFIG_DVB_SP887X=m ++CONFIG_DVB_STV0367=m ++CONFIG_DVB_TDA10048=m ++CONFIG_DVB_TDA1004X=m ++CONFIG_DVB_ZD1301_DEMOD=m ++CONFIG_DVB_ZL10353=m ++CONFIG_DVB_CXD2880=m ++ ++# ++# DVB-C (cable) frontends ++# ++CONFIG_DVB_STV0297=m ++CONFIG_DVB_TDA10021=m ++CONFIG_DVB_TDA10023=m ++CONFIG_DVB_VES1820=m ++ ++# ++# ATSC (North American/Korean Terrestrial/Cable DTV) frontends ++# ++CONFIG_DVB_AU8522=m ++CONFIG_DVB_AU8522_DTV=m ++CONFIG_DVB_AU8522_V4L=m ++CONFIG_DVB_BCM3510=m ++CONFIG_DVB_LG2160=m ++CONFIG_DVB_LGDT3305=m ++CONFIG_DVB_LGDT3306A=m ++CONFIG_DVB_LGDT330X=m ++CONFIG_DVB_MXL692=m ++CONFIG_DVB_NXT200X=m ++CONFIG_DVB_OR51132=m ++CONFIG_DVB_OR51211=m ++CONFIG_DVB_S5H1409=m ++CONFIG_DVB_S5H1411=m ++ ++# ++# ISDB-T (terrestrial) frontends ++# ++CONFIG_DVB_DIB8000=m ++CONFIG_DVB_MB86A20S=m ++CONFIG_DVB_S921=m ++ ++# ++# ISDB-S (satellite) & ISDB-T (terrestrial) frontends ++# ++CONFIG_DVB_MN88443X=m ++CONFIG_DVB_TC90522=m ++ ++# ++# Digital terrestrial only tuners/PLL ++# ++CONFIG_DVB_PLL=m ++CONFIG_DVB_TUNER_DIB0070=m ++CONFIG_DVB_TUNER_DIB0090=m ++ ++# ++# SEC control devices for DVB-S ++# ++CONFIG_DVB_A8293=m ++CONFIG_DVB_AF9033=m ++CONFIG_DVB_ASCOT2E=m ++CONFIG_DVB_ATBM8830=m ++CONFIG_DVB_HELENE=m ++CONFIG_DVB_HORUS3A=m ++CONFIG_DVB_ISL6405=m ++CONFIG_DVB_ISL6421=m ++CONFIG_DVB_ISL6423=m ++CONFIG_DVB_IX2505V=m ++CONFIG_DVB_LGS8GL5=m ++CONFIG_DVB_LGS8GXX=m ++CONFIG_DVB_LNBH25=m ++CONFIG_DVB_LNBH29=m ++CONFIG_DVB_LNBP21=m ++CONFIG_DVB_LNBP22=m ++CONFIG_DVB_M88RS2000=m ++CONFIG_DVB_TDA665x=m ++CONFIG_DVB_DRX39XYJ=m ++ ++# ++# Common Interface (EN50221) controller drivers ++# ++CONFIG_DVB_CXD2099=m ++CONFIG_DVB_SP2=m ++# end of Customise DVB Frontends ++ ++# ++# Tools to develop new frontends ++# ++# CONFIG_DVB_DUMMY_FE is not set ++# end of Media ancillary drivers ++ ++# ++# Graphics support ++# ++CONFIG_APERTURE_HELPERS=y ++CONFIG_VIDEO=y ++CONFIG_AUXDISPLAY=y ++CONFIG_CHARLCD=m ++CONFIG_HD44780_COMMON=m ++CONFIG_HD44780=m ++# CONFIG_LCD2S is not set ++# CONFIG_PANEL_CHANGE_MESSAGE is not set ++# CONFIG_CHARLCD_BL_OFF is not set ++# CONFIG_CHARLCD_BL_ON is not set ++CONFIG_CHARLCD_BL_FLASH=y ++# CONFIG_IMG_ASCII_LCD is not set ++# CONFIG_HT16K33 is not set ++# CONFIG_MAX6959 is not set ++# CONFIG_SEG_LED_GPIO is not set ++CONFIG_DRM=m ++CONFIG_DRM_MIPI_DBI=m ++CONFIG_DRM_MIPI_DSI=y ++# CONFIG_DRM_DEBUG_MM is not set ++CONFIG_DRM_KMS_HELPER=m ++# CONFIG_DRM_PANIC is not set ++# CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set ++# CONFIG_DRM_DEBUG_MODESET_LOCK is not set ++CONFIG_DRM_CLIENT_SELECTION=y ++CONFIG_DRM_CLIENT_SETUP=y ++CONFIG_DRM_FBDEV_EMULATION=y ++CONFIG_DRM_FBDEV_OVERALLOC=100 ++# CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set ++CONFIG_DRM_LOAD_EDID_FIRMWARE=y ++CONFIG_DRM_DISPLAY_HELPER=m ++# CONFIG_DRM_DISPLAY_DP_AUX_CEC is not set ++# CONFIG_DRM_DISPLAY_DP_AUX_CHARDEV is not set ++CONFIG_DRM_DISPLAY_HDMI_HELPER=y ++CONFIG_DRM_DISPLAY_HDMI_STATE_HELPER=y ++CONFIG_DRM_TTM=m ++CONFIG_DRM_VRAM_HELPER=m ++CONFIG_DRM_TTM_HELPER=m ++CONFIG_DRM_GEM_DMA_HELPER=m ++CONFIG_DRM_GEM_SHMEM_HELPER=m ++CONFIG_DRM_SCHED=m ++ ++# ++# I2C encoder or helper chips ++# ++# CONFIG_DRM_I2C_CH7006 is not set ++# CONFIG_DRM_I2C_SIL164 is not set ++# CONFIG_DRM_I2C_NXP_TDA998X is not set ++# CONFIG_DRM_I2C_NXP_TDA9950 is not set ++# end of I2C encoder or helper chips ++ ++# ++# ARM devices ++# ++# CONFIG_DRM_HDLCD is not set ++# CONFIG_DRM_MALI_DISPLAY is not set ++# CONFIG_DRM_KOMEDA is not set ++# end of ARM devices ++ ++# CONFIG_DRM_RADEON is not set ++# CONFIG_DRM_AMDGPU is not set ++# CONFIG_DRM_NOUVEAU is not set ++# CONFIG_DRM_XE is not set ++# CONFIG_DRM_VGEM is not set ++# CONFIG_DRM_VKMS is not set ++# CONFIG_DRM_VMWGFX is not set ++CONFIG_DRM_UDL=m ++# CONFIG_DRM_AST is not set ++# CONFIG_DRM_MGAG200 is not set ++# CONFIG_DRM_QXL is not set ++# CONFIG_DRM_VIRTIO_GPU is not set ++CONFIG_DRM_PANEL=y ++ ++# ++# Display Panels ++# ++# CONFIG_DRM_PANEL_ABT_Y030XX067A is not set ++# CONFIG_DRM_PANEL_ARM_VERSATILE is not set ++# CONFIG_DRM_PANEL_ASUS_Z00T_TM5P5_NT35596 is not set ++# CONFIG_DRM_PANEL_AUO_A030JTN01 is not set ++# CONFIG_DRM_PANEL_BOE_BF060Y8M_AJ0 is not set ++# CONFIG_DRM_PANEL_BOE_HIMAX8279D is not set ++# CONFIG_DRM_PANEL_BOE_TH101MB31UIG002_28A is not set ++# CONFIG_DRM_PANEL_BOE_TV101WUM_NL6 is not set ++# CONFIG_DRM_PANEL_BOE_TV101WUM_LL2 is not set ++# CONFIG_DRM_PANEL_EBBG_FT8719 is not set ++# CONFIG_DRM_PANEL_ELIDA_KD35T133 is not set ++# CONFIG_DRM_PANEL_FEIXIN_K101_IM2BA02 is not set ++# CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D is not set ++# CONFIG_DRM_PANEL_DSI_CM is not set ++CONFIG_DRM_PANEL_LVDS=m ++# CONFIG_DRM_PANEL_HIMAX_HX83102 is not set ++# CONFIG_DRM_PANEL_HIMAX_HX83112A is not set ++# CONFIG_DRM_PANEL_HIMAX_HX8394 is not set ++# CONFIG_DRM_PANEL_ILITEK_IL9322 is not set ++# CONFIG_DRM_PANEL_ILITEK_ILI9341 is not set ++# CONFIG_DRM_PANEL_ILITEK_ILI9805 is not set ++CONFIG_DRM_PANEL_ILITEK_ILI9806E=m ++CONFIG_DRM_PANEL_ILITEK_ILI9806E_SPI=m ++CONFIG_DRM_PANEL_ILITEK_ILI9881C=m ++# CONFIG_DRM_PANEL_ILITEK_ILI9882T is not set ++# CONFIG_DRM_PANEL_INNOLUX_EJ030NA is not set ++# CONFIG_DRM_PANEL_INNOLUX_P079ZCA is not set ++# CONFIG_DRM_PANEL_JADARD_JD9365DA_H3 is not set ++# CONFIG_DRM_PANEL_JDI_LPM102A188A is not set ++CONFIG_DRM_PANEL_JDI_LT070ME05000=m ++# CONFIG_DRM_PANEL_JDI_R63452 is not set ++# CONFIG_DRM_PANEL_KHADAS_TS050 is not set ++# CONFIG_DRM_PANEL_KINGDISPLAY_KD097D04 is not set ++# CONFIG_DRM_PANEL_LEADTEK_LTK050H3146W is not set ++# CONFIG_DRM_PANEL_LEADTEK_LTK500HD1829 is not set ++# CONFIG_DRM_PANEL_LINCOLNTECH_LCD197 is not set ++# CONFIG_DRM_PANEL_LG_LB035Q02 is not set ++# CONFIG_DRM_PANEL_LG_LG4573 is not set ++# CONFIG_DRM_PANEL_LG_SW43408 is not set ++# CONFIG_DRM_PANEL_MAGNACHIP_D53E6EA8966 is not set ++# CONFIG_DRM_PANEL_MANTIX_MLAF057WE51 is not set ++# CONFIG_DRM_PANEL_NEC_NL8048HL11 is not set ++# CONFIG_DRM_PANEL_NEWVISION_NV3051D is not set ++# CONFIG_DRM_PANEL_NEWVISION_NV3052C is not set ++# CONFIG_DRM_PANEL_NOVATEK_NT35510 is not set ++# CONFIG_DRM_PANEL_NOVATEK_NT35560 is not set ++# CONFIG_DRM_PANEL_NOVATEK_NT35950 is not set ++# CONFIG_DRM_PANEL_NOVATEK_NT36523 is not set ++# CONFIG_DRM_PANEL_NOVATEK_NT36672A is not set ++# CONFIG_DRM_PANEL_NOVATEK_NT36672E is not set ++# CONFIG_DRM_PANEL_NOVATEK_NT39016 is not set ++# CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO is not set ++# CONFIG_DRM_PANEL_ORISETECH_OTA5601A is not set ++# CONFIG_DRM_PANEL_ORISETECH_OTM8009A is not set ++# CONFIG_DRM_PANEL_OSD_OSD101T2587_53TS is not set ++# CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00 is not set ++CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN=m ++# CONFIG_DRM_PANEL_RAYDIUM_RM67191 is not set ++# CONFIG_DRM_PANEL_RAYDIUM_RM68200 is not set ++# CONFIG_DRM_PANEL_RAYDIUM_RM692E5 is not set ++# CONFIG_DRM_PANEL_RAYDIUM_RM69380 is not set ++# CONFIG_DRM_PANEL_RONBO_RB070D30 is not set ++# CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01 is not set ++# CONFIG_DRM_PANEL_SAMSUNG_ATNA33XC20 is not set ++# CONFIG_DRM_PANEL_SAMSUNG_DB7430 is not set ++# CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set ++# CONFIG_DRM_PANEL_SAMSUNG_S6E3FA7 is not set ++# CONFIG_DRM_PANEL_SAMSUNG_S6D16D0 is not set ++# CONFIG_DRM_PANEL_SAMSUNG_S6D27A1 is not set ++# CONFIG_DRM_PANEL_SAMSUNG_S6D7AA0 is not set ++# CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2 is not set ++# CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03 is not set ++# CONFIG_DRM_PANEL_SAMSUNG_S6E63M0 is not set ++# CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set ++# CONFIG_DRM_PANEL_SAMSUNG_SOFEF00 is not set ++# CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set ++# CONFIG_DRM_PANEL_SHARP_LQ101R1SX01 is not set ++# CONFIG_DRM_PANEL_SHARP_LS037V7DW01 is not set ++# CONFIG_DRM_PANEL_SHARP_LS043T1LE01 is not set ++# CONFIG_DRM_PANEL_SHARP_LS060T1SX01 is not set ++CONFIG_DRM_PANEL_SITRONIX_ST7701=m ++# CONFIG_DRM_PANEL_SITRONIX_ST7703 is not set ++# CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set ++# CONFIG_DRM_PANEL_SONY_ACX565AKM is not set ++# CONFIG_DRM_PANEL_SONY_TD4353_JDI is not set ++# CONFIG_DRM_PANEL_SONY_TULIP_TRULY_NT35521 is not set ++# CONFIG_DRM_PANEL_STARTEK_KD070FHFID015 is not set ++# CONFIG_DRM_PANEL_EDP is not set ++CONFIG_DRM_PANEL_SIMPLE=m ++# CONFIG_DRM_PANEL_SYNAPTICS_R63353 is not set ++# CONFIG_DRM_PANEL_TDO_TL070WSH30 is not set ++CONFIG_DRM_PANEL_TPO_Y17P=m ++# CONFIG_DRM_PANEL_TPO_TD028TTEC1 is not set ++# CONFIG_DRM_PANEL_TPO_TD043MTEA1 is not set ++# CONFIG_DRM_PANEL_TPO_TPG110 is not set ++# CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA is not set ++# CONFIG_DRM_PANEL_VISIONOX_R66451 is not set ++# CONFIG_DRM_PANEL_VISIONOX_RM69299 is not set ++# CONFIG_DRM_PANEL_VISIONOX_VTDR6130 is not set ++CONFIG_DRM_PANEL_WAVESHARE_TOUCHSCREEN=m ++CONFIG_DRM_PANEL_WAVESHARE_TOUCHSCREEN_V2=m ++# CONFIG_DRM_PANEL_WIDECHIPS_WS2401 is not set ++# CONFIG_DRM_PANEL_XINPENG_XPP055C272 is not set ++# end of Display Panels ++ ++CONFIG_DRM_BRIDGE=y ++CONFIG_DRM_PANEL_BRIDGE=y ++ ++# ++# Display Interface Bridges ++# ++# CONFIG_DRM_CHIPONE_ICN6211 is not set ++# CONFIG_DRM_CHRONTEL_CH7033 is not set ++CONFIG_DRM_DISPLAY_CONNECTOR=m ++# CONFIG_DRM_ITE_IT6505 is not set ++# CONFIG_DRM_LONTIUM_LT8912B is not set ++# CONFIG_DRM_LONTIUM_LT9211 is not set ++# CONFIG_DRM_LONTIUM_LT9611 is not set ++# CONFIG_DRM_LONTIUM_LT9611UXC is not set ++# CONFIG_DRM_ITE_IT66121 is not set ++# CONFIG_DRM_LVDS_CODEC is not set ++# CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set ++# CONFIG_DRM_NWL_MIPI_DSI is not set ++# CONFIG_DRM_NXP_PTN3460 is not set ++# CONFIG_DRM_PARADE_PS8622 is not set ++# CONFIG_DRM_PARADE_PS8640 is not set ++# CONFIG_DRM_SAMSUNG_DSIM is not set ++# CONFIG_DRM_SIL_SII8620 is not set ++# CONFIG_DRM_SII902X is not set ++# CONFIG_DRM_SII9234 is not set ++CONFIG_DRM_SIMPLE_BRIDGE=m ++# CONFIG_DRM_THINE_THC63LVD1024 is not set ++CONFIG_DRM_TOSHIBA_TC358762=m ++# CONFIG_DRM_TOSHIBA_TC358764 is not set ++# CONFIG_DRM_TOSHIBA_TC358767 is not set ++# CONFIG_DRM_TOSHIBA_TC358768 is not set ++# CONFIG_DRM_TOSHIBA_TC358775 is not set ++# CONFIG_DRM_TI_DLPC3433 is not set ++# CONFIG_DRM_TI_TFP410 is not set ++CONFIG_DRM_TI_SN65DSI83=m ++# CONFIG_DRM_TI_SN65DSI86 is not set ++# CONFIG_DRM_TI_TPD12S015 is not set ++# CONFIG_DRM_ANALOGIX_ANX6345 is not set ++# CONFIG_DRM_ANALOGIX_ANX78XX is not set ++# CONFIG_DRM_ANALOGIX_ANX7625 is not set ++# CONFIG_DRM_I2C_ADV7511 is not set ++# CONFIG_DRM_CDNS_DSI is not set ++# CONFIG_DRM_CDNS_MHDP8546 is not set ++# end of Display Interface Bridges ++ ++CONFIG_DRM_V3D=m ++CONFIG_DRM_VC4=m ++CONFIG_DRM_VC4_HDMI_CEC=y ++CONFIG_DRM_RP1_DSI=m ++CONFIG_DRM_RP1_DPI=m ++CONFIG_DRM_RP1_VEC=m ++# CONFIG_DRM_ETNAVIV is not set ++# CONFIG_DRM_HISI_HIBMC is not set ++# CONFIG_DRM_HISI_KIRIN is not set ++# CONFIG_DRM_LOGICVC is not set ++# CONFIG_DRM_ARCPGU is not set ++# CONFIG_DRM_BOCHS is not set ++# CONFIG_DRM_CIRRUS_QEMU is not set ++# CONFIG_DRM_GM12U320 is not set ++CONFIG_DRM_PANEL_MIPI_DBI=m ++# CONFIG_DRM_SIMPLEDRM is not set ++CONFIG_TINYDRM_HX8357D=m ++# CONFIG_TINYDRM_ILI9163 is not set ++CONFIG_TINYDRM_ILI9225=m ++CONFIG_TINYDRM_ILI9341=m ++CONFIG_TINYDRM_ILI9486=m ++CONFIG_TINYDRM_MI0283QT=m ++CONFIG_TINYDRM_REPAPER=m ++CONFIG_TINYDRM_ST7586=m ++CONFIG_TINYDRM_ST7735R=m ++# CONFIG_DRM_PL111 is not set ++# CONFIG_DRM_LIMA is not set ++# CONFIG_DRM_PANFROST is not set ++# CONFIG_DRM_PANTHOR is not set ++# CONFIG_DRM_TIDSS is not set ++CONFIG_DRM_GUD=m ++CONFIG_DRM_SSD130X=m ++CONFIG_DRM_SSD130X_I2C=m ++CONFIG_DRM_SSD130X_SPI=m ++# CONFIG_DRM_POWERVR is not set ++# CONFIG_DRM_WERROR is not set ++CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=m ++ ++# ++# Frame buffer Devices ++# ++CONFIG_FB=y ++CONFIG_FB_BCM2708=y ++# CONFIG_FB_CIRRUS is not set ++# CONFIG_FB_PM2 is not set ++# CONFIG_FB_CYBER2000 is not set ++# CONFIG_FB_ASILIANT is not set ++# CONFIG_FB_IMSTT is not set ++# CONFIG_FB_UVESA is not set ++# CONFIG_FB_EFI is not set ++# CONFIG_FB_OPENCORES is not set ++# CONFIG_FB_S1D13XXX is not set ++# CONFIG_FB_NVIDIA is not set ++# CONFIG_FB_RIVA is not set ++# CONFIG_FB_I740 is not set ++# CONFIG_FB_MATROX is not set ++# CONFIG_FB_RADEON is not set ++# CONFIG_FB_ATY128 is not set ++# CONFIG_FB_ATY is not set ++# CONFIG_FB_S3 is not set ++# CONFIG_FB_SAVAGE is not set ++# CONFIG_FB_SIS is not set ++# CONFIG_FB_NEOMAGIC is not set ++# CONFIG_FB_KYRO is not set ++# CONFIG_FB_3DFX is not set ++# CONFIG_FB_VOODOO1 is not set ++# CONFIG_FB_VT8623 is not set ++# CONFIG_FB_TRIDENT is not set ++# CONFIG_FB_ARK is not set ++# CONFIG_FB_PM3 is not set ++# CONFIG_FB_CARMINE is not set ++# CONFIG_FB_SMSCUFX is not set ++# CONFIG_FB_UDL is not set ++# CONFIG_FB_IBM_GXT4500 is not set ++# CONFIG_FB_VIRTUAL is not set ++# CONFIG_FB_METRONOME is not set ++# CONFIG_FB_MB862XX is not set ++CONFIG_FB_SIMPLE=y ++CONFIG_FB_SSD1307=m ++# CONFIG_FB_SM712 is not set ++CONFIG_FB_RPISENSE=m ++CONFIG_FB_CORE=y ++CONFIG_FB_NOTIFY=y ++# CONFIG_FIRMWARE_EDID is not set ++CONFIG_FB_DEVICE=y ++CONFIG_FB_CFB_FILLRECT=y ++CONFIG_FB_CFB_COPYAREA=y ++CONFIG_FB_CFB_IMAGEBLIT=y ++CONFIG_FB_SYS_FILLRECT=y ++CONFIG_FB_SYS_COPYAREA=y ++CONFIG_FB_SYS_IMAGEBLIT=y ++# CONFIG_FB_FOREIGN_ENDIAN is not set ++CONFIG_FB_SYSMEM_FOPS=y ++CONFIG_FB_DEFERRED_IO=y ++CONFIG_FB_DMAMEM_HELPERS=y ++CONFIG_FB_DMAMEM_HELPERS_DEFERRED=y ++CONFIG_FB_IOMEM_FOPS=y ++CONFIG_FB_IOMEM_HELPERS=y ++CONFIG_FB_SYSMEM_HELPERS=y ++CONFIG_FB_SYSMEM_HELPERS_DEFERRED=y ++CONFIG_FB_BACKLIGHT=m ++# CONFIG_FB_MODE_HELPERS is not set ++# CONFIG_FB_TILEBLITTING is not set ++# end of Frame buffer Devices ++ ++# ++# Backlight & LCD device support ++# ++# CONFIG_LCD_CLASS_DEVICE is not set ++CONFIG_BACKLIGHT_CLASS_DEVICE=m ++# CONFIG_BACKLIGHT_KTD253 is not set ++# CONFIG_BACKLIGHT_KTD2801 is not set ++# CONFIG_BACKLIGHT_KTZ8866 is not set ++CONFIG_BACKLIGHT_PWM=m ++CONFIG_BACKLIGHT_RPI=m ++# CONFIG_BACKLIGHT_QCOM_WLED is not set ++# CONFIG_BACKLIGHT_ADP8860 is not set ++# CONFIG_BACKLIGHT_ADP8870 is not set ++# CONFIG_BACKLIGHT_LM3509 is not set ++CONFIG_BACKLIGHT_LM3630A=m ++# CONFIG_BACKLIGHT_LM3639 is not set ++# CONFIG_BACKLIGHT_LP855X is not set ++# CONFIG_BACKLIGHT_MP3309C is not set ++CONFIG_BACKLIGHT_GPIO=m ++# CONFIG_BACKLIGHT_LV5207LP is not set ++# CONFIG_BACKLIGHT_BD6107 is not set ++# CONFIG_BACKLIGHT_ARCXCNN is not set ++# CONFIG_BACKLIGHT_LED is not set ++# end of Backlight & LCD device support ++ ++CONFIG_VIDEOMODE_HELPERS=y ++CONFIG_HDMI=y ++ ++# ++# Console display driver support ++# ++CONFIG_DUMMY_CONSOLE=y ++CONFIG_DUMMY_CONSOLE_COLUMNS=80 ++CONFIG_DUMMY_CONSOLE_ROWS=25 ++CONFIG_FRAMEBUFFER_CONSOLE=y ++# CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION is not set ++CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y ++CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y ++# CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set ++# end of Console display driver support ++ ++CONFIG_LOGO=y ++# CONFIG_LOGO_LINUX_MONO is not set ++# CONFIG_LOGO_LINUX_VGA16 is not set ++CONFIG_LOGO_LINUX_CLUT224=y ++# end of Graphics support ++ ++# CONFIG_DRM_ACCEL is not set ++CONFIG_SOUND=y ++CONFIG_SOUND_OSS_CORE=y ++CONFIG_SOUND_OSS_CORE_PRECLAIM=y ++CONFIG_SND=m ++CONFIG_SND_TIMER=m ++CONFIG_SND_PCM=m ++CONFIG_SND_PCM_ELD=y ++CONFIG_SND_PCM_IEC958=y ++CONFIG_SND_DMAENGINE_PCM=m ++CONFIG_SND_HWDEP=m ++CONFIG_SND_SEQ_DEVICE=m ++CONFIG_SND_RAWMIDI=m ++CONFIG_SND_COMPRESS_OFFLOAD=m ++CONFIG_SND_JACK=y ++CONFIG_SND_JACK_INPUT_DEV=y ++CONFIG_SND_OSSEMUL=y ++# CONFIG_SND_MIXER_OSS is not set ++CONFIG_SND_PCM_OSS=m ++CONFIG_SND_PCM_OSS_PLUGINS=y ++CONFIG_SND_PCM_TIMER=y ++CONFIG_SND_HRTIMER=m ++CONFIG_SND_DYNAMIC_MINORS=y ++CONFIG_SND_MAX_CARDS=32 ++CONFIG_SND_SUPPORT_OLD_API=y ++CONFIG_SND_PROC_FS=y ++CONFIG_SND_VERBOSE_PROCFS=y ++CONFIG_SND_CTL_FAST_LOOKUP=y ++# CONFIG_SND_DEBUG is not set ++# CONFIG_SND_CTL_INPUT_VALIDATION is not set ++# CONFIG_SND_UTIMER is not set ++CONFIG_SND_VMASTER=y ++CONFIG_SND_SEQUENCER=m ++CONFIG_SND_SEQ_DUMMY=m ++# CONFIG_SND_SEQUENCER_OSS is not set ++CONFIG_SND_SEQ_HRTIMER_DEFAULT=y ++CONFIG_SND_SEQ_MIDI_EVENT=m ++CONFIG_SND_SEQ_MIDI=m ++CONFIG_SND_SEQ_VIRMIDI=m ++# CONFIG_SND_SEQ_UMP is not set ++CONFIG_SND_MPU401_UART=m ++CONFIG_SND_DRIVERS=y ++CONFIG_SND_DUMMY=m ++CONFIG_SND_ALOOP=m ++# CONFIG_SND_PCMTEST is not set ++CONFIG_SND_VIRMIDI=m ++CONFIG_SND_MTPAV=m ++CONFIG_SND_SERIAL_U16550=m ++# CONFIG_SND_SERIAL_GENERIC is not set ++CONFIG_SND_MPU401=m ++CONFIG_SND_PIMIDI=m ++CONFIG_SND_PISOUND_MICRO=m ++CONFIG_SND_PCI=y ++# CONFIG_SND_AD1889 is not set ++# CONFIG_SND_ALS300 is not set ++# CONFIG_SND_ALI5451 is not set ++# CONFIG_SND_ATIIXP is not set ++# CONFIG_SND_ATIIXP_MODEM is not set ++# CONFIG_SND_AU8810 is not set ++# CONFIG_SND_AU8820 is not set ++# CONFIG_SND_AU8830 is not set ++# CONFIG_SND_AW2 is not set ++# CONFIG_SND_AZT3328 is not set ++# CONFIG_SND_BT87X is not set ++# CONFIG_SND_CA0106 is not set ++# CONFIG_SND_CMIPCI is not set ++# CONFIG_SND_OXYGEN is not set ++# CONFIG_SND_CS4281 is not set ++# CONFIG_SND_CS46XX is not set ++# CONFIG_SND_CTXFI is not set ++# CONFIG_SND_DARLA20 is not set ++# CONFIG_SND_GINA20 is not set ++# CONFIG_SND_LAYLA20 is not set ++# CONFIG_SND_DARLA24 is not set ++# CONFIG_SND_GINA24 is not set ++# CONFIG_SND_LAYLA24 is not set ++# CONFIG_SND_MONA is not set ++# CONFIG_SND_MIA is not set ++# CONFIG_SND_ECHO3G is not set ++# CONFIG_SND_INDIGO is not set ++# CONFIG_SND_INDIGOIO is not set ++# CONFIG_SND_INDIGODJ is not set ++# CONFIG_SND_INDIGOIOX is not set ++# CONFIG_SND_INDIGODJX is not set ++# CONFIG_SND_EMU10K1 is not set ++# CONFIG_SND_EMU10K1X is not set ++# CONFIG_SND_ENS1370 is not set ++# CONFIG_SND_ENS1371 is not set ++# CONFIG_SND_ES1938 is not set ++# CONFIG_SND_ES1968 is not set ++# CONFIG_SND_FM801 is not set ++# CONFIG_SND_HDSP is not set ++# CONFIG_SND_HDSPM is not set ++# CONFIG_SND_ICE1712 is not set ++# CONFIG_SND_ICE1724 is not set ++# CONFIG_SND_INTEL8X0 is not set ++# CONFIG_SND_INTEL8X0M is not set ++# CONFIG_SND_KORG1212 is not set ++# CONFIG_SND_LOLA is not set ++# CONFIG_SND_LX6464ES is not set ++# CONFIG_SND_MAESTRO3 is not set ++# CONFIG_SND_MIXART is not set ++# CONFIG_SND_NM256 is not set ++# CONFIG_SND_PCXHR is not set ++# CONFIG_SND_RIPTIDE is not set ++# CONFIG_SND_RME32 is not set ++# CONFIG_SND_RME96 is not set ++# CONFIG_SND_RME9652 is not set ++# CONFIG_SND_SE6X is not set ++# CONFIG_SND_SONICVIBES is not set ++# CONFIG_SND_TRIDENT is not set ++# CONFIG_SND_VIA82XX is not set ++# CONFIG_SND_VIA82XX_MODEM is not set ++# CONFIG_SND_VIRTUOSO is not set ++# CONFIG_SND_VX222 is not set ++# CONFIG_SND_YMFPCI is not set ++ ++# ++# HD-Audio ++# ++# CONFIG_SND_HDA_INTEL is not set ++# end of HD-Audio ++ ++CONFIG_SND_HDA_PREALLOC_SIZE=64 ++CONFIG_SND_SPI=y ++CONFIG_SND_USB=y ++CONFIG_SND_USB_AUDIO=m ++# CONFIG_SND_USB_AUDIO_MIDI_V2 is not set ++CONFIG_SND_USB_AUDIO_USE_MEDIA_CONTROLLER=y ++CONFIG_SND_USB_UA101=m ++CONFIG_SND_USB_CAIAQ=m ++CONFIG_SND_USB_CAIAQ_INPUT=y ++CONFIG_SND_USB_6FIRE=m ++CONFIG_SND_USB_HIFACE=m ++# CONFIG_SND_BCD2000 is not set ++CONFIG_SND_USB_LINE6=m ++# CONFIG_SND_USB_POD is not set ++# CONFIG_SND_USB_PODHD is not set ++CONFIG_SND_USB_TONEPORT=m ++# CONFIG_SND_USB_VARIAX is not set ++CONFIG_SND_SOC=m ++CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y ++CONFIG_SND_SOC_COMPRESS=y ++# CONFIG_SND_SOC_ADI is not set ++# CONFIG_SND_SOC_AMD_ACP is not set ++# CONFIG_SND_AMD_ACP_CONFIG is not set ++# CONFIG_SND_ATMEL_SOC is not set ++CONFIG_SND_BCM2835_SOC_I2S=m ++# CONFIG_SND_BCM63XX_I2S_WHISTLER is not set ++CONFIG_SND_BCM2708_SOC_CHIPDIP_DAC=m ++CONFIG_SND_BCM2708_SOC_GOOGLEVOICEHAT_SOUNDCARD=m ++CONFIG_SND_BCM2708_SOC_HIFIBERRY_ADC=m ++# CONFIG_SND_BCM2708_SOC_HIFIBERRY_ADC8X is not set ++CONFIG_SND_BCM2708_SOC_HIFIBERRY_DAC=m ++CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUS=m ++CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUSHD=m ++CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUSADC=m ++CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUSADCPRO=m ++CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUSDSP=m ++CONFIG_SND_BCM2708_SOC_HIFIBERRY_DIGI=m ++CONFIG_SND_BCM2708_SOC_HIFIBERRY_AMP=m ++CONFIG_SND_BCM2708_SOC_PIFI_40=m ++CONFIG_SND_BCM2708_SOC_RPI_CIRRUS=m ++CONFIG_SND_BCM2708_SOC_RPI_DAC=m ++CONFIG_SND_BCM2708_SOC_RPI_PROTO=m ++CONFIG_SND_BCM2708_SOC_JUSTBOOM_BOTH=m ++CONFIG_SND_BCM2708_SOC_JUSTBOOM_DAC=m ++CONFIG_SND_BCM2708_SOC_JUSTBOOM_DIGI=m ++CONFIG_SND_BCM2708_SOC_IQAUDIO_CODEC=m ++CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC=m ++CONFIG_SND_BCM2708_SOC_IQAUDIO_DIGI=m ++CONFIG_SND_BCM2708_SOC_I_SABRE_Q2M=m ++CONFIG_SND_BCM2708_SOC_ADAU1977_ADC=m ++CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD=m ++CONFIG_SND_AUDIOINJECTOR_OCTO_SOUNDCARD=m ++CONFIG_SND_AUDIOINJECTOR_ISOLATED_SOUNDCARD=m ++CONFIG_SND_AUDIOSENSE_PI=m ++CONFIG_SND_DIGIDAC1_SOUNDCARD=m ++CONFIG_SND_BCM2708_SOC_DIONAUDIO_LOCO=m ++CONFIG_SND_BCM2708_SOC_DIONAUDIO_LOCO_V2=m ++CONFIG_SND_BCM2708_SOC_ALLO_PIANO_DAC=m ++CONFIG_SND_BCM2708_SOC_ALLO_PIANO_DAC_PLUS=m ++CONFIG_SND_BCM2708_SOC_ALLO_BOSS_DAC=m ++CONFIG_SND_BCM2708_SOC_ALLO_BOSS2_DAC=m ++CONFIG_SND_BCM2708_SOC_ALLO_DIGIONE=m ++CONFIG_SND_BCM2708_SOC_ALLO_KATANA_DAC=m ++CONFIG_SND_BCM2708_SOC_FE_PI_AUDIO=m ++CONFIG_SND_PISOUND=m ++CONFIG_SND_RPI_SIMPLE_SOUNDCARD=m ++CONFIG_SND_RPI_WM8804_SOUNDCARD=m ++CONFIG_SND_DACBERRY400=m ++CONFIG_SND_DESIGNWARE_I2S=m ++CONFIG_SND_DESIGNWARE_PCM=y ++ ++# ++# SoC Audio for Freescale CPUs ++# ++ ++# ++# Common SoC Audio options for Freescale CPUs: ++# ++# CONFIG_SND_SOC_FSL_ASRC is not set ++# CONFIG_SND_SOC_FSL_SAI is not set ++# CONFIG_SND_SOC_FSL_AUDMIX is not set ++# CONFIG_SND_SOC_FSL_SSI is not set ++# CONFIG_SND_SOC_FSL_SPDIF is not set ++# CONFIG_SND_SOC_FSL_ESAI is not set ++# CONFIG_SND_SOC_FSL_MICFIL is not set ++# CONFIG_SND_SOC_FSL_XCVR is not set ++# CONFIG_SND_SOC_IMX_AUDMUX is not set ++# end of SoC Audio for Freescale CPUs ++ ++# CONFIG_SND_SOC_CHV3_I2S is not set ++# CONFIG_SND_I2S_HI6210_I2S is not set ++# CONFIG_SND_SOC_IMG is not set ++# CONFIG_SND_SOC_MTK_BTCVSD is not set ++CONFIG_SND_RP1_AUDIO_OUT=m ++# CONFIG_SND_SOC_SOF_TOPLEVEL is not set ++ ++# ++# STMicroelectronics STM32 SOC audio support ++# ++# end of STMicroelectronics STM32 SOC audio support ++ ++# CONFIG_SND_SOC_XILINX_I2S is not set ++# CONFIG_SND_SOC_XILINX_AUDIO_FORMATTER is not set ++# CONFIG_SND_SOC_XILINX_SPDIF is not set ++# CONFIG_SND_SOC_XTFPGA_I2S is not set ++CONFIG_SND_SOC_I2C_AND_SPI=m ++ ++# ++# CODEC drivers ++# ++CONFIG_SND_SOC_ARIZONA=m ++CONFIG_SND_SOC_WM_ADSP=m ++# CONFIG_SND_SOC_AC97_CODEC is not set ++CONFIG_SND_SOC_AD193X=m ++CONFIG_SND_SOC_AD193X_SPI=m ++CONFIG_SND_SOC_AD193X_I2C=m ++# CONFIG_SND_SOC_ADAU1372_I2C is not set ++# CONFIG_SND_SOC_ADAU1372_SPI is not set ++CONFIG_SND_SOC_ADAU1701=m ++# CONFIG_SND_SOC_ADAU1761_I2C is not set ++# CONFIG_SND_SOC_ADAU1761_SPI is not set ++CONFIG_SND_SOC_ADAU1977=m ++CONFIG_SND_SOC_ADAU1977_I2C=m ++CONFIG_SND_SOC_ADAU7002=m ++# CONFIG_SND_SOC_ADAU7118_HW is not set ++# CONFIG_SND_SOC_ADAU7118_I2C is not set ++# CONFIG_SND_SOC_AK4104 is not set ++# CONFIG_SND_SOC_AK4118 is not set ++# CONFIG_SND_SOC_AK4375 is not set ++# CONFIG_SND_SOC_AK4458 is not set ++CONFIG_SND_SOC_AK4554=m ++# CONFIG_SND_SOC_AK4613 is not set ++# CONFIG_SND_SOC_AK4619 is not set ++# CONFIG_SND_SOC_AK4642 is not set ++# CONFIG_SND_SOC_AK5386 is not set ++# CONFIG_SND_SOC_AK5558 is not set ++# CONFIG_SND_SOC_ALC5623 is not set ++# CONFIG_SND_SOC_AUDIO_IIO_AUX is not set ++# CONFIG_SND_SOC_AW8738 is not set ++# CONFIG_SND_SOC_AW88395 is not set ++# CONFIG_SND_SOC_AW88261 is not set ++# CONFIG_SND_SOC_AW87390 is not set ++# CONFIG_SND_SOC_AW88399 is not set ++# CONFIG_SND_SOC_BD28623 is not set ++# CONFIG_SND_SOC_BT_SCO is not set ++# CONFIG_SND_SOC_CHV3_CODEC is not set ++# CONFIG_SND_SOC_CS35L32 is not set ++# CONFIG_SND_SOC_CS35L33 is not set ++# CONFIG_SND_SOC_CS35L34 is not set ++# CONFIG_SND_SOC_CS35L35 is not set ++# CONFIG_SND_SOC_CS35L36 is not set ++# CONFIG_SND_SOC_CS35L41_SPI is not set ++# CONFIG_SND_SOC_CS35L41_I2C is not set ++# CONFIG_SND_SOC_CS35L45_SPI is not set ++# CONFIG_SND_SOC_CS35L45_I2C is not set ++# CONFIG_SND_SOC_CS35L56_I2C is not set ++# CONFIG_SND_SOC_CS35L56_SPI is not set ++# CONFIG_SND_SOC_CS42L42 is not set ++# CONFIG_SND_SOC_CS42L51_I2C is not set ++# CONFIG_SND_SOC_CS42L52 is not set ++# CONFIG_SND_SOC_CS42L56 is not set ++# CONFIG_SND_SOC_CS42L73 is not set ++# CONFIG_SND_SOC_CS42L83 is not set ++# CONFIG_SND_SOC_CS4234 is not set ++CONFIG_SND_SOC_CS4265=m ++# CONFIG_SND_SOC_CS4270 is not set ++CONFIG_SND_SOC_CS4271=m ++CONFIG_SND_SOC_CS4271_I2C=m ++# CONFIG_SND_SOC_CS4271_SPI is not set ++CONFIG_SND_SOC_CS42XX8=m ++CONFIG_SND_SOC_CS42XX8_I2C=m ++# CONFIG_SND_SOC_CS43130 is not set ++# CONFIG_SND_SOC_CS4341 is not set ++# CONFIG_SND_SOC_CS4349 is not set ++# CONFIG_SND_SOC_CS53L30 is not set ++# CONFIG_SND_SOC_CS530X_I2C is not set ++# CONFIG_SND_SOC_CX2072X is not set ++CONFIG_SND_SOC_DA7213=m ++CONFIG_SND_SOC_DMIC=m ++CONFIG_SND_SOC_HDMI_CODEC=m ++# CONFIG_SND_SOC_ES7134 is not set ++# CONFIG_SND_SOC_ES7241 is not set ++# CONFIG_SND_SOC_ES8311 is not set ++# CONFIG_SND_SOC_ES8316 is not set ++# CONFIG_SND_SOC_ES8326 is not set ++# CONFIG_SND_SOC_ES8328_I2C is not set ++# CONFIG_SND_SOC_ES8328_SPI is not set ++# CONFIG_SND_SOC_GTM601 is not set ++# CONFIG_SND_SOC_HDA is not set ++CONFIG_SND_SOC_ICS43432=m ++# CONFIG_SND_SOC_IDT821034 is not set ++CONFIG_SND_SOC_MA120X0P=m ++# CONFIG_SND_SOC_MAX98088 is not set ++# CONFIG_SND_SOC_MAX98090 is not set ++CONFIG_SND_SOC_MAX98357A=m ++# CONFIG_SND_SOC_MAX98504 is not set ++# CONFIG_SND_SOC_MAX9867 is not set ++# CONFIG_SND_SOC_MAX98927 is not set ++# CONFIG_SND_SOC_MAX98520 is not set ++# CONFIG_SND_SOC_MAX98373_I2C is not set ++# CONFIG_SND_SOC_MAX98388 is not set ++# CONFIG_SND_SOC_MAX98390 is not set ++# CONFIG_SND_SOC_MAX98396 is not set ++# CONFIG_SND_SOC_MAX9860 is not set ++# CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set ++# CONFIG_SND_SOC_PCM1681 is not set ++# CONFIG_SND_SOC_PCM1789_I2C is not set ++CONFIG_SND_SOC_PCM179X=m ++CONFIG_SND_SOC_PCM179X_I2C=m ++# CONFIG_SND_SOC_PCM179X_SPI is not set ++CONFIG_SND_SOC_PCM186X=m ++CONFIG_SND_SOC_PCM186X_I2C=m ++# CONFIG_SND_SOC_PCM186X_SPI is not set ++# CONFIG_SND_SOC_PCM3060_I2C is not set ++# CONFIG_SND_SOC_PCM3060_SPI is not set ++CONFIG_SND_SOC_PCM3168A=m ++CONFIG_SND_SOC_PCM3168A_I2C=m ++# CONFIG_SND_SOC_PCM3168A_SPI is not set ++CONFIG_SND_SOC_PCM5102A=m ++CONFIG_SND_SOC_PCM512x=m ++CONFIG_SND_SOC_PCM512x_I2C=m ++# CONFIG_SND_SOC_PCM512x_SPI is not set ++# CONFIG_SND_SOC_PCM6240 is not set ++# CONFIG_SND_SOC_PEB2466 is not set ++# CONFIG_SND_SOC_RT5616 is not set ++CONFIG_SND_SOC_PCM1794A=m ++# CONFIG_SND_SOC_RT5631 is not set ++# CONFIG_SND_SOC_RT5640 is not set ++# CONFIG_SND_SOC_RT5659 is not set ++# CONFIG_SND_SOC_RT9120 is not set ++# CONFIG_SND_SOC_RTQ9128 is not set ++CONFIG_SND_SOC_SGTL5000=m ++CONFIG_SND_SOC_SIGMADSP=m ++CONFIG_SND_SOC_SIGMADSP_I2C=m ++# CONFIG_SND_SOC_SIMPLE_AMPLIFIER is not set ++# CONFIG_SND_SOC_SIMPLE_MUX is not set ++# CONFIG_SND_SOC_SMA1303 is not set ++CONFIG_SND_SOC_SPDIF=m ++# CONFIG_SND_SOC_SRC4XXX_I2C is not set ++# CONFIG_SND_SOC_SSM2305 is not set ++# CONFIG_SND_SOC_SSM2518 is not set ++# CONFIG_SND_SOC_SSM2602_SPI is not set ++# CONFIG_SND_SOC_SSM2602_I2C is not set ++# CONFIG_SND_SOC_SSM3515 is not set ++# CONFIG_SND_SOC_SSM4567 is not set ++# CONFIG_SND_SOC_STA32X is not set ++# CONFIG_SND_SOC_STA350 is not set ++# CONFIG_SND_SOC_STI_SAS is not set ++# CONFIG_SND_SOC_TAS2552 is not set ++# CONFIG_SND_SOC_TAS2562 is not set ++# CONFIG_SND_SOC_TAS2764 is not set ++# CONFIG_SND_SOC_TAS2770 is not set ++# CONFIG_SND_SOC_TAS2780 is not set ++# CONFIG_SND_SOC_TAS2781_I2C is not set ++# CONFIG_SND_SOC_TAS5086 is not set ++CONFIG_SND_SOC_TAS571X=m ++# CONFIG_SND_SOC_TAS5720 is not set ++# CONFIG_SND_SOC_TAS5805M is not set ++# CONFIG_SND_SOC_TAS6424 is not set ++# CONFIG_SND_SOC_TDA7419 is not set ++# CONFIG_SND_SOC_TFA9879 is not set ++CONFIG_SND_SOC_TAS5713=m ++# CONFIG_SND_SOC_TFA989X is not set ++# CONFIG_SND_SOC_TLV320ADC3XXX is not set ++CONFIG_SND_SOC_TLV320AIC23=m ++CONFIG_SND_SOC_TLV320AIC23_I2C=m ++# CONFIG_SND_SOC_TLV320AIC23_SPI is not set ++# CONFIG_SND_SOC_TLV320AIC31XX is not set ++CONFIG_SND_SOC_TLV320AIC32X4=m ++CONFIG_SND_SOC_TLV320AIC32X4_I2C=m ++# CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set ++CONFIG_SND_SOC_TLV320AIC3X=m ++CONFIG_SND_SOC_TLV320AIC3X_I2C=m ++# CONFIG_SND_SOC_TLV320AIC3X_SPI is not set ++# CONFIG_SND_SOC_TLV320ADCX140 is not set ++# CONFIG_SND_SOC_TS3A227E is not set ++# CONFIG_SND_SOC_TSCS42XX is not set ++# CONFIG_SND_SOC_TSCS454 is not set ++# CONFIG_SND_SOC_UDA1334 is not set ++CONFIG_SND_SOC_WM5102=m ++# CONFIG_SND_SOC_WM8510 is not set ++# CONFIG_SND_SOC_WM8523 is not set ++# CONFIG_SND_SOC_WM8524 is not set ++# CONFIG_SND_SOC_WM8580 is not set ++# CONFIG_SND_SOC_WM8711 is not set ++# CONFIG_SND_SOC_WM8728 is not set ++CONFIG_SND_SOC_WM8731=m ++CONFIG_SND_SOC_WM8731_I2C=m ++# CONFIG_SND_SOC_WM8731_SPI is not set ++# CONFIG_SND_SOC_WM8737 is not set ++CONFIG_SND_SOC_WM8741=m ++# CONFIG_SND_SOC_WM8750 is not set ++# CONFIG_SND_SOC_WM8753 is not set ++# CONFIG_SND_SOC_WM8770 is not set ++# CONFIG_SND_SOC_WM8776 is not set ++# CONFIG_SND_SOC_WM8782 is not set ++CONFIG_SND_SOC_WM8804=m ++CONFIG_SND_SOC_WM8804_I2C=m ++# CONFIG_SND_SOC_WM8804_SPI is not set ++# CONFIG_SND_SOC_WM8903 is not set ++CONFIG_SND_SOC_WM8904=m ++# CONFIG_SND_SOC_WM8940 is not set ++CONFIG_SND_SOC_WM8960=m ++# CONFIG_SND_SOC_WM8961 is not set ++# CONFIG_SND_SOC_WM8962 is not set ++# CONFIG_SND_SOC_WM8974 is not set ++# CONFIG_SND_SOC_WM8978 is not set ++# CONFIG_SND_SOC_WM8985 is not set ++# CONFIG_SND_SOC_ZL38060 is not set ++# CONFIG_SND_SOC_MAX9759 is not set ++# CONFIG_SND_SOC_MT6351 is not set ++# CONFIG_SND_SOC_MT6357 is not set ++# CONFIG_SND_SOC_MT6358 is not set ++# CONFIG_SND_SOC_MT6660 is not set ++# CONFIG_SND_SOC_NAU8315 is not set ++# CONFIG_SND_SOC_NAU8540 is not set ++# CONFIG_SND_SOC_NAU8810 is not set ++# CONFIG_SND_SOC_NAU8821 is not set ++# CONFIG_SND_SOC_NAU8822 is not set ++# CONFIG_SND_SOC_NAU8824 is not set ++CONFIG_SND_SOC_TPA6130A2=m ++# CONFIG_SND_SOC_LPASS_WSA_MACRO is not set ++# CONFIG_SND_SOC_LPASS_VA_MACRO is not set ++# CONFIG_SND_SOC_LPASS_RX_MACRO is not set ++# CONFIG_SND_SOC_LPASS_TX_MACRO is not set ++CONFIG_SND_SOC_I_SABRE_CODEC=m ++# end of CODEC drivers ++ ++CONFIG_SND_SIMPLE_CARD_UTILS=m ++CONFIG_SND_SIMPLE_CARD=m ++CONFIG_SND_AUDIO_GRAPH_CARD=m ++# CONFIG_SND_AUDIO_GRAPH_CARD2 is not set ++# CONFIG_SND_TEST_COMPONENT is not set ++CONFIG_HID_SUPPORT=y ++CONFIG_HID=y ++CONFIG_HID_BATTERY_STRENGTH=y ++CONFIG_HIDRAW=y ++CONFIG_UHID=m ++CONFIG_HID_GENERIC=y ++ ++# ++# Special HID drivers ++# ++CONFIG_HID_A4TECH=m ++# CONFIG_HID_ACCUTOUCH is not set ++CONFIG_HID_ACRUX=m ++# CONFIG_HID_ACRUX_FF is not set ++CONFIG_HID_APPLE=m ++# CONFIG_HID_APPLEIR is not set ++CONFIG_HID_ASUS=m ++# CONFIG_HID_AUREAL is not set ++CONFIG_HID_BELKIN=m ++CONFIG_HID_BETOP_FF=m ++CONFIG_HID_BIGBEN_FF=m ++CONFIG_HID_CHERRY=m ++CONFIG_HID_CHICONY=m ++# CONFIG_HID_CORSAIR is not set ++# CONFIG_HID_COUGAR is not set ++# CONFIG_HID_MACALLY is not set ++# CONFIG_HID_PRODIKEYS is not set ++# CONFIG_HID_CMEDIA is not set ++# CONFIG_HID_CP2112 is not set ++# CONFIG_HID_CREATIVE_SB0540 is not set ++CONFIG_HID_CYPRESS=m ++CONFIG_HID_DRAGONRISE=m ++# CONFIG_DRAGONRISE_FF is not set ++CONFIG_HID_EMS_FF=m ++# CONFIG_HID_ELAN is not set ++CONFIG_HID_ELECOM=m ++CONFIG_HID_ELO=m ++# CONFIG_HID_EVISION is not set ++CONFIG_HID_EZKEY=m ++# CONFIG_HID_FT260 is not set ++CONFIG_HID_GEMBIRD=m ++# CONFIG_HID_GFRM is not set ++# CONFIG_HID_GLORIOUS is not set ++CONFIG_HID_HOLTEK=m ++# CONFIG_HOLTEK_FF is not set ++# CONFIG_HID_GOODIX_SPI is not set ++# CONFIG_HID_GOOGLE_STADIA_FF is not set ++# CONFIG_HID_VIVALDI is not set ++# CONFIG_HID_GT683R is not set ++CONFIG_HID_KEYTOUCH=m ++CONFIG_HID_KYE=m ++CONFIG_HID_UCLOGIC=m ++CONFIG_HID_WALTOP=m ++# CONFIG_HID_VIEWSONIC is not set ++# CONFIG_HID_VRC2 is not set ++# CONFIG_HID_XIAOMI is not set ++CONFIG_HID_GYRATION=m ++# CONFIG_HID_ICADE is not set ++# CONFIG_HID_ITE is not set ++# CONFIG_HID_JABRA is not set ++CONFIG_HID_TWINHAN=m ++CONFIG_HID_KENSINGTON=m ++CONFIG_HID_LCPOWER=m ++CONFIG_HID_LED=m ++# CONFIG_HID_LENOVO is not set ++# CONFIG_HID_LETSKETCH is not set ++CONFIG_HID_LOGITECH=m ++CONFIG_HID_LOGITECH_DJ=m ++CONFIG_HID_LOGITECH_HIDPP=m ++CONFIG_LOGITECH_FF=y ++CONFIG_LOGIRUMBLEPAD2_FF=y ++CONFIG_LOGIG940_FF=y ++CONFIG_LOGIWHEELS_FF=y ++CONFIG_HID_MAGICMOUSE=m ++# CONFIG_HID_MALTRON is not set ++# CONFIG_HID_MAYFLASH is not set ++# CONFIG_HID_MEGAWORLD_FF is not set ++# CONFIG_HID_REDRAGON is not set ++CONFIG_HID_MICROSOFT=m ++CONFIG_HID_MONTEREY=m ++CONFIG_HID_MULTITOUCH=m ++CONFIG_HID_NINTENDO=m ++CONFIG_NINTENDO_FF=y ++# CONFIG_HID_NTI is not set ++CONFIG_HID_NTRIG=m ++# CONFIG_HID_NVIDIA_SHIELD is not set ++CONFIG_HID_ORTEK=m ++CONFIG_HID_PANTHERLORD=m ++# CONFIG_PANTHERLORD_FF is not set ++# CONFIG_HID_PENMOUNT is not set ++CONFIG_HID_PETALYNX=m ++CONFIG_HID_PICOLCD=m ++# CONFIG_HID_PICOLCD_FB is not set ++# CONFIG_HID_PICOLCD_BACKLIGHT is not set ++# CONFIG_HID_PICOLCD_LEDS is not set ++# CONFIG_HID_PICOLCD_CIR is not set ++# CONFIG_HID_PLANTRONICS is not set ++CONFIG_HID_PLAYSTATION=m ++CONFIG_PLAYSTATION_FF=y ++# CONFIG_HID_PXRC is not set ++# CONFIG_HID_RAZER is not set ++# CONFIG_HID_PRIMAX is not set ++# CONFIG_HID_RETRODE is not set ++CONFIG_HID_ROCCAT=m ++# CONFIG_HID_SAITEK is not set ++CONFIG_HID_SAMSUNG=m ++# CONFIG_HID_SEMITEK is not set ++# CONFIG_HID_SIGMAMICRO is not set ++CONFIG_HID_SONY=m ++CONFIG_SONY_FF=y ++CONFIG_HID_SPEEDLINK=m ++CONFIG_HID_STEAM=m ++# CONFIG_STEAM_FF is not set ++# CONFIG_HID_STEELSERIES is not set ++CONFIG_HID_SUNPLUS=m ++# CONFIG_HID_RMI is not set ++CONFIG_HID_GREENASIA=m ++# CONFIG_GREENASIA_FF is not set ++CONFIG_HID_SMARTJOYPLUS=m ++# CONFIG_SMARTJOYPLUS_FF is not set ++# CONFIG_HID_TIVO is not set ++CONFIG_HID_TOPSEED=m ++# CONFIG_HID_TOPRE is not set ++CONFIG_HID_THINGM=m ++CONFIG_HID_THRUSTMASTER=m ++# CONFIG_THRUSTMASTER_FF is not set ++# CONFIG_HID_UDRAW_PS3 is not set ++# CONFIG_HID_U2FZERO is not set ++# CONFIG_HID_UNIVERSAL_PIDFF is not set ++CONFIG_HID_WACOM=m ++CONFIG_HID_WIIMOTE=m ++# CONFIG_HID_WINWING is not set ++CONFIG_HID_XINMO=m ++CONFIG_HID_ZEROPLUS=m ++# CONFIG_ZEROPLUS_FF is not set ++CONFIG_HID_ZYDACRON=m ++# CONFIG_HID_SENSOR_HUB is not set ++# CONFIG_HID_ALPS is not set ++# CONFIG_HID_MCP2200 is not set ++# CONFIG_HID_MCP2221 is not set ++# end of Special HID drivers ++ ++# ++# HID-BPF support ++# ++# CONFIG_HID_BPF is not set ++# end of HID-BPF support ++ ++# ++# USB HID support ++# ++CONFIG_USB_HID=y ++CONFIG_HID_PID=y ++CONFIG_USB_HIDDEV=y ++# end of USB HID support ++ ++CONFIG_I2C_HID=y ++CONFIG_I2C_HID_OF=m ++# CONFIG_I2C_HID_OF_ELAN is not set ++# CONFIG_I2C_HID_OF_GOODIX is not set ++CONFIG_I2C_HID_CORE=m ++CONFIG_USB_OHCI_LITTLE_ENDIAN=y ++CONFIG_USB_SUPPORT=y ++CONFIG_USB_COMMON=y ++# CONFIG_USB_LED_TRIG is not set ++# CONFIG_USB_ULPI_BUS is not set ++# CONFIG_USB_CONN_GPIO is not set ++CONFIG_USB_ARCH_HAS_HCD=y ++CONFIG_USB=y ++CONFIG_USB_PCI=y ++# CONFIG_USB_PCI_AMD is not set ++CONFIG_USB_ANNOUNCE_NEW_DEVICES=y ++ ++# ++# Miscellaneous USB options ++# ++CONFIG_USB_DEFAULT_PERSIST=y ++# CONFIG_USB_FEW_INIT_RETRIES is not set ++# CONFIG_USB_DYNAMIC_MINORS is not set ++# CONFIG_USB_OTG is not set ++# CONFIG_USB_OTG_PRODUCTLIST is not set ++# CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set ++# CONFIG_USB_LEDS_TRIGGER_USBPORT is not set ++CONFIG_USB_AUTOSUSPEND_DELAY=2 ++CONFIG_USB_DEFAULT_AUTHORIZATION_MODE=1 ++CONFIG_USB_MON=m ++ ++# ++# USB Host Controller Drivers ++# ++# CONFIG_USB_C67X00_HCD is not set ++CONFIG_USB_XHCI_HCD=y ++# CONFIG_USB_XHCI_DBGCAP is not set ++CONFIG_USB_XHCI_PCI=y ++CONFIG_USB_XHCI_PCI_RENESAS=m ++CONFIG_USB_XHCI_PLATFORM=y ++# CONFIG_USB_BRCMSTB is not set ++# CONFIG_USB_EHCI_HCD is not set ++# CONFIG_USB_OXU210HP_HCD is not set ++# CONFIG_USB_ISP116X_HCD is not set ++# CONFIG_USB_MAX3421_HCD is not set ++# CONFIG_USB_OHCI_HCD is not set ++# CONFIG_USB_UHCI_HCD is not set ++# CONFIG_USB_SL811_HCD is not set ++# CONFIG_USB_R8A66597_HCD is not set ++CONFIG_USB_DWCOTG=y ++# CONFIG_USB_HCD_BCMA is not set ++# CONFIG_USB_HCD_SSB is not set ++# CONFIG_USB_HCD_TEST_MODE is not set ++ ++# ++# USB Device Class drivers ++# ++CONFIG_USB_ACM=m ++CONFIG_USB_PRINTER=m ++CONFIG_USB_WDM=m ++CONFIG_USB_TMC=m ++ ++# ++# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may ++# ++ ++# ++# also be needed; see USB_STORAGE Help for more info ++# ++CONFIG_USB_STORAGE=y ++# CONFIG_USB_STORAGE_DEBUG is not set ++CONFIG_USB_STORAGE_REALTEK=m ++CONFIG_REALTEK_AUTOPM=y ++CONFIG_USB_STORAGE_DATAFAB=m ++CONFIG_USB_STORAGE_FREECOM=m ++CONFIG_USB_STORAGE_ISD200=m ++CONFIG_USB_STORAGE_USBAT=m ++CONFIG_USB_STORAGE_SDDR09=m ++CONFIG_USB_STORAGE_SDDR55=m ++CONFIG_USB_STORAGE_JUMPSHOT=m ++CONFIG_USB_STORAGE_ALAUDA=m ++CONFIG_USB_STORAGE_ONETOUCH=m ++CONFIG_USB_STORAGE_KARMA=m ++CONFIG_USB_STORAGE_CYPRESS_ATACB=m ++CONFIG_USB_STORAGE_ENE_UB6250=m ++CONFIG_USB_UAS=y ++ ++# ++# USB Imaging devices ++# ++CONFIG_USB_MDC800=m ++CONFIG_USB_MICROTEK=m ++CONFIG_USBIP_CORE=m ++CONFIG_USBIP_VHCI_HCD=m ++CONFIG_USBIP_VHCI_HC_PORTS=8 ++CONFIG_USBIP_VHCI_NR_HCS=1 ++CONFIG_USBIP_HOST=m ++CONFIG_USBIP_VUDC=m ++# CONFIG_USBIP_DEBUG is not set ++ ++# ++# USB dual-mode controller drivers ++# ++# CONFIG_USB_CDNS_SUPPORT is not set ++# CONFIG_USB_MUSB_HDRC is not set ++CONFIG_USB_DWC3=y ++# CONFIG_USB_DWC3_HOST is not set ++# CONFIG_USB_DWC3_GADGET is not set ++CONFIG_USB_DWC3_DUAL_ROLE=y ++ ++# ++# Platform Glue Driver Support ++# ++CONFIG_USB_DWC3_HAPS=y ++CONFIG_USB_DWC3_OF_SIMPLE=y ++CONFIG_USB_DWC2=y ++# CONFIG_USB_DWC2_HOST is not set ++ ++# ++# Gadget/Dual-role mode requires USB Gadget support to be enabled ++# ++# CONFIG_USB_DWC2_PERIPHERAL is not set ++CONFIG_USB_DWC2_DUAL_ROLE=y ++# CONFIG_USB_DWC2_PCI is not set ++# CONFIG_USB_DWC2_DEBUG is not set ++# CONFIG_USB_DWC2_TRACK_MISSED_SOFS is not set ++# CONFIG_USB_CHIPIDEA is not set ++# CONFIG_USB_ISP1760 is not set ++ ++# ++# USB port drivers ++# ++CONFIG_USB_SERIAL=m ++CONFIG_USB_SERIAL_GENERIC=y ++CONFIG_USB_SERIAL_SIMPLE=m ++CONFIG_USB_SERIAL_AIRCABLE=m ++CONFIG_USB_SERIAL_ARK3116=m ++CONFIG_USB_SERIAL_BELKIN=m ++CONFIG_USB_SERIAL_CH341=m ++CONFIG_USB_SERIAL_WHITEHEAT=m ++CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m ++CONFIG_USB_SERIAL_CP210X=m ++CONFIG_USB_SERIAL_CYPRESS_M8=m ++CONFIG_USB_SERIAL_EMPEG=m ++CONFIG_USB_SERIAL_FTDI_SIO=m ++CONFIG_USB_SERIAL_VISOR=m ++CONFIG_USB_SERIAL_IPAQ=m ++CONFIG_USB_SERIAL_IR=m ++CONFIG_USB_SERIAL_EDGEPORT=m ++CONFIG_USB_SERIAL_EDGEPORT_TI=m ++CONFIG_USB_SERIAL_F81232=m ++CONFIG_USB_SERIAL_F8153X=m ++CONFIG_USB_SERIAL_GARMIN=m ++CONFIG_USB_SERIAL_IPW=m ++CONFIG_USB_SERIAL_IUU=m ++CONFIG_USB_SERIAL_KEYSPAN_PDA=m ++CONFIG_USB_SERIAL_KEYSPAN=m ++CONFIG_USB_SERIAL_KLSI=m ++CONFIG_USB_SERIAL_KOBIL_SCT=m ++CONFIG_USB_SERIAL_MCT_U232=m ++CONFIG_USB_SERIAL_METRO=m ++CONFIG_USB_SERIAL_MOS7720=m ++CONFIG_USB_SERIAL_MOS7840=m ++CONFIG_USB_SERIAL_MXUPORT=m ++CONFIG_USB_SERIAL_NAVMAN=m ++CONFIG_USB_SERIAL_PL2303=m ++CONFIG_USB_SERIAL_OTI6858=m ++CONFIG_USB_SERIAL_QCAUX=m ++CONFIG_USB_SERIAL_QUALCOMM=m ++CONFIG_USB_SERIAL_SPCP8X5=m ++CONFIG_USB_SERIAL_SAFE=m ++# CONFIG_USB_SERIAL_SAFE_PADDED is not set ++CONFIG_USB_SERIAL_SIERRAWIRELESS=m ++CONFIG_USB_SERIAL_SYMBOL=m ++CONFIG_USB_SERIAL_TI=m ++CONFIG_USB_SERIAL_CYBERJACK=m ++CONFIG_USB_SERIAL_WWAN=m ++CONFIG_USB_SERIAL_OPTION=m ++CONFIG_USB_SERIAL_OMNINET=m ++CONFIG_USB_SERIAL_OPTICON=m ++CONFIG_USB_SERIAL_XSENS_MT=m ++CONFIG_USB_SERIAL_WISHBONE=m ++CONFIG_USB_SERIAL_SSU100=m ++CONFIG_USB_SERIAL_QT2=m ++CONFIG_USB_SERIAL_UPD78F0730=m ++CONFIG_USB_SERIAL_XR=m ++CONFIG_USB_SERIAL_DEBUG=m ++ ++# ++# USB Miscellaneous drivers ++# ++CONFIG_USB_EMI62=m ++CONFIG_USB_EMI26=m ++CONFIG_USB_ADUTUX=m ++CONFIG_USB_SEVSEG=m ++CONFIG_USB_LEGOTOWER=m ++CONFIG_USB_LCD=m ++CONFIG_USB_CYPRESS_CY7C63=m ++CONFIG_USB_CYTHERM=m ++CONFIG_USB_IDMOUSE=m ++CONFIG_USB_APPLEDISPLAY=m ++# CONFIG_APPLE_MFI_FASTCHARGE is not set ++CONFIG_USB_LD=m ++CONFIG_USB_TRANCEVIBRATOR=m ++CONFIG_USB_IOWARRIOR=m ++CONFIG_USB_TEST=m ++# CONFIG_USB_EHSET_TEST_FIXTURE is not set ++CONFIG_USB_ISIGHTFW=m ++CONFIG_USB_YUREX=m ++CONFIG_USB_EZUSB_FX2=m ++# CONFIG_USB_HUB_USB251XB is not set ++# CONFIG_USB_HSIC_USB3503 is not set ++# CONFIG_USB_HSIC_USB4604 is not set ++# CONFIG_USB_LINK_LAYER_TEST is not set ++# CONFIG_USB_CHAOSKEY is not set ++CONFIG_BRCM_USB_PINMAP=y ++# CONFIG_USB_ONBOARD_DEV is not set ++CONFIG_USB_ATM=m ++CONFIG_USB_SPEEDTOUCH=m ++CONFIG_USB_CXACRU=m ++CONFIG_USB_UEAGLEATM=m ++CONFIG_USB_XUSBATM=m ++ ++# ++# USB Physical Layer drivers ++# ++CONFIG_USB_PHY=y ++CONFIG_NOP_USB_XCEIV=y ++# CONFIG_USB_GPIO_VBUS is not set ++# CONFIG_USB_ISP1301 is not set ++# CONFIG_USB_ULPI is not set ++# end of USB Physical Layer drivers ++ ++CONFIG_USB_GADGET=y ++# CONFIG_USB_GADGET_DEBUG is not set ++# CONFIG_USB_GADGET_DEBUG_FILES is not set ++# CONFIG_USB_GADGET_DEBUG_FS is not set ++CONFIG_USB_GADGET_VBUS_DRAW=2 ++CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 ++# CONFIG_U_SERIAL_CONSOLE is not set ++ ++# ++# USB Peripheral Controller ++# ++# CONFIG_USB_GR_UDC is not set ++# CONFIG_USB_R8A66597 is not set ++# CONFIG_USB_PXA27X is not set ++# CONFIG_USB_MV_UDC is not set ++# CONFIG_USB_MV_U3D is not set ++# CONFIG_USB_SNP_UDC_PLAT is not set ++# CONFIG_USB_M66592 is not set ++CONFIG_USB_BDC_UDC=y ++# CONFIG_USB_AMD5536UDC is not set ++# CONFIG_USB_NET2272 is not set ++# CONFIG_USB_NET2280 is not set ++# CONFIG_USB_GOKU is not set ++# CONFIG_USB_EG20T is not set ++# CONFIG_USB_GADGET_XILINX is not set ++# CONFIG_USB_MAX3420_UDC is not set ++# CONFIG_USB_DUMMY_HCD is not set ++# end of USB Peripheral Controller ++ ++CONFIG_USB_LIBCOMPOSITE=m ++CONFIG_USB_F_ACM=m ++CONFIG_USB_F_SS_LB=m ++CONFIG_USB_U_SERIAL=m ++CONFIG_USB_U_ETHER=m ++CONFIG_USB_U_AUDIO=m ++CONFIG_USB_F_SERIAL=m ++CONFIG_USB_F_OBEX=m ++CONFIG_USB_F_NCM=m ++CONFIG_USB_F_ECM=m ++CONFIG_USB_F_EEM=m ++CONFIG_USB_F_SUBSET=m ++CONFIG_USB_F_RNDIS=m ++CONFIG_USB_F_MASS_STORAGE=m ++CONFIG_USB_F_FS=m ++CONFIG_USB_F_UAC1=m ++CONFIG_USB_F_UAC2=m ++CONFIG_USB_F_UVC=m ++CONFIG_USB_F_MIDI=m ++CONFIG_USB_F_HID=m ++CONFIG_USB_F_PRINTER=m ++CONFIG_USB_CONFIGFS=m ++CONFIG_USB_CONFIGFS_SERIAL=y ++CONFIG_USB_CONFIGFS_ACM=y ++CONFIG_USB_CONFIGFS_OBEX=y ++CONFIG_USB_CONFIGFS_NCM=y ++CONFIG_USB_CONFIGFS_ECM=y ++CONFIG_USB_CONFIGFS_ECM_SUBSET=y ++CONFIG_USB_CONFIGFS_RNDIS=y ++CONFIG_USB_CONFIGFS_EEM=y ++CONFIG_USB_CONFIGFS_MASS_STORAGE=y ++CONFIG_USB_CONFIGFS_F_LB_SS=y ++CONFIG_USB_CONFIGFS_F_FS=y ++CONFIG_USB_CONFIGFS_F_UAC1=y ++# CONFIG_USB_CONFIGFS_F_UAC1_LEGACY is not set ++CONFIG_USB_CONFIGFS_F_UAC2=y ++CONFIG_USB_CONFIGFS_F_MIDI=y ++# CONFIG_USB_CONFIGFS_F_MIDI2 is not set ++CONFIG_USB_CONFIGFS_F_HID=y ++CONFIG_USB_CONFIGFS_F_UVC=y ++CONFIG_USB_CONFIGFS_F_PRINTER=y ++ ++# ++# USB Gadget precomposed configurations ++# ++CONFIG_USB_ZERO=m ++CONFIG_USB_AUDIO=m ++# CONFIG_GADGET_UAC1 is not set ++CONFIG_USB_ETH=m ++CONFIG_USB_ETH_RNDIS=y ++# CONFIG_USB_ETH_EEM is not set ++# CONFIG_USB_G_NCM is not set ++CONFIG_USB_GADGETFS=m ++# CONFIG_USB_FUNCTIONFS is not set ++CONFIG_USB_MASS_STORAGE=m ++CONFIG_USB_G_SERIAL=m ++CONFIG_USB_MIDI_GADGET=m ++CONFIG_USB_G_PRINTER=m ++CONFIG_USB_CDC_COMPOSITE=m ++CONFIG_USB_G_ACM_MS=m ++CONFIG_USB_G_MULTI=m ++CONFIG_USB_G_MULTI_RNDIS=y ++# CONFIG_USB_G_MULTI_CDC is not set ++CONFIG_USB_G_HID=m ++# CONFIG_USB_G_DBGP is not set ++CONFIG_USB_G_WEBCAM=m ++# CONFIG_USB_RAW_GADGET is not set ++# end of USB Gadget precomposed configurations ++ ++# CONFIG_TYPEC is not set ++CONFIG_USB_ROLE_SWITCH=y ++CONFIG_MMC=y ++CONFIG_PWRSEQ_EMMC=y ++# CONFIG_PWRSEQ_SD8787 is not set ++CONFIG_PWRSEQ_SIMPLE=y ++CONFIG_MMC_BLOCK=y ++CONFIG_MMC_BLOCK_MINORS=32 ++# CONFIG_SDIO_UART is not set ++# CONFIG_MMC_TEST is not set ++ ++# ++# MMC/SD/SDIO Host Controller Drivers ++# ++CONFIG_MMC_BCM2835_MMC=y ++CONFIG_MMC_BCM2835_DMA=y ++CONFIG_MMC_BCM2835_PIO_DMA_BARRIER=2 ++# CONFIG_MMC_BCM2835_SDHOST is not set ++# CONFIG_MMC_DEBUG is not set ++# CONFIG_MMC_ARMMMCI is not set ++CONFIG_MMC_SDHCI=y ++CONFIG_MMC_SDHCI_IO_ACCESSORS=y ++# CONFIG_MMC_SDHCI_PCI is not set ++CONFIG_MMC_SDHCI_PLTFM=y ++# CONFIG_MMC_SDHCI_OF_ARASAN is not set ++# CONFIG_MMC_SDHCI_OF_AT91 is not set ++CONFIG_MMC_SDHCI_OF_DWCMSHC=m ++# CONFIG_MMC_SDHCI_CADENCE is not set ++# CONFIG_MMC_SDHCI_F_SDH30 is not set ++# CONFIG_MMC_SDHCI_MILBEAUT is not set ++CONFIG_MMC_SDHCI_IPROC=y ++# CONFIG_MMC_TIFM_SD is not set ++CONFIG_MMC_SPI=m ++# CONFIG_MMC_CB710 is not set ++# CONFIG_MMC_VIA_SDMMC is not set ++# CONFIG_MMC_DW is not set ++# CONFIG_MMC_VUB300 is not set ++# CONFIG_MMC_USHC is not set ++# CONFIG_MMC_USDHI6ROL0 is not set ++CONFIG_MMC_CQHCI=y ++CONFIG_MMC_HSQ=y ++# CONFIG_MMC_TOSHIBA_PCI is not set ++CONFIG_MMC_BCM2835=y ++# CONFIG_MMC_MTK is not set ++CONFIG_MMC_SDHCI_BRCMSTB=y ++# CONFIG_MMC_SDHCI_XENON is not set ++# CONFIG_SCSI_UFSHCD is not set ++# CONFIG_MEMSTICK is not set ++CONFIG_NEW_LEDS=y ++CONFIG_LEDS_CLASS=y ++# CONFIG_LEDS_CLASS_FLASH is not set ++CONFIG_LEDS_CLASS_MULTICOLOR=m ++# CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set ++ ++# ++# LED drivers ++# ++# CONFIG_LEDS_AN30259A is not set ++# CONFIG_LEDS_AW200XX is not set ++# CONFIG_LEDS_AW2013 is not set ++# CONFIG_LEDS_BCM6328 is not set ++# CONFIG_LEDS_BCM6358 is not set ++# CONFIG_LEDS_CR0014114 is not set ++# CONFIG_LEDS_EL15203000 is not set ++# CONFIG_LEDS_LM3530 is not set ++# CONFIG_LEDS_LM3532 is not set ++# CONFIG_LEDS_LM3642 is not set ++# CONFIG_LEDS_LM3692X is not set ++CONFIG_LEDS_PCA9532=m ++# CONFIG_LEDS_PCA9532_GPIO is not set ++CONFIG_LEDS_GPIO=y ++# CONFIG_LEDS_LP3944 is not set ++# CONFIG_LEDS_LP3952 is not set ++# CONFIG_LEDS_LP50XX is not set ++# CONFIG_LEDS_LP55XX_COMMON is not set ++# CONFIG_LEDS_LP8860 is not set ++CONFIG_LEDS_PCA955X=m ++# CONFIG_LEDS_PCA955X_GPIO is not set ++CONFIG_LEDS_PCA963X=m ++# CONFIG_LEDS_PCA995X is not set ++# CONFIG_LEDS_DAC124S085 is not set ++CONFIG_LEDS_PWM=y ++# CONFIG_LEDS_REGULATOR is not set ++# CONFIG_LEDS_BD2606MVV is not set ++# CONFIG_LEDS_BD2802 is not set ++# CONFIG_LEDS_LT3593 is not set ++# CONFIG_LEDS_TCA6507 is not set ++# CONFIG_LEDS_TLC591XX is not set ++# CONFIG_LEDS_LM355x is not set ++# CONFIG_LEDS_IS31FL319X is not set ++CONFIG_LEDS_IS31FL32XX=m ++ ++# ++# LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) ++# ++# CONFIG_LEDS_BLINKM is not set ++# CONFIG_LEDS_SYSCON is not set ++# CONFIG_LEDS_MLXREG is not set ++# CONFIG_LEDS_USER is not set ++# CONFIG_LEDS_SPI_BYTE is not set ++# CONFIG_LEDS_LM3697 is not set ++ ++# ++# Flash and Torch LED drivers ++# ++ ++# ++# RGB LED drivers ++# ++# CONFIG_LEDS_GROUP_MULTICOLOR is not set ++# CONFIG_LEDS_KTD202X is not set ++# CONFIG_LEDS_NCP5623 is not set ++# CONFIG_LEDS_PWM_MULTICOLOR is not set ++ ++# ++# LED Triggers ++# ++CONFIG_LEDS_TRIGGERS=y ++CONFIG_LEDS_TRIGGER_TIMER=y ++CONFIG_LEDS_TRIGGER_ONESHOT=y ++# CONFIG_LEDS_TRIGGER_DISK is not set ++# CONFIG_LEDS_TRIGGER_MTD is not set ++CONFIG_LEDS_TRIGGER_HEARTBEAT=y ++CONFIG_LEDS_TRIGGER_BACKLIGHT=y ++CONFIG_LEDS_TRIGGER_CPU=y ++# CONFIG_LEDS_TRIGGER_ACTIVITY is not set ++# CONFIG_LEDS_TRIGGER_GPIO is not set ++CONFIG_LEDS_TRIGGER_DEFAULT_ON=y ++ ++# ++# iptables trigger is under Netfilter config (LED target) ++# ++CONFIG_LEDS_TRIGGER_TRANSIENT=m ++CONFIG_LEDS_TRIGGER_CAMERA=m ++CONFIG_LEDS_TRIGGER_INPUT=y ++CONFIG_LEDS_TRIGGER_PANIC=y ++CONFIG_LEDS_TRIGGER_NETDEV=m ++CONFIG_LEDS_TRIGGER_PATTERN=m ++# CONFIG_LEDS_TRIGGER_TTY is not set ++# CONFIG_LEDS_TRIGGER_INPUT_EVENTS is not set ++CONFIG_LEDS_TRIGGER_ACTPWR=y ++ ++# ++# Simple LED drivers ++# ++CONFIG_ACCESSIBILITY=y ++# CONFIG_A11Y_BRAILLE_CONSOLE is not set ++ ++# ++# Speakup console speech ++# ++CONFIG_SPEAKUP=m ++# CONFIG_SPEAKUP_SYNTH_ACNTSA is not set ++# CONFIG_SPEAKUP_SYNTH_APOLLO is not set ++# CONFIG_SPEAKUP_SYNTH_AUDPTR is not set ++# CONFIG_SPEAKUP_SYNTH_BNS is not set ++# CONFIG_SPEAKUP_SYNTH_DECTLK is not set ++# CONFIG_SPEAKUP_SYNTH_DECEXT is not set ++# CONFIG_SPEAKUP_SYNTH_LTLK is not set ++CONFIG_SPEAKUP_SYNTH_SOFT=m ++# CONFIG_SPEAKUP_SYNTH_SPKOUT is not set ++# CONFIG_SPEAKUP_SYNTH_TXPRT is not set ++# CONFIG_SPEAKUP_SYNTH_DUMMY is not set ++# end of Speakup console speech ++ ++# CONFIG_INFINIBAND is not set ++CONFIG_EDAC_SUPPORT=y ++# CONFIG_EDAC is not set ++CONFIG_RTC_LIB=y ++CONFIG_RTC_CLASS=y ++CONFIG_RTC_HCTOSYS=y ++CONFIG_RTC_HCTOSYS_DEVICE="rtc0" ++CONFIG_RTC_SYSTOHC=y ++CONFIG_RTC_SYSTOHC_DEVICE="rtc0" ++# CONFIG_RTC_DEBUG is not set ++CONFIG_RTC_NVMEM=y ++ ++# ++# RTC interfaces ++# ++CONFIG_RTC_INTF_SYSFS=y ++CONFIG_RTC_INTF_PROC=y ++CONFIG_RTC_INTF_DEV=y ++# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set ++# CONFIG_RTC_DRV_TEST is not set ++ ++# ++# I2C RTC drivers ++# ++# CONFIG_RTC_DRV_ABB5ZES3 is not set ++# CONFIG_RTC_DRV_ABEOZ9 is not set ++CONFIG_RTC_DRV_ABX80X=m ++CONFIG_RTC_DRV_RPI=y ++CONFIG_RTC_DRV_BRCMSTB=y ++CONFIG_RTC_DRV_DS1307=m ++# CONFIG_RTC_DRV_DS1307_CENTURY is not set ++CONFIG_RTC_DRV_DS1374=m ++# CONFIG_RTC_DRV_DS1374_WDT is not set ++CONFIG_RTC_DRV_DS1672=m ++# CONFIG_RTC_DRV_HYM8563 is not set ++CONFIG_RTC_DRV_MAX6900=m ++# CONFIG_RTC_DRV_MAX31335 is not set ++# CONFIG_RTC_DRV_NCT3018Y is not set ++CONFIG_RTC_DRV_RS5C372=m ++CONFIG_RTC_DRV_ISL1208=m ++CONFIG_RTC_DRV_ISL12022=m ++# CONFIG_RTC_DRV_ISL12026 is not set ++CONFIG_RTC_DRV_X1205=m ++CONFIG_RTC_DRV_PCF8523=m ++CONFIG_RTC_DRV_PCF85063=m ++CONFIG_RTC_DRV_PCF85363=m ++CONFIG_RTC_DRV_PCF8563=m ++CONFIG_RTC_DRV_PCF8583=m ++CONFIG_RTC_DRV_M41T80=m ++# CONFIG_RTC_DRV_M41T80_WDT is not set ++CONFIG_RTC_DRV_BQ32K=m ++CONFIG_RTC_DRV_S35390A=m ++CONFIG_RTC_DRV_FM3130=m ++# CONFIG_RTC_DRV_RX8010 is not set ++# CONFIG_RTC_DRV_RX8111 is not set ++CONFIG_RTC_DRV_RX8581=m ++CONFIG_RTC_DRV_RX8025=m ++CONFIG_RTC_DRV_EM3027=m ++CONFIG_RTC_DRV_RV3028=m ++CONFIG_RTC_DRV_RV3032=m ++CONFIG_RTC_DRV_RV8803=m ++# CONFIG_RTC_DRV_SD2405AL is not set ++CONFIG_RTC_DRV_SD3078=m ++ ++# ++# SPI RTC drivers ++# ++CONFIG_RTC_DRV_M41T93=m ++CONFIG_RTC_DRV_M41T94=m ++CONFIG_RTC_DRV_DS1302=m ++CONFIG_RTC_DRV_DS1305=m ++# CONFIG_RTC_DRV_DS1343 is not set ++# CONFIG_RTC_DRV_DS1347 is not set ++CONFIG_RTC_DRV_DS1390=m ++# CONFIG_RTC_DRV_MAX6916 is not set ++CONFIG_RTC_DRV_R9701=m ++CONFIG_RTC_DRV_RX4581=m ++CONFIG_RTC_DRV_RS5C348=m ++CONFIG_RTC_DRV_MAX6902=m ++CONFIG_RTC_DRV_PCF2123=m ++# CONFIG_RTC_DRV_MCP795 is not set ++CONFIG_RTC_I2C_AND_SPI=y ++ ++# ++# SPI and I2C RTC drivers ++# ++CONFIG_RTC_DRV_DS3232=m ++CONFIG_RTC_DRV_DS3232_HWMON=y ++CONFIG_RTC_DRV_PCF2127=m ++CONFIG_RTC_DRV_RV3029C2=m ++CONFIG_RTC_DRV_RV3029_HWMON=y ++# CONFIG_RTC_DRV_RX6110 is not set ++ ++# ++# Platform RTC drivers ++# ++# CONFIG_RTC_DRV_DS1286 is not set ++# CONFIG_RTC_DRV_DS1511 is not set ++# CONFIG_RTC_DRV_DS1553 is not set ++# CONFIG_RTC_DRV_DS1685_FAMILY is not set ++# CONFIG_RTC_DRV_DS1742 is not set ++# CONFIG_RTC_DRV_DS2404 is not set ++# CONFIG_RTC_DRV_EFI is not set ++# CONFIG_RTC_DRV_STK17TA8 is not set ++# CONFIG_RTC_DRV_M48T86 is not set ++# CONFIG_RTC_DRV_M48T35 is not set ++# CONFIG_RTC_DRV_M48T59 is not set ++# CONFIG_RTC_DRV_MSM6242 is not set ++# CONFIG_RTC_DRV_RP5C01 is not set ++# CONFIG_RTC_DRV_ZYNQMP is not set ++ ++# ++# on-CPU RTC drivers ++# ++# CONFIG_RTC_DRV_PL030 is not set ++# CONFIG_RTC_DRV_PL031 is not set ++# CONFIG_RTC_DRV_CADENCE is not set ++# CONFIG_RTC_DRV_FTRTC010 is not set ++# CONFIG_RTC_DRV_R7301 is not set ++ ++# ++# HID Sensor RTC drivers ++# ++# CONFIG_RTC_DRV_GOLDFISH is not set ++CONFIG_DMADEVICES=y ++# CONFIG_DMADEVICES_DEBUG is not set ++ ++# ++# DMA Devices ++# ++CONFIG_DMA_ENGINE=y ++CONFIG_DMA_VIRTUAL_CHANNELS=y ++CONFIG_DMA_OF=y ++# CONFIG_ALTERA_MSGDMA is not set ++# CONFIG_AMBA_PL08X is not set ++# CONFIG_BCM_SBA_RAID is not set ++CONFIG_DMA_BCM2835=y ++CONFIG_DW_AXI_DMAC=y ++# CONFIG_FSL_EDMA is not set ++# CONFIG_FSL_QDMA is not set ++# CONFIG_INTEL_IDMA64 is not set ++# CONFIG_MV_XOR_V2 is not set ++# CONFIG_PL330_DMA is not set ++# CONFIG_PLX_DMA is not set ++CONFIG_DMA_BCM2708=y ++# CONFIG_XILINX_DMA is not set ++# CONFIG_XILINX_XDMA is not set ++# CONFIG_XILINX_ZYNQMP_DMA is not set ++# CONFIG_XILINX_ZYNQMP_DPDMA is not set ++# CONFIG_AMD_QDMA is not set ++# CONFIG_QCOM_HIDMA_MGMT is not set ++# CONFIG_QCOM_HIDMA is not set ++# CONFIG_DW_DMAC is not set ++# CONFIG_DW_DMAC_PCI is not set ++# CONFIG_DW_EDMA is not set ++# CONFIG_SF_PDMA is not set ++ ++# ++# DMA Clients ++# ++# CONFIG_ASYNC_TX_DMA is not set ++# CONFIG_DMATEST is not set ++ ++# ++# DMABUF options ++# ++CONFIG_SYNC_FILE=y ++# CONFIG_SW_SYNC is not set ++CONFIG_UDMABUF=y ++# CONFIG_DMABUF_MOVE_NOTIFY is not set ++# CONFIG_DMABUF_DEBUG is not set ++# CONFIG_DMABUF_SELFTESTS is not set ++CONFIG_DMABUF_HEAPS=y ++# CONFIG_DMABUF_SYSFS_STATS is not set ++CONFIG_DMABUF_HEAPS_SYSTEM=y ++CONFIG_DMABUF_HEAPS_CMA=y ++# end of DMABUF options ++ ++CONFIG_UIO=m ++# CONFIG_UIO_CIF is not set ++CONFIG_UIO_PDRV_GENIRQ=m ++# CONFIG_UIO_DMEM_GENIRQ is not set ++# CONFIG_UIO_AEC is not set ++# CONFIG_UIO_SERCOS3 is not set ++# CONFIG_UIO_PCI_GENERIC is not set ++# CONFIG_UIO_NETX is not set ++# CONFIG_UIO_MF624 is not set ++# CONFIG_VFIO is not set ++CONFIG_IRQ_BYPASS_MANAGER=y ++# CONFIG_VIRT_DRIVERS is not set ++CONFIG_VIRTIO_MENU=y ++# CONFIG_VIRTIO_PCI is not set ++# CONFIG_VIRTIO_MMIO is not set ++# CONFIG_VDPA is not set ++CONFIG_VHOST_IOTLB=m ++CONFIG_VHOST_TASK=y ++CONFIG_VHOST=m ++CONFIG_VHOST_MENU=y ++CONFIG_VHOST_NET=m ++CONFIG_VHOST_VSOCK=m ++CONFIG_VHOST_CROSS_ENDIAN_LEGACY=y ++CONFIG_VHOST_ENABLE_FORK_OWNER_CONTROL=y ++ ++# ++# Microsoft Hyper-V guest support ++# ++# end of Microsoft Hyper-V guest support ++ ++# CONFIG_GREYBUS is not set ++# CONFIG_COMEDI is not set ++CONFIG_STAGING=y ++# CONFIG_RTLLIB is not set ++# CONFIG_RTL8723BS is not set ++CONFIG_R8712U=m ++# CONFIG_RTS5208 is not set ++# CONFIG_VT6655 is not set ++CONFIG_VT6656=m ++ ++# ++# IIO staging drivers ++# ++ ++# ++# Accelerometers ++# ++# CONFIG_ADIS16203 is not set ++# CONFIG_ADIS16240 is not set ++# end of Accelerometers ++ ++# ++# Analog to digital converters ++# ++# CONFIG_AD7816 is not set ++# end of Analog to digital converters ++ ++# ++# Analog digital bi-direction converters ++# ++# CONFIG_ADT7316 is not set ++# end of Analog digital bi-direction converters ++ ++# ++# Direct Digital Synthesis ++# ++# CONFIG_AD9832 is not set ++# CONFIG_AD9834 is not set ++# end of Direct Digital Synthesis ++ ++# ++# Network Analyzer, Impedance Converters ++# ++# CONFIG_AD5933 is not set ++# end of Network Analyzer, Impedance Converters ++# end of IIO staging drivers ++ ++# CONFIG_FB_SM750 is not set ++CONFIG_STAGING_MEDIA=y ++# CONFIG_DVB_AV7110 is not set ++# CONFIG_VIDEO_MAX96712 is not set ++ ++# ++# StarFive media platform drivers ++# ++CONFIG_STAGING_MEDIA_DEPRECATED=y ++ ++# ++# Atmel media platform drivers ++# ++# CONFIG_LTE_GDM724X is not set ++CONFIG_FB_TFT=m ++CONFIG_FB_TFT_AGM1264K_FL=m ++CONFIG_FB_TFT_BD663474=m ++CONFIG_FB_TFT_HX8340BN=m ++CONFIG_FB_TFT_HX8347D=m ++CONFIG_FB_TFT_HX8353D=m ++CONFIG_FB_TFT_HX8357D=m ++CONFIG_FB_TFT_ILI9163=m ++CONFIG_FB_TFT_ILI9320=m ++CONFIG_FB_TFT_ILI9325=m ++CONFIG_FB_TFT_ILI9340=m ++CONFIG_FB_TFT_ILI9341=m ++CONFIG_FB_TFT_ILI9481=m ++CONFIG_FB_TFT_ILI9486=m ++CONFIG_FB_TFT_PCD8544=m ++CONFIG_FB_TFT_RA8875=m ++CONFIG_FB_TFT_S6D02A1=m ++CONFIG_FB_TFT_S6D1121=m ++# CONFIG_FB_TFT_SEPS525 is not set ++CONFIG_FB_TFT_SH1106=m ++CONFIG_FB_TFT_SSD1289=m ++# CONFIG_FB_TFT_SSD1305 is not set ++CONFIG_FB_TFT_SSD1306=m ++CONFIG_FB_TFT_SSD1331=m ++CONFIG_FB_TFT_SSD1351=m ++CONFIG_FB_TFT_ST7735R=m ++CONFIG_FB_TFT_ST7789V=m ++CONFIG_FB_TFT_TINYLCD=m ++CONFIG_FB_TFT_TLS8204=m ++CONFIG_FB_TFT_UC1611=m ++CONFIG_FB_TFT_UC1701=m ++CONFIG_FB_TFT_UPD161704=m ++CONFIG_BCM_VIDEOCORE=y ++CONFIG_BCM2835_VCHIQ=y ++CONFIG_VCHIQ_CDEV=y ++CONFIG_SND_BCM2835=m ++CONFIG_VIDEO_BCM2835=m ++CONFIG_BCM_VC_SM_CMA=m ++CONFIG_VIDEO_CODEC_BCM2835=m ++CONFIG_VIDEO_ISP_BCM2835=m ++CONFIG_BCM2835_VCHIQ_MMAL=m ++# CONFIG_XIL_AXIS_FIFO is not set ++# CONFIG_FIELDBUS_DEV is not set ++# CONFIG_VME_BUS is not set ++# CONFIG_GOLDFISH is not set ++# CONFIG_CHROME_PLATFORMS is not set ++# CONFIG_MELLANOX_PLATFORM is not set ++CONFIG_SURFACE_PLATFORMS=y ++CONFIG_ARM64_PLATFORM_DEVICES=y ++CONFIG_HAVE_CLK=y ++CONFIG_HAVE_CLK_PREPARE=y ++CONFIG_COMMON_CLK=y ++ ++# ++# Clock driver for ARM Reference designs ++# ++# CONFIG_CLK_ICST is not set ++# CONFIG_CLK_SP810 is not set ++# end of Clock driver for ARM Reference designs ++ ++# CONFIG_LMK04832 is not set ++# CONFIG_COMMON_CLK_MAX9485 is not set ++CONFIG_COMMON_CLK_RP1=y ++CONFIG_COMMON_CLK_RP1_SDIO=y ++CONFIG_COMMON_CLK_HIFIBERRY_DACPLUSHD=m ++CONFIG_COMMON_CLK_HIFIBERRY_DACPRO=m ++# CONFIG_COMMON_CLK_SI5341 is not set ++# CONFIG_COMMON_CLK_SI5351 is not set ++# CONFIG_COMMON_CLK_SI514 is not set ++# CONFIG_COMMON_CLK_SI544 is not set ++# CONFIG_COMMON_CLK_SI570 is not set ++# CONFIG_COMMON_CLK_CDCE706 is not set ++# CONFIG_COMMON_CLK_CDCE925 is not set ++# CONFIG_COMMON_CLK_CS2000_CP is not set ++# CONFIG_COMMON_CLK_AXI_CLKGEN is not set ++# CONFIG_COMMON_CLK_XGENE is not set ++# CONFIG_COMMON_CLK_PWM is not set ++# CONFIG_COMMON_CLK_RS9_PCIE is not set ++# CONFIG_COMMON_CLK_SI521XX is not set ++# CONFIG_COMMON_CLK_VC3 is not set ++# CONFIG_COMMON_CLK_VC5 is not set ++# CONFIG_COMMON_CLK_VC7 is not set ++# CONFIG_COMMON_CLK_FIXED_MMIO is not set ++CONFIG_CLK_BCM2711_DVP=y ++CONFIG_CLK_BCM2835=y ++CONFIG_CLK_RASPBERRYPI=y ++# CONFIG_XILINX_VCU is not set ++# CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set ++# CONFIG_HWSPINLOCK is not set ++ ++# ++# Clock Source drivers ++# ++CONFIG_TIMER_OF=y ++CONFIG_TIMER_PROBE=y ++CONFIG_CLKSRC_MMIO=y ++CONFIG_ARM_ARCH_TIMER=y ++CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y ++CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND=y ++CONFIG_FSL_ERRATUM_A008585=y ++CONFIG_HISILICON_ERRATUM_161010101=y ++CONFIG_ARM64_ERRATUM_858921=y ++CONFIG_ARM_TIMER_SP804=y ++# end of Clock Source drivers ++ ++CONFIG_MAILBOX=y ++# CONFIG_ARM_MHU is not set ++# CONFIG_ARM_MHU_V2 is not set ++# CONFIG_ARM_MHU_V3 is not set ++# CONFIG_PLATFORM_MHU is not set ++# CONFIG_PL320_MBOX is not set ++# CONFIG_ALTERA_MBOX is not set ++CONFIG_BCM2835_MBOX=y ++# CONFIG_MAILBOX_TEST is not set ++CONFIG_MBOX_RP1=m ++CONFIG_IOMMU_IOVA=y ++CONFIG_IOMMU_API=y ++CONFIG_IOMMU_SUPPORT=y ++ ++# ++# Generic IOMMU Pagetable Support ++# ++# CONFIG_IOMMU_IO_PGTABLE_LPAE is not set ++# CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set ++# CONFIG_IOMMU_IO_PGTABLE_DART is not set ++# end of Generic IOMMU Pagetable Support ++ ++# CONFIG_IOMMU_DEBUGFS is not set ++CONFIG_IOMMU_DEFAULT_DMA_STRICT=y ++# CONFIG_IOMMU_DEFAULT_DMA_LAZY is not set ++# CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set ++CONFIG_OF_IOMMU=y ++CONFIG_IOMMU_DMA=y ++# CONFIG_IOMMUFD is not set ++# CONFIG_ARM_SMMU is not set ++# CONFIG_ARM_SMMU_V3 is not set ++CONFIG_BCM2712_IOMMU=y ++ ++# ++# Remoteproc drivers ++# ++# CONFIG_REMOTEPROC is not set ++# end of Remoteproc drivers ++ ++# ++# Rpmsg drivers ++# ++# CONFIG_RPMSG_QCOM_GLINK_RPM is not set ++# CONFIG_RPMSG_VIRTIO is not set ++# end of Rpmsg drivers ++ ++# CONFIG_SOUNDWIRE is not set ++ ++# ++# SOC (System On Chip) specific Drivers ++# ++ ++# ++# Amlogic SoC drivers ++# ++# end of Amlogic SoC drivers ++ ++# ++# Broadcom SoC drivers ++# ++CONFIG_SOC_BRCMSTB=y ++# end of Broadcom SoC drivers ++ ++# ++# NXP/Freescale QorIQ SoC drivers ++# ++# CONFIG_QUICC_ENGINE is not set ++# end of NXP/Freescale QorIQ SoC drivers ++ ++# ++# fujitsu SoC drivers ++# ++# end of fujitsu SoC drivers ++ ++# ++# i.MX SoC drivers ++# ++# end of i.MX SoC drivers ++ ++# ++# Enable LiteX SoC Builder specific drivers ++# ++# CONFIG_LITEX_SOC_CONTROLLER is not set ++# end of Enable LiteX SoC Builder specific drivers ++ ++# CONFIG_WPCM450_SOC is not set ++ ++# ++# Qualcomm SoC drivers ++# ++# end of Qualcomm SoC drivers ++ ++# CONFIG_SOC_TI is not set ++ ++# ++# Xilinx SoC drivers ++# ++# end of Xilinx SoC drivers ++# end of SOC (System On Chip) specific Drivers ++ ++# ++# PM Domains ++# ++ ++# ++# Amlogic PM Domains ++# ++# end of Amlogic PM Domains ++ ++# ++# Broadcom PM Domains ++# ++CONFIG_BCM2835_POWER=y ++CONFIG_RASPBERRYPI_POWER=y ++# end of Broadcom PM Domains ++ ++# ++# i.MX PM Domains ++# ++# end of i.MX PM Domains ++ ++# ++# Qualcomm PM Domains ++# ++# end of Qualcomm PM Domains ++# end of PM Domains ++ ++# CONFIG_PM_DEVFREQ is not set ++CONFIG_EXTCON=y ++ ++# ++# Extcon Device Drivers ++# ++# CONFIG_EXTCON_ADC_JACK is not set ++# CONFIG_EXTCON_FSA9480 is not set ++# CONFIG_EXTCON_GPIO is not set ++# CONFIG_EXTCON_LC824206XA is not set ++# CONFIG_EXTCON_MAX3355 is not set ++# CONFIG_EXTCON_PTN5150 is not set ++# CONFIG_EXTCON_RT8973A is not set ++# CONFIG_EXTCON_SM5502 is not set ++# CONFIG_EXTCON_USB_GPIO is not set ++# CONFIG_MEMORY is not set ++CONFIG_IIO=m ++CONFIG_IIO_BUFFER=y ++CONFIG_IIO_BUFFER_CB=m ++# CONFIG_IIO_BUFFER_DMA is not set ++# CONFIG_IIO_BUFFER_DMAENGINE is not set ++# CONFIG_IIO_BUFFER_HW_CONSUMER is not set ++CONFIG_IIO_KFIFO_BUF=m ++CONFIG_IIO_TRIGGERED_BUFFER=m ++CONFIG_IIO_CONFIGFS=m ++CONFIG_IIO_TRIGGER=y ++CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 ++# CONFIG_IIO_SW_DEVICE is not set ++CONFIG_IIO_SW_TRIGGER=m ++# CONFIG_IIO_TRIGGERED_EVENT is not set ++ ++# ++# Accelerometers ++# ++# CONFIG_ADIS16201 is not set ++# CONFIG_ADIS16209 is not set ++# CONFIG_ADXL313_I2C is not set ++# CONFIG_ADXL313_SPI is not set ++CONFIG_ADXL355=m ++CONFIG_ADXL355_I2C=m ++# CONFIG_ADXL355_SPI is not set ++# CONFIG_ADXL367_SPI is not set ++# CONFIG_ADXL367_I2C is not set ++# CONFIG_ADXL372_SPI is not set ++# CONFIG_ADXL372_I2C is not set ++# CONFIG_ADXL380_SPI is not set ++# CONFIG_ADXL380_I2C is not set ++# CONFIG_BMA180 is not set ++# CONFIG_BMA220 is not set ++# CONFIG_BMA400 is not set ++# CONFIG_BMC150_ACCEL is not set ++# CONFIG_BMI088_ACCEL is not set ++# CONFIG_DA280 is not set ++# CONFIG_DA311 is not set ++# CONFIG_DMARD06 is not set ++# CONFIG_DMARD09 is not set ++# CONFIG_DMARD10 is not set ++# CONFIG_FXLS8962AF_I2C is not set ++# CONFIG_FXLS8962AF_SPI is not set ++# CONFIG_IIO_ST_ACCEL_3AXIS is not set ++# CONFIG_IIO_KX022A_SPI is not set ++# CONFIG_IIO_KX022A_I2C is not set ++# CONFIG_KXSD9 is not set ++# CONFIG_KXCJK1013 is not set ++# CONFIG_MC3230 is not set ++# CONFIG_MMA7455_I2C is not set ++# CONFIG_MMA7455_SPI is not set ++# CONFIG_MMA7660 is not set ++# CONFIG_MMA8452 is not set ++# CONFIG_MMA9551 is not set ++# CONFIG_MMA9553 is not set ++# CONFIG_MSA311 is not set ++# CONFIG_MXC4005 is not set ++# CONFIG_MXC6255 is not set ++# CONFIG_SCA3000 is not set ++# CONFIG_SCA3300 is not set ++# CONFIG_STK8312 is not set ++# CONFIG_STK8BA50 is not set ++# end of Accelerometers ++ ++# ++# Analog to digital converters ++# ++# CONFIG_AD4000 is not set ++# CONFIG_AD4130 is not set ++# CONFIG_AD4695 is not set ++# CONFIG_AD7091R5 is not set ++# CONFIG_AD7091R8 is not set ++# CONFIG_AD7124 is not set ++# CONFIG_AD7173 is not set ++# CONFIG_AD7192 is not set ++# CONFIG_AD7266 is not set ++# CONFIG_AD7280 is not set ++# CONFIG_AD7291 is not set ++# CONFIG_AD7292 is not set ++# CONFIG_AD7298 is not set ++# CONFIG_AD7380 is not set ++# CONFIG_AD7476 is not set ++# CONFIG_AD7606_IFACE_PARALLEL is not set ++# CONFIG_AD7606_IFACE_SPI is not set ++# CONFIG_AD7766 is not set ++# CONFIG_AD7768_1 is not set ++# CONFIG_AD7780 is not set ++# CONFIG_AD7791 is not set ++# CONFIG_AD7793 is not set ++# CONFIG_AD7887 is not set ++# CONFIG_AD7923 is not set ++# CONFIG_AD7944 is not set ++# CONFIG_AD7949 is not set ++# CONFIG_AD799X is not set ++# CONFIG_AD9467 is not set ++# CONFIG_CC10001_ADC is not set ++# CONFIG_ENVELOPE_DETECTOR is not set ++# CONFIG_HI8435 is not set ++# CONFIG_HX711 is not set ++# CONFIG_INA2XX_ADC is not set ++# CONFIG_LTC2309 is not set ++# CONFIG_LTC2471 is not set ++# CONFIG_LTC2485 is not set ++# CONFIG_LTC2496 is not set ++# CONFIG_LTC2497 is not set ++# CONFIG_MAX1027 is not set ++# CONFIG_MAX11100 is not set ++# CONFIG_MAX1118 is not set ++# CONFIG_MAX11205 is not set ++# CONFIG_MAX11410 is not set ++# CONFIG_MAX1241 is not set ++# CONFIG_MAX1363 is not set ++# CONFIG_MAX34408 is not set ++# CONFIG_MAX9611 is not set ++CONFIG_MCP320X=m ++CONFIG_MCP3422=m ++# CONFIG_MCP3564 is not set ++# CONFIG_MCP3911 is not set ++# CONFIG_NAU7802 is not set ++# CONFIG_PAC1921 is not set ++# CONFIG_PAC1934 is not set ++# CONFIG_RICHTEK_RTQ6056 is not set ++# CONFIG_SD_ADC_MODULATOR is not set ++# CONFIG_STMPE_ADC is not set ++# CONFIG_TI_ADC081C is not set ++# CONFIG_TI_ADC0832 is not set ++# CONFIG_TI_ADC084S021 is not set ++# CONFIG_TI_ADC12138 is not set ++# CONFIG_TI_ADC108S102 is not set ++# CONFIG_TI_ADC128S052 is not set ++# CONFIG_TI_ADC161S626 is not set ++CONFIG_TI_ADS1015=m ++# CONFIG_TI_ADS1119 is not set ++# CONFIG_TI_ADS7924 is not set ++# CONFIG_TI_ADS1100 is not set ++# CONFIG_TI_ADS1298 is not set ++# CONFIG_TI_ADS7950 is not set ++# CONFIG_TI_ADS8344 is not set ++# CONFIG_TI_ADS8688 is not set ++# CONFIG_TI_ADS124S08 is not set ++# CONFIG_TI_ADS131E08 is not set ++# CONFIG_TI_LMP92064 is not set ++# CONFIG_TI_TLC4541 is not set ++# CONFIG_TI_TSC2046 is not set ++# CONFIG_VF610_ADC is not set ++# CONFIG_XILINX_XADC is not set ++# end of Analog to digital converters ++ ++# ++# Analog to digital and digital to analog converters ++# ++# CONFIG_AD74115 is not set ++# CONFIG_AD74413R is not set ++# end of Analog to digital and digital to analog converters ++ ++# ++# Analog Front Ends ++# ++# CONFIG_IIO_RESCALE is not set ++# end of Analog Front Ends ++ ++# ++# Amplifiers ++# ++# CONFIG_AD8366 is not set ++# CONFIG_ADA4250 is not set ++# CONFIG_HMC425 is not set ++# end of Amplifiers ++ ++# ++# Capacitance to digital converters ++# ++# CONFIG_AD7150 is not set ++# CONFIG_AD7746 is not set ++# end of Capacitance to digital converters ++ ++# ++# Chemical Sensors ++# ++# CONFIG_AOSONG_AGS02MA is not set ++# CONFIG_ATLAS_PH_SENSOR is not set ++# CONFIG_ATLAS_EZO_SENSOR is not set ++CONFIG_BME680=m ++CONFIG_BME680_I2C=m ++CONFIG_BME680_SPI=m ++CONFIG_CCS811=m ++# CONFIG_ENS160 is not set ++# CONFIG_IAQCORE is not set ++# CONFIG_PMS7003 is not set ++# CONFIG_SCD30_CORE is not set ++# CONFIG_SCD4X is not set ++CONFIG_SENSIRION_SGP30=m ++# CONFIG_SENSIRION_SGP40 is not set ++CONFIG_SPS30=m ++CONFIG_SPS30_I2C=m ++# CONFIG_SPS30_SERIAL is not set ++# CONFIG_SENSEAIR_SUNRISE_CO2 is not set ++# CONFIG_VZ89X is not set ++# end of Chemical Sensors ++ ++# ++# Hid Sensor IIO Common ++# ++# end of Hid Sensor IIO Common ++ ++CONFIG_IIO_INV_SENSORS_TIMESTAMP=m ++CONFIG_IIO_MS_SENSORS_I2C=m ++ ++# ++# IIO SCMI Sensors ++# ++# end of IIO SCMI Sensors ++ ++# ++# SSP Sensor Common ++# ++# CONFIG_IIO_SSP_SENSORHUB is not set ++# end of SSP Sensor Common ++ ++# ++# Digital to analog converters ++# ++# CONFIG_AD3552R is not set ++# CONFIG_AD5064 is not set ++# CONFIG_AD5360 is not set ++# CONFIG_AD5380 is not set ++# CONFIG_AD5421 is not set ++# CONFIG_AD5446 is not set ++# CONFIG_AD5449 is not set ++# CONFIG_AD5592R is not set ++# CONFIG_AD5593R is not set ++# CONFIG_AD5504 is not set ++# CONFIG_AD5624R_SPI is not set ++# CONFIG_AD9739A is not set ++# CONFIG_LTC2688 is not set ++# CONFIG_AD5686_SPI is not set ++# CONFIG_AD5696_I2C is not set ++# CONFIG_AD5755 is not set ++# CONFIG_AD5758 is not set ++# CONFIG_AD5761 is not set ++# CONFIG_AD5764 is not set ++# CONFIG_AD5766 is not set ++# CONFIG_AD5770R is not set ++# CONFIG_AD5791 is not set ++# CONFIG_AD7293 is not set ++# CONFIG_AD7303 is not set ++# CONFIG_AD8801 is not set ++# CONFIG_DPOT_DAC is not set ++# CONFIG_DS4424 is not set ++# CONFIG_LTC1660 is not set ++# CONFIG_LTC2632 is not set ++# CONFIG_LTC2664 is not set ++# CONFIG_M62332 is not set ++# CONFIG_MAX517 is not set ++# CONFIG_MAX5522 is not set ++# CONFIG_MAX5821 is not set ++# CONFIG_MCP4725 is not set ++# CONFIG_MCP4728 is not set ++# CONFIG_MCP4821 is not set ++# CONFIG_MCP4922 is not set ++# CONFIG_TI_DAC082S085 is not set ++# CONFIG_TI_DAC5571 is not set ++# CONFIG_TI_DAC7311 is not set ++# CONFIG_TI_DAC7612 is not set ++# CONFIG_VF610_DAC is not set ++# end of Digital to analog converters ++ ++# ++# IIO dummy driver ++# ++# end of IIO dummy driver ++ ++# ++# Filters ++# ++# CONFIG_ADMV8818 is not set ++# end of Filters ++ ++# ++# Frequency Synthesizers DDS/PLL ++# ++ ++# ++# Clock Generator/Distribution ++# ++# CONFIG_AD9523 is not set ++# end of Clock Generator/Distribution ++ ++# ++# Phase-Locked Loop (PLL) frequency synthesizers ++# ++# CONFIG_ADF4350 is not set ++# CONFIG_ADF4371 is not set ++# CONFIG_ADF4377 is not set ++# CONFIG_ADMFM2000 is not set ++# CONFIG_ADMV1013 is not set ++# CONFIG_ADMV1014 is not set ++# CONFIG_ADMV4420 is not set ++# CONFIG_ADRF6780 is not set ++# end of Phase-Locked Loop (PLL) frequency synthesizers ++# end of Frequency Synthesizers DDS/PLL ++ ++# ++# Digital gyroscope sensors ++# ++# CONFIG_ADIS16080 is not set ++# CONFIG_ADIS16130 is not set ++# CONFIG_ADIS16136 is not set ++# CONFIG_ADIS16260 is not set ++# CONFIG_ADXRS290 is not set ++# CONFIG_ADXRS450 is not set ++# CONFIG_BMG160 is not set ++# CONFIG_FXAS21002C is not set ++# CONFIG_MPU3050_I2C is not set ++# CONFIG_IIO_ST_GYRO_3AXIS is not set ++# CONFIG_ITG3200 is not set ++# end of Digital gyroscope sensors ++ ++# ++# Health Sensors ++# ++ ++# ++# Heart Rate Monitors ++# ++# CONFIG_AFE4403 is not set ++# CONFIG_AFE4404 is not set ++# CONFIG_MAX30100 is not set ++CONFIG_MAX30102=m ++# end of Heart Rate Monitors ++# end of Health Sensors ++ ++# ++# Humidity sensors ++# ++# CONFIG_AM2315 is not set ++CONFIG_DHT11=m ++# CONFIG_ENS210 is not set ++CONFIG_HDC100X=m ++# CONFIG_HDC2010 is not set ++CONFIG_HDC3020=m ++CONFIG_HTS221=m ++CONFIG_HTS221_I2C=m ++CONFIG_HTS221_SPI=m ++CONFIG_HTU21=m ++# CONFIG_SI7005 is not set ++CONFIG_SI7020=m ++# end of Humidity sensors ++ ++# ++# Inertial measurement units ++# ++# CONFIG_ADIS16400 is not set ++# CONFIG_ADIS16460 is not set ++# CONFIG_ADIS16475 is not set ++# CONFIG_ADIS16480 is not set ++# CONFIG_BMI160_I2C is not set ++# CONFIG_BMI160_SPI is not set ++# CONFIG_BMI323_I2C is not set ++# CONFIG_BMI323_SPI is not set ++CONFIG_BOSCH_BNO055=m ++# CONFIG_BOSCH_BNO055_SERIAL is not set ++CONFIG_BOSCH_BNO055_I2C=m ++# CONFIG_FXOS8700_I2C is not set ++# CONFIG_FXOS8700_SPI is not set ++# CONFIG_KMX61 is not set ++# CONFIG_INV_ICM42600_I2C is not set ++# CONFIG_INV_ICM42600_SPI is not set ++CONFIG_INV_MPU6050_IIO=m ++CONFIG_INV_MPU6050_I2C=m ++# CONFIG_INV_MPU6050_SPI is not set ++# CONFIG_IIO_ST_LSM6DSX is not set ++# CONFIG_IIO_ST_LSM9DS0 is not set ++# end of Inertial measurement units ++ ++# ++# Light sensors ++# ++# CONFIG_ADJD_S311 is not set ++# CONFIG_ADUX1020 is not set ++# CONFIG_AL3010 is not set ++# CONFIG_AL3320A is not set ++# CONFIG_APDS9300 is not set ++# CONFIG_APDS9306 is not set ++CONFIG_APDS9960=m ++CONFIG_AS73211=m ++# CONFIG_BH1745 is not set ++CONFIG_BH1750=m ++# CONFIG_BH1780 is not set ++# CONFIG_CM32181 is not set ++# CONFIG_CM3232 is not set ++# CONFIG_CM3323 is not set ++# CONFIG_CM3605 is not set ++# CONFIG_CM36651 is not set ++# CONFIG_GP2AP002 is not set ++# CONFIG_GP2AP020A00F is not set ++# CONFIG_SENSORS_ISL29018 is not set ++# CONFIG_SENSORS_ISL29028 is not set ++# CONFIG_ISL29125 is not set ++# CONFIG_ISL76682 is not set ++# CONFIG_JSA1212 is not set ++# CONFIG_ROHM_BU27008 is not set ++# CONFIG_ROHM_BU27034 is not set ++# CONFIG_RPR0521 is not set ++# CONFIG_LTR390 is not set ++# CONFIG_LTR501 is not set ++# CONFIG_LTRF216A is not set ++# CONFIG_LV0104CS is not set ++# CONFIG_MAX44000 is not set ++# CONFIG_MAX44009 is not set ++# CONFIG_NOA1305 is not set ++# CONFIG_OPT3001 is not set ++# CONFIG_OPT4001 is not set ++# CONFIG_PA12203001 is not set ++# CONFIG_SI1133 is not set ++# CONFIG_SI1145 is not set ++# CONFIG_STK3310 is not set ++# CONFIG_ST_UVIS25 is not set ++# CONFIG_TCS3414 is not set ++CONFIG_TCS3472=m ++# CONFIG_SENSORS_TSL2563 is not set ++# CONFIG_TSL2583 is not set ++# CONFIG_TSL2591 is not set ++# CONFIG_TSL2772 is not set ++CONFIG_TSL4531=m ++# CONFIG_US5182D is not set ++# CONFIG_VCNL4000 is not set ++# CONFIG_VCNL4035 is not set ++# CONFIG_VEML6030 is not set ++CONFIG_VEML6040=m ++CONFIG_VEML6070=m ++CONFIG_VEML6075=m ++# CONFIG_VL6180 is not set ++# CONFIG_ZOPT2201 is not set ++# end of Light sensors ++ ++# ++# Magnetometer sensors ++# ++# CONFIG_AF8133J is not set ++# CONFIG_AK8974 is not set ++# CONFIG_AK8975 is not set ++# CONFIG_AK09911 is not set ++# CONFIG_BMC150_MAGN_I2C is not set ++# CONFIG_BMC150_MAGN_SPI is not set ++# CONFIG_MAG3110 is not set ++# CONFIG_MMC35240 is not set ++# CONFIG_IIO_ST_MAGN_3AXIS is not set ++# CONFIG_SENSORS_HMC5843_I2C is not set ++# CONFIG_SENSORS_HMC5843_SPI is not set ++# CONFIG_SENSORS_RM3100_I2C is not set ++# CONFIG_SENSORS_RM3100_SPI is not set ++# CONFIG_TI_TMAG5273 is not set ++# CONFIG_YAMAHA_YAS530 is not set ++# end of Magnetometer sensors ++ ++# ++# Multiplexers ++# ++# CONFIG_IIO_MUX is not set ++# end of Multiplexers ++ ++# ++# Inclinometer sensors ++# ++# end of Inclinometer sensors ++ ++# ++# Triggers - standalone ++# ++CONFIG_IIO_HRTIMER_TRIGGER=m ++CONFIG_IIO_INTERRUPT_TRIGGER=m ++# CONFIG_IIO_TIGHTLOOP_TRIGGER is not set ++CONFIG_IIO_SYSFS_TRIGGER=m ++# end of Triggers - standalone ++ ++# ++# Linear and angular position sensors ++# ++# end of Linear and angular position sensors ++ ++# ++# Digital potentiometers ++# ++# CONFIG_AD5110 is not set ++# CONFIG_AD5272 is not set ++# CONFIG_DS1803 is not set ++# CONFIG_MAX5432 is not set ++# CONFIG_MAX5481 is not set ++# CONFIG_MAX5487 is not set ++# CONFIG_MCP4018 is not set ++# CONFIG_MCP4131 is not set ++# CONFIG_MCP4531 is not set ++# CONFIG_MCP41010 is not set ++# CONFIG_TPL0102 is not set ++# CONFIG_X9250 is not set ++# end of Digital potentiometers ++ ++# ++# Digital potentiostats ++# ++# CONFIG_LMP91000 is not set ++# end of Digital potentiostats ++ ++# ++# Pressure sensors ++# ++# CONFIG_ABP060MG is not set ++# CONFIG_ROHM_BM1390 is not set ++CONFIG_BMP280=m ++CONFIG_BMP280_I2C=m ++CONFIG_BMP280_SPI=m ++# CONFIG_DLHL60D is not set ++# CONFIG_DPS310 is not set ++# CONFIG_HP03 is not set ++# CONFIG_HSC030PA is not set ++# CONFIG_ICP10100 is not set ++# CONFIG_MPL115_I2C is not set ++# CONFIG_MPL115_SPI is not set ++# CONFIG_MPL3115 is not set ++# CONFIG_MPRLS0025PA is not set ++# CONFIG_MS5611 is not set ++CONFIG_MS5637=m ++# CONFIG_SDP500 is not set ++# CONFIG_IIO_ST_PRESS is not set ++# CONFIG_T5403 is not set ++# CONFIG_HP206C is not set ++# CONFIG_ZPA2326 is not set ++# end of Pressure sensors ++ ++# ++# Lightning sensors ++# ++# CONFIG_AS3935 is not set ++# end of Lightning sensors ++ ++# ++# Proximity and distance sensors ++# ++# CONFIG_HX9023S is not set ++# CONFIG_IRSD200 is not set ++# CONFIG_ISL29501 is not set ++# CONFIG_LIDAR_LITE_V2 is not set ++# CONFIG_MB1232 is not set ++# CONFIG_PING is not set ++# CONFIG_RFD77402 is not set ++# CONFIG_SRF04 is not set ++# CONFIG_SX9310 is not set ++# CONFIG_SX9324 is not set ++# CONFIG_SX9360 is not set ++# CONFIG_SX9500 is not set ++# CONFIG_SRF08 is not set ++# CONFIG_VCNL3020 is not set ++# CONFIG_VL53L0X_I2C is not set ++# CONFIG_AW96103 is not set ++# end of Proximity and distance sensors ++ ++# ++# Resolver to digital converters ++# ++# CONFIG_AD2S90 is not set ++# CONFIG_AD2S1200 is not set ++# CONFIG_AD2S1210 is not set ++# end of Resolver to digital converters ++ ++# ++# Temperature sensors ++# ++# CONFIG_LTC2983 is not set ++CONFIG_MAXIM_THERMOCOUPLE=m ++# CONFIG_MLX90614 is not set ++# CONFIG_MLX90632 is not set ++# CONFIG_MLX90635 is not set ++# CONFIG_TMP006 is not set ++# CONFIG_TMP007 is not set ++# CONFIG_TMP117 is not set ++# CONFIG_TSYS01 is not set ++# CONFIG_TSYS02D is not set ++# CONFIG_MAX30208 is not set ++CONFIG_MAX31856=m ++# CONFIG_MAX31865 is not set ++# CONFIG_MCP9600 is not set ++# end of Temperature sensors ++ ++# CONFIG_NTB is not set ++CONFIG_PWM=y ++# CONFIG_PWM_DEBUG is not set ++# CONFIG_PWM_ATMEL_TCB is not set ++CONFIG_PWM_BCM2835=m ++CONFIG_PWM_BRCMSTB=y ++# CONFIG_PWM_CLK is not set ++# CONFIG_PWM_DWC is not set ++# CONFIG_PWM_FSL_FTM is not set ++CONFIG_PWM_GPIO=m ++CONFIG_PWM_PCA9685=m ++CONFIG_PWM_PIO_RP1=m ++CONFIG_PWM_RASPBERRYPI_POE=m ++CONFIG_PWM_RP1=y ++# CONFIG_PWM_STMPE is not set ++# CONFIG_PWM_XILINX is not set ++ ++# ++# IRQ chip support ++# ++CONFIG_IRQCHIP=y ++CONFIG_ARM_GIC=y ++CONFIG_ARM_GIC_MAX_NR=1 ++CONFIG_ARM_GIC_V2M=y ++CONFIG_ARM_GIC_V3=y ++CONFIG_ARM_GIC_V3_ITS=y ++CONFIG_IRQ_MSI_LIB=y ++# CONFIG_AL_FIC is not set ++CONFIG_BCM2712_MIP=y ++CONFIG_BCM7038_L1_IRQ=y ++CONFIG_BCM7120_L2_IRQ=y ++CONFIG_BRCMSTB_L2_IRQ=y ++# CONFIG_XILINX_INTC is not set ++CONFIG_PARTITION_PERCPU=y ++# end of IRQ chip support ++ ++# CONFIG_IPACK_BUS is not set ++CONFIG_ARCH_HAS_RESET_CONTROLLER=y ++CONFIG_RESET_CONTROLLER=y ++CONFIG_RESET_BRCMSTB=y ++CONFIG_RESET_BRCMSTB_RESCAL=y ++# CONFIG_RESET_GPIO is not set ++CONFIG_RESET_RASPBERRYPI=y ++CONFIG_RESET_SIMPLE=y ++# CONFIG_RESET_TI_SYSCON is not set ++# CONFIG_RESET_TI_TPS380X is not set ++ ++# ++# PHY Subsystem ++# ++CONFIG_GENERIC_PHY=y ++CONFIG_GENERIC_PHY_MIPI_DPHY=y ++# CONFIG_PHY_CAN_TRANSCEIVER is not set ++ ++# ++# PHY drivers for Broadcom platforms ++# ++# CONFIG_BCM_KONA_USB2_PHY is not set ++# CONFIG_PHY_BRCM_SATA is not set ++CONFIG_PHY_BRCM_USB=y ++# end of PHY drivers for Broadcom platforms ++ ++# CONFIG_PHY_CADENCE_TORRENT is not set ++# CONFIG_PHY_CADENCE_DPHY is not set ++# CONFIG_PHY_CADENCE_DPHY_RX is not set ++# CONFIG_PHY_CADENCE_SIERRA is not set ++# CONFIG_PHY_CADENCE_SALVO is not set ++# CONFIG_PHY_PXA_28NM_HSIC is not set ++# CONFIG_PHY_PXA_28NM_USB2 is not set ++# CONFIG_PHY_LAN966X_SERDES is not set ++# CONFIG_PHY_CPCAP_USB is not set ++# CONFIG_PHY_MAPPHONE_MDM6600 is not set ++# CONFIG_PHY_OCELOT_SERDES is not set ++# CONFIG_PHY_SAMSUNG_USB2 is not set ++# end of PHY Subsystem ++ ++# CONFIG_POWERCAP is not set ++# CONFIG_MCB is not set ++ ++# ++# Performance monitor support ++# ++# CONFIG_ARM_CCI_PMU is not set ++# CONFIG_ARM_CCN is not set ++# CONFIG_ARM_CMN is not set ++# CONFIG_ARM_NI is not set ++CONFIG_ARM_PMU=y ++# CONFIG_ARM_SMMU_V3_PMU is not set ++CONFIG_ARM_PMUV3=y ++# CONFIG_ARM_DSU_PMU is not set ++# CONFIG_ARM_SPE_PMU is not set ++CONFIG_RPI_AXIPERF=m ++# CONFIG_HISI_PCIE_PMU is not set ++# CONFIG_HNS3_PMU is not set ++# CONFIG_DWC_PCIE_PMU is not set ++# CONFIG_ARM_CORESIGHT_PMU_ARCH_SYSTEM_PMU is not set ++# end of Performance monitor support ++ ++CONFIG_RAS=y ++# CONFIG_USB4 is not set ++ ++# ++# Android ++# ++CONFIG_ANDROID_BINDER_IPC=y ++CONFIG_ANDROID_BINDERFS=y ++CONFIG_ANDROID_BINDER_DEVICES="binder,hwbinder,vndbinder" ++# CONFIG_ANDROID_BINDER_IPC_SELFTEST is not set ++# end of Android ++ ++# CONFIG_LIBNVDIMM is not set ++# CONFIG_DAX is not set ++CONFIG_NVMEM=y ++CONFIG_NVMEM_SYSFS=y ++CONFIG_NVMEM_LAYOUTS=y ++ ++# ++# Layout Types ++# ++# CONFIG_NVMEM_LAYOUT_SL28_VPD is not set ++# CONFIG_NVMEM_LAYOUT_ONIE_TLV is not set ++# CONFIG_NVMEM_LAYOUT_U_BOOT_ENV is not set ++# end of Layout Types ++ ++CONFIG_NVMEM_RASPBERRYPI_OTP=y ++CONFIG_NVMEM_RMEM=m ++# CONFIG_NVMEM_U_BOOT_ENV is not set ++ ++# ++# HW tracing support ++# ++# CONFIG_STM is not set ++# CONFIG_INTEL_TH is not set ++# CONFIG_HISI_PTT is not set ++# end of HW tracing support ++ ++# CONFIG_FPGA is not set ++# CONFIG_FSI is not set ++# CONFIG_TEE is not set ++CONFIG_MULTIPLEXER=m ++ ++# ++# Multiplexer drivers ++# ++# CONFIG_MUX_ADG792A is not set ++# CONFIG_MUX_ADGS1408 is not set ++CONFIG_MUX_GPIO=m ++# CONFIG_MUX_MMIO is not set ++# end of Multiplexer drivers ++ ++CONFIG_PM_OPP=y ++# CONFIG_SIOX is not set ++# CONFIG_SLIMBUS is not set ++# CONFIG_INTERCONNECT is not set ++# CONFIG_COUNTER is not set ++# CONFIG_MOST is not set ++# CONFIG_PECI is not set ++# CONFIG_HTE is not set ++# CONFIG_CDX_BUS is not set ++# end of Device Drivers ++ ++# ++# File systems ++# ++CONFIG_DCACHE_WORD_ACCESS=y ++# CONFIG_VALIDATE_FS_PARSER is not set ++CONFIG_FS_IOMAP=y ++CONFIG_FS_STACK=y ++CONFIG_BUFFER_HEAD=y ++CONFIG_LEGACY_DIRECT_IO=y ++# CONFIG_EXT2_FS is not set ++# CONFIG_EXT3_FS is not set ++CONFIG_EXT4_FS=y ++CONFIG_EXT4_USE_FOR_EXT2=y ++CONFIG_EXT4_FS_POSIX_ACL=y ++CONFIG_EXT4_FS_SECURITY=y ++# CONFIG_EXT4_DEBUG is not set ++CONFIG_JBD2=y ++# CONFIG_JBD2_DEBUG is not set ++CONFIG_FS_MBCACHE=y ++CONFIG_REISERFS_FS=m ++# CONFIG_REISERFS_CHECK is not set ++# CONFIG_REISERFS_PROC_INFO is not set ++CONFIG_REISERFS_FS_XATTR=y ++CONFIG_REISERFS_FS_POSIX_ACL=y ++CONFIG_REISERFS_FS_SECURITY=y ++CONFIG_JFS_FS=m ++CONFIG_JFS_POSIX_ACL=y ++CONFIG_JFS_SECURITY=y ++# CONFIG_JFS_DEBUG is not set ++CONFIG_JFS_STATISTICS=y ++CONFIG_XFS_FS=m ++CONFIG_XFS_SUPPORT_V4=y ++CONFIG_XFS_SUPPORT_ASCII_CI=y ++CONFIG_XFS_QUOTA=y ++CONFIG_XFS_POSIX_ACL=y ++CONFIG_XFS_RT=y ++# CONFIG_XFS_ONLINE_SCRUB is not set ++# CONFIG_XFS_WARN is not set ++# CONFIG_XFS_DEBUG is not set ++CONFIG_GFS2_FS=m ++# CONFIG_GFS2_FS_LOCKING_DLM is not set ++CONFIG_OCFS2_FS=m ++CONFIG_OCFS2_FS_O2CB=m ++CONFIG_OCFS2_FS_USERSPACE_CLUSTER=m ++CONFIG_OCFS2_FS_STATS=y ++CONFIG_OCFS2_DEBUG_MASKLOG=y ++# CONFIG_OCFS2_DEBUG_FS is not set ++CONFIG_BTRFS_FS=m ++CONFIG_BTRFS_FS_POSIX_ACL=y ++# CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set ++# CONFIG_BTRFS_DEBUG is not set ++# CONFIG_BTRFS_ASSERT is not set ++# CONFIG_BTRFS_FS_REF_VERIFY is not set ++CONFIG_NILFS2_FS=m ++CONFIG_F2FS_FS=y ++CONFIG_F2FS_STAT_FS=y ++CONFIG_F2FS_FS_XATTR=y ++CONFIG_F2FS_FS_POSIX_ACL=y ++CONFIG_F2FS_FS_SECURITY=y ++# CONFIG_F2FS_CHECK_FS is not set ++# CONFIG_F2FS_FAULT_INJECTION is not set ++# CONFIG_F2FS_FS_COMPRESSION is not set ++CONFIG_F2FS_IOSTAT=y ++# CONFIG_F2FS_UNFAIR_RWSEM is not set ++CONFIG_BCACHEFS_FS=m ++CONFIG_BCACHEFS_QUOTA=y ++# CONFIG_BCACHEFS_ERASURE_CODING is not set ++CONFIG_BCACHEFS_POSIX_ACL=y ++# CONFIG_BCACHEFS_DEBUG is not set ++# CONFIG_BCACHEFS_TESTS is not set ++# CONFIG_BCACHEFS_LOCK_TIME_STATS is not set ++# CONFIG_BCACHEFS_NO_LATENCY_ACCT is not set ++CONFIG_BCACHEFS_SIX_OPTIMISTIC_SPIN=y ++# CONFIG_BCACHEFS_PATH_TRACEPOINTS is not set ++CONFIG_FS_POSIX_ACL=y ++CONFIG_EXPORTFS=y ++# CONFIG_EXPORTFS_BLOCK_OPS is not set ++CONFIG_FILE_LOCKING=y ++CONFIG_FS_ENCRYPTION=y ++CONFIG_FS_ENCRYPTION_ALGS=y ++# CONFIG_FS_VERITY is not set ++CONFIG_FSNOTIFY=y ++CONFIG_DNOTIFY=y ++CONFIG_INOTIFY_USER=y ++CONFIG_FANOTIFY=y ++# CONFIG_FANOTIFY_ACCESS_PERMISSIONS is not set ++CONFIG_QUOTA=y ++# CONFIG_QUOTA_NETLINK_INTERFACE is not set ++# CONFIG_QUOTA_DEBUG is not set ++CONFIG_QUOTA_TREE=m ++CONFIG_QFMT_V1=m ++CONFIG_QFMT_V2=m ++CONFIG_QUOTACTL=y ++CONFIG_AUTOFS_FS=y ++CONFIG_FUSE_FS=m ++CONFIG_CUSE=m ++# CONFIG_VIRTIO_FS is not set ++CONFIG_FUSE_PASSTHROUGH=y ++CONFIG_OVERLAY_FS=m ++# CONFIG_OVERLAY_FS_REDIRECT_DIR is not set ++CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y ++# CONFIG_OVERLAY_FS_INDEX is not set ++# CONFIG_OVERLAY_FS_XINO_AUTO is not set ++# CONFIG_OVERLAY_FS_METACOPY is not set ++# CONFIG_OVERLAY_FS_DEBUG is not set ++ ++# ++# Caches ++# ++CONFIG_NETFS_SUPPORT=m ++CONFIG_NETFS_STATS=y ++# CONFIG_NETFS_DEBUG is not set ++CONFIG_FSCACHE=y ++CONFIG_FSCACHE_STATS=y ++CONFIG_CACHEFILES=m ++# CONFIG_CACHEFILES_DEBUG is not set ++# CONFIG_CACHEFILES_ERROR_INJECTION is not set ++# CONFIG_CACHEFILES_ONDEMAND is not set ++# end of Caches ++ ++# ++# CD-ROM/DVD Filesystems ++# ++CONFIG_ISO9660_FS=m ++CONFIG_JOLIET=y ++CONFIG_ZISOFS=y ++CONFIG_UDF_FS=m ++# end of CD-ROM/DVD Filesystems ++ ++# ++# DOS/FAT/EXFAT/NT Filesystems ++# ++CONFIG_FAT_FS=y ++CONFIG_MSDOS_FS=y ++CONFIG_VFAT_FS=y ++CONFIG_FAT_DEFAULT_CODEPAGE=437 ++CONFIG_FAT_DEFAULT_IOCHARSET="ascii" ++# CONFIG_FAT_DEFAULT_UTF8 is not set ++CONFIG_EXFAT_FS=m ++CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" ++CONFIG_NTFS3_FS=m ++# CONFIG_NTFS3_64BIT_CLUSTER is not set ++# CONFIG_NTFS3_LZX_XPRESS is not set ++# CONFIG_NTFS3_FS_POSIX_ACL is not set ++# CONFIG_NTFS_FS is not set ++# end of DOS/FAT/EXFAT/NT Filesystems ++ ++# ++# Pseudo filesystems ++# ++CONFIG_PROC_FS=y ++# CONFIG_PROC_KCORE is not set ++CONFIG_PROC_SYSCTL=y ++CONFIG_PROC_PAGE_MONITOR=y ++CONFIG_PROC_CHILDREN=y ++CONFIG_KERNFS=y ++CONFIG_SYSFS=y ++CONFIG_TMPFS=y ++CONFIG_TMPFS_POSIX_ACL=y ++CONFIG_TMPFS_XATTR=y ++# CONFIG_TMPFS_INODE64 is not set ++# CONFIG_TMPFS_QUOTA is not set ++CONFIG_ARCH_SUPPORTS_HUGETLBFS=y ++# CONFIG_HUGETLBFS is not set ++CONFIG_ARCH_HAS_GIGANTIC_PAGE=y ++CONFIG_CONFIGFS_FS=y ++CONFIG_EFIVAR_FS=m ++# end of Pseudo filesystems ++ ++CONFIG_MISC_FILESYSTEMS=y ++# CONFIG_ORANGEFS_FS is not set ++# CONFIG_ADFS_FS is not set ++# CONFIG_AFFS_FS is not set ++CONFIG_ECRYPT_FS=m ++# CONFIG_ECRYPT_FS_MESSAGING is not set ++CONFIG_HFS_FS=m ++CONFIG_HFSPLUS_FS=m ++# CONFIG_BEFS_FS is not set ++# CONFIG_BFS_FS is not set ++# CONFIG_EFS_FS is not set ++CONFIG_JFFS2_FS=m ++CONFIG_JFFS2_FS_DEBUG=0 ++CONFIG_JFFS2_FS_WRITEBUFFER=y ++# CONFIG_JFFS2_FS_WBUF_VERIFY is not set ++CONFIG_JFFS2_SUMMARY=y ++# CONFIG_JFFS2_FS_XATTR is not set ++# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set ++CONFIG_JFFS2_ZLIB=y ++CONFIG_JFFS2_RTIME=y ++CONFIG_UBIFS_FS=m ++# CONFIG_UBIFS_FS_ADVANCED_COMPR is not set ++CONFIG_UBIFS_FS_LZO=y ++CONFIG_UBIFS_FS_ZLIB=y ++CONFIG_UBIFS_FS_ZSTD=y ++# CONFIG_UBIFS_ATIME_SUPPORT is not set ++CONFIG_UBIFS_FS_XATTR=y ++CONFIG_UBIFS_FS_SECURITY=y ++# CONFIG_UBIFS_FS_AUTHENTICATION is not set ++# CONFIG_CRAMFS is not set ++CONFIG_SQUASHFS=m ++CONFIG_SQUASHFS_FILE_CACHE=y ++# CONFIG_SQUASHFS_FILE_DIRECT is not set ++CONFIG_SQUASHFS_DECOMP_SINGLE=y ++# CONFIG_SQUASHFS_CHOICE_DECOMP_BY_MOUNT is not set ++CONFIG_SQUASHFS_COMPILE_DECOMP_SINGLE=y ++# CONFIG_SQUASHFS_COMPILE_DECOMP_MULTI is not set ++# CONFIG_SQUASHFS_COMPILE_DECOMP_MULTI_PERCPU is not set ++CONFIG_SQUASHFS_XATTR=y ++CONFIG_SQUASHFS_ZLIB=y ++# CONFIG_SQUASHFS_LZ4 is not set ++CONFIG_SQUASHFS_LZO=y ++CONFIG_SQUASHFS_XZ=y ++CONFIG_SQUASHFS_ZSTD=y ++# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set ++# CONFIG_SQUASHFS_EMBEDDED is not set ++CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 ++# CONFIG_VXFS_FS is not set ++# CONFIG_MINIX_FS is not set ++# CONFIG_OMFS_FS is not set ++# CONFIG_HPFS_FS is not set ++# CONFIG_QNX4FS_FS is not set ++# CONFIG_QNX6FS_FS is not set ++# CONFIG_ROMFS_FS is not set ++CONFIG_PSTORE=y ++CONFIG_PSTORE_DEFAULT_KMSG_BYTES=10240 ++CONFIG_PSTORE_COMPRESS=y ++CONFIG_PSTORE_CONSOLE=y ++# CONFIG_PSTORE_PMSG is not set ++# CONFIG_PSTORE_FTRACE is not set ++CONFIG_PSTORE_RAM=y ++# CONFIG_PSTORE_BLK is not set ++# CONFIG_SYSV_FS is not set ++# CONFIG_UFS_FS is not set ++CONFIG_EROFS_FS=m ++# CONFIG_EROFS_FS_DEBUG is not set ++CONFIG_EROFS_FS_XATTR=y ++CONFIG_EROFS_FS_POSIX_ACL=y ++CONFIG_EROFS_FS_SECURITY=y ++CONFIG_EROFS_FS_BACKED_BY_FILE=y ++CONFIG_EROFS_FS_ZIP=y ++# CONFIG_EROFS_FS_ZIP_LZMA is not set ++# CONFIG_EROFS_FS_ZIP_DEFLATE is not set ++CONFIG_EROFS_FS_ZIP_ZSTD=y ++# CONFIG_EROFS_FS_ONDEMAND is not set ++# CONFIG_EROFS_FS_PCPU_KTHREAD is not set ++CONFIG_NETWORK_FILESYSTEMS=y ++CONFIG_NFS_FS=y ++CONFIG_NFS_V2=y ++CONFIG_NFS_V3=y ++CONFIG_NFS_V3_ACL=y ++CONFIG_NFS_V4=y ++CONFIG_NFS_SWAP=y ++CONFIG_NFS_V4_1=y ++CONFIG_NFS_V4_2=y ++CONFIG_PNFS_FILE_LAYOUT=y ++CONFIG_PNFS_BLOCK=m ++CONFIG_PNFS_FLEXFILE_LAYOUT=y ++CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" ++# CONFIG_NFS_V4_1_MIGRATION is not set ++CONFIG_NFS_V4_SECURITY_LABEL=y ++CONFIG_ROOT_NFS=y ++# CONFIG_NFS_FSCACHE is not set ++# CONFIG_NFS_USE_LEGACY_DNS is not set ++CONFIG_NFS_USE_KERNEL_DNS=y ++CONFIG_NFS_DISABLE_UDP_SUPPORT=y ++CONFIG_NFS_V4_2_READ_PLUS=y ++CONFIG_NFSD=m ++CONFIG_NFSD_V2=y ++CONFIG_NFSD_V2_ACL=y ++CONFIG_NFSD_V3_ACL=y ++CONFIG_NFSD_V4=y ++# CONFIG_NFSD_BLOCKLAYOUT is not set ++# CONFIG_NFSD_SCSILAYOUT is not set ++# CONFIG_NFSD_FLEXFILELAYOUT is not set ++# CONFIG_NFSD_V4_2_INTER_SSC is not set ++# CONFIG_NFSD_V4_SECURITY_LABEL is not set ++CONFIG_NFSD_LEGACY_CLIENT_TRACKING=y ++CONFIG_GRACE_PERIOD=y ++CONFIG_LOCKD=y ++CONFIG_LOCKD_V4=y ++CONFIG_NFS_ACL_SUPPORT=y ++CONFIG_NFS_COMMON=y ++# CONFIG_NFS_LOCALIO is not set ++CONFIG_NFS_V4_2_SSC_HELPER=y ++CONFIG_SUNRPC=y ++CONFIG_SUNRPC_GSS=y ++CONFIG_SUNRPC_BACKCHANNEL=y ++CONFIG_SUNRPC_SWAP=y ++CONFIG_RPCSEC_GSS_KRB5=y ++CONFIG_RPCSEC_GSS_KRB5_ENCTYPES_AES_SHA1=y ++# CONFIG_RPCSEC_GSS_KRB5_ENCTYPES_AES_SHA2 is not set ++# CONFIG_SUNRPC_DEBUG is not set ++CONFIG_CEPH_FS=m ++# CONFIG_CEPH_FSCACHE is not set ++# CONFIG_CEPH_FS_POSIX_ACL is not set ++# CONFIG_CEPH_FS_SECURITY_LABEL is not set ++CONFIG_CIFS=m ++CONFIG_CIFS_STATS2=y ++CONFIG_CIFS_ALLOW_INSECURE_LEGACY=y ++CONFIG_CIFS_UPCALL=y ++CONFIG_CIFS_XATTR=y ++CONFIG_CIFS_POSIX=y ++CONFIG_CIFS_DEBUG=y ++# CONFIG_CIFS_DEBUG2 is not set ++# CONFIG_CIFS_DEBUG_DUMP_KEYS is not set ++CONFIG_CIFS_DFS_UPCALL=y ++# CONFIG_CIFS_SWN_UPCALL is not set ++CONFIG_CIFS_FSCACHE=y ++# CONFIG_CIFS_COMPRESSION is not set ++CONFIG_SMB_SERVER=m ++CONFIG_SMB_SERVER_CHECK_CAP_NET_ADMIN=y ++# CONFIG_SMB_SERVER_KERBEROS5 is not set ++CONFIG_SMBFS=m ++# CONFIG_CODA_FS is not set ++# CONFIG_AFS_FS is not set ++CONFIG_9P_FS=m ++# CONFIG_9P_FSCACHE is not set ++CONFIG_9P_FS_POSIX_ACL=y ++# CONFIG_9P_FS_SECURITY is not set ++CONFIG_NLS=y ++CONFIG_NLS_DEFAULT="utf8" ++CONFIG_NLS_CODEPAGE_437=y ++CONFIG_NLS_CODEPAGE_737=m ++CONFIG_NLS_CODEPAGE_775=m ++CONFIG_NLS_CODEPAGE_850=m ++CONFIG_NLS_CODEPAGE_852=m ++CONFIG_NLS_CODEPAGE_855=m ++CONFIG_NLS_CODEPAGE_857=m ++CONFIG_NLS_CODEPAGE_860=m ++CONFIG_NLS_CODEPAGE_861=m ++CONFIG_NLS_CODEPAGE_862=m ++CONFIG_NLS_CODEPAGE_863=m ++CONFIG_NLS_CODEPAGE_864=m ++CONFIG_NLS_CODEPAGE_865=m ++CONFIG_NLS_CODEPAGE_866=m ++CONFIG_NLS_CODEPAGE_869=m ++CONFIG_NLS_CODEPAGE_936=m ++CONFIG_NLS_CODEPAGE_950=m ++CONFIG_NLS_CODEPAGE_932=m ++CONFIG_NLS_CODEPAGE_949=m ++CONFIG_NLS_CODEPAGE_874=m ++CONFIG_NLS_ISO8859_8=m ++CONFIG_NLS_CODEPAGE_1250=m ++CONFIG_NLS_CODEPAGE_1251=m ++CONFIG_NLS_ASCII=y ++CONFIG_NLS_ISO8859_1=m ++CONFIG_NLS_ISO8859_2=m ++CONFIG_NLS_ISO8859_3=m ++CONFIG_NLS_ISO8859_4=m ++CONFIG_NLS_ISO8859_5=m ++CONFIG_NLS_ISO8859_6=m ++CONFIG_NLS_ISO8859_7=m ++CONFIG_NLS_ISO8859_9=m ++CONFIG_NLS_ISO8859_13=m ++CONFIG_NLS_ISO8859_14=m ++CONFIG_NLS_ISO8859_15=m ++CONFIG_NLS_KOI8_R=m ++CONFIG_NLS_KOI8_U=m ++# CONFIG_NLS_MAC_ROMAN is not set ++# CONFIG_NLS_MAC_CELTIC is not set ++# CONFIG_NLS_MAC_CENTEURO is not set ++# CONFIG_NLS_MAC_CROATIAN is not set ++# CONFIG_NLS_MAC_CYRILLIC is not set ++# CONFIG_NLS_MAC_GAELIC is not set ++# CONFIG_NLS_MAC_GREEK is not set ++# CONFIG_NLS_MAC_ICELAND is not set ++# CONFIG_NLS_MAC_INUIT is not set ++# CONFIG_NLS_MAC_ROMANIAN is not set ++# CONFIG_NLS_MAC_TURKISH is not set ++CONFIG_NLS_UTF8=m ++CONFIG_NLS_UCS2_UTILS=m ++CONFIG_DLM=m ++# CONFIG_DLM_DEBUG is not set ++CONFIG_UNICODE=m ++# CONFIG_UNICODE_NORMALIZATION_SELFTEST is not set ++CONFIG_IO_WQ=y ++# end of File systems ++ ++# ++# Security options ++# ++CONFIG_KEYS=y ++# CONFIG_KEYS_REQUEST_CACHE is not set ++# CONFIG_PERSISTENT_KEYRINGS is not set ++# CONFIG_TRUSTED_KEYS is not set ++# CONFIG_ENCRYPTED_KEYS is not set ++CONFIG_KEY_DH_OPERATIONS=y ++# CONFIG_SECURITY_DMESG_RESTRICT is not set ++CONFIG_PROC_MEM_ALWAYS_FORCE=y ++# CONFIG_PROC_MEM_FORCE_PTRACE is not set ++# CONFIG_PROC_MEM_NO_FORCE is not set ++CONFIG_SECURITY=y ++CONFIG_SECURITYFS=y ++CONFIG_SECURITY_NETWORK=y ++# CONFIG_SECURITY_NETWORK_XFRM is not set ++CONFIG_SECURITY_PATH=y ++# CONFIG_HARDENED_USERCOPY is not set ++# CONFIG_FORTIFY_SOURCE is not set ++# CONFIG_STATIC_USERMODEHELPER is not set ++# CONFIG_SECURITY_SELINUX is not set ++# CONFIG_SECURITY_SMACK is not set ++# CONFIG_SECURITY_TOMOYO is not set ++CONFIG_SECURITY_APPARMOR=y ++# CONFIG_SECURITY_APPARMOR_DEBUG is not set ++CONFIG_SECURITY_APPARMOR_INTROSPECT_POLICY=y ++CONFIG_SECURITY_APPARMOR_HASH=y ++CONFIG_SECURITY_APPARMOR_HASH_DEFAULT=y ++CONFIG_SECURITY_APPARMOR_EXPORT_BINARY=y ++CONFIG_SECURITY_APPARMOR_PARANOID_LOAD=y ++# CONFIG_SECURITY_LOADPIN is not set ++# CONFIG_SECURITY_YAMA is not set ++# CONFIG_SECURITY_SAFESETID is not set ++# CONFIG_SECURITY_LOCKDOWN_LSM is not set ++# CONFIG_SECURITY_LANDLOCK is not set ++# CONFIG_SECURITY_IPE is not set ++CONFIG_INTEGRITY=y ++# CONFIG_INTEGRITY_SIGNATURE is not set ++CONFIG_INTEGRITY_AUDIT=y ++# CONFIG_IMA is not set ++# CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT is not set ++# CONFIG_EVM is not set ++CONFIG_DEFAULT_SECURITY_APPARMOR=y ++# CONFIG_DEFAULT_SECURITY_DAC is not set ++CONFIG_LSM="" ++ ++# ++# Kernel hardening options ++# ++ ++# ++# Memory initialization ++# ++CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y ++CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_BARE=y ++CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y ++# CONFIG_INIT_STACK_NONE is not set ++# CONFIG_INIT_STACK_ALL_PATTERN is not set ++CONFIG_INIT_STACK_ALL_ZERO=y ++# CONFIG_GCC_PLUGIN_STACKLEAK is not set ++# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set ++# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set ++CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y ++# CONFIG_ZERO_CALL_USED_REGS is not set ++# end of Memory initialization ++ ++# ++# Hardening of kernel data structures ++# ++# CONFIG_LIST_HARDENED is not set ++# CONFIG_BUG_ON_DATA_CORRUPTION is not set ++# end of Hardening of kernel data structures ++ ++CONFIG_RANDSTRUCT_NONE=y ++# CONFIG_RANDSTRUCT_FULL is not set ++# CONFIG_RANDSTRUCT_PERFORMANCE is not set ++# end of Kernel hardening options ++# end of Security options ++ ++CONFIG_XOR_BLOCKS=m ++CONFIG_ASYNC_CORE=m ++CONFIG_ASYNC_MEMCPY=m ++CONFIG_ASYNC_XOR=m ++CONFIG_ASYNC_PQ=m ++CONFIG_ASYNC_RAID6_RECOV=m ++CONFIG_CRYPTO=y ++ ++# ++# Crypto core or helper ++# ++CONFIG_CRYPTO_ALGAPI=y ++CONFIG_CRYPTO_ALGAPI2=y ++CONFIG_CRYPTO_AEAD=m ++CONFIG_CRYPTO_AEAD2=y ++CONFIG_CRYPTO_SIG=y ++CONFIG_CRYPTO_SIG2=y ++CONFIG_CRYPTO_SKCIPHER=y ++CONFIG_CRYPTO_SKCIPHER2=y ++CONFIG_CRYPTO_HASH=y ++CONFIG_CRYPTO_HASH2=y ++CONFIG_CRYPTO_RNG=m ++CONFIG_CRYPTO_RNG2=y ++CONFIG_CRYPTO_RNG_DEFAULT=m ++CONFIG_CRYPTO_AKCIPHER2=y ++CONFIG_CRYPTO_AKCIPHER=y ++CONFIG_CRYPTO_KPP2=y ++CONFIG_CRYPTO_KPP=y ++CONFIG_CRYPTO_ACOMP2=y ++CONFIG_CRYPTO_MANAGER=y ++CONFIG_CRYPTO_MANAGER2=y ++CONFIG_CRYPTO_USER=m ++CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y ++CONFIG_CRYPTO_NULL=m ++CONFIG_CRYPTO_NULL2=m ++# CONFIG_CRYPTO_PCRYPT is not set ++CONFIG_CRYPTO_CRYPTD=m ++CONFIG_CRYPTO_AUTHENC=m ++# CONFIG_CRYPTO_TEST is not set ++# end of Crypto core or helper ++ ++# ++# Public-key cryptography ++# ++CONFIG_CRYPTO_RSA=y ++CONFIG_CRYPTO_DH=y ++# CONFIG_CRYPTO_DH_RFC7919_GROUPS is not set ++CONFIG_CRYPTO_ECC=m ++CONFIG_CRYPTO_ECDH=m ++# CONFIG_CRYPTO_ECDSA is not set ++# CONFIG_CRYPTO_ECRDSA is not set ++# CONFIG_CRYPTO_CURVE25519 is not set ++# end of Public-key cryptography ++ ++# ++# Block ciphers ++# ++CONFIG_CRYPTO_AES=m ++# CONFIG_CRYPTO_AES_TI is not set ++# CONFIG_CRYPTO_ANUBIS is not set ++# CONFIG_CRYPTO_ARIA is not set ++# CONFIG_CRYPTO_BLOWFISH is not set ++# CONFIG_CRYPTO_CAMELLIA is not set ++CONFIG_CRYPTO_CAST_COMMON=m ++CONFIG_CRYPTO_CAST5=m ++# CONFIG_CRYPTO_CAST6 is not set ++CONFIG_CRYPTO_DES=y ++# CONFIG_CRYPTO_FCRYPT is not set ++# CONFIG_CRYPTO_KHAZAD is not set ++# CONFIG_CRYPTO_SEED is not set ++# CONFIG_CRYPTO_SERPENT is not set ++CONFIG_CRYPTO_SM4=m ++# CONFIG_CRYPTO_SM4_GENERIC is not set ++# CONFIG_CRYPTO_TEA is not set ++CONFIG_CRYPTO_TWOFISH=m ++CONFIG_CRYPTO_TWOFISH_COMMON=m ++# end of Block ciphers ++ ++# ++# Length-preserving ciphers and modes ++# ++CONFIG_CRYPTO_ADIANTUM=m ++# CONFIG_CRYPTO_ARC4 is not set ++CONFIG_CRYPTO_CHACHA20=m ++CONFIG_CRYPTO_CBC=m ++CONFIG_CRYPTO_CTR=m ++CONFIG_CRYPTO_CTS=y ++CONFIG_CRYPTO_ECB=y ++# CONFIG_CRYPTO_HCTR2 is not set ++# CONFIG_CRYPTO_KEYWRAP is not set ++# CONFIG_CRYPTO_LRW is not set ++# CONFIG_CRYPTO_PCBC is not set ++CONFIG_CRYPTO_XTS=y ++CONFIG_CRYPTO_NHPOLY1305=m ++# end of Length-preserving ciphers and modes ++ ++# ++# AEAD (authenticated encryption with associated data) ciphers ++# ++# CONFIG_CRYPTO_AEGIS128 is not set ++CONFIG_CRYPTO_CHACHA20POLY1305=m ++CONFIG_CRYPTO_CCM=m ++CONFIG_CRYPTO_GCM=m ++CONFIG_CRYPTO_GENIV=m ++CONFIG_CRYPTO_SEQIV=m ++CONFIG_CRYPTO_ECHAINIV=m ++CONFIG_CRYPTO_ESSIV=m ++# end of AEAD (authenticated encryption with associated data) ciphers ++ ++# ++# Hashes, digests, and MACs ++# ++CONFIG_CRYPTO_BLAKE2B=m ++CONFIG_CRYPTO_CMAC=m ++CONFIG_CRYPTO_GHASH=m ++CONFIG_CRYPTO_HMAC=y ++CONFIG_CRYPTO_MD4=m ++CONFIG_CRYPTO_MD5=m ++# CONFIG_CRYPTO_MICHAEL_MIC is not set ++CONFIG_CRYPTO_POLY1305=m ++# CONFIG_CRYPTO_RMD160 is not set ++CONFIG_CRYPTO_SHA1=m ++CONFIG_CRYPTO_SHA256=y ++CONFIG_CRYPTO_SHA512=m ++CONFIG_CRYPTO_SHA3=m ++CONFIG_CRYPTO_SM3=m ++# CONFIG_CRYPTO_SM3_GENERIC is not set ++# CONFIG_CRYPTO_STREEBOG is not set ++# CONFIG_CRYPTO_VMAC is not set ++CONFIG_CRYPTO_WP512=m ++CONFIG_CRYPTO_XCBC=m ++CONFIG_CRYPTO_XXHASH=m ++# end of Hashes, digests, and MACs ++ ++# ++# CRCs (cyclic redundancy checks) ++# ++CONFIG_CRYPTO_CRC32C=y ++CONFIG_CRYPTO_CRC32=y ++CONFIG_CRYPTO_CRCT10DIF=y ++CONFIG_CRYPTO_CRC64_ROCKSOFT=y ++# end of CRCs (cyclic redundancy checks) ++ ++# ++# Compression ++# ++CONFIG_CRYPTO_DEFLATE=m ++CONFIG_CRYPTO_LZO=y ++# CONFIG_CRYPTO_842 is not set ++CONFIG_CRYPTO_LZ4=m ++# CONFIG_CRYPTO_LZ4HC is not set ++CONFIG_CRYPTO_ZSTD=m ++# end of Compression ++ ++# ++# Random number generation ++# ++# CONFIG_CRYPTO_ANSI_CPRNG is not set ++CONFIG_CRYPTO_DRBG_MENU=m ++CONFIG_CRYPTO_DRBG_HMAC=y ++# CONFIG_CRYPTO_DRBG_HASH is not set ++# CONFIG_CRYPTO_DRBG_CTR is not set ++CONFIG_CRYPTO_DRBG=m ++CONFIG_CRYPTO_JITTERENTROPY=m ++CONFIG_CRYPTO_JITTERENTROPY_MEMORY_BLOCKS=64 ++CONFIG_CRYPTO_JITTERENTROPY_MEMORY_BLOCKSIZE=32 ++CONFIG_CRYPTO_JITTERENTROPY_OSR=1 ++CONFIG_CRYPTO_KDF800108_CTR=y ++# end of Random number generation ++ ++# ++# Userspace interface ++# ++CONFIG_CRYPTO_USER_API=m ++CONFIG_CRYPTO_USER_API_HASH=m ++CONFIG_CRYPTO_USER_API_SKCIPHER=m ++CONFIG_CRYPTO_USER_API_RNG=m ++# CONFIG_CRYPTO_USER_API_RNG_CAVP is not set ++CONFIG_CRYPTO_USER_API_AEAD=m ++CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y ++# end of Userspace interface ++ ++CONFIG_CRYPTO_HASH_INFO=y ++CONFIG_CRYPTO_NHPOLY1305_NEON=m ++CONFIG_CRYPTO_CHACHA20_NEON=m ++ ++# ++# Accelerated Cryptographic Algorithms for CPU (arm64) ++# ++CONFIG_CRYPTO_GHASH_ARM64_CE=m ++CONFIG_CRYPTO_POLY1305_NEON=m ++CONFIG_CRYPTO_SHA1_ARM64_CE=m ++CONFIG_CRYPTO_SHA256_ARM64=m ++CONFIG_CRYPTO_SHA2_ARM64_CE=m ++CONFIG_CRYPTO_SHA512_ARM64=m ++CONFIG_CRYPTO_SHA512_ARM64_CE=m ++CONFIG_CRYPTO_SHA3_ARM64=m ++# CONFIG_CRYPTO_SM3_NEON is not set ++CONFIG_CRYPTO_SM3_ARM64_CE=m ++# CONFIG_CRYPTO_POLYVAL_ARM64_CE is not set ++CONFIG_CRYPTO_AES_ARM64=m ++CONFIG_CRYPTO_AES_ARM64_CE=m ++CONFIG_CRYPTO_AES_ARM64_CE_BLK=m ++CONFIG_CRYPTO_AES_ARM64_NEON_BLK=m ++CONFIG_CRYPTO_AES_ARM64_BS=m ++CONFIG_CRYPTO_SM4_ARM64_CE=m ++# CONFIG_CRYPTO_SM4_ARM64_CE_BLK is not set ++# CONFIG_CRYPTO_SM4_ARM64_NEON_BLK is not set ++CONFIG_CRYPTO_AES_ARM64_CE_CCM=m ++# CONFIG_CRYPTO_SM4_ARM64_CE_CCM is not set ++# CONFIG_CRYPTO_SM4_ARM64_CE_GCM is not set ++# CONFIG_CRYPTO_CRCT10DIF_ARM64_CE is not set ++# end of Accelerated Cryptographic Algorithms for CPU (arm64) ++ ++# CONFIG_CRYPTO_HW is not set ++CONFIG_ASYMMETRIC_KEY_TYPE=y ++CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y ++CONFIG_X509_CERTIFICATE_PARSER=y ++CONFIG_PKCS8_PRIVATE_KEY_PARSER=m ++CONFIG_PKCS7_MESSAGE_PARSER=y ++# CONFIG_PKCS7_TEST_KEY is not set ++# CONFIG_SIGNED_PE_FILE_VERIFICATION is not set ++# CONFIG_FIPS_SIGNATURE_SELFTEST is not set ++ ++# ++# Certificates for signature checking ++# ++CONFIG_SYSTEM_TRUSTED_KEYRING=y ++CONFIG_SYSTEM_TRUSTED_KEYS="" ++# CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set ++# CONFIG_SECONDARY_TRUSTED_KEYRING is not set ++# CONFIG_SYSTEM_BLACKLIST_KEYRING is not set ++# end of Certificates for signature checking ++ ++CONFIG_BINARY_PRINTF=y ++ ++# ++# Library routines ++# ++CONFIG_RAID6_PQ=m ++CONFIG_RAID6_PQ_BENCHMARK=y ++CONFIG_LINEAR_RANGES=y ++# CONFIG_PACKING is not set ++CONFIG_BITREVERSE=y ++CONFIG_HAVE_ARCH_BITREVERSE=y ++CONFIG_GENERIC_STRNCPY_FROM_USER=y ++CONFIG_GENERIC_STRNLEN_USER=y ++CONFIG_GENERIC_NET_UTILS=y ++CONFIG_CORDIC=m ++# CONFIG_PRIME_NUMBERS is not set ++CONFIG_RATIONAL=y ++CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y ++CONFIG_ARCH_HAS_FAST_MULTIPLIER=y ++CONFIG_ARCH_USE_SYM_ANNOTATIONS=y ++# CONFIG_INDIRECT_PIO is not set ++# CONFIG_TRACE_MMIO_ACCESS is not set ++ ++# ++# Crypto library routines ++# ++CONFIG_CRYPTO_LIB_UTILS=y ++CONFIG_CRYPTO_LIB_AES=m ++CONFIG_CRYPTO_LIB_ARC4=m ++CONFIG_CRYPTO_LIB_GF128MUL=m ++CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y ++CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=y ++CONFIG_CRYPTO_LIB_CHACHA_GENERIC=m ++CONFIG_CRYPTO_LIB_CHACHA_INTERNAL=m ++CONFIG_CRYPTO_LIB_CHACHA=m ++CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=m ++CONFIG_CRYPTO_LIB_CURVE25519_INTERNAL=m ++CONFIG_CRYPTO_LIB_CURVE25519=m ++CONFIG_CRYPTO_LIB_DES=y ++CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 ++CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=y ++CONFIG_CRYPTO_LIB_POLY1305_GENERIC=m ++CONFIG_CRYPTO_LIB_POLY1305_INTERNAL=m ++CONFIG_CRYPTO_LIB_POLY1305=m ++CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m ++CONFIG_CRYPTO_LIB_SHA1=y ++CONFIG_CRYPTO_LIB_SHA256=y ++# end of Crypto library routines ++ ++CONFIG_CRC_CCITT=m ++CONFIG_CRC16=y ++CONFIG_CRC_T10DIF=y ++CONFIG_CRC64_ROCKSOFT=y ++CONFIG_CRC_ITU_T=y ++CONFIG_CRC32=y ++# CONFIG_CRC32_SELFTEST is not set ++CONFIG_CRC32_SLICEBY8=y ++# CONFIG_CRC32_SLICEBY4 is not set ++# CONFIG_CRC32_SARWATE is not set ++# CONFIG_CRC32_BIT is not set ++CONFIG_CRC64=y ++# CONFIG_CRC4 is not set ++CONFIG_CRC7=m ++CONFIG_LIBCRC32C=y ++CONFIG_CRC8=m ++CONFIG_XXHASH=y ++CONFIG_AUDIT_GENERIC=y ++CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y ++CONFIG_AUDIT_COMPAT_GENERIC=y ++# CONFIG_RANDOM32_SELFTEST is not set ++CONFIG_ZLIB_INFLATE=y ++CONFIG_ZLIB_DEFLATE=y ++CONFIG_LZO_COMPRESS=y ++CONFIG_LZO_DECOMPRESS=y ++CONFIG_LZ4_COMPRESS=m ++CONFIG_LZ4HC_COMPRESS=m ++CONFIG_LZ4_DECOMPRESS=y ++CONFIG_ZSTD_COMMON=y ++CONFIG_ZSTD_COMPRESS=y ++CONFIG_ZSTD_DECOMPRESS=y ++CONFIG_XZ_DEC=y ++CONFIG_XZ_DEC_X86=y ++CONFIG_XZ_DEC_POWERPC=y ++CONFIG_XZ_DEC_ARM=y ++CONFIG_XZ_DEC_ARMTHUMB=y ++CONFIG_XZ_DEC_ARM64=y ++CONFIG_XZ_DEC_SPARC=y ++CONFIG_XZ_DEC_RISCV=y ++# CONFIG_XZ_DEC_MICROLZMA is not set ++CONFIG_XZ_DEC_BCJ=y ++# CONFIG_XZ_DEC_TEST is not set ++CONFIG_DECOMPRESS_GZIP=y ++CONFIG_DECOMPRESS_BZIP2=y ++CONFIG_DECOMPRESS_LZMA=y ++CONFIG_DECOMPRESS_XZ=y ++CONFIG_DECOMPRESS_LZO=y ++CONFIG_DECOMPRESS_LZ4=y ++CONFIG_DECOMPRESS_ZSTD=y ++CONFIG_GENERIC_ALLOCATOR=y ++CONFIG_REED_SOLOMON=y ++CONFIG_REED_SOLOMON_ENC8=y ++CONFIG_REED_SOLOMON_DEC8=y ++CONFIG_TEXTSEARCH=y ++CONFIG_TEXTSEARCH_KMP=m ++CONFIG_TEXTSEARCH_BM=m ++CONFIG_TEXTSEARCH_FSM=m ++CONFIG_BTREE=y ++CONFIG_INTERVAL_TREE=y ++CONFIG_XARRAY_MULTI=y ++CONFIG_ASSOCIATIVE_ARRAY=y ++CONFIG_CLOSURES=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_IOPORT=y ++CONFIG_HAS_IOPORT_MAP=y ++CONFIG_HAS_DMA=y ++CONFIG_DMA_OPS_HELPERS=y ++CONFIG_NEED_SG_DMA_FLAGS=y ++CONFIG_NEED_SG_DMA_LENGTH=y ++CONFIG_NEED_DMA_MAP_STATE=y ++CONFIG_ARCH_DMA_ADDR_T_64BIT=y ++CONFIG_DMA_DECLARE_COHERENT=y ++CONFIG_ARCH_HAS_SETUP_DMA_OPS=y ++CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE=y ++CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU=y ++CONFIG_ARCH_HAS_DMA_PREP_COHERENT=y ++CONFIG_SWIOTLB=y ++# CONFIG_SWIOTLB_DYNAMIC is not set ++CONFIG_DMA_NEED_SYNC=y ++# CONFIG_DMA_RESTRICTED_POOL is not set ++CONFIG_DMA_NONCOHERENT_MMAP=y ++CONFIG_DMA_COHERENT_POOL=y ++CONFIG_DMA_DIRECT_REMAP=y ++CONFIG_DMA_CMA=y ++# CONFIG_DMA_NUMA_CMA is not set ++ ++# ++# Default contiguous memory area size: ++# ++CONFIG_CMA_SIZE_MBYTES=5 ++CONFIG_CMA_SIZE_SEL_MBYTES=y ++# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set ++# CONFIG_CMA_SIZE_SEL_MIN is not set ++# CONFIG_CMA_SIZE_SEL_MAX is not set ++CONFIG_CMA_ALIGNMENT=8 ++# CONFIG_DMA_API_DEBUG is not set ++# CONFIG_DMA_MAP_BENCHMARK is not set ++CONFIG_SGL_ALLOC=y ++CONFIG_CPU_RMAP=y ++CONFIG_DQL=y ++CONFIG_GLOB=y ++# CONFIG_GLOB_SELFTEST is not set ++CONFIG_NLATTR=y ++CONFIG_LRU_CACHE=m ++CONFIG_CLZ_TAB=y ++# CONFIG_IRQ_POLL is not set ++CONFIG_MPILIB=y ++CONFIG_DIMLIB=y ++CONFIG_LIBFDT=y ++CONFIG_OID_REGISTRY=y ++CONFIG_UCS2_STRING=y ++CONFIG_HAVE_GENERIC_VDSO=y ++CONFIG_GENERIC_GETTIMEOFDAY=y ++CONFIG_GENERIC_VDSO_TIME_NS=y ++CONFIG_VDSO_GETRANDOM=y ++CONFIG_FONT_SUPPORT=y ++# CONFIG_FONTS is not set ++CONFIG_FONT_8x8=y ++CONFIG_FONT_8x16=y ++CONFIG_SG_POOL=y ++CONFIG_ARCH_STACKWALK=y ++CONFIG_STACKDEPOT=y ++CONFIG_STACKDEPOT_MAX_FRAMES=64 ++CONFIG_SBITMAP=y ++# CONFIG_LWQ_TEST is not set ++# end of Library routines ++ ++CONFIG_GENERIC_IOREMAP=y ++CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y ++ ++# ++# Kernel hacking ++# ++ ++# ++# printk and dmesg options ++# ++CONFIG_PRINTK_TIME=y ++# CONFIG_PRINTK_CALLER is not set ++# CONFIG_STACKTRACE_BUILD_ID is not set ++CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 ++CONFIG_CONSOLE_LOGLEVEL_QUIET=4 ++CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 ++CONFIG_BOOT_PRINTK_DELAY=y ++# CONFIG_DYNAMIC_DEBUG is not set ++# CONFIG_DYNAMIC_DEBUG_CORE is not set ++CONFIG_SYMBOLIC_ERRNAME=y ++CONFIG_DEBUG_BUGVERBOSE=y ++# end of printk and dmesg options ++ ++CONFIG_DEBUG_KERNEL=y ++CONFIG_DEBUG_MISC=y ++ ++# ++# Compile-time checks and compiler options ++# ++CONFIG_AS_HAS_NON_CONST_ULEB128=y ++CONFIG_DEBUG_INFO_NONE=y ++# CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set ++# CONFIG_DEBUG_INFO_DWARF4 is not set ++# CONFIG_DEBUG_INFO_DWARF5 is not set ++CONFIG_FRAME_WARN=2048 ++# CONFIG_STRIP_ASM_SYMS is not set ++# CONFIG_READABLE_ASM is not set ++# CONFIG_HEADERS_INSTALL is not set ++# CONFIG_DEBUG_SECTION_MISMATCH is not set ++CONFIG_SECTION_MISMATCH_WARN_ONLY=y ++# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set ++CONFIG_ARCH_WANT_FRAME_POINTERS=y ++CONFIG_FRAME_POINTER=y ++# CONFIG_VMLINUX_MAP is not set ++# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set ++# end of Compile-time checks and compiler options ++ ++# ++# Generic Kernel Debugging Instruments ++# ++CONFIG_MAGIC_SYSRQ=y ++CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1f6 ++CONFIG_MAGIC_SYSRQ_SERIAL=y ++CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" ++CONFIG_DEBUG_FS=y ++CONFIG_DEBUG_FS_ALLOW_ALL=y ++# CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set ++# CONFIG_DEBUG_FS_ALLOW_NONE is not set ++CONFIG_HAVE_ARCH_KGDB=y ++CONFIG_KGDB=y ++CONFIG_KGDB_HONOUR_BLOCKLIST=y ++CONFIG_KGDB_SERIAL_CONSOLE=y ++# CONFIG_KGDB_TESTS is not set ++CONFIG_KGDB_KDB=y ++CONFIG_KDB_DEFAULT_ENABLE=0x1 ++CONFIG_KDB_KEYBOARD=y ++CONFIG_KDB_CONTINUE_CATASTROPHIC=0 ++CONFIG_ARCH_HAS_UBSAN=y ++# CONFIG_UBSAN is not set ++CONFIG_HAVE_ARCH_KCSAN=y ++CONFIG_HAVE_KCSAN_COMPILER=y ++# CONFIG_KCSAN is not set ++# end of Generic Kernel Debugging Instruments ++ ++# ++# Networking Debugging ++# ++# CONFIG_NET_DEV_REFCNT_TRACKER is not set ++# CONFIG_NET_NS_REFCNT_TRACKER is not set ++# CONFIG_DEBUG_NET is not set ++# end of Networking Debugging ++ ++# ++# Memory Debugging ++# ++# CONFIG_PAGE_EXTENSION is not set ++# CONFIG_DEBUG_PAGEALLOC is not set ++CONFIG_SLUB_DEBUG=y ++# CONFIG_SLUB_DEBUG_ON is not set ++# CONFIG_PAGE_OWNER is not set ++# CONFIG_PAGE_POISONING is not set ++# CONFIG_DEBUG_PAGE_REF is not set ++# CONFIG_DEBUG_RODATA_TEST is not set ++CONFIG_ARCH_HAS_DEBUG_WX=y ++# CONFIG_DEBUG_WX is not set ++CONFIG_GENERIC_PTDUMP=y ++# CONFIG_PTDUMP_DEBUGFS is not set ++CONFIG_HAVE_DEBUG_KMEMLEAK=y ++# CONFIG_DEBUG_KMEMLEAK is not set ++# CONFIG_PER_VMA_LOCK_STATS is not set ++# CONFIG_DEBUG_OBJECTS is not set ++# CONFIG_SHRINKER_DEBUG is not set ++# CONFIG_DEBUG_STACK_USAGE is not set ++# CONFIG_SCHED_STACK_END_CHECK is not set ++CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y ++# CONFIG_DEBUG_VM is not set ++# CONFIG_DEBUG_VM_PGTABLE is not set ++CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y ++# CONFIG_DEBUG_VIRTUAL is not set ++CONFIG_DEBUG_MEMORY_INIT=y ++# CONFIG_DEBUG_PER_CPU_MAPS is not set ++# CONFIG_MEM_ALLOC_PROFILING is not set ++CONFIG_HAVE_ARCH_KASAN=y ++CONFIG_HAVE_ARCH_KASAN_SW_TAGS=y ++CONFIG_HAVE_ARCH_KASAN_HW_TAGS=y ++CONFIG_HAVE_ARCH_KASAN_VMALLOC=y ++CONFIG_CC_HAS_KASAN_GENERIC=y ++CONFIG_CC_HAS_KASAN_SW_TAGS=y ++CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y ++# CONFIG_KASAN is not set ++CONFIG_HAVE_ARCH_KFENCE=y ++# CONFIG_KFENCE is not set ++# end of Memory Debugging ++ ++# CONFIG_DEBUG_SHIRQ is not set ++ ++# ++# Debug Oops, Lockups and Hangs ++# ++# CONFIG_PANIC_ON_OOPS is not set ++CONFIG_PANIC_ON_OOPS_VALUE=0 ++CONFIG_PANIC_TIMEOUT=0 ++# CONFIG_SOFTLOCKUP_DETECTOR is not set ++CONFIG_HAVE_HARDLOCKUP_DETECTOR_BUDDY=y ++# CONFIG_HARDLOCKUP_DETECTOR is not set ++CONFIG_DETECT_HUNG_TASK=y ++CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 ++# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set ++# CONFIG_WQ_WATCHDOG is not set ++# CONFIG_WQ_CPU_INTENSIVE_REPORT is not set ++# CONFIG_TEST_LOCKUP is not set ++# end of Debug Oops, Lockups and Hangs ++ ++# ++# Scheduler Debugging ++# ++CONFIG_SCHED_DEBUG=y ++CONFIG_SCHED_INFO=y ++CONFIG_SCHEDSTATS=y ++# end of Scheduler Debugging ++ ++# CONFIG_DEBUG_PREEMPT is not set ++ ++# ++# Lock Debugging (spinlocks, mutexes, etc...) ++# ++CONFIG_LOCK_DEBUGGING_SUPPORT=y ++# CONFIG_PROVE_LOCKING is not set ++# CONFIG_LOCK_STAT is not set ++# CONFIG_DEBUG_RT_MUTEXES is not set ++# CONFIG_DEBUG_SPINLOCK is not set ++# CONFIG_DEBUG_MUTEXES is not set ++# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set ++# CONFIG_DEBUG_RWSEMS is not set ++# CONFIG_DEBUG_LOCK_ALLOC is not set ++# CONFIG_DEBUG_ATOMIC_SLEEP is not set ++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set ++# CONFIG_LOCK_TORTURE_TEST is not set ++# CONFIG_WW_MUTEX_SELFTEST is not set ++# CONFIG_SCF_TORTURE_TEST is not set ++# CONFIG_CSD_LOCK_WAIT_DEBUG is not set ++# end of Lock Debugging (spinlocks, mutexes, etc...) ++ ++# CONFIG_DEBUG_IRQFLAGS is not set ++CONFIG_STACKTRACE=y ++# CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set ++# CONFIG_DEBUG_KOBJECT is not set ++ ++# ++# Debug kernel data structures ++# ++# CONFIG_DEBUG_LIST is not set ++# CONFIG_DEBUG_PLIST is not set ++# CONFIG_DEBUG_SG is not set ++# CONFIG_DEBUG_NOTIFIERS is not set ++# CONFIG_DEBUG_CLOSURES is not set ++# CONFIG_DEBUG_MAPLE_TREE is not set ++# end of Debug kernel data structures ++ ++# ++# RCU Debugging ++# ++# CONFIG_RCU_SCALE_TEST is not set ++# CONFIG_RCU_TORTURE_TEST is not set ++# CONFIG_RCU_REF_SCALE_TEST is not set ++CONFIG_RCU_CPU_STALL_TIMEOUT=21 ++CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 ++# CONFIG_RCU_CPU_STALL_CPUTIME is not set ++CONFIG_RCU_TRACE=y ++# CONFIG_RCU_EQS_DEBUG is not set ++# end of RCU Debugging ++ ++# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set ++# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set ++CONFIG_LATENCYTOP=y ++# CONFIG_DEBUG_CGROUP_REF is not set ++CONFIG_USER_STACKTRACE_SUPPORT=y ++CONFIG_NOP_TRACER=y ++CONFIG_HAVE_FUNCTION_TRACER=y ++CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y ++CONFIG_HAVE_FUNCTION_GRAPH_RETVAL=y ++CONFIG_HAVE_DYNAMIC_FTRACE=y ++CONFIG_HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y ++CONFIG_HAVE_DYNAMIC_FTRACE_WITH_CALL_OPS=y ++CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y ++CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y ++CONFIG_HAVE_SYSCALL_TRACEPOINTS=y ++CONFIG_HAVE_C_RECORDMCOUNT=y ++CONFIG_TRACER_MAX_TRACE=y ++CONFIG_TRACE_CLOCK=y ++CONFIG_RING_BUFFER=y ++CONFIG_EVENT_TRACING=y ++CONFIG_CONTEXT_SWITCH_TRACER=y ++CONFIG_TRACING=y ++CONFIG_GENERIC_TRACER=y ++CONFIG_TRACING_SUPPORT=y ++CONFIG_FTRACE=y ++# CONFIG_BOOTTIME_TRACING is not set ++CONFIG_FUNCTION_TRACER=y ++CONFIG_FUNCTION_GRAPH_TRACER=y ++# CONFIG_FUNCTION_GRAPH_RETVAL is not set ++CONFIG_DYNAMIC_FTRACE=y ++CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y ++CONFIG_DYNAMIC_FTRACE_WITH_CALL_OPS=y ++CONFIG_DYNAMIC_FTRACE_WITH_ARGS=y ++CONFIG_FUNCTION_PROFILER=y ++CONFIG_STACK_TRACER=y ++# CONFIG_IRQSOFF_TRACER is not set ++# CONFIG_PREEMPT_TRACER is not set ++CONFIG_SCHED_TRACER=y ++# CONFIG_HWLAT_TRACER is not set ++# CONFIG_OSNOISE_TRACER is not set ++# CONFIG_TIMERLAT_TRACER is not set ++CONFIG_FTRACE_SYSCALLS=y ++CONFIG_TRACER_SNAPSHOT=y ++# CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP is not set ++CONFIG_BRANCH_PROFILE_NONE=y ++# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set ++# CONFIG_PROFILE_ALL_BRANCHES is not set ++CONFIG_BLK_DEV_IO_TRACE=y ++CONFIG_KPROBE_EVENTS=y ++# CONFIG_KPROBE_EVENTS_ON_NOTRACE is not set ++# CONFIG_UPROBE_EVENTS is not set ++CONFIG_BPF_EVENTS=y ++CONFIG_DYNAMIC_EVENTS=y ++CONFIG_PROBE_EVENTS=y ++CONFIG_FTRACE_MCOUNT_RECORD=y ++CONFIG_FTRACE_MCOUNT_USE_PATCHABLE_FUNCTION_ENTRY=y ++# CONFIG_SYNTH_EVENTS is not set ++# CONFIG_USER_EVENTS is not set ++# CONFIG_HIST_TRIGGERS is not set ++# CONFIG_TRACE_EVENT_INJECT is not set ++# CONFIG_TRACEPOINT_BENCHMARK is not set ++# CONFIG_RING_BUFFER_BENCHMARK is not set ++# CONFIG_TRACE_EVAL_MAP_FILE is not set ++# CONFIG_FTRACE_RECORD_RECURSION is not set ++# CONFIG_FTRACE_VALIDATE_RCU_IS_WATCHING is not set ++# CONFIG_FTRACE_STARTUP_TEST is not set ++# CONFIG_RING_BUFFER_STARTUP_TEST is not set ++# CONFIG_RING_BUFFER_VALIDATE_TIME_DELTAS is not set ++# CONFIG_PREEMPTIRQ_DELAY_TEST is not set ++# CONFIG_KPROBE_EVENT_GEN_TEST is not set ++# CONFIG_RV is not set ++# CONFIG_SAMPLES is not set ++CONFIG_HAVE_SAMPLE_FTRACE_DIRECT=y ++CONFIG_HAVE_SAMPLE_FTRACE_DIRECT_MULTI=y ++# CONFIG_STRICT_DEVMEM is not set ++ ++# ++# arm64 Debugging ++# ++# CONFIG_PID_IN_CONTEXTIDR is not set ++# CONFIG_ARM64_RELOC_TEST is not set ++# CONFIG_CORESIGHT is not set ++# end of arm64 Debugging ++ ++# ++# Kernel Testing and Coverage ++# ++# CONFIG_KUNIT is not set ++# CONFIG_NOTIFIER_ERROR_INJECTION is not set ++# CONFIG_FUNCTION_ERROR_INJECTION is not set ++# CONFIG_FAULT_INJECTION is not set ++CONFIG_ARCH_HAS_KCOV=y ++CONFIG_CC_HAS_SANCOV_TRACE_PC=y ++# CONFIG_KCOV is not set ++CONFIG_RUNTIME_TESTING_MENU=y ++# CONFIG_TEST_DHRY is not set ++# CONFIG_LKDTM is not set ++# CONFIG_TEST_MIN_HEAP is not set ++# CONFIG_TEST_DIV64 is not set ++# CONFIG_TEST_MULDIV64 is not set ++# CONFIG_BACKTRACE_SELF_TEST is not set ++# CONFIG_TEST_REF_TRACKER is not set ++# CONFIG_RBTREE_TEST is not set ++# CONFIG_REED_SOLOMON_TEST is not set ++# CONFIG_INTERVAL_TREE_TEST is not set ++# CONFIG_PERCPU_TEST is not set ++# CONFIG_ATOMIC64_SELFTEST is not set ++# CONFIG_ASYNC_RAID6_TEST is not set ++# CONFIG_TEST_HEXDUMP is not set ++# CONFIG_TEST_KSTRTOX is not set ++# CONFIG_TEST_PRINTF is not set ++# CONFIG_TEST_SCANF is not set ++# CONFIG_TEST_BITMAP is not set ++# CONFIG_TEST_UUID is not set ++# CONFIG_TEST_XARRAY is not set ++# CONFIG_TEST_MAPLE_TREE is not set ++# CONFIG_TEST_RHASHTABLE is not set ++# CONFIG_TEST_IDA is not set ++# CONFIG_TEST_LKM is not set ++# CONFIG_TEST_BITOPS is not set ++# CONFIG_TEST_VMALLOC is not set ++# CONFIG_TEST_BPF is not set ++# CONFIG_TEST_BLACKHOLE_DEV is not set ++# CONFIG_FIND_BIT_BENCHMARK is not set ++# CONFIG_TEST_FIRMWARE is not set ++# CONFIG_TEST_SYSCTL is not set ++# CONFIG_TEST_UDELAY is not set ++# CONFIG_TEST_STATIC_KEYS is not set ++# CONFIG_TEST_KMOD is not set ++# CONFIG_TEST_MEMCAT_P is not set ++# CONFIG_TEST_MEMINIT is not set ++# CONFIG_TEST_FREE_PAGES is not set ++# CONFIG_TEST_FPU is not set ++# CONFIG_TEST_OBJPOOL is not set ++CONFIG_ARCH_USE_MEMTEST=y ++# CONFIG_MEMTEST is not set ++# end of Kernel Testing and Coverage ++ ++# ++# Rust hacking ++# ++# end of Rust hacking ++# end of Kernel hacking diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0015-rpi4_64_nomodules_defconfig.patch b/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0015-rpi4_64_nomodules_defconfig.patch similarity index 100% rename from build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0015-rpi4_64_nomodules_defconfig.patch rename to build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0015-rpi4_64_nomodules_defconfig.patch diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0016-Makefile.patch b/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0016-Makefile.patch similarity index 100% rename from build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0016-Makefile.patch rename to build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0016-Makefile.patch diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0002-rpi4_64_nomodules_soo_defconfig.patch b/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0017-rpi4_64_nomodules_soo_defconfig.patch similarity index 85% rename from build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0002-rpi4_64_nomodules_soo_defconfig.patch rename to build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0017-rpi4_64_nomodules_soo_defconfig.patch index ba3a9c4..d88473e 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0002-rpi4_64_nomodules_soo_defconfig.patch +++ b/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0017-rpi4_64_nomodules_soo_defconfig.patch @@ -1,9 +1,9 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/configs/rpi4_64_nomodules_soo_defconfig 1970-01-01 01:00:00.000000000 +0100 -+++ ./arch/arm64/configs/rpi4_64_nomodules_soo_defconfig 2026-03-21 13:02:28.838899612 +0100 -@@ -0,0 +1,6140 @@ +--- /home/rossierd/soo/micofe/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/configs/rpi4_64_nomodules_soo_defconfig 1970-01-01 01:00:00.000000000 +0100 ++++ ./arch/arm64/configs/rpi4_64_nomodules_soo_defconfig 2026-02-13 12:39:28.107216945 +0100 +@@ -0,0 +1,5437 @@ +# +# Automatically generated file; DO NOT EDIT. -+# Linux/arm64 6.12.47 Kernel Configuration ++# Linux/arm64 6.12.34 Kernel Configuration +# +CONFIG_CC_VERSION_TEXT="aarch64-none-linux-gnu-gcc (Arm GNU Toolchain 12.2.Rel1 (Build arm-12.24)) 12.2.1 20221205" +CONFIG_CC_IS_GCC=y @@ -22,6 +22,7 @@ +CONFIG_CC_HAS_ASM_INLINE=y +CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y +CONFIG_LD_CAN_USE_KEEP_IN_OVERLAY=y ++CONFIG_RUSTC_HAS_UNNECESSARY_TRANSMUTES=y +CONFIG_PAHOLE_VERSION=0 +CONFIG_IRQ_WORK=y +CONFIG_BUILDTIME_TABLE_SORT=y @@ -936,7 +937,9 @@ +CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y +# CONFIG_MEMORY_HOTPLUG is not set +CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y ++CONFIG_SPLIT_PTE_PTLOCKS=y +CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y ++CONFIG_SPLIT_PMD_PTLOCKS=y +CONFIG_COMPACTION=y +CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1 +# CONFIG_PAGE_REPORTING is not set @@ -1397,8 +1400,6 @@ +CONFIG_GENERIC_CPU_VULNERABILITIES=y +CONFIG_SOC_BUS=y +CONFIG_REGMAP=y -+CONFIG_REGMAP_I2C=y -+CONFIG_REGMAP_SPI=y +CONFIG_REGMAP_MMIO=y +CONFIG_DMA_SHARED_BUFFER=y +# CONFIG_DMA_FENCE_TRACE is not set @@ -2210,11 +2211,11 @@ +# CONFIG_JOYSTICK_SEESAW is not set +# CONFIG_INPUT_TABLET is not set +CONFIG_INPUT_TOUCHSCREEN=y -+CONFIG_TOUCHSCREEN_ADS7846=y ++# CONFIG_TOUCHSCREEN_ADS7846 is not set +# CONFIG_TOUCHSCREEN_AD7877 is not set +# CONFIG_TOUCHSCREEN_AD7879 is not set +# CONFIG_TOUCHSCREEN_AR1021_I2C is not set -+CONFIG_TOUCHSCREEN_ATMEL_MXT=y ++# CONFIG_TOUCHSCREEN_ATMEL_MXT is not set +# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set +# CONFIG_TOUCHSCREEN_BU21013 is not set +# CONFIG_TOUCHSCREEN_BU21029 is not set @@ -2226,17 +2227,17 @@ +# CONFIG_TOUCHSCREEN_DYNAPRO is not set +# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set +# CONFIG_TOUCHSCREEN_EETI is not set -+CONFIG_TOUCHSCREEN_EGALAX=y ++# CONFIG_TOUCHSCREEN_EGALAX is not set +# CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set -+CONFIG_TOUCHSCREEN_EXC3000=y ++# CONFIG_TOUCHSCREEN_EXC3000 is not set +# CONFIG_TOUCHSCREEN_FUJITSU is not set -+CONFIG_TOUCHSCREEN_GOODIX=y ++# CONFIG_TOUCHSCREEN_GOODIX is not set +# CONFIG_TOUCHSCREEN_GOODIX_BERLIN_I2C is not set +# CONFIG_TOUCHSCREEN_GOODIX_BERLIN_SPI is not set +# CONFIG_TOUCHSCREEN_HIDEEP is not set +# CONFIG_TOUCHSCREEN_HYCON_HY46XX is not set +# CONFIG_TOUCHSCREEN_HYNITRON_CSTXXX is not set -+CONFIG_TOUCHSCREEN_ILI210X=y ++# CONFIG_TOUCHSCREEN_ILI210X is not set +# CONFIG_TOUCHSCREEN_ILITEK is not set +# CONFIG_TOUCHSCREEN_S6SY761 is not set +# CONFIG_TOUCHSCREEN_GUNZE is not set @@ -2255,49 +2256,31 @@ +# CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set +# CONFIG_TOUCHSCREEN_INEXIO is not set +# CONFIG_TOUCHSCREEN_PENMOUNT is not set -+CONFIG_TOUCHSCREEN_EDT_FT5X06=y -+CONFIG_TOUCHSCREEN_RASPBERRYPI_FW=y ++# CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set ++# CONFIG_TOUCHSCREEN_RASPBERRYPI_FW is not set +# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set +# CONFIG_TOUCHSCREEN_TOUCHWIN is not set +# CONFIG_TOUCHSCREEN_PIXCIR is not set +# CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set -+CONFIG_TOUCHSCREEN_USB_COMPOSITE=y -+CONFIG_TOUCHSCREEN_USB_EGALAX=y -+CONFIG_TOUCHSCREEN_USB_PANJIT=y -+CONFIG_TOUCHSCREEN_USB_3M=y -+CONFIG_TOUCHSCREEN_USB_ITM=y -+CONFIG_TOUCHSCREEN_USB_ETURBO=y -+CONFIG_TOUCHSCREEN_USB_GUNZE=y -+CONFIG_TOUCHSCREEN_USB_DMC_TSC10=y -+CONFIG_TOUCHSCREEN_USB_IRTOUCH=y -+CONFIG_TOUCHSCREEN_USB_IDEALTEK=y -+CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH=y -+CONFIG_TOUCHSCREEN_USB_GOTOP=y -+CONFIG_TOUCHSCREEN_USB_JASTEC=y -+CONFIG_TOUCHSCREEN_USB_ELO=y -+CONFIG_TOUCHSCREEN_USB_E2I=y -+CONFIG_TOUCHSCREEN_USB_ZYTRONIC=y -+CONFIG_TOUCHSCREEN_USB_ETT_TC45USB=y -+CONFIG_TOUCHSCREEN_USB_NEXIO=y -+CONFIG_TOUCHSCREEN_USB_EASYTOUCH=y ++# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set +# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set +# CONFIG_TOUCHSCREEN_TSC_SERIO is not set +# CONFIG_TOUCHSCREEN_TSC2004 is not set +# CONFIG_TOUCHSCREEN_TSC2005 is not set -+CONFIG_TOUCHSCREEN_TSC2007=y ++# CONFIG_TOUCHSCREEN_TSC2007 is not set +# CONFIG_TOUCHSCREEN_RM_TS is not set +# CONFIG_TOUCHSCREEN_SILEAD is not set +# CONFIG_TOUCHSCREEN_SIS_I2C is not set +# CONFIG_TOUCHSCREEN_ST1232 is not set +# CONFIG_TOUCHSCREEN_STMFTS is not set -+CONFIG_TOUCHSCREEN_STMPE=y ++# CONFIG_TOUCHSCREEN_STMPE is not set +# CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set +# CONFIG_TOUCHSCREEN_SX8654 is not set +# CONFIG_TOUCHSCREEN_TPS6507X is not set +# CONFIG_TOUCHSCREEN_ZET6223 is not set +# CONFIG_TOUCHSCREEN_ZFORCE is not set +# CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set -+CONFIG_TOUCHSCREEN_IQS5XX=y ++# CONFIG_TOUCHSCREEN_IQS5XX is not set +# CONFIG_TOUCHSCREEN_IQS7211 is not set +# CONFIG_TOUCHSCREEN_ZINITIX is not set +# CONFIG_TOUCHSCREEN_HIMAX_HX83112B is not set @@ -2483,8 +2466,8 @@ +# +# I2C system bus drivers (mostly embedded / system-on-chip) +# -+CONFIG_I2C_BCM2835=y -+CONFIG_I2C_BRCMSTB=y ++# CONFIG_I2C_BCM2835 is not set ++# CONFIG_I2C_BRCMSTB is not set +# CONFIG_I2C_CADENCE is not set +# CONFIG_I2C_CBUS_GPIO is not set +# CONFIG_I2C_DESIGNWARE_CORE is not set @@ -3108,7 +3091,6 @@ +# CONFIG_MFD_RN5T618 is not set +# CONFIG_MFD_SEC_CORE is not set +# CONFIG_MFD_SI476X_CORE is not set -+CONFIG_MFD_SIMPLE_MFD_I2C=y +# CONFIG_MFD_SM501 is not set +# CONFIG_MFD_SKY81452 is not set +CONFIG_MFD_STMPE=y @@ -3222,9 +3204,6 @@ +# CONFIG_REGULATOR_PV88090 is not set +# CONFIG_REGULATOR_PWM is not set +# CONFIG_REGULATOR_RAA215300 is not set -+CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY=y -+CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_V2=y -+CONFIG_REGULATOR_WAVESHARE_TOUCHSCREEN=y +# CONFIG_REGULATOR_RT4801 is not set +# CONFIG_REGULATOR_RT4803 is not set +# CONFIG_REGULATOR_RT5190A is not set @@ -3285,12 +3264,10 @@ +# CONFIG_RC_ATI_REMOTE is not set +# CONFIG_RC_LOOPBACK is not set +# CONFIG_RC_XBOX_DVD is not set -+CONFIG_CEC_CORE=y + +# +# CEC support +# -+# CONFIG_MEDIA_CEC_RC is not set +CONFIG_MEDIA_CEC_SUPPORT=y +# CONFIG_CEC_CH7322 is not set +# CONFIG_CEC_GPIO is not set @@ -3315,250 +3292,7 @@ +# CONFIG_HT16K33 is not set +# CONFIG_MAX6959 is not set +# CONFIG_SEG_LED_GPIO is not set -+CONFIG_DRM=y -+CONFIG_DRM_MIPI_DBI=y -+CONFIG_DRM_MIPI_DSI=y -+# CONFIG_DRM_DEBUG_MM is not set -+CONFIG_DRM_KMS_HELPER=y -+# CONFIG_DRM_PANIC is not set -+# CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set -+# CONFIG_DRM_DEBUG_MODESET_LOCK is not set -+CONFIG_DRM_CLIENT_SELECTION=y -+CONFIG_DRM_CLIENT_SETUP=y -+CONFIG_DRM_FBDEV_EMULATION=y -+CONFIG_DRM_FBDEV_OVERALLOC=100 -+# CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set -+CONFIG_DRM_LOAD_EDID_FIRMWARE=y -+CONFIG_DRM_DISPLAY_HELPER=y -+# CONFIG_DRM_DISPLAY_DP_AUX_CEC is not set -+# CONFIG_DRM_DISPLAY_DP_AUX_CHARDEV is not set -+CONFIG_DRM_DISPLAY_HDMI_HELPER=y -+CONFIG_DRM_DISPLAY_HDMI_STATE_HELPER=y -+CONFIG_DRM_GEM_DMA_HELPER=y -+CONFIG_DRM_GEM_SHMEM_HELPER=y -+CONFIG_DRM_SCHED=y -+ -+# -+# I2C encoder or helper chips -+# -+# CONFIG_DRM_I2C_CH7006 is not set -+# CONFIG_DRM_I2C_SIL164 is not set -+# CONFIG_DRM_I2C_NXP_TDA998X is not set -+# CONFIG_DRM_I2C_NXP_TDA9950 is not set -+# end of I2C encoder or helper chips -+ -+# -+# ARM devices -+# -+# CONFIG_DRM_HDLCD is not set -+# CONFIG_DRM_MALI_DISPLAY is not set -+# CONFIG_DRM_KOMEDA is not set -+# end of ARM devices -+ -+# CONFIG_DRM_RADEON is not set -+# CONFIG_DRM_AMDGPU is not set -+# CONFIG_DRM_NOUVEAU is not set -+# CONFIG_DRM_XE is not set -+# CONFIG_DRM_VGEM is not set -+# CONFIG_DRM_VKMS is not set -+# CONFIG_DRM_VMWGFX is not set -+CONFIG_DRM_UDL=y -+# CONFIG_DRM_AST is not set -+# CONFIG_DRM_MGAG200 is not set -+# CONFIG_DRM_QXL is not set -+# CONFIG_DRM_VIRTIO_GPU is not set -+CONFIG_DRM_PANEL=y -+ -+# -+# Display Panels -+# -+# CONFIG_DRM_PANEL_ABT_Y030XX067A is not set -+# CONFIG_DRM_PANEL_ARM_VERSATILE is not set -+# CONFIG_DRM_PANEL_ASUS_Z00T_TM5P5_NT35596 is not set -+# CONFIG_DRM_PANEL_AUO_A030JTN01 is not set -+# CONFIG_DRM_PANEL_BOE_BF060Y8M_AJ0 is not set -+# CONFIG_DRM_PANEL_BOE_HIMAX8279D is not set -+# CONFIG_DRM_PANEL_BOE_TH101MB31UIG002_28A is not set -+# CONFIG_DRM_PANEL_BOE_TV101WUM_NL6 is not set -+# CONFIG_DRM_PANEL_BOE_TV101WUM_LL2 is not set -+# CONFIG_DRM_PANEL_EBBG_FT8719 is not set -+# CONFIG_DRM_PANEL_ELIDA_KD35T133 is not set -+# CONFIG_DRM_PANEL_FEIXIN_K101_IM2BA02 is not set -+# CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D is not set -+# CONFIG_DRM_PANEL_DSI_CM is not set -+CONFIG_DRM_PANEL_LVDS=y -+# CONFIG_DRM_PANEL_HIMAX_HX83102 is not set -+# CONFIG_DRM_PANEL_HIMAX_HX83112A is not set -+# CONFIG_DRM_PANEL_HIMAX_HX8394 is not set -+# CONFIG_DRM_PANEL_ILITEK_IL9322 is not set -+# CONFIG_DRM_PANEL_ILITEK_ILI9341 is not set -+# CONFIG_DRM_PANEL_ILITEK_ILI9805 is not set -+CONFIG_DRM_PANEL_ILITEK_ILI9806E=y -+CONFIG_DRM_PANEL_ILITEK_ILI9806E_SPI=y -+CONFIG_DRM_PANEL_ILITEK_ILI9881C=y -+# CONFIG_DRM_PANEL_ILITEK_ILI9882T is not set -+# CONFIG_DRM_PANEL_INNOLUX_EJ030NA is not set -+# CONFIG_DRM_PANEL_INNOLUX_P079ZCA is not set -+# CONFIG_DRM_PANEL_JADARD_JD9365DA_H3 is not set -+# CONFIG_DRM_PANEL_JDI_LPM102A188A is not set -+CONFIG_DRM_PANEL_JDI_LT070ME05000=y -+# CONFIG_DRM_PANEL_JDI_R63452 is not set -+# CONFIG_DRM_PANEL_KHADAS_TS050 is not set -+# CONFIG_DRM_PANEL_KINGDISPLAY_KD097D04 is not set -+# CONFIG_DRM_PANEL_LEADTEK_LTK050H3146W is not set -+# CONFIG_DRM_PANEL_LEADTEK_LTK500HD1829 is not set -+# CONFIG_DRM_PANEL_LINCOLNTECH_LCD197 is not set -+# CONFIG_DRM_PANEL_LG_LB035Q02 is not set -+# CONFIG_DRM_PANEL_LG_LG4573 is not set -+# CONFIG_DRM_PANEL_LG_SW43408 is not set -+# CONFIG_DRM_PANEL_MAGNACHIP_D53E6EA8966 is not set -+# CONFIG_DRM_PANEL_MANTIX_MLAF057WE51 is not set -+# CONFIG_DRM_PANEL_NEC_NL8048HL11 is not set -+# CONFIG_DRM_PANEL_NEWVISION_NV3051D is not set -+# CONFIG_DRM_PANEL_NEWVISION_NV3052C is not set -+# CONFIG_DRM_PANEL_NOVATEK_NT35510 is not set -+# CONFIG_DRM_PANEL_NOVATEK_NT35560 is not set -+# CONFIG_DRM_PANEL_NOVATEK_NT35950 is not set -+# CONFIG_DRM_PANEL_NOVATEK_NT36523 is not set -+# CONFIG_DRM_PANEL_NOVATEK_NT36672A is not set -+# CONFIG_DRM_PANEL_NOVATEK_NT36672E is not set -+# CONFIG_DRM_PANEL_NOVATEK_NT39016 is not set -+# CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO is not set -+# CONFIG_DRM_PANEL_ORISETECH_OTA5601A is not set -+# CONFIG_DRM_PANEL_ORISETECH_OTM8009A is not set -+# CONFIG_DRM_PANEL_OSD_OSD101T2587_53TS is not set -+# CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00 is not set -+CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN=y -+# CONFIG_DRM_PANEL_RAYDIUM_RM67191 is not set -+# CONFIG_DRM_PANEL_RAYDIUM_RM68200 is not set -+# CONFIG_DRM_PANEL_RAYDIUM_RM692E5 is not set -+# CONFIG_DRM_PANEL_RAYDIUM_RM69380 is not set -+# CONFIG_DRM_PANEL_RONBO_RB070D30 is not set -+# CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01 is not set -+# CONFIG_DRM_PANEL_SAMSUNG_ATNA33XC20 is not set -+# CONFIG_DRM_PANEL_SAMSUNG_DB7430 is not set -+# CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set -+# CONFIG_DRM_PANEL_SAMSUNG_S6E3FA7 is not set -+# CONFIG_DRM_PANEL_SAMSUNG_S6D16D0 is not set -+# CONFIG_DRM_PANEL_SAMSUNG_S6D27A1 is not set -+# CONFIG_DRM_PANEL_SAMSUNG_S6D7AA0 is not set -+# CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2 is not set -+# CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03 is not set -+# CONFIG_DRM_PANEL_SAMSUNG_S6E63M0 is not set -+# CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set -+# CONFIG_DRM_PANEL_SAMSUNG_SOFEF00 is not set -+# CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set -+# CONFIG_DRM_PANEL_SHARP_LQ101R1SX01 is not set -+# CONFIG_DRM_PANEL_SHARP_LS037V7DW01 is not set -+# CONFIG_DRM_PANEL_SHARP_LS043T1LE01 is not set -+# CONFIG_DRM_PANEL_SHARP_LS060T1SX01 is not set -+CONFIG_DRM_PANEL_SITRONIX_ST7701=y -+# CONFIG_DRM_PANEL_SITRONIX_ST7703 is not set -+# CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set -+# CONFIG_DRM_PANEL_SONY_ACX565AKM is not set -+# CONFIG_DRM_PANEL_SONY_TD4353_JDI is not set -+# CONFIG_DRM_PANEL_SONY_TULIP_TRULY_NT35521 is not set -+# CONFIG_DRM_PANEL_STARTEK_KD070FHFID015 is not set -+# CONFIG_DRM_PANEL_EDP is not set -+CONFIG_DRM_PANEL_SIMPLE=y -+# CONFIG_DRM_PANEL_SYNAPTICS_R63353 is not set -+# CONFIG_DRM_PANEL_TDO_TL070WSH30 is not set -+CONFIG_DRM_PANEL_TPO_Y17P=y -+# CONFIG_DRM_PANEL_TPO_TD028TTEC1 is not set -+# CONFIG_DRM_PANEL_TPO_TD043MTEA1 is not set -+# CONFIG_DRM_PANEL_TPO_TPG110 is not set -+# CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA is not set -+# CONFIG_DRM_PANEL_VISIONOX_R66451 is not set -+# CONFIG_DRM_PANEL_VISIONOX_RM69299 is not set -+# CONFIG_DRM_PANEL_VISIONOX_VTDR6130 is not set -+CONFIG_DRM_PANEL_WAVESHARE_TOUCHSCREEN=y -+CONFIG_DRM_PANEL_WAVESHARE_TOUCHSCREEN_V2=y -+# CONFIG_DRM_PANEL_WIDECHIPS_WS2401 is not set -+# CONFIG_DRM_PANEL_XINPENG_XPP055C272 is not set -+# end of Display Panels -+ -+CONFIG_DRM_BRIDGE=y -+CONFIG_DRM_PANEL_BRIDGE=y -+ -+# -+# Display Interface Bridges -+# -+# CONFIG_DRM_CHIPONE_ICN6211 is not set -+# CONFIG_DRM_CHRONTEL_CH7033 is not set -+CONFIG_DRM_DISPLAY_CONNECTOR=y -+# CONFIG_DRM_ITE_IT6505 is not set -+# CONFIG_DRM_LONTIUM_LT8912B is not set -+# CONFIG_DRM_LONTIUM_LT9211 is not set -+# CONFIG_DRM_LONTIUM_LT9611 is not set -+# CONFIG_DRM_LONTIUM_LT9611UXC is not set -+# CONFIG_DRM_ITE_IT66121 is not set -+# CONFIG_DRM_LVDS_CODEC is not set -+# CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set -+# CONFIG_DRM_NWL_MIPI_DSI is not set -+# CONFIG_DRM_NXP_PTN3460 is not set -+# CONFIG_DRM_PARADE_PS8622 is not set -+# CONFIG_DRM_PARADE_PS8640 is not set -+# CONFIG_DRM_SAMSUNG_DSIM is not set -+# CONFIG_DRM_SIL_SII8620 is not set -+# CONFIG_DRM_SII902X is not set -+# CONFIG_DRM_SII9234 is not set -+CONFIG_DRM_SIMPLE_BRIDGE=y -+# CONFIG_DRM_THINE_THC63LVD1024 is not set -+CONFIG_DRM_TOSHIBA_TC358762=y -+# CONFIG_DRM_TOSHIBA_TC358764 is not set -+# CONFIG_DRM_TOSHIBA_TC358767 is not set -+# CONFIG_DRM_TOSHIBA_TC358768 is not set -+# CONFIG_DRM_TOSHIBA_TC358775 is not set -+# CONFIG_DRM_TI_DLPC3433 is not set -+# CONFIG_DRM_TI_TFP410 is not set -+CONFIG_DRM_TI_SN65DSI83=y -+# CONFIG_DRM_TI_SN65DSI86 is not set -+# CONFIG_DRM_TI_TPD12S015 is not set -+# CONFIG_DRM_ANALOGIX_ANX6345 is not set -+# CONFIG_DRM_ANALOGIX_ANX78XX is not set -+# CONFIG_DRM_ANALOGIX_ANX7625 is not set -+# CONFIG_DRM_I2C_ADV7511 is not set -+# CONFIG_DRM_CDNS_DSI is not set -+# CONFIG_DRM_CDNS_MHDP8546 is not set -+# end of Display Interface Bridges -+ -+CONFIG_DRM_V3D=y -+CONFIG_DRM_VC4=y -+CONFIG_DRM_VC4_HDMI_CEC=y -+# CONFIG_DRM_RP1_DSI is not set -+# CONFIG_DRM_RP1_DPI is not set -+# CONFIG_DRM_RP1_VEC is not set -+# CONFIG_DRM_ETNAVIV is not set -+# CONFIG_DRM_HISI_HIBMC is not set -+# CONFIG_DRM_HISI_KIRIN is not set -+# CONFIG_DRM_LOGICVC is not set -+# CONFIG_DRM_ARCPGU is not set -+# CONFIG_DRM_BOCHS is not set -+# CONFIG_DRM_CIRRUS_QEMU is not set -+# CONFIG_DRM_GM12U320 is not set -+CONFIG_DRM_PANEL_MIPI_DBI=y -+# CONFIG_DRM_SIMPLEDRM is not set -+CONFIG_TINYDRM_HX8357D=y -+# CONFIG_TINYDRM_ILI9163 is not set -+CONFIG_TINYDRM_ILI9225=y -+CONFIG_TINYDRM_ILI9341=y -+CONFIG_TINYDRM_ILI9486=y -+CONFIG_TINYDRM_MI0283QT=y -+CONFIG_TINYDRM_REPAPER=y -+CONFIG_TINYDRM_ST7586=y -+CONFIG_TINYDRM_ST7735R=y -+# CONFIG_DRM_PL111 is not set -+# CONFIG_DRM_LIMA is not set -+# CONFIG_DRM_PANFROST is not set -+# CONFIG_DRM_PANTHOR is not set -+# CONFIG_DRM_TIDSS is not set -+CONFIG_DRM_GUD=y -+CONFIG_DRM_SSD130X=y -+CONFIG_DRM_SSD130X_I2C=y -+CONFIG_DRM_SSD130X_SPI=y -+# CONFIG_DRM_POWERVR is not set -+# CONFIG_DRM_WERROR is not set -+CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y ++# CONFIG_DRM is not set + +# +# Frame buffer Devices @@ -3599,9 +3333,9 @@ +# CONFIG_FB_METRONOME is not set +# CONFIG_FB_MB862XX is not set +CONFIG_FB_SIMPLE=y -+CONFIG_FB_SSD1307=y ++# CONFIG_FB_SSD1307 is not set +# CONFIG_FB_SM712 is not set -+CONFIG_FB_RPISENSE=y ++# CONFIG_FB_RPISENSE is not set +CONFIG_FB_CORE=y +CONFIG_FB_NOTIFY=y +# CONFIG_FIRMWARE_EDID is not set @@ -3609,19 +3343,9 @@ +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y -+CONFIG_FB_SYS_FILLRECT=y -+CONFIG_FB_SYS_COPYAREA=y -+CONFIG_FB_SYS_IMAGEBLIT=y +# CONFIG_FB_FOREIGN_ENDIAN is not set -+CONFIG_FB_SYSMEM_FOPS=y -+CONFIG_FB_DEFERRED_IO=y -+CONFIG_FB_DMAMEM_HELPERS=y -+CONFIG_FB_DMAMEM_HELPERS_DEFERRED=y +CONFIG_FB_IOMEM_FOPS=y +CONFIG_FB_IOMEM_HELPERS=y -+CONFIG_FB_SYSMEM_HELPERS=y -+CONFIG_FB_SYSMEM_HELPERS_DEFERRED=y -+CONFIG_FB_BACKLIGHT=y +# CONFIG_FB_MODE_HELPERS is not set +# CONFIG_FB_TILEBLITTING is not set +# end of Frame buffer Devices @@ -3630,447 +3354,30 @@ +# Backlight & LCD device support +# +# CONFIG_LCD_CLASS_DEVICE is not set -+CONFIG_BACKLIGHT_CLASS_DEVICE=y -+# CONFIG_BACKLIGHT_KTD253 is not set -+# CONFIG_BACKLIGHT_KTD2801 is not set -+# CONFIG_BACKLIGHT_KTZ8866 is not set -+CONFIG_BACKLIGHT_PWM=y -+CONFIG_BACKLIGHT_RPI=y -+# CONFIG_BACKLIGHT_QCOM_WLED is not set -+# CONFIG_BACKLIGHT_ADP8860 is not set -+# CONFIG_BACKLIGHT_ADP8870 is not set -+# CONFIG_BACKLIGHT_LM3509 is not set -+CONFIG_BACKLIGHT_LM3630A=y -+# CONFIG_BACKLIGHT_LM3639 is not set -+# CONFIG_BACKLIGHT_LP855X is not set -+# CONFIG_BACKLIGHT_MP3309C is not set -+CONFIG_BACKLIGHT_GPIO=y -+# CONFIG_BACKLIGHT_LV5207LP is not set -+# CONFIG_BACKLIGHT_BD6107 is not set -+# CONFIG_BACKLIGHT_ARCXCNN is not set -+# CONFIG_BACKLIGHT_LED is not set ++# CONFIG_BACKLIGHT_CLASS_DEVICE is not set +# end of Backlight & LCD device support + -+CONFIG_VIDEOMODE_HELPERS=y -+CONFIG_HDMI=y -+ +# +# Console display driver support +# +CONFIG_DUMMY_CONSOLE=y +CONFIG_DUMMY_CONSOLE_COLUMNS=80 +CONFIG_DUMMY_CONSOLE_ROWS=25 -+# CONFIG_FRAMEBUFFER_CONSOLE is not set ++CONFIG_FRAMEBUFFER_CONSOLE=y ++# CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION is not set ++CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y ++CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y ++# CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set +# end of Console display driver support + -+# CONFIG_LOGO is not set ++CONFIG_LOGO=y ++# CONFIG_LOGO_LINUX_MONO is not set ++# CONFIG_LOGO_LINUX_VGA16 is not set ++CONFIG_LOGO_LINUX_CLUT224=y +# end of Graphics support + -+# CONFIG_DRM_ACCEL is not set +CONFIG_SOUND=y -+CONFIG_SND=y -+CONFIG_SND_TIMER=y -+CONFIG_SND_PCM=y -+CONFIG_SND_PCM_ELD=y -+CONFIG_SND_PCM_IEC958=y -+CONFIG_SND_DMAENGINE_PCM=y -+CONFIG_SND_JACK=y -+CONFIG_SND_JACK_INPUT_DEV=y -+# CONFIG_SND_OSSEMUL is not set -+CONFIG_SND_PCM_TIMER=y -+# CONFIG_SND_HRTIMER is not set -+# CONFIG_SND_DYNAMIC_MINORS is not set -+CONFIG_SND_SUPPORT_OLD_API=y -+CONFIG_SND_PROC_FS=y -+CONFIG_SND_VERBOSE_PROCFS=y -+CONFIG_SND_CTL_FAST_LOOKUP=y -+# CONFIG_SND_DEBUG is not set -+# CONFIG_SND_CTL_INPUT_VALIDATION is not set -+# CONFIG_SND_UTIMER is not set -+# CONFIG_SND_SEQUENCER is not set -+CONFIG_SND_DRIVERS=y -+# CONFIG_SND_DUMMY is not set -+# CONFIG_SND_ALOOP is not set -+# CONFIG_SND_PCMTEST is not set -+# CONFIG_SND_MTPAV is not set -+# CONFIG_SND_SERIAL_U16550 is not set -+# CONFIG_SND_SERIAL_GENERIC is not set -+# CONFIG_SND_MPU401 is not set -+CONFIG_SND_PCI=y -+# CONFIG_SND_AD1889 is not set -+# CONFIG_SND_ALS300 is not set -+# CONFIG_SND_ALI5451 is not set -+# CONFIG_SND_ATIIXP is not set -+# CONFIG_SND_ATIIXP_MODEM is not set -+# CONFIG_SND_AU8810 is not set -+# CONFIG_SND_AU8820 is not set -+# CONFIG_SND_AU8830 is not set -+# CONFIG_SND_AW2 is not set -+# CONFIG_SND_AZT3328 is not set -+# CONFIG_SND_BT87X is not set -+# CONFIG_SND_CA0106 is not set -+# CONFIG_SND_CMIPCI is not set -+# CONFIG_SND_OXYGEN is not set -+# CONFIG_SND_CS4281 is not set -+# CONFIG_SND_CS46XX is not set -+# CONFIG_SND_CTXFI is not set -+# CONFIG_SND_DARLA20 is not set -+# CONFIG_SND_GINA20 is not set -+# CONFIG_SND_LAYLA20 is not set -+# CONFIG_SND_DARLA24 is not set -+# CONFIG_SND_GINA24 is not set -+# CONFIG_SND_LAYLA24 is not set -+# CONFIG_SND_MONA is not set -+# CONFIG_SND_MIA is not set -+# CONFIG_SND_ECHO3G is not set -+# CONFIG_SND_INDIGO is not set -+# CONFIG_SND_INDIGOIO is not set -+# CONFIG_SND_INDIGODJ is not set -+# CONFIG_SND_INDIGOIOX is not set -+# CONFIG_SND_INDIGODJX is not set -+# CONFIG_SND_EMU10K1 is not set -+# CONFIG_SND_EMU10K1X is not set -+# CONFIG_SND_ENS1370 is not set -+# CONFIG_SND_ENS1371 is not set -+# CONFIG_SND_ES1938 is not set -+# CONFIG_SND_ES1968 is not set -+# CONFIG_SND_FM801 is not set -+# CONFIG_SND_HDSP is not set -+# CONFIG_SND_HDSPM is not set -+# CONFIG_SND_ICE1712 is not set -+# CONFIG_SND_ICE1724 is not set -+# CONFIG_SND_INTEL8X0 is not set -+# CONFIG_SND_INTEL8X0M is not set -+# CONFIG_SND_KORG1212 is not set -+# CONFIG_SND_LOLA is not set -+# CONFIG_SND_LX6464ES is not set -+# CONFIG_SND_MAESTRO3 is not set -+# CONFIG_SND_MIXART is not set -+# CONFIG_SND_NM256 is not set -+# CONFIG_SND_PCXHR is not set -+# CONFIG_SND_RIPTIDE is not set -+# CONFIG_SND_RME32 is not set -+# CONFIG_SND_RME96 is not set -+# CONFIG_SND_RME9652 is not set -+# CONFIG_SND_SE6X is not set -+# CONFIG_SND_SONICVIBES is not set -+# CONFIG_SND_TRIDENT is not set -+# CONFIG_SND_VIA82XX is not set -+# CONFIG_SND_VIA82XX_MODEM is not set -+# CONFIG_SND_VIRTUOSO is not set -+# CONFIG_SND_VX222 is not set -+# CONFIG_SND_YMFPCI is not set -+ -+# -+# HD-Audio -+# -+# CONFIG_SND_HDA_INTEL is not set -+# end of HD-Audio -+ -+CONFIG_SND_HDA_PREALLOC_SIZE=64 -+CONFIG_SND_SPI=y -+CONFIG_SND_USB=y -+# CONFIG_SND_USB_AUDIO is not set -+# CONFIG_SND_USB_UA101 is not set -+# CONFIG_SND_USB_CAIAQ is not set -+# CONFIG_SND_USB_6FIRE is not set -+# CONFIG_SND_USB_HIFACE is not set -+# CONFIG_SND_BCD2000 is not set -+# CONFIG_SND_USB_POD is not set -+# CONFIG_SND_USB_PODHD is not set -+# CONFIG_SND_USB_TONEPORT is not set -+# CONFIG_SND_USB_VARIAX is not set -+CONFIG_SND_SOC=y -+CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y -+# CONFIG_SND_SOC_ADI is not set -+# CONFIG_SND_SOC_AMD_ACP is not set -+# CONFIG_SND_AMD_ACP_CONFIG is not set -+# CONFIG_SND_ATMEL_SOC is not set -+# CONFIG_SND_BCM2835_SOC_I2S is not set -+# CONFIG_SND_BCM63XX_I2S_WHISTLER is not set -+# CONFIG_SND_BCM2708_SOC_CHIPDIP_DAC is not set -+# CONFIG_SND_BCM2708_SOC_GOOGLEVOICEHAT_SOUNDCARD is not set -+# CONFIG_SND_BCM2708_SOC_HIFIBERRY_ADC is not set -+# CONFIG_SND_BCM2708_SOC_HIFIBERRY_ADC8X is not set -+# CONFIG_SND_BCM2708_SOC_HIFIBERRY_DAC is not set -+# CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUS is not set -+# CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUSHD is not set -+# CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUSADC is not set -+# CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUSADCPRO is not set -+# CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUSDSP is not set -+# CONFIG_SND_BCM2708_SOC_HIFIBERRY_DIGI is not set -+# CONFIG_SND_BCM2708_SOC_HIFIBERRY_AMP is not set -+# CONFIG_SND_BCM2708_SOC_PIFI_40 is not set -+# CONFIG_SND_BCM2708_SOC_RPI_CIRRUS is not set -+# CONFIG_SND_BCM2708_SOC_RPI_DAC is not set -+# CONFIG_SND_BCM2708_SOC_RPI_PROTO is not set -+# CONFIG_SND_BCM2708_SOC_JUSTBOOM_BOTH is not set -+# CONFIG_SND_BCM2708_SOC_JUSTBOOM_DAC is not set -+# CONFIG_SND_BCM2708_SOC_JUSTBOOM_DIGI is not set -+# CONFIG_SND_BCM2708_SOC_IQAUDIO_CODEC is not set -+# CONFIG_SND_BCM2708_SOC_IQAUDIO_DAC is not set -+# CONFIG_SND_BCM2708_SOC_IQAUDIO_DIGI is not set -+# CONFIG_SND_BCM2708_SOC_I_SABRE_Q2M is not set -+# CONFIG_SND_BCM2708_SOC_ADAU1977_ADC is not set -+# CONFIG_SND_AUDIOINJECTOR_PI_SOUNDCARD is not set -+# CONFIG_SND_AUDIOINJECTOR_OCTO_SOUNDCARD is not set -+# CONFIG_SND_AUDIOINJECTOR_ISOLATED_SOUNDCARD is not set -+# CONFIG_SND_AUDIOSENSE_PI is not set -+# CONFIG_SND_DIGIDAC1_SOUNDCARD is not set -+# CONFIG_SND_BCM2708_SOC_DIONAUDIO_LOCO is not set -+# CONFIG_SND_BCM2708_SOC_DIONAUDIO_LOCO_V2 is not set -+# CONFIG_SND_BCM2708_SOC_ALLO_PIANO_DAC is not set -+# CONFIG_SND_BCM2708_SOC_ALLO_PIANO_DAC_PLUS is not set -+# CONFIG_SND_BCM2708_SOC_ALLO_BOSS_DAC is not set -+# CONFIG_SND_BCM2708_SOC_ALLO_BOSS2_DAC is not set -+# CONFIG_SND_BCM2708_SOC_ALLO_DIGIONE is not set -+# CONFIG_SND_BCM2708_SOC_ALLO_KATANA_DAC is not set -+# CONFIG_SND_BCM2708_SOC_FE_PI_AUDIO is not set -+# CONFIG_SND_PISOUND is not set -+# CONFIG_SND_RPI_SIMPLE_SOUNDCARD is not set -+# CONFIG_SND_RPI_WM8804_SOUNDCARD is not set -+# CONFIG_SND_DACBERRY400 is not set -+# CONFIG_SND_DESIGNWARE_I2S is not set -+ -+# -+# SoC Audio for Freescale CPUs -+# -+ -+# -+# Common SoC Audio options for Freescale CPUs: -+# -+# CONFIG_SND_SOC_FSL_ASRC is not set -+# CONFIG_SND_SOC_FSL_SAI is not set -+# CONFIG_SND_SOC_FSL_AUDMIX is not set -+# CONFIG_SND_SOC_FSL_SSI is not set -+# CONFIG_SND_SOC_FSL_SPDIF is not set -+# CONFIG_SND_SOC_FSL_ESAI is not set -+# CONFIG_SND_SOC_FSL_MICFIL is not set -+# CONFIG_SND_SOC_FSL_XCVR is not set -+# CONFIG_SND_SOC_IMX_AUDMUX is not set -+# end of SoC Audio for Freescale CPUs -+ -+# CONFIG_SND_SOC_CHV3_I2S is not set -+# CONFIG_SND_I2S_HI6210_I2S is not set -+# CONFIG_SND_SOC_IMG is not set -+# CONFIG_SND_SOC_MTK_BTCVSD is not set -+# CONFIG_SND_RP1_AUDIO_OUT is not set -+# CONFIG_SND_SOC_SOF_TOPLEVEL is not set -+ -+# -+# STMicroelectronics STM32 SOC audio support -+# -+# end of STMicroelectronics STM32 SOC audio support -+ -+# CONFIG_SND_SOC_XILINX_I2S is not set -+# CONFIG_SND_SOC_XILINX_AUDIO_FORMATTER is not set -+# CONFIG_SND_SOC_XILINX_SPDIF is not set -+# CONFIG_SND_SOC_XTFPGA_I2S is not set -+CONFIG_SND_SOC_I2C_AND_SPI=y -+ -+# -+# CODEC drivers -+# -+# CONFIG_SND_SOC_AC97_CODEC is not set -+# CONFIG_SND_SOC_AD193X_SPI is not set -+# CONFIG_SND_SOC_AD193X_I2C is not set -+# CONFIG_SND_SOC_ADAU1372_I2C is not set -+# CONFIG_SND_SOC_ADAU1372_SPI is not set -+# CONFIG_SND_SOC_ADAU1701 is not set -+# CONFIG_SND_SOC_ADAU1761_I2C is not set -+# CONFIG_SND_SOC_ADAU1761_SPI is not set -+# CONFIG_SND_SOC_ADAU7002 is not set -+# CONFIG_SND_SOC_ADAU7118_HW is not set -+# CONFIG_SND_SOC_ADAU7118_I2C is not set -+# CONFIG_SND_SOC_AK4104 is not set -+# CONFIG_SND_SOC_AK4118 is not set -+# CONFIG_SND_SOC_AK4375 is not set -+# CONFIG_SND_SOC_AK4458 is not set -+# CONFIG_SND_SOC_AK4554 is not set -+# CONFIG_SND_SOC_AK4613 is not set -+# CONFIG_SND_SOC_AK4619 is not set -+# CONFIG_SND_SOC_AK4642 is not set -+# CONFIG_SND_SOC_AK5386 is not set -+# CONFIG_SND_SOC_AK5558 is not set -+# CONFIG_SND_SOC_ALC5623 is not set -+# CONFIG_SND_SOC_AW8738 is not set -+# CONFIG_SND_SOC_AW88395 is not set -+# CONFIG_SND_SOC_AW88261 is not set -+# CONFIG_SND_SOC_AW87390 is not set -+# CONFIG_SND_SOC_AW88399 is not set -+# CONFIG_SND_SOC_BD28623 is not set -+# CONFIG_SND_SOC_BT_SCO is not set -+# CONFIG_SND_SOC_CHV3_CODEC is not set -+# CONFIG_SND_SOC_CS35L32 is not set -+# CONFIG_SND_SOC_CS35L33 is not set -+# CONFIG_SND_SOC_CS35L34 is not set -+# CONFIG_SND_SOC_CS35L35 is not set -+# CONFIG_SND_SOC_CS35L36 is not set -+# CONFIG_SND_SOC_CS35L41_SPI is not set -+# CONFIG_SND_SOC_CS35L41_I2C is not set -+# CONFIG_SND_SOC_CS35L45_SPI is not set -+# CONFIG_SND_SOC_CS35L45_I2C is not set -+# CONFIG_SND_SOC_CS35L56_I2C is not set -+# CONFIG_SND_SOC_CS35L56_SPI is not set -+# CONFIG_SND_SOC_CS42L42 is not set -+# CONFIG_SND_SOC_CS42L51_I2C is not set -+# CONFIG_SND_SOC_CS42L52 is not set -+# CONFIG_SND_SOC_CS42L56 is not set -+# CONFIG_SND_SOC_CS42L73 is not set -+# CONFIG_SND_SOC_CS42L83 is not set -+# CONFIG_SND_SOC_CS4234 is not set -+# CONFIG_SND_SOC_CS4265 is not set -+# CONFIG_SND_SOC_CS4270 is not set -+# CONFIG_SND_SOC_CS4271_I2C is not set -+# CONFIG_SND_SOC_CS4271_SPI is not set -+# CONFIG_SND_SOC_CS42XX8_I2C is not set -+# CONFIG_SND_SOC_CS43130 is not set -+# CONFIG_SND_SOC_CS4341 is not set -+# CONFIG_SND_SOC_CS4349 is not set -+# CONFIG_SND_SOC_CS53L30 is not set -+# CONFIG_SND_SOC_CS530X_I2C is not set -+# CONFIG_SND_SOC_CX2072X is not set -+# CONFIG_SND_SOC_DA7213 is not set -+# CONFIG_SND_SOC_DMIC is not set -+CONFIG_SND_SOC_HDMI_CODEC=y -+# CONFIG_SND_SOC_ES7134 is not set -+# CONFIG_SND_SOC_ES7241 is not set -+# CONFIG_SND_SOC_ES8311 is not set -+# CONFIG_SND_SOC_ES8316 is not set -+# CONFIG_SND_SOC_ES8326 is not set -+# CONFIG_SND_SOC_ES8328_I2C is not set -+# CONFIG_SND_SOC_ES8328_SPI is not set -+# CONFIG_SND_SOC_GTM601 is not set -+# CONFIG_SND_SOC_HDA is not set -+# CONFIG_SND_SOC_ICS43432 is not set -+# CONFIG_SND_SOC_IDT821034 is not set -+# CONFIG_SND_SOC_MA120X0P is not set -+# CONFIG_SND_SOC_MAX98088 is not set -+# CONFIG_SND_SOC_MAX98090 is not set -+# CONFIG_SND_SOC_MAX98357A is not set -+# CONFIG_SND_SOC_MAX98504 is not set -+# CONFIG_SND_SOC_MAX9867 is not set -+# CONFIG_SND_SOC_MAX98927 is not set -+# CONFIG_SND_SOC_MAX98520 is not set -+# CONFIG_SND_SOC_MAX98373_I2C is not set -+# CONFIG_SND_SOC_MAX98388 is not set -+# CONFIG_SND_SOC_MAX98390 is not set -+# CONFIG_SND_SOC_MAX98396 is not set -+# CONFIG_SND_SOC_MAX9860 is not set -+# CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set -+# CONFIG_SND_SOC_PCM1681 is not set -+# CONFIG_SND_SOC_PCM1789_I2C is not set -+# CONFIG_SND_SOC_PCM179X_I2C is not set -+# CONFIG_SND_SOC_PCM179X_SPI is not set -+# CONFIG_SND_SOC_PCM186X_I2C is not set -+# CONFIG_SND_SOC_PCM186X_SPI is not set -+# CONFIG_SND_SOC_PCM3060_I2C is not set -+# CONFIG_SND_SOC_PCM3060_SPI is not set -+# CONFIG_SND_SOC_PCM3168A_I2C is not set -+# CONFIG_SND_SOC_PCM3168A_SPI is not set -+# CONFIG_SND_SOC_PCM5102A is not set -+# CONFIG_SND_SOC_PCM512x_I2C is not set -+# CONFIG_SND_SOC_PCM512x_SPI is not set -+# CONFIG_SND_SOC_PCM6240 is not set -+# CONFIG_SND_SOC_PEB2466 is not set -+# CONFIG_SND_SOC_RT5616 is not set -+# CONFIG_SND_SOC_RT5631 is not set -+# CONFIG_SND_SOC_RT5640 is not set -+# CONFIG_SND_SOC_RT5659 is not set -+# CONFIG_SND_SOC_RT9120 is not set -+# CONFIG_SND_SOC_RTQ9128 is not set -+# CONFIG_SND_SOC_SGTL5000 is not set -+# CONFIG_SND_SOC_SIMPLE_AMPLIFIER is not set -+# CONFIG_SND_SOC_SIMPLE_MUX is not set -+# CONFIG_SND_SOC_SMA1303 is not set -+# CONFIG_SND_SOC_SPDIF is not set -+# CONFIG_SND_SOC_SRC4XXX_I2C is not set -+# CONFIG_SND_SOC_SSM2305 is not set -+# CONFIG_SND_SOC_SSM2518 is not set -+# CONFIG_SND_SOC_SSM2602_SPI is not set -+# CONFIG_SND_SOC_SSM2602_I2C is not set -+# CONFIG_SND_SOC_SSM3515 is not set -+# CONFIG_SND_SOC_SSM4567 is not set -+# CONFIG_SND_SOC_STA32X is not set -+# CONFIG_SND_SOC_STA350 is not set -+# CONFIG_SND_SOC_STI_SAS is not set -+# CONFIG_SND_SOC_TAS2552 is not set -+# CONFIG_SND_SOC_TAS2562 is not set -+# CONFIG_SND_SOC_TAS2764 is not set -+# CONFIG_SND_SOC_TAS2770 is not set -+# CONFIG_SND_SOC_TAS2780 is not set -+# CONFIG_SND_SOC_TAS2781_I2C is not set -+# CONFIG_SND_SOC_TAS5086 is not set -+# CONFIG_SND_SOC_TAS571X is not set -+# CONFIG_SND_SOC_TAS5720 is not set -+# CONFIG_SND_SOC_TAS5805M is not set -+# CONFIG_SND_SOC_TAS6424 is not set -+# CONFIG_SND_SOC_TDA7419 is not set -+# CONFIG_SND_SOC_TFA9879 is not set -+# CONFIG_SND_SOC_TFA989X is not set -+# CONFIG_SND_SOC_TLV320ADC3XXX is not set -+# CONFIG_SND_SOC_TLV320AIC23_I2C is not set -+# CONFIG_SND_SOC_TLV320AIC23_SPI is not set -+# CONFIG_SND_SOC_TLV320AIC31XX is not set -+# CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set -+# CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set -+# CONFIG_SND_SOC_TLV320AIC3X_I2C is not set -+# CONFIG_SND_SOC_TLV320AIC3X_SPI is not set -+# CONFIG_SND_SOC_TLV320ADCX140 is not set -+# CONFIG_SND_SOC_TS3A227E is not set -+# CONFIG_SND_SOC_TSCS42XX is not set -+# CONFIG_SND_SOC_TSCS454 is not set -+# CONFIG_SND_SOC_UDA1334 is not set -+# CONFIG_SND_SOC_WM8510 is not set -+# CONFIG_SND_SOC_WM8523 is not set -+# CONFIG_SND_SOC_WM8524 is not set -+# CONFIG_SND_SOC_WM8580 is not set -+# CONFIG_SND_SOC_WM8711 is not set -+# CONFIG_SND_SOC_WM8728 is not set -+# CONFIG_SND_SOC_WM8731_I2C is not set -+# CONFIG_SND_SOC_WM8731_SPI is not set -+# CONFIG_SND_SOC_WM8737 is not set -+# CONFIG_SND_SOC_WM8741 is not set -+# CONFIG_SND_SOC_WM8750 is not set -+# CONFIG_SND_SOC_WM8753 is not set -+# CONFIG_SND_SOC_WM8770 is not set -+# CONFIG_SND_SOC_WM8776 is not set -+# CONFIG_SND_SOC_WM8782 is not set -+# CONFIG_SND_SOC_WM8804_I2C is not set -+# CONFIG_SND_SOC_WM8804_SPI is not set -+# CONFIG_SND_SOC_WM8903 is not set -+# CONFIG_SND_SOC_WM8904 is not set -+# CONFIG_SND_SOC_WM8940 is not set -+# CONFIG_SND_SOC_WM8960 is not set -+# CONFIG_SND_SOC_WM8961 is not set -+# CONFIG_SND_SOC_WM8962 is not set -+# CONFIG_SND_SOC_WM8974 is not set -+# CONFIG_SND_SOC_WM8978 is not set -+# CONFIG_SND_SOC_WM8985 is not set -+# CONFIG_SND_SOC_ZL38060 is not set -+# CONFIG_SND_SOC_MAX9759 is not set -+# CONFIG_SND_SOC_MT6351 is not set -+# CONFIG_SND_SOC_MT6357 is not set -+# CONFIG_SND_SOC_MT6358 is not set -+# CONFIG_SND_SOC_MT6660 is not set -+# CONFIG_SND_SOC_NAU8315 is not set -+# CONFIG_SND_SOC_NAU8540 is not set -+# CONFIG_SND_SOC_NAU8810 is not set -+# CONFIG_SND_SOC_NAU8821 is not set -+# CONFIG_SND_SOC_NAU8822 is not set -+# CONFIG_SND_SOC_NAU8824 is not set -+# CONFIG_SND_SOC_TPA6130A2 is not set -+# CONFIG_SND_SOC_LPASS_WSA_MACRO is not set -+# CONFIG_SND_SOC_LPASS_VA_MACRO is not set -+# CONFIG_SND_SOC_LPASS_RX_MACRO is not set -+# CONFIG_SND_SOC_LPASS_TX_MACRO is not set -+# CONFIG_SND_SOC_I_SABRE_CODEC is not set -+# end of CODEC drivers -+ -+# CONFIG_SND_SIMPLE_CARD is not set -+# CONFIG_SND_AUDIO_GRAPH_CARD is not set -+# CONFIG_SND_AUDIO_GRAPH_CARD2 is not set -+# CONFIG_SND_TEST_COMPONENT is not set ++# CONFIG_SND is not set +CONFIG_HID_SUPPORT=y +CONFIG_HID=y +CONFIG_HID_BATTERY_STRENGTH=y @@ -4096,7 +3403,6 @@ +# CONFIG_HID_CORSAIR is not set +# CONFIG_HID_COUGAR is not set +# CONFIG_HID_MACALLY is not set -+# CONFIG_HID_PRODIKEYS is not set +# CONFIG_HID_CMEDIA is not set +# CONFIG_HID_CP2112 is not set +# CONFIG_HID_CREATIVE_SB0540 is not set @@ -4401,14 +3707,12 @@ +# USB Gadget precomposed configurations +# +# CONFIG_USB_ZERO is not set -+# CONFIG_USB_AUDIO is not set +# CONFIG_USB_ETH is not set +# CONFIG_USB_G_NCM is not set +# CONFIG_USB_GADGETFS is not set +# CONFIG_USB_FUNCTIONFS is not set +# CONFIG_USB_MASS_STORAGE is not set +# CONFIG_USB_G_SERIAL is not set -+# CONFIG_USB_MIDI_GADGET is not set +# CONFIG_USB_G_PRINTER is not set +# CONFIG_USB_CDC_COMPOSITE is not set +# CONFIG_USB_G_ACM_MS is not set @@ -4744,7 +4048,6 @@ +CONFIG_VHOST_MENU=y +# CONFIG_VHOST_NET is not set +CONFIG_VHOST_CROSS_ENDIAN_LEGACY=y -+CONFIG_VHOST_ENABLE_FORK_OWNER_CONTROL=y + +# +# Microsoft Hyper-V guest support @@ -4763,7 +4066,6 @@ +CONFIG_BCM_VIDEOCORE=y +CONFIG_BCM2835_VCHIQ=y +CONFIG_VCHIQ_CDEV=y -+# CONFIG_SND_BCM2835 is not set +# CONFIG_BCM_VC_SM_CMA is not set +# CONFIG_BCM2835_VCHIQ_MMAL is not set +# CONFIG_XIL_AXIS_FIFO is not set @@ -5660,7 +4962,7 @@ +CONFIG_CRYPTO_LIB_SHA256=y +# end of Crypto library routines + -+CONFIG_CRC_CCITT=y ++# CONFIG_CRC_CCITT is not set +CONFIG_CRC16=y +CONFIG_CRC_T10DIF=y +CONFIG_CRC64_ROCKSOFT=y @@ -5685,7 +4987,6 @@ +CONFIG_ZLIB_DEFLATE=y +CONFIG_LZO_COMPRESS=y +CONFIG_LZO_DECOMPRESS=y -+CONFIG_LZ4_COMPRESS=y +CONFIG_LZ4_DECOMPRESS=y +CONFIG_ZSTD_COMMON=y +CONFIG_ZSTD_COMPRESS=y @@ -5713,7 +5014,6 @@ +CONFIG_REED_SOLOMON_ENC8=y +CONFIG_REED_SOLOMON_DEC8=y +CONFIG_INTERVAL_TREE=y -+CONFIG_XARRAY_MULTI=y +CONFIG_ASSOCIATIVE_ARRAY=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT=y @@ -5742,7 +5042,7 @@ +# +# Default contiguous memory area size: +# -+CONFIG_CMA_SIZE_MBYTES=32 ++CONFIG_CMA_SIZE_MBYTES=5 +CONFIG_CMA_SIZE_SEL_MBYTES=y +# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set +# CONFIG_CMA_SIZE_SEL_MIN is not set @@ -5768,8 +5068,9 @@ +CONFIG_GENERIC_VDSO_TIME_NS=y +CONFIG_VDSO_GETRANDOM=y +CONFIG_FONT_SUPPORT=y ++# CONFIG_FONTS is not set ++CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y -+CONFIG_FONT_AUTOSELECT=y +CONFIG_SG_POOL=y +CONFIG_ARCH_STACKWALK=y +CONFIG_STACKDEPOT=y @@ -6134,10 +5435,6 @@ +CONFIG_VDUMMY_BACKEND=y +CONFIG_VUART_BACKEND=y +# CONFIG_VLEDS_BACKEND is not set -+# CONFIG_VSENSELED_BACKEND is not set -+# CONFIG_VSENSEJ_BACKEND is not set +CONFIG_VLOGS_BACKEND=y -+CONFIG_VFBDEV_BACKEND=y -+CONFIG_VINPUT_BACKEND=y +# end of Smart Object Oriented subsystem +# end of SOO Framework and subsystems diff --git a/build/meta-linux/recipes-linux/linux/linux_6.12-rpi4.bb b/build/meta-linux/recipes-linux/linux/linux_6.12-rpi4.bb index f271f0f..9aa7b44 100644 --- a/build/meta-linux/recipes-linux/linux/linux_6.12-rpi4.bb +++ b/build/meta-linux/recipes-linux/linux/linux_6.12-rpi4.bb @@ -1,3 +1,5 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD SUMMARY = "Linux Operating System" DESCRIPTION = "Linux OS used as main domain running on the embedded platform" @@ -11,15 +13,15 @@ OVERRIDES += ":linux" inherit linux -SRC_URI = "git://github.com/raspberrypi/linux.git;branch=rpi-6.12.y;tag=stable_20250916;protocol=https" +SRC_URI = "git://github.com/raspberrypi/linux.git;branch=rpi-6.12.y;tag=stable_20250702;protocol=https" -SRCREV = "359f37f0faefb712add32a39f98751aea67d5c1f" +SRCREV = "8f77e03530f65209a377d25023e912b288e039cd" # Set of patches to be applied # These patches contain rpi4 64-bits enhancement FILESPATH:prepend = "${THISDIR}/files/0001-${PF}:" - + require files/0001-${PF}-patches.inc # Where the working directory will be placed in infrabase root dir diff --git a/build/meta-linux/recipes-linux/linux/linux_6.12.bb b/build/meta-linux/recipes-linux/linux/linux_6.12.bb index fbeba77..7ae4b48 100644 --- a/build/meta-linux/recipes-linux/linux/linux_6.12.bb +++ b/build/meta-linux/recipes-linux/linux/linux_6.12.bb @@ -1,3 +1,5 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD SUMMARY = "Linux Operating System" DESCRIPTION = "Linux OS used as main domain running on the embedded platform" diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0-patches.inc b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0-patches.inc index dbffd2e..78659f1 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0-patches.inc +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0-patches.inc @@ -1,3 +1,6 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + SRC_URI:append:soo = "\ file://0071-asf_test.c.patch \ file://0048-guest_api.h.patch \ @@ -121,10 +124,8 @@ SRC_URI:append:soo = "\ file://0125-Makefile.patch \ file://0126-vlogs.c.patch \ file://0127-vlogs.h.patch \ - file://0128-Makefile.patch \ - file://0129-vfbdev.c.patch \ - file://0130-vfbdev.h.patch \ - file://0131-Makefile.patch \ - file://0132-vinput.c.patch \ - file://0133-vinput.h.patch \ + file://0128-vfbdev.c.patch \ + file://0129-vfbdev.h.patch \ + file://0130-vinput.c.patch \ + file://0131-vinput.h.patch \ " diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0001-virt64_guest.dts.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0001-virt64_guest.dts.patch index df8d78d..2abb77d 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0001-virt64_guest.dts.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0001-virt64_guest.dts.patch @@ -19,7 +19,7 @@ }; timer { -@@ -403,4 +404,46 @@ +@@ -403,4 +404,36 @@ compatible = "fixed-clock"; }; @@ -52,16 +52,6 @@ + compatible = "vlogs,backend"; + status = "ok"; + }; -+ -+ vfbdev { -+ compatible = "vfbdev,backend"; -+ status = "ok"; -+ }; -+ -+ vinput { -+ compatible = "vinput,backend"; -+ status = "ok"; -+ }; + }; + }; + diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0002-virt64_soo_defconfig.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0002-virt64_soo_defconfig.patch index 9b5633c..2a941a5 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0002-virt64_soo_defconfig.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0002-virt64_soo_defconfig.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/arch/arm64/configs/virt64_soo_defconfig 1970-01-01 01:00:00.000000000 +0100 +++ ./arch/arm64/configs/virt64_soo_defconfig 2025-08-29 08:46:39.970708755 +0200 -@@ -0,0 +1,8990 @@ +@@ -0,0 +1,8995 @@ +# +# Automatically generated file; DO NOT EDIT. +# Linux/arm64 6.12.0 Kernel Configuration @@ -4585,10 +4585,17 @@ +CONFIG_DUMMY_CONSOLE=y +CONFIG_DUMMY_CONSOLE_COLUMNS=80 +CONFIG_DUMMY_CONSOLE_ROWS=25 -+# CONFIG_FRAMEBUFFER_CONSOLE is not set ++CONFIG_FRAMEBUFFER_CONSOLE=y ++# CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION is not set ++CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y ++# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set ++# CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set +# end of Console display driver support + -+# CONFIG_LOGO is not set ++CONFIG_LOGO=y ++# CONFIG_LOGO_LINUX_MONO is not set ++# CONFIG_LOGO_LINUX_VGA16 is not set ++CONFIG_LOGO_LINUX_CLUT224=y +# end of Graphics support + +# CONFIG_DRM_ACCEL is not set @@ -8987,7 +8994,5 @@ +# CONFIG_VSENSELED_BACKEND is not set +# CONFIG_VSENSEJ_BACKEND is not set +CONFIG_VLOGS_BACKEND=y -+CONFIG_VFBDEV_BACKEND=y -+CONFIG_VINPUT_BACKEND=y +# end of Smart Object Oriented subsystem +# end of SOO Framework and subsystems diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0018-Kconfig.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0018-Kconfig.patch index 5c95329..3418d4a 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0018-Kconfig.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0018-Kconfig.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/drivers/Kconfig 1970-01-01 01:00:00.000000000 +0100 +++ ./soo/drivers/Kconfig 2025-08-29 08:46:41.395616621 +0200 -@@ -0,0 +1,51 @@ +@@ -0,0 +1,44 @@ +# +# SOO device configuration +# @@ -40,15 +40,8 @@ + The vlogs driver is used to logs Capsules logs - logs are store in + `/var/log/soo/capsule_N.log` (N corresponds to the SlotID of the capsule). + -+config VFBDEV_BACKEND -+ bool "vfbdev Framebuffer Backend support for SOO Capsules" -+ help -+ The vfbdev driver is used to allow capsules to access a framebuffer from Linux. ++endmenu ++ + -+config VINPUT_BACKEND -+ bool "vinput Input support for SOO Capsules" -+ help -+ The vinput driver is used to allow capsules to access a mouse/keyboard inputs from Linux. + -+endmenu + diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0019-Makefile.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0019-Makefile.patch index b39572d..588941f 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0019-Makefile.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0019-Makefile.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/drivers/Makefile 1970-01-01 01:00:00.000000000 +0100 +++ ./soo/drivers/Makefile 2025-08-29 08:46:41.395638406 +0200 -@@ -0,0 +1,14 @@ +@@ -0,0 +1,12 @@ +# +# Makefile for SOO general drivers. +# @@ -13,5 +13,3 @@ +obj-$(CONFIG_VSENSELED_BACKEND) += vsenseledback/ +obj-$(CONFIG_VSENSEJ_BACKEND) += vsensejback/ +obj-$(CONFIG_VLOGS_BACKEND) += vlogsback/ -+obj-$(CONFIG_VFBDEV_BACKEND) += vfbdevback/ -+obj-$(CONFIG_VINPUT_BACKEND) += vinputback/ diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0032-vuart.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0032-vuart.c.patch index 78dae41..dc00f61 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0032-vuart.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0032-vuart.c.patch @@ -89,7 +89,7 @@ +{ + struct vdev_console *console; + -+ console = kzalloc(sizeof(*console), GFP_ATOMIC); ++ console = kzalloc(sizeof(vdev_console), GFP_ATOMIC); + BUG_ON(!console); + + console->vdev_console = vdev_console; @@ -191,7 +191,7 @@ + + console = get_console(domid); + -+ if (!console || !vdevfront_is_connected(console)) ++ if (!vdevfront_is_connected(console)) + return; + + vdevback_processing_begin(console); diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0056-sysfs.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0056-sysfs.h.patch index 0133623..ac21c58 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0056-sysfs.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0056-sysfs.h.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/sysfs.h 1970-01-01 01:00:00.000000000 +0100 +++ ./soo/include/soo/sysfs.h 2025-08-29 08:46:41.395990253 +0200 -@@ -0,0 +1,65 @@ +@@ -0,0 +1,57 @@ + +/* + * Copyright (C) 2020 Daniel Rossier @@ -40,14 +40,6 @@ + /**** vsensej ****/ + vsensej_js, + -+ /**** vfbdev ****/ -+ vfbdev_hres, -+ vfbdev_vres, -+ vfbdev_bpp, -+ vfbdev_size, -+ vfbdev_addr, -+ vfbdev_pid, -+ + /**** vwagoled ****/ + vwagoled_notify, + vwagoled_debug, diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0062-soo.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0062-soo.h.patch index f9b7c15..abc42f5 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0062-soo.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0062-soo.h.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/uapi/soo.h 1970-01-01 01:00:00.000000000 +0100 +++ ./soo/include/soo/uapi/soo.h 2025-08-29 08:46:41.395924678 +0200 -@@ -0,0 +1,496 @@ +@@ -0,0 +1,462 @@ +/* + * Copyright (C) 2014-2025 Daniel Rossier + * @@ -75,19 +75,6 @@ + +void do_gnttab(gnttab_op_t *args); + -+/* -+ * Page frame number to set the framebuffer addresses. -+ * The physical addresses may be splitted in multiple parts, which requires to have -+ * multiple set of strating page frame and page count -+ */ -+ -+#define MAX_FBDEV_PFN 8 -+typedef struct fbdev_pfns { -+ size_t pfn_count; -+ addr_t pfn[MAX_FBDEV_PFN]; -+ size_t page_count[MAX_FBDEV_PFN]; -+} fbdev_pfns_t; -+ +#define AVZ_SCHEDULER_FLIP 0 + +/* @@ -316,9 +303,6 @@ +#define AVZ_SET_ME_STATE 11 +#define AVZ_GET_DOM_DESC 12 +#define AVZ_GRANT_TABLE_OP 13 -+#define AVZ_FBDEV_SET_PFNS 14 -+#define AVZ_FBDEV_CHANGE_FOCUS 15 -+#define AVZ_FBDEV_GET_ME_ADDR 16 + +/* AVZ_INJECT_CAPSULE */ +typedef struct { @@ -381,21 +365,6 @@ + gnttab_op_t gnttab_op; +} avz_gnttab_t; + -+/* AVZ_FBDEV_SET_PFNS */ -+typedef struct { -+ fbdev_pfns_t fbdev; -+} avz_fbdev_pfns_t; -+ -+/* AVZ_FBDEV_CHANGE_FOCUS */ -+typedef struct { -+ int new_slotID; -+} avz_fbdev_focus_t; -+ -+/* AVZ_FBDEV_GET_ME_ADDR */ -+typedef struct { -+ addr_t paddr; -+} avz_fbdev_addr_t; -+ +/* + * AVZ hypercall argument + */ @@ -415,9 +384,6 @@ + avz_console_io_t avz_console_io_args; + avz_domctl_t avz_domctl_args; + avz_gnttab_t avz_gnttab_args; -+ avz_fbdev_pfns_t avz_fbdev_pfns_args; -+ avz_fbdev_focus_t avz_fbdev_focus_args; -+ avz_fbdev_addr_t avz_fbdev_addr_args; + } u; +} avz_hyp_t; + diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0074-console.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0074-console.c.patch index ae26e46..a1f546e 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0074-console.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0074-console.c.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/console/console.c 1970-01-01 01:00:00.000000000 +0100 +++ ./soo/kernel/console/console.c 2025-08-29 08:46:41.394716106 +0200 -@@ -0,0 +1,158 @@ +@@ -0,0 +1,152 @@ +/* + * Copyright (C) 2016-2019 Daniel Rossier + * @@ -64,11 +64,6 @@ + +int vfb_set_focus(int next_domain) +{ -+ avz_hyp_t hyp_args; -+ hyp_args.cmd = AVZ_FBDEV_CHANGE_FOCUS; -+ hyp_args.u.avz_fbdev_focus_args.new_slotID = next_domain; -+ avz_hypercall(&hyp_args); -+ + vfb_active = next_domain; + return vfb_active; +} @@ -116,7 +111,6 @@ + next = ((next == 1) ? next+1 : next); + + avzcons_set_focus(active); -+ vfb_set_focus(active); + + switch_code_count = 0; + diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0082-evtchn.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0082-evtchn.c.patch index 14ba5ed..e9baead 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0082-evtchn.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0082-evtchn.c.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/evtchn.c 1970-01-01 01:00:00.000000000 +0100 +++ ./soo/kernel/evtchn.c 2025-08-29 08:46:41.394868986 +0200 -@@ -0,0 +1,413 @@ +@@ -0,0 +1,427 @@ + +/* + * Copyright (C) 2014-2016 Daniel Rossier @@ -57,27 +57,29 @@ +/* + * This lock protects updates to the following mapping and reference-count + * arrays. The lock does not need to be acquired to read the mapping tables. -+ * -+ * All evtchn-indexed arrays are GLOBAL (not per-CPU): an evtchn binding is a -+ * system-wide property. The original per-CPU design caused SMP races where -+ * virq_handle() on CPU Y would not find evtchns bound on CPU X, silently -+ * dropping all ME→Linux event channel notifications. + */ +static DEFINE_SPINLOCK(virq_mapping_update_lock); + -+static int evtchn_to_virq[NR_EVTCHN]; /* evtchn -> virq (global) */ -+static u32 virq_to_evtchn[NR_VIRQS]; /* virq -> evtchn (global) */ -+static bool evtchn_valid[NR_EVTCHN]; /* evtchn in use (global) */ -+static bool evtchn_masked[NR_EVTCHN]; /* evtchn masked (global) */ -+static int virq_bindcount[NR_VIRQS]; /* reference counts (global) */ ++typedef struct { ++ int evtchn_to_virq[NR_EVTCHN]; /* evtchn -> IRQ */ ++ u32 virq_to_evtchn[NR_VIRQS]; /* IRQ -> evtchn */ ++ bool valid[NR_EVTCHN]; /* Indicate if the event channel can be used for notification for example */ ++ bool evtchn_mask[NR_EVTCHN]; ++ int virq_bindcount[NR_VIRQS]; ++} evtchn_info_t; ++ ++static DEFINE_PER_CPU(evtchn_info_t, evtchn_info); + ++/* ++ * Get the evtchn from a irq_data structure which contains a (unique) CPU bound to the IRQ processing. ++ */ +inline unsigned int evtchn_from_virq_and_cpu(unsigned int virq, unsigned int cpu) { -+ return virq_to_evtchn[virq]; ++ return per_cpu(evtchn_info, cpu).virq_to_evtchn[virq]; +} + +inline unsigned int evtchn_from_virq(int virq) +{ -+ return virq_to_evtchn[virq]; ++ return evtchn_from_virq_and_cpu(virq, smp_processor_id()); +} + +inline unsigned int evtchn_from_irq_data(struct irq_data *irq_data) @@ -89,17 +91,17 @@ +#define __evtchn_from_virq evtchn_from_irq_data + +static inline bool evtchn_is_masked(unsigned int b) { -+ return evtchn_masked[b]; ++ return per_cpu(evtchn_info, smp_processor_id()).evtchn_mask[b]; +} + +#if 0 /* debug */ +static void dump_evtchn_pending(void) { + int i; + -+ lprintk(" Evtchn info in Agency\n\n"); ++ lprintk(" Evtchn info in Agency CPU %d\n\n", smp_processor_id()); + + for (i = 0; i < NR_EVTCHN; i++) -+ lprintk("e:%d m:%d p:%d ", i, evtchn_masked[i], ++ lprintk("e:%d m:%d p:%d ", i, per_cpu(evtchn_info, smp_processor_id()).evtchn_mask[i], + avz_shared->evtchn_pending[i]); + + lprintk("\n\n"); @@ -140,17 +142,17 @@ + if (evtchn == NR_EVTCHN) + break; + -+ BUG_ON(!evtchn_valid[evtchn]); ++ BUG_ON(!per_cpu(evtchn_info, smp_processor_id()).valid[evtchn]); + + loopmax++; + + if (loopmax > 500) /* Probably something wrong ;-) */ + lprintk("%s: Warning trying to process evtchn: %d IRQ: %d for quite a long time on CPU %d / masked: %d...\n", -+ __func__, evtchn, evtchn_to_virq[evtchn], smp_processor_id(), evtchn_is_masked(evtchn)); ++ __func__, evtchn, per_cpu(evtchn_info, smp_processor_id()).evtchn_to_virq[evtchn], smp_processor_id(), evtchn_is_masked(evtchn)); + -+ virq = evtchn_to_virq[evtchn]; ++ virq = per_cpu(evtchn_info, smp_processor_id()).evtchn_to_virq[evtchn]; + -+ clear_evtchn(evtchn); ++ clear_evtchn(evtchn_from_virq(virq)); + + generic_handle_irq(VIRQ_BASE + virq); + @@ -166,9 +168,8 @@ +{ + int virq; + -+ /* virq_bindcount is now global; simple scan suffices */ + for (virq = 0; virq < NR_VIRQS; virq++) -+ if (virq_bindcount[virq] == 0) ++ if (per_cpu(evtchn_info, cpu).virq_bindcount[virq] == 0) + break; + + if (virq == NR_VIRQS) @@ -184,14 +185,15 @@ + + spin_lock(&virq_mapping_update_lock); + -+ if ((virq = evtchn_to_virq[evtchn]) == -1) { ++ if ((virq = per_cpu(evtchn_info, cpu).evtchn_to_virq[evtchn]) == -1) { + virq = find_unbound_virq(cpu); -+ evtchn_to_virq[evtchn] = virq; -+ virq_to_evtchn[virq] = evtchn; -+ evtchn_valid[evtchn] = true; ++ per_cpu(evtchn_info, cpu).evtchn_to_virq[evtchn] = virq; ++ per_cpu(evtchn_info, cpu).virq_to_evtchn[virq] = evtchn; ++ per_cpu(evtchn_info, cpu).valid[evtchn] = true; ++ + } + -+ virq_bindcount[virq]++; ++ per_cpu(evtchn_info, cpu).virq_bindcount[virq]++; + + spin_unlock(&virq_mapping_update_lock); + @@ -210,7 +212,7 @@ + + avz_hypercall(&args); + -+ evtchn_valid[evtchn] = false; ++ evtchn_info.valid[evtchn] = false; +} + +static int bind_interdomain_evtchn_to_virq(unsigned int remote_domain, unsigned int remote_evtchn) @@ -253,11 +255,12 @@ +static void unbind_from_virq(unsigned int virq) +{ + avz_hyp_t args; -+ int evtchn = virq_to_evtchn[virq]; ++ int evtchn = evtchn_from_virq(virq); ++ int cpu = smp_processor_id(); + + spin_lock(&virq_mapping_update_lock); + -+ if (--virq_bindcount[virq] == 0) { ++ if (--per_cpu(evtchn_info, cpu).virq_bindcount[virq] == 0) { + + args.cmd = AVZ_EVENT_CHANNEL_OP; + args.u.avz_evtchn.evtchn_op.cmd = EVTCHNOP_close; @@ -266,8 +269,8 @@ + + avz_hypercall(&args); + -+ evtchn_to_virq[evtchn] = -1; -+ evtchn_valid[evtchn] = false; ++ per_cpu(evtchn_info, cpu).evtchn_to_virq[evtchn] = -1; ++ per_cpu(evtchn_info, cpu).valid[evtchn] = false; + } + + spin_unlock(&virq_mapping_update_lock); @@ -365,39 +368,50 @@ + +void notify_remote_via_virq(int virq) +{ -+ /* virq_to_evtchn is now a global array — direct lookup */ -+ notify_remote_via_evtchn(virq_to_evtchn[virq]); ++ int evtchn = evtchn_from_virq(virq); ++ ++ notify_remote_via_evtchn(evtchn); +} + +void mask_evtchn(int evtchn) +{ -+ evtchn_masked[evtchn] = true; ++ per_cpu(evtchn_info, smp_processor_id()).evtchn_mask[evtchn] = true; +} + +void unmask_evtchn(int evtchn) +{ -+ evtchn_masked[evtchn] = false; ++ per_cpu(evtchn_info, smp_processor_id()).evtchn_mask[evtchn] = false; +} + +void virq_init(void) +{ + struct irq_desc *irqdesc; /* Linux IRQ descriptor */ -+ int i; + -+ /* Initialize global evtchn state */ -+ for (i = 0; i < NR_EVTCHN; i++) { -+ evtchn_to_virq[i] = -1; -+ evtchn_valid[i] = false; -+ evtchn_masked[i] = true; /* all masked until explicitly unmasked */ -+ } ++ int i, cpu; ++ cpumask_t cpumask = CPU_MASK_ALL; ++ ++ /* ++ * For each CPU, initialize event channels for all IRQs. ++ * An IRQ will processed by only one CPU, but it may be rebound to another CPU as well. ++ */ ++ ++ for_each_cpu(cpu, &cpumask) { ++ ++ /* No event-channel -> IRQ mappings. */ ++ for (i = 0; i < NR_EVTCHN; i++) { ++ per_cpu(evtchn_info, cpu).evtchn_to_virq[i] = -1; ++ per_cpu(evtchn_info, cpu).valid[i] = false; ++ ++ per_cpu(evtchn_info, cpu).evtchn_mask[i] = true; ++ } + +#ifdef CONFIG_SPARSE_IRQ -+ irq_alloc_descs(VIRQ_BASE, VIRQ_BASE, NR_VIRQS, numa_node_id()); ++ irq_alloc_descs(VIRQ_BASE, VIRQ_BASE, NR_VIRQS, numa_node_id()); +#endif + -+ for (i = 0; i < NR_VIRQS; i++) { -+ virq_to_evtchn[i] = 0; -+ virq_bindcount[i] = 0; ++ /* Dynamic IRQ space is currently unbound. Zero the refcnts. */ ++ for (i = 0; i < NR_VIRQS; i++) ++ per_cpu(evtchn_info, cpu).virq_bindcount[i] = 0; + } + + /* Configure the irqdesc associated to VIRQs */ @@ -414,4 +428,3 @@ + irq_set_handler(VIRQ_BASE + i, handle_level_irq); + } +} - diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0088-sysfs.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0088-sysfs.c.patch index 24d4e4f..f29f618 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0088-sysfs.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0088-sysfs.c.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/sysfs.c 1970-01-01 01:00:00.000000000 +0100 +++ ./soo/kernel/sysfs.c 2025-08-29 08:46:41.394665675 +0200 -@@ -0,0 +1,193 @@ +@@ -0,0 +1,158 @@ + +/* + * Copyright (C) 2020 Daniel Rossier @@ -34,19 +34,12 @@ + [agencyUID] = "agencyUID", + [name] = "name", + [vsensej_js]= "vsensej_js", -+ [vfbdev_hres] = "vfbdev_hres", -+ [vfbdev_vres] = "vfbdev_vres", -+ [vfbdev_bpp] = "vfbdev_bpp", -+ [vfbdev_size] = "vfbdev_size", -+ [vfbdev_addr] = "vfbdev_addr", -+ [vfbdev_pid] = "vfbdev_pid", +}; + +static struct kobject *root_kobj; + +static struct kobject *backend_kobj; +static struct kobject *backend_vsensej_kobj; -+static struct kobject *backend_vfbdev_kobj; + + +/* Internal list structure to manage the diversity of callback functions related to attributes */ @@ -114,13 +107,6 @@ +/**** vsensej ****/ +static struct kobj_attribute vsensej_js_attr = __ATTR(vsensej_js, 0664, attr_show, attr_store); + -+static struct kobj_attribute vfbdev_hres_attr = __ATTR(vfbdev_hres, 0664, attr_show, attr_store); -+static struct kobj_attribute vfbdev_vres_attr = __ATTR(vfbdev_vres, 0664, attr_show, attr_store); -+static struct kobj_attribute vfbdev_bpp_attr = __ATTR(vfbdev_bpp, 0664, attr_show, attr_store); -+static struct kobj_attribute vfbdev_size_attr = __ATTR(vfbdev_size, 0664, attr_show, attr_store); -+static struct kobj_attribute vfbdev_addr_attr = __ATTR(vfbdev_addr, 0664, attr_show, attr_store); -+static struct kobj_attribute vfbdev_pid_attr = __ATTR(vfbdev_pid, 0664, attr_show, attr_store); -+ + +/* Groups of attributes for SOO (root) */ +static struct attribute *soo_attrs[] = { @@ -144,20 +130,6 @@ + .attrs = backend_vsensej_attrs, +}; + -+static struct attribute *backend_vfbdev_attrs[] = { -+ &vfbdev_hres_attr.attr, -+ &vfbdev_vres_attr.attr, -+ &vfbdev_bpp_attr.attr, -+ &vfbdev_size_attr.attr, -+ &vfbdev_addr_attr.attr, -+ &vfbdev_pid_attr.attr, -+ NULL, /* need to NULL terminate the list of attributes */ -+}; -+ -+static struct attribute_group backend_vfbdev_group = { -+ .attrs = backend_vfbdev_attrs, -+}; -+ +void soo_sysfs_init(void) { + int ret; + @@ -184,13 +156,6 @@ + + ret = sysfs_create_group(backend_vsensej_kobj, &backend_vsensej_group); + BUG_ON(ret); -+ -+ /**** vfbdev ****/ -+ backend_vfbdev_kobj = kobject_create_and_add("vfbdev", backend_kobj); -+ BUG_ON(!backend_vfbdev_kobj); -+ -+ ret = sysfs_create_group(backend_vfbdev_kobj, &backend_vfbdev_group); -+ BUG_ON(ret); +} + + diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0090-vbstorage.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0090-vbstorage.c.patch index 29703a4..2375844 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0090-vbstorage.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0090-vbstorage.c.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/vbstore/vbstorage.c 1970-01-01 01:00:00.000000000 +0100 +++ ./soo/kernel/vbstore/vbstorage.c 2025-08-29 08:46:41.395120704 +0200 -@@ -0,0 +1,528 @@ +@@ -0,0 +1,518 @@ +/* + * Copyright (C) 2016-2019 Daniel Rossier + * Copyright (C) 2018 Baptiste Delporte @@ -518,14 +518,4 @@ + np = of_find_compatible_node(NULL, NULL, "vlogs,backend"); + if (of_device_is_available(np)) + vbs_store_mkdir("/backend/vlogs"); -+ -+ /* Agency backend side of virtual vfbdev device */ -+ np = of_find_compatible_node(NULL, NULL, "vfbdev,backend"); -+ if (of_device_is_available(np)) -+ vbs_store_mkdir("/backend/vfbdev"); -+ -+ /* Agency backend side of virtual vinput device */ -+ np = of_find_compatible_node(NULL, NULL, "vinput,backend"); -+ if (of_device_is_available(np)) -+ vbs_store_mkdir("/backend/vinput"); +} diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0096-vbus_vbstore.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0096-vbus_vbstore.c.patch index 89b5674..dee3578 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0096-vbus_vbstore.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0096-vbus_vbstore.c.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/vbus/vbus_vbstore.c 1970-01-01 01:00:00.000000000 +0100 +++ ./soo/kernel/vbus/vbus_vbstore.c 2025-08-29 08:46:41.394977570 +0200 -@@ -0,0 +1,974 @@ +@@ -0,0 +1,968 @@ +/* + * Copyright (C) 2016-2019 Daniel Rossier + * Copyright (C) 2018 Baptiste Delporte @@ -748,18 +748,12 @@ +{ + struct vbus_watch *__w; + bool found; -+ int ret; + + BUG_ON(smp_processor_id() != AGENCY_CPU); + + for (;;) { + -+ /* Use interruptible version to avoid blocked task message every 120 seconds */ -+ ret = wait_for_completion_interruptible(&vbs_state.watch_wait); -+ if (ret == -ERESTARTSYS) { -+ pr_warn("%s wait_for_completion has been interrupted, ignoring\n", __func__); -+ continue; -+ } ++ wait_for_completion(&vbs_state.watch_wait); + + /* Avoiding to be suspended during SOO callback processing... */ + mutex_lock(&vbs_state.watch_mutex); diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0128-Makefile.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0128-Makefile.patch deleted file mode 100644 index 2c25580..0000000 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0128-Makefile.patch +++ /dev/null @@ -1,4 +0,0 @@ ---- ./build/tmp/work/linux-6.12-r0/linux-6.12/soo/drivers/vfbdevback/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/drivers/vfbdevback/Makefile 2026-02-17 08:18:11.150593301 +0100 -@@ -0,0 +1 @@ -+obj-y := vfbdev.o diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0129-vfbdev.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0128-vfbdev.c.patch similarity index 100% rename from build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0129-vfbdev.c.patch rename to build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0128-vfbdev.c.patch diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0130-vfbdev.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0129-vfbdev.h.patch similarity index 100% rename from build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0130-vfbdev.h.patch rename to build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0129-vfbdev.h.patch diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0132-vinput.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0130-vinput.c.patch similarity index 100% rename from build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0132-vinput.c.patch rename to build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0130-vinput.c.patch diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0131-Makefile.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0131-Makefile.patch deleted file mode 100644 index 99d2ef0..0000000 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0131-Makefile.patch +++ /dev/null @@ -1,5 +0,0 @@ ---- /home/cdk/project/micofe/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/drivers/vinputback/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/drivers/vinputback/Makefile 2026-04-28 16:34:33.037734565 +0200 -@@ -0,0 +1,2 @@ -+obj-y := vinput.o -+ diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0133-vinput.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0131-vinput.h.patch similarity index 100% rename from build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0133-vinput.h.patch rename to build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0131-vinput.h.patch diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0-patches.inc b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0-patches.inc index d00435d..a8b55b8 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0-patches.inc +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0-patches.inc @@ -1,44 +1,46 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + SRC_URI:append:soo = "\ - file://0014-parser.tab.h.patch \ file://0071-asf_test.c.patch \ file://0048-guest_api.h.patch \ file://0052-roxml.h.patch \ file://0066-Kconfig.patch \ file://0104-roxml_core.c.patch \ file://0075-lprintk.c.patch \ - file://0002-rpi4_64_nomodules_soo_defconfig.patch \ + file://0014-Kconfig.patch \ file://0116-roxml_tune.h.patch \ file://0064-vbus.h.patch \ file://0069-asf.c.patch \ + file://0032-vuart.c.patch \ + file://0024-rpisense-joystick.c.patch \ file://0060-debug.h.patch \ file://0055-strtod.h.patch \ file://0050-paging.h.patch \ file://0056-sysfs.h.patch \ file://0098-config.h.patch \ - file://0035-capsule.h.patch \ - file://1016-Makefile.patch \ + file://0016-Makefile.patch \ file://0079-Kconfig.patch \ file://0086-setup.c.patch \ - file://0010-fixdep.patch \ + file://0019-Makefile.patch \ file://0087-soo_guest_activity.c.patch \ file://0053-simulation.h.patch \ - file://0012-lexer.lex.c.patch \ file://0084-hypervisor.c.patch \ file://0067-Makefile.patch \ + file://0018-Kconfig.patch \ file://0094-vbus.c.patch \ - file://0021-vlogs.c.patch \ file://0117-roxml_types.h.patch \ - file://0008-Kconfig.patch \ - file://0029-vsenseled.c.patch \ - file://0015-Kconfig.patch \ + file://0012-tty_flip.h.patch \ + file://0022-vdummy.c.patch \ file://0081-meminfo.c.patch \ file://0110-roxml_internal.h.patch \ + file://0033-avz.h.patch \ file://0059-console.h.patch \ + file://0038-vdummy.h.patch \ file://0078-debug.c.patch \ + file://0027-Makefile.patch \ file://0095-vbus_client.c.patch \ file://0085-Makefile.patch \ - file://0026-Makefile.patch \ - file://0030-Makefile.patch \ file://0041-vuart.h.patch \ file://0074-console.c.patch \ file://0047-gnttab.h.patch \ @@ -51,47 +53,40 @@ SRC_URI:append:soo = "\ file://0111-roxml_mem.c.patch \ file://0080-Makefile.patch \ file://0096-vbus_vbstore.c.patch \ + file://0028-rpisense-led.c.patch \ file://0101-roxml_buff.h.patch \ - file://0033-asf.h.patch \ + file://0035-avzcons.h.patch \ file://0113-roxml_nav.c.patch \ file://0070-asf_priv.h.patch \ file://0107-roxml_edit.c.patch \ - file://0025-vsensej.c.patch \ - file://0034-avzcons.h.patch \ - file://0027-rpisense-led.c.patch \ - file://0022-Makefile.patch \ + file://0020-vdevback.c.patch \ file://0045-errno.h.patch \ - file://0017-vdevback.c.patch \ - file://0011-conf.patch \ file://0077-core.c.patch \ file://0109-roxml_file.h.patch \ file://0100-roxml_buff.c.patch \ - file://0019-vdummy.c.patch \ file://0090-vbstorage.c.patch \ - file://0007-main.c.patch \ file://0099-Makefile.patch \ - file://0036-debug.h.patch \ - file://0032-avz.h.patch \ - file://0006-tty_flip.h.patch \ + file://0036-capsule.h.patch \ + file://0029-rpisense-led.h.patch \ + file://0013-main.c.patch \ file://0061-injector.h.patch \ + file://0030-vsenseled.c.patch \ file://0097-ctype.c.patch \ - file://0009-Makefile.patch \ - file://0013-parser.tab.c.patch \ + file://0006-.clang-format.patch \ file://0089-Makefile.patch \ file://0102-roxml_commit.c.patch \ - file://0031-vuart.c.patch \ file://0105-roxml_core.h.patch \ - file://0037-vdummy.h.patch \ file://0114-roxml_parser.c.patch \ file://0004-irq.c.patch \ + file://0034-asf.h.patch \ + file://0010-.gitattributes.patch \ file://0103-roxml_content.c.patch \ file://0106-roxml_defines.h.patch \ file://0003-entry.S.patch \ file://0072-Makefile.patch \ file://0115-roxml_parser.h.patch \ file://0039-vsensej.h.patch \ - file://0024-rpisense-joystick.h.patch \ - file://0023-rpisense-joystick.c.patch \ + file://0023-Makefile.patch \ file://0062-soo.h.patch \ file://0058-asf.h.patch \ file://0088-sysfs.c.patch \ @@ -100,15 +95,16 @@ SRC_URI:append:soo = "\ file://0044-errno-base.h.patch \ file://0063-vbstore.h.patch \ file://0076-Makefile.patch \ - file://1001-bcm2711-rpi-4-b.dts.patch \ + file://0031-Makefile.patch \ + file://0025-rpisense-joystick.h.patch \ file://0043-err.h.patch \ - file://0020-Makefile.patch \ + file://0021-Makefile.patch \ file://0121-roxml_xpath.h.patch \ file://0119-roxml_win32_native.h.patch \ file://0124-Makefile.patch \ file://0051-ring.h.patch \ file://0118-roxml_utils.h.patch \ - file://0018-Makefile.patch \ + file://0026-vsensej.c.patch \ file://0057-types.h.patch \ file://0046-evtchn.h.patch \ file://0068-paging.c.patch \ @@ -116,17 +112,19 @@ SRC_URI:append:soo = "\ file://0092-Makefile.patch \ file://0040-vsenseled.h.patch \ file://0093-vbus_backend.c.patch \ - file://0038-vlogs.h.patch \ + file://0037-debug.h.patch \ file://0073-capsule.c.patch \ file://0108-roxml_file.c.patch \ - file://0028-rpisense-led.h.patch \ file://0049-hypervisor.h.patch \ file://0065-vdevback.h.patch \ + file://0015-.mailmap.patch \ file://0123-strtod.c.patch \ - file://0125-Makefile.patch \ - file://0126-vfbdev.c.patch \ - file://0127-vfbdev.h.patch \ - file://0128-Makefile.patch \ - file://0129-vinput.c.patch \ - file://0130-vinput.h.patch \ -" \ No newline at end of file + file://0125-Makefile.patch \ + file://0126-vlogs.c.patch \ + file://0127-vlogs.h.patch \ + file://0128-vfbdev.c.patch \ + file://0129-vfbdev.h.patch \ + file://0130-vinput.c.patch \ + file://0131-vinput.h.patch \ + file://0132-bcm2711-rpi-4-b.dts.patch \ +" diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0003-entry.S.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0003-entry.S.patch index 0c76c83..3d5617d 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0003-entry.S.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0003-entry.S.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/kernel/entry.S 2026-03-23 18:27:14.611246150 +0100 -+++ ./arch/arm64/kernel/entry.S 2026-03-13 13:24:35.771787619 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/arch/arm64/kernel/entry.S 2024-11-17 23:15:08.000000000 +0100 ++++ ./arch/arm64/kernel/entry.S 2025-08-29 08:46:39.976604032 +0200 @@ -28,6 +28,11 @@ #include #include @@ -12,7 +12,7 @@ .macro clear_gp_regs .irp n,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29 -@@ -1102,3 +1107,15 @@ +@@ -1096,3 +1101,15 @@ SYM_CODE_END(__sdei_handler_abort) NOKPROBE(__sdei_handler_abort) #endif /* CONFIG_ARM_SDE_INTERFACE */ diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0004-irq.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0004-irq.c.patch index c79bcf2..e187043 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0004-irq.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0004-irq.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/kernel/irq.c 2026-03-23 18:27:14.611246150 +0100 -+++ ./arch/arm64/kernel/irq.c 2026-03-13 13:24:35.773049136 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/arch/arm64/kernel/irq.c 2024-11-17 23:15:08.000000000 +0100 ++++ ./arch/arm64/kernel/irq.c 2025-08-29 08:46:39.978048892 +0200 @@ -27,6 +27,10 @@ #include #include diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0005-smp.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0005-smp.c.patch index e9e75b0..068c7da 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0005-smp.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0005-smp.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/kernel/smp.c 2026-03-23 18:27:14.613246203 +0100 -+++ ./arch/arm64/kernel/smp.c 2026-03-16 21:04:48.406866037 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/arch/arm64/kernel/smp.c 2024-11-17 23:15:08.000000000 +0100 ++++ ./arch/arm64/kernel/smp.c 2025-08-29 08:46:39.976376895 +0200 @@ -53,6 +53,8 @@ #include #include @@ -18,15 +18,7 @@ IPI_CPU_STOP_NMI, IPI_TIMER, IPI_IRQ_WORK, -@@ -99,7 +101,6 @@ - } - #endif - -- - /* - * Boot a secondary CPU, and assign it the specified idle task. - * This also gives us the initial stack to use for this CPU. -@@ -955,7 +956,7 @@ +@@ -955,7 +957,7 @@ static void do_handle_IPI(int ipinr) { unsigned int cpu = smp_processor_id(); @@ -35,7 +27,7 @@ if ((unsigned)ipinr < NR_IPI) trace_ipi_entry(ipi_types[ipinr]); -@@ -969,6 +970,17 @@ +@@ -969,6 +971,17 @@ break; case IPI_CPU_STOP: diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0006-.clang-format.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0006-.clang-format.patch new file mode 100644 index 0000000..6e6a205 --- /dev/null +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0006-.clang-format.patch @@ -0,0 +1,767 @@ +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/.clang-format 2024-11-17 23:15:08.000000000 +0100 ++++ ./.clang-format 1970-01-01 01:00:00.000000000 +0100 +@@ -1,764 +0,0 @@ +-# SPDX-License-Identifier: GPL-2.0 +-# +-# clang-format configuration file. Intended for clang-format >= 11. +-# +-# For more information, see: +-# +-# Documentation/dev-tools/clang-format.rst +-# https://clang.llvm.org/docs/ClangFormat.html +-# https://clang.llvm.org/docs/ClangFormatStyleOptions.html +-# +---- +-AccessModifierOffset: -4 +-AlignAfterOpenBracket: Align +-AlignConsecutiveAssignments: false +-AlignConsecutiveDeclarations: false +-AlignEscapedNewlines: Left +-AlignOperands: true +-AlignTrailingComments: false +-AllowAllParametersOfDeclarationOnNextLine: false +-AllowShortBlocksOnASingleLine: false +-AllowShortCaseLabelsOnASingleLine: false +-AllowShortFunctionsOnASingleLine: None +-AllowShortIfStatementsOnASingleLine: false +-AllowShortLoopsOnASingleLine: false +-AlwaysBreakAfterDefinitionReturnType: None +-AlwaysBreakAfterReturnType: None +-AlwaysBreakBeforeMultilineStrings: false +-AlwaysBreakTemplateDeclarations: false +-BinPackArguments: true +-BinPackParameters: true +-BraceWrapping: +- AfterClass: false +- AfterControlStatement: false +- AfterEnum: false +- AfterFunction: true +- AfterNamespace: true +- AfterObjCDeclaration: false +- AfterStruct: false +- AfterUnion: false +- AfterExternBlock: false +- BeforeCatch: false +- BeforeElse: false +- IndentBraces: false +- SplitEmptyFunction: true +- SplitEmptyRecord: true +- SplitEmptyNamespace: true +-BreakBeforeBinaryOperators: None +-BreakBeforeBraces: Custom +-BreakBeforeInheritanceComma: false +-BreakBeforeTernaryOperators: false +-BreakConstructorInitializersBeforeComma: false +-BreakConstructorInitializers: BeforeComma +-BreakAfterJavaFieldAnnotations: false +-BreakStringLiterals: false +-ColumnLimit: 80 +-CommentPragmas: '^ IWYU pragma:' +-CompactNamespaces: false +-ConstructorInitializerAllOnOneLineOrOnePerLine: false +-ConstructorInitializerIndentWidth: 8 +-ContinuationIndentWidth: 8 +-Cpp11BracedListStyle: false +-DerivePointerAlignment: false +-DisableFormat: false +-ExperimentalAutoDetectBinPacking: false +-FixNamespaceComments: false +- +-# Taken from: +-# git grep -h '^#define [^[:space:]]*for_each[^[:space:]]*(' include/ tools/ \ +-# | sed "s,^#define \([^[:space:]]*for_each[^[:space:]]*\)(.*$, - '\1'," \ +-# | LC_ALL=C sort -u +-ForEachMacros: +- - '__ata_qc_for_each' +- - '__bio_for_each_bvec' +- - '__bio_for_each_segment' +- - '__evlist__for_each_entry' +- - '__evlist__for_each_entry_continue' +- - '__evlist__for_each_entry_from' +- - '__evlist__for_each_entry_reverse' +- - '__evlist__for_each_entry_safe' +- - '__for_each_mem_range' +- - '__for_each_mem_range_rev' +- - '__for_each_thread' +- - '__hlist_for_each_rcu' +- - '__map__for_each_symbol_by_name' +- - '__pci_bus_for_each_res0' +- - '__pci_bus_for_each_res1' +- - '__pci_dev_for_each_res0' +- - '__pci_dev_for_each_res1' +- - '__perf_evlist__for_each_entry' +- - '__perf_evlist__for_each_entry_reverse' +- - '__perf_evlist__for_each_entry_safe' +- - '__rq_for_each_bio' +- - '__shost_for_each_device' +- - '__sym_for_each' +- - 'apei_estatus_for_each_section' +- - 'ata_for_each_dev' +- - 'ata_for_each_link' +- - 'ata_qc_for_each' +- - 'ata_qc_for_each_raw' +- - 'ata_qc_for_each_with_internal' +- - 'ax25_for_each' +- - 'ax25_uid_for_each' +- - 'bio_for_each_bvec' +- - 'bio_for_each_bvec_all' +- - 'bio_for_each_folio_all' +- - 'bio_for_each_integrity_vec' +- - 'bio_for_each_segment' +- - 'bio_for_each_segment_all' +- - 'bio_list_for_each' +- - 'bip_for_each_vec' +- - 'bond_for_each_slave' +- - 'bond_for_each_slave_rcu' +- - 'bpf_for_each' +- - 'bpf_for_each_reg_in_vstate' +- - 'bpf_for_each_reg_in_vstate_mask' +- - 'bpf_for_each_spilled_reg' +- - 'bpf_object__for_each_map' +- - 'bpf_object__for_each_program' +- - 'btree_for_each_safe128' +- - 'btree_for_each_safe32' +- - 'btree_for_each_safe64' +- - 'btree_for_each_safel' +- - 'card_for_each_dev' +- - 'cgroup_taskset_for_each' +- - 'cgroup_taskset_for_each_leader' +- - 'cpu_aggr_map__for_each_idx' +- - 'cpufreq_for_each_efficient_entry_idx' +- - 'cpufreq_for_each_entry' +- - 'cpufreq_for_each_entry_idx' +- - 'cpufreq_for_each_valid_entry' +- - 'cpufreq_for_each_valid_entry_idx' +- - 'css_for_each_child' +- - 'css_for_each_descendant_post' +- - 'css_for_each_descendant_pre' +- - 'damon_for_each_region' +- - 'damon_for_each_region_from' +- - 'damon_for_each_region_safe' +- - 'damon_for_each_scheme' +- - 'damon_for_each_scheme_safe' +- - 'damon_for_each_target' +- - 'damon_for_each_target_safe' +- - 'damos_for_each_filter' +- - 'damos_for_each_filter_safe' +- - 'damos_for_each_quota_goal' +- - 'damos_for_each_quota_goal_safe' +- - 'data__for_each_file' +- - 'data__for_each_file_new' +- - 'data__for_each_file_start' +- - 'device_for_each_child_node' +- - 'device_for_each_child_node_scoped' +- - 'dma_fence_array_for_each' +- - 'dma_fence_chain_for_each' +- - 'dma_fence_unwrap_for_each' +- - 'dma_resv_for_each_fence' +- - 'dma_resv_for_each_fence_unlocked' +- - 'do_for_each_ftrace_op' +- - 'drm_atomic_crtc_for_each_plane' +- - 'drm_atomic_crtc_state_for_each_plane' +- - 'drm_atomic_crtc_state_for_each_plane_state' +- - 'drm_atomic_for_each_plane_damage' +- - 'drm_client_for_each_connector_iter' +- - 'drm_client_for_each_modeset' +- - 'drm_connector_for_each_possible_encoder' +- - 'drm_exec_for_each_locked_object' +- - 'drm_exec_for_each_locked_object_reverse' +- - 'drm_for_each_bridge_in_chain' +- - 'drm_for_each_connector_iter' +- - 'drm_for_each_crtc' +- - 'drm_for_each_crtc_reverse' +- - 'drm_for_each_encoder' +- - 'drm_for_each_encoder_mask' +- - 'drm_for_each_fb' +- - 'drm_for_each_legacy_plane' +- - 'drm_for_each_plane' +- - 'drm_for_each_plane_mask' +- - 'drm_for_each_privobj' +- - 'drm_gem_for_each_gpuvm_bo' +- - 'drm_gem_for_each_gpuvm_bo_safe' +- - 'drm_gpuva_for_each_op' +- - 'drm_gpuva_for_each_op_from_reverse' +- - 'drm_gpuva_for_each_op_reverse' +- - 'drm_gpuva_for_each_op_safe' +- - 'drm_gpuvm_bo_for_each_va' +- - 'drm_gpuvm_bo_for_each_va_safe' +- - 'drm_gpuvm_for_each_va' +- - 'drm_gpuvm_for_each_va_range' +- - 'drm_gpuvm_for_each_va_range_safe' +- - 'drm_gpuvm_for_each_va_safe' +- - 'drm_mm_for_each_hole' +- - 'drm_mm_for_each_node' +- - 'drm_mm_for_each_node_in_range' +- - 'drm_mm_for_each_node_safe' +- - 'dsa_switch_for_each_available_port' +- - 'dsa_switch_for_each_cpu_port' +- - 'dsa_switch_for_each_cpu_port_continue_reverse' +- - 'dsa_switch_for_each_port' +- - 'dsa_switch_for_each_port_continue_reverse' +- - 'dsa_switch_for_each_port_safe' +- - 'dsa_switch_for_each_user_port' +- - 'dsa_switch_for_each_user_port_continue_reverse' +- - 'dsa_tree_for_each_cpu_port' +- - 'dsa_tree_for_each_user_port' +- - 'dsa_tree_for_each_user_port_continue_reverse' +- - 'dso__for_each_symbol' +- - 'elf_hash_for_each_possible' +- - 'elf_symtab__for_each_symbol' +- - 'evlist__for_each_cpu' +- - 'evlist__for_each_entry' +- - 'evlist__for_each_entry_continue' +- - 'evlist__for_each_entry_from' +- - 'evlist__for_each_entry_reverse' +- - 'evlist__for_each_entry_safe' +- - 'flow_action_for_each' +- - 'for_each_acpi_consumer_dev' +- - 'for_each_acpi_dev_match' +- - 'for_each_active_dev_scope' +- - 'for_each_active_drhd_unit' +- - 'for_each_active_iommu' +- - 'for_each_active_route' +- - 'for_each_aggr_pgid' +- - 'for_each_and_bit' +- - 'for_each_andnot_bit' +- - 'for_each_available_child_of_node' +- - 'for_each_available_child_of_node_scoped' +- - 'for_each_bench' +- - 'for_each_bio' +- - 'for_each_board_func_rsrc' +- - 'for_each_btf_ext_rec' +- - 'for_each_btf_ext_sec' +- - 'for_each_bvec' +- - 'for_each_card_auxs' +- - 'for_each_card_auxs_safe' +- - 'for_each_card_components' +- - 'for_each_card_dapms' +- - 'for_each_card_pre_auxs' +- - 'for_each_card_prelinks' +- - 'for_each_card_rtds' +- - 'for_each_card_rtds_safe' +- - 'for_each_card_widgets' +- - 'for_each_card_widgets_safe' +- - 'for_each_cgroup_storage_type' +- - 'for_each_child_of_node' +- - 'for_each_child_of_node_scoped' +- - 'for_each_clear_bit' +- - 'for_each_clear_bit_from' +- - 'for_each_clear_bitrange' +- - 'for_each_clear_bitrange_from' +- - 'for_each_cmd' +- - 'for_each_cmsghdr' +- - 'for_each_collection' +- - 'for_each_comp_order' +- - 'for_each_compatible_node' +- - 'for_each_component_dais' +- - 'for_each_component_dais_safe' +- - 'for_each_conduit' +- - 'for_each_console' +- - 'for_each_console_srcu' +- - 'for_each_cpu' +- - 'for_each_cpu_and' +- - 'for_each_cpu_andnot' +- - 'for_each_cpu_from' +- - 'for_each_cpu_or' +- - 'for_each_cpu_wrap' +- - 'for_each_dapm_widgets' +- - 'for_each_dedup_cand' +- - 'for_each_dev_addr' +- - 'for_each_dev_scope' +- - 'for_each_dma_cap_mask' +- - 'for_each_dpcm_be' +- - 'for_each_dpcm_be_rollback' +- - 'for_each_dpcm_be_safe' +- - 'for_each_dpcm_fe' +- - 'for_each_drhd_unit' +- - 'for_each_dss_dev' +- - 'for_each_efi_memory_desc' +- - 'for_each_efi_memory_desc_in_map' +- - 'for_each_element' +- - 'for_each_element_extid' +- - 'for_each_element_id' +- - 'for_each_enabled_cpu' +- - 'for_each_endpoint_of_node' +- - 'for_each_event' +- - 'for_each_event_tps' +- - 'for_each_evictable_lru' +- - 'for_each_fib6_node_rt_rcu' +- - 'for_each_fib6_walker_rt' +- - 'for_each_file_lock' +- - 'for_each_free_mem_pfn_range_in_zone_from' +- - 'for_each_free_mem_range' +- - 'for_each_free_mem_range_reverse' +- - 'for_each_func_rsrc' +- - 'for_each_gpiochip_node' +- - 'for_each_group_evsel' +- - 'for_each_group_evsel_head' +- - 'for_each_group_member' +- - 'for_each_group_member_head' +- - 'for_each_hstate' +- - 'for_each_hwgpio' +- - 'for_each_if' +- - 'for_each_inject_fn' +- - 'for_each_insn' +- - 'for_each_insn_op_loc' +- - 'for_each_insn_prefix' +- - 'for_each_intid' +- - 'for_each_iommu' +- - 'for_each_ip_tunnel_rcu' +- - 'for_each_irq_nr' +- - 'for_each_lang' +- - 'for_each_link_ch_maps' +- - 'for_each_link_codecs' +- - 'for_each_link_cpus' +- - 'for_each_link_platforms' +- - 'for_each_lru' +- - 'for_each_matching_node' +- - 'for_each_matching_node_and_match' +- - 'for_each_media_entity_data_link' +- - 'for_each_mem_pfn_range' +- - 'for_each_mem_range' +- - 'for_each_mem_range_rev' +- - 'for_each_mem_region' +- - 'for_each_member' +- - 'for_each_memory' +- - 'for_each_migratetype_order' +- - 'for_each_missing_reg' +- - 'for_each_mle_subelement' +- - 'for_each_mod_mem_type' +- - 'for_each_net' +- - 'for_each_net_continue_reverse' +- - 'for_each_net_rcu' +- - 'for_each_netdev' +- - 'for_each_netdev_continue' +- - 'for_each_netdev_continue_rcu' +- - 'for_each_netdev_continue_reverse' +- - 'for_each_netdev_dump' +- - 'for_each_netdev_feature' +- - 'for_each_netdev_in_bond_rcu' +- - 'for_each_netdev_rcu' +- - 'for_each_netdev_reverse' +- - 'for_each_netdev_safe' +- - 'for_each_new_connector_in_state' +- - 'for_each_new_crtc_in_state' +- - 'for_each_new_mst_mgr_in_state' +- - 'for_each_new_plane_in_state' +- - 'for_each_new_plane_in_state_reverse' +- - 'for_each_new_private_obj_in_state' +- - 'for_each_new_reg' +- - 'for_each_nhlt_endpoint' +- - 'for_each_nhlt_endpoint_fmtcfg' +- - 'for_each_nhlt_fmtcfg' +- - 'for_each_node' +- - 'for_each_node_by_name' +- - 'for_each_node_by_type' +- - 'for_each_node_mask' +- - 'for_each_node_state' +- - 'for_each_node_with_cpus' +- - 'for_each_node_with_property' +- - 'for_each_nonreserved_multicast_dest_pgid' +- - 'for_each_numa_hop_mask' +- - 'for_each_of_allnodes' +- - 'for_each_of_allnodes_from' +- - 'for_each_of_cpu_node' +- - 'for_each_of_pci_range' +- - 'for_each_old_connector_in_state' +- - 'for_each_old_crtc_in_state' +- - 'for_each_old_mst_mgr_in_state' +- - 'for_each_old_plane_in_state' +- - 'for_each_old_private_obj_in_state' +- - 'for_each_oldnew_connector_in_state' +- - 'for_each_oldnew_crtc_in_state' +- - 'for_each_oldnew_mst_mgr_in_state' +- - 'for_each_oldnew_plane_in_state' +- - 'for_each_oldnew_plane_in_state_reverse' +- - 'for_each_oldnew_private_obj_in_state' +- - 'for_each_online_cpu' +- - 'for_each_online_node' +- - 'for_each_online_pgdat' +- - 'for_each_or_bit' +- - 'for_each_path' +- - 'for_each_pci_bridge' +- - 'for_each_pci_dev' +- - 'for_each_pcm_streams' +- - 'for_each_physmem_range' +- - 'for_each_populated_zone' +- - 'for_each_possible_cpu' +- - 'for_each_present_blessed_reg' +- - 'for_each_present_cpu' +- - 'for_each_prime_number' +- - 'for_each_prime_number_from' +- - 'for_each_probe_cache_entry' +- - 'for_each_process' +- - 'for_each_process_thread' +- - 'for_each_prop_codec_conf' +- - 'for_each_prop_dai_codec' +- - 'for_each_prop_dai_cpu' +- - 'for_each_prop_dlc_codecs' +- - 'for_each_prop_dlc_cpus' +- - 'for_each_prop_dlc_platforms' +- - 'for_each_property_of_node' +- - 'for_each_reg' +- - 'for_each_reg_filtered' +- - 'for_each_reloc' +- - 'for_each_reloc_from' +- - 'for_each_requested_gpio' +- - 'for_each_requested_gpio_in_range' +- - 'for_each_reserved_child_of_node' +- - 'for_each_reserved_mem_range' +- - 'for_each_reserved_mem_region' +- - 'for_each_rtd_ch_maps' +- - 'for_each_rtd_codec_dais' +- - 'for_each_rtd_components' +- - 'for_each_rtd_cpu_dais' +- - 'for_each_rtd_dais' +- - 'for_each_rtd_dais_reverse' +- - 'for_each_sband_iftype_data' +- - 'for_each_script' +- - 'for_each_sec' +- - 'for_each_set_bit' +- - 'for_each_set_bit_from' +- - 'for_each_set_bit_wrap' +- - 'for_each_set_bitrange' +- - 'for_each_set_bitrange_from' +- - 'for_each_set_clump8' +- - 'for_each_sg' +- - 'for_each_sg_dma_page' +- - 'for_each_sg_page' +- - 'for_each_sgtable_dma_page' +- - 'for_each_sgtable_dma_sg' +- - 'for_each_sgtable_page' +- - 'for_each_sgtable_sg' +- - 'for_each_sibling_event' +- - 'for_each_sta_active_link' +- - 'for_each_subelement' +- - 'for_each_subelement_extid' +- - 'for_each_subelement_id' +- - 'for_each_sublist' +- - 'for_each_subsystem' +- - 'for_each_supported_activate_fn' +- - 'for_each_supported_inject_fn' +- - 'for_each_sym' +- - 'for_each_test' +- - 'for_each_thread' +- - 'for_each_token' +- - 'for_each_unicast_dest_pgid' +- - 'for_each_valid_link' +- - 'for_each_vif_active_link' +- - 'for_each_vma' +- - 'for_each_vma_range' +- - 'for_each_vsi' +- - 'for_each_wakeup_source' +- - 'for_each_zone' +- - 'for_each_zone_zonelist' +- - 'for_each_zone_zonelist_nodemask' +- - 'func_for_each_insn' +- - 'fwnode_for_each_available_child_node' +- - 'fwnode_for_each_child_node' +- - 'fwnode_for_each_parent_node' +- - 'fwnode_graph_for_each_endpoint' +- - 'gadget_for_each_ep' +- - 'genradix_for_each' +- - 'genradix_for_each_from' +- - 'genradix_for_each_reverse' +- - 'hash_for_each' +- - 'hash_for_each_possible' +- - 'hash_for_each_possible_rcu' +- - 'hash_for_each_possible_rcu_notrace' +- - 'hash_for_each_possible_safe' +- - 'hash_for_each_rcu' +- - 'hash_for_each_safe' +- - 'hashmap__for_each_entry' +- - 'hashmap__for_each_entry_safe' +- - 'hashmap__for_each_key_entry' +- - 'hashmap__for_each_key_entry_safe' +- - 'hctx_for_each_ctx' +- - 'hists__for_each_format' +- - 'hists__for_each_sort_list' +- - 'hlist_bl_for_each_entry' +- - 'hlist_bl_for_each_entry_rcu' +- - 'hlist_bl_for_each_entry_safe' +- - 'hlist_for_each' +- - 'hlist_for_each_entry' +- - 'hlist_for_each_entry_continue' +- - 'hlist_for_each_entry_continue_rcu' +- - 'hlist_for_each_entry_continue_rcu_bh' +- - 'hlist_for_each_entry_from' +- - 'hlist_for_each_entry_from_rcu' +- - 'hlist_for_each_entry_rcu' +- - 'hlist_for_each_entry_rcu_bh' +- - 'hlist_for_each_entry_rcu_notrace' +- - 'hlist_for_each_entry_safe' +- - 'hlist_for_each_entry_srcu' +- - 'hlist_for_each_safe' +- - 'hlist_nulls_for_each_entry' +- - 'hlist_nulls_for_each_entry_from' +- - 'hlist_nulls_for_each_entry_rcu' +- - 'hlist_nulls_for_each_entry_safe' +- - 'i3c_bus_for_each_i2cdev' +- - 'i3c_bus_for_each_i3cdev' +- - 'idr_for_each_entry' +- - 'idr_for_each_entry_continue' +- - 'idr_for_each_entry_continue_ul' +- - 'idr_for_each_entry_ul' +- - 'in_dev_for_each_ifa_rcu' +- - 'in_dev_for_each_ifa_rtnl' +- - 'inet_bind_bucket_for_each' +- - 'interval_tree_for_each_span' +- - 'intlist__for_each_entry' +- - 'intlist__for_each_entry_safe' +- - 'kcore_copy__for_each_phdr' +- - 'key_for_each' +- - 'key_for_each_safe' +- - 'klp_for_each_func' +- - 'klp_for_each_func_safe' +- - 'klp_for_each_func_static' +- - 'klp_for_each_object' +- - 'klp_for_each_object_safe' +- - 'klp_for_each_object_static' +- - 'kunit_suite_for_each_test_case' +- - 'kvm_for_each_memslot' +- - 'kvm_for_each_memslot_in_gfn_range' +- - 'kvm_for_each_vcpu' +- - 'libbpf_nla_for_each_attr' +- - 'list_for_each' +- - 'list_for_each_codec' +- - 'list_for_each_codec_safe' +- - 'list_for_each_continue' +- - 'list_for_each_entry' +- - 'list_for_each_entry_continue' +- - 'list_for_each_entry_continue_rcu' +- - 'list_for_each_entry_continue_reverse' +- - 'list_for_each_entry_from' +- - 'list_for_each_entry_from_rcu' +- - 'list_for_each_entry_from_reverse' +- - 'list_for_each_entry_lockless' +- - 'list_for_each_entry_rcu' +- - 'list_for_each_entry_reverse' +- - 'list_for_each_entry_safe' +- - 'list_for_each_entry_safe_continue' +- - 'list_for_each_entry_safe_from' +- - 'list_for_each_entry_safe_reverse' +- - 'list_for_each_entry_srcu' +- - 'list_for_each_from' +- - 'list_for_each_prev' +- - 'list_for_each_prev_safe' +- - 'list_for_each_rcu' +- - 'list_for_each_reverse' +- - 'list_for_each_safe' +- - 'llist_for_each' +- - 'llist_for_each_entry' +- - 'llist_for_each_entry_safe' +- - 'llist_for_each_safe' +- - 'lwq_for_each_safe' +- - 'map__for_each_symbol' +- - 'map__for_each_symbol_by_name' +- - 'mas_for_each' +- - 'mci_for_each_dimm' +- - 'media_device_for_each_entity' +- - 'media_device_for_each_intf' +- - 'media_device_for_each_link' +- - 'media_device_for_each_pad' +- - 'media_entity_for_each_pad' +- - 'media_pipeline_for_each_entity' +- - 'media_pipeline_for_each_pad' +- - 'mlx5_lag_for_each_peer_mdev' +- - 'msi_domain_for_each_desc' +- - 'msi_for_each_desc' +- - 'mt_for_each' +- - 'nanddev_io_for_each_page' +- - 'netdev_for_each_lower_dev' +- - 'netdev_for_each_lower_private' +- - 'netdev_for_each_lower_private_rcu' +- - 'netdev_for_each_mc_addr' +- - 'netdev_for_each_synced_mc_addr' +- - 'netdev_for_each_synced_uc_addr' +- - 'netdev_for_each_uc_addr' +- - 'netdev_for_each_upper_dev_rcu' +- - 'netdev_hw_addr_list_for_each' +- - 'nft_rule_for_each_expr' +- - 'nla_for_each_attr' +- - 'nla_for_each_attr_type' +- - 'nla_for_each_nested' +- - 'nla_for_each_nested_type' +- - 'nlmsg_for_each_attr' +- - 'nlmsg_for_each_msg' +- - 'nr_neigh_for_each' +- - 'nr_neigh_for_each_safe' +- - 'nr_node_for_each' +- - 'nr_node_for_each_safe' +- - 'of_for_each_phandle' +- - 'of_property_for_each_string' +- - 'of_property_for_each_u32' +- - 'pci_bus_for_each_resource' +- - 'pci_dev_for_each_resource' +- - 'pcl_for_each_chunk' +- - 'pcl_for_each_segment' +- - 'pcm_for_each_format' +- - 'perf_config_items__for_each_entry' +- - 'perf_config_sections__for_each_entry' +- - 'perf_config_set__for_each_entry' +- - 'perf_cpu_map__for_each_cpu' +- - 'perf_cpu_map__for_each_cpu_skip_any' +- - 'perf_cpu_map__for_each_idx' +- - 'perf_evlist__for_each_entry' +- - 'perf_evlist__for_each_entry_reverse' +- - 'perf_evlist__for_each_entry_safe' +- - 'perf_evlist__for_each_evsel' +- - 'perf_evlist__for_each_mmap' +- - 'perf_hpp_list__for_each_format' +- - 'perf_hpp_list__for_each_format_safe' +- - 'perf_hpp_list__for_each_sort_list' +- - 'perf_hpp_list__for_each_sort_list_safe' +- - 'perf_tool_event__for_each_event' +- - 'plist_for_each' +- - 'plist_for_each_continue' +- - 'plist_for_each_entry' +- - 'plist_for_each_entry_continue' +- - 'plist_for_each_entry_safe' +- - 'plist_for_each_safe' +- - 'pnp_for_each_card' +- - 'pnp_for_each_dev' +- - 'protocol_for_each_card' +- - 'protocol_for_each_dev' +- - 'queue_for_each_hw_ctx' +- - 'radix_tree_for_each_slot' +- - 'radix_tree_for_each_tagged' +- - 'rb_for_each' +- - 'rbtree_postorder_for_each_entry_safe' +- - 'rdma_for_each_block' +- - 'rdma_for_each_port' +- - 'rdma_umem_for_each_dma_block' +- - 'resort_rb__for_each_entry' +- - 'resource_list_for_each_entry' +- - 'resource_list_for_each_entry_safe' +- - 'rhl_for_each_entry_rcu' +- - 'rhl_for_each_rcu' +- - 'rht_for_each' +- - 'rht_for_each_entry' +- - 'rht_for_each_entry_from' +- - 'rht_for_each_entry_rcu' +- - 'rht_for_each_entry_rcu_from' +- - 'rht_for_each_entry_safe' +- - 'rht_for_each_from' +- - 'rht_for_each_rcu' +- - 'rht_for_each_rcu_from' +- - 'rq_for_each_bvec' +- - 'rq_for_each_segment' +- - 'rq_list_for_each' +- - 'rq_list_for_each_safe' +- - 'sample_read_group__for_each' +- - 'scsi_for_each_prot_sg' +- - 'scsi_for_each_sg' +- - 'sctp_for_each_hentry' +- - 'sctp_skb_for_each' +- - 'sec_for_each_insn' +- - 'sec_for_each_insn_continue' +- - 'sec_for_each_insn_from' +- - 'sec_for_each_sym' +- - 'shdma_for_each_chan' +- - 'shost_for_each_device' +- - 'sk_for_each' +- - 'sk_for_each_bound' +- - 'sk_for_each_entry_offset_rcu' +- - 'sk_for_each_from' +- - 'sk_for_each_rcu' +- - 'sk_for_each_safe' +- - 'sk_nulls_for_each' +- - 'sk_nulls_for_each_from' +- - 'sk_nulls_for_each_rcu' +- - 'snd_array_for_each' +- - 'snd_pcm_group_for_each_entry' +- - 'snd_soc_dapm_widget_for_each_path' +- - 'snd_soc_dapm_widget_for_each_path_safe' +- - 'snd_soc_dapm_widget_for_each_sink_path' +- - 'snd_soc_dapm_widget_for_each_source_path' +- - 'sparsebit_for_each_set_range' +- - 'strlist__for_each_entry' +- - 'strlist__for_each_entry_safe' +- - 'sym_for_each_insn' +- - 'sym_for_each_insn_continue_reverse' +- - 'symbols__for_each_entry' +- - 'tb_property_for_each' +- - 'tcf_act_for_each_action' +- - 'tcf_exts_for_each_action' +- - 'ttm_resource_manager_for_each_res' +- - 'udp_portaddr_for_each_entry' +- - 'udp_portaddr_for_each_entry_rcu' +- - 'usb_hub_for_each_child' +- - 'v4l2_device_for_each_subdev' +- - 'v4l2_m2m_for_each_dst_buf' +- - 'v4l2_m2m_for_each_dst_buf_safe' +- - 'v4l2_m2m_for_each_src_buf' +- - 'v4l2_m2m_for_each_src_buf_safe' +- - 'virtio_device_for_each_vq' +- - 'while_for_each_ftrace_op' +- - 'xa_for_each' +- - 'xa_for_each_marked' +- - 'xa_for_each_range' +- - 'xa_for_each_start' +- - 'xas_for_each' +- - 'xas_for_each_conflict' +- - 'xas_for_each_marked' +- - 'xbc_array_for_each_value' +- - 'xbc_for_each_key_value' +- - 'xbc_node_for_each_array_value' +- - 'xbc_node_for_each_child' +- - 'xbc_node_for_each_key_value' +- - 'xbc_node_for_each_subkey' +- - 'ynl_attr_for_each' +- - 'ynl_attr_for_each_nested' +- - 'ynl_attr_for_each_payload' +- - 'zorro_for_each_dev' +- +-IncludeBlocks: Preserve +-IncludeCategories: +- - Regex: '.*' +- Priority: 1 +-IncludeIsMainRegex: '(Test)?$' +-IndentCaseLabels: false +-IndentGotoLabels: false +-IndentPPDirectives: None +-IndentWidth: 8 +-IndentWrappedFunctionNames: false +-JavaScriptQuotes: Leave +-JavaScriptWrapImports: true +-KeepEmptyLinesAtTheStartOfBlocks: false +-MacroBlockBegin: '' +-MacroBlockEnd: '' +-MaxEmptyLinesToKeep: 1 +-NamespaceIndentation: None +-ObjCBinPackProtocolList: Auto +-ObjCBlockIndentWidth: 8 +-ObjCSpaceAfterProperty: true +-ObjCSpaceBeforeProtocolList: true +- +-# Taken from git's rules +-PenaltyBreakAssignment: 10 +-PenaltyBreakBeforeFirstCallParameter: 30 +-PenaltyBreakComment: 10 +-PenaltyBreakFirstLessLess: 0 +-PenaltyBreakString: 10 +-PenaltyExcessCharacter: 100 +-PenaltyReturnTypeOnItsOwnLine: 60 +- +-PointerAlignment: Right +-ReflowComments: false +-SortIncludes: false +-SortUsingDeclarations: false +-SpaceAfterCStyleCast: false +-SpaceAfterTemplateKeyword: true +-SpaceBeforeAssignmentOperators: true +-SpaceBeforeCtorInitializerColon: true +-SpaceBeforeInheritanceColon: true +-SpaceBeforeParens: ControlStatementsExceptForEachMacros +-SpaceBeforeRangeBasedForLoopColon: true +-SpaceInEmptyParentheses: false +-SpacesBeforeTrailingComments: 1 +-SpacesInAngles: false +-SpacesInContainerLiterals: false +-SpacesInCStyleCastParentheses: false +-SpacesInParentheses: false +-SpacesInSquareBrackets: false +-Standard: Cpp03 +-TabWidth: 8 +-UseTab: Always +-... diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0008-Kconfig.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0008-Kconfig.patch deleted file mode 100644 index 0846697..0000000 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0008-Kconfig.patch +++ /dev/null @@ -1,9 +0,0 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/Kconfig 2026-03-23 18:27:14.360239460 +0100 -+++ ./Kconfig 2026-03-23 18:28:30.829938837 +0100 -@@ -30,3 +30,6 @@ - source "lib/Kconfig.debug" - - source "Documentation/Kconfig" -+ -+# SOO subsystems and drivers -+source "soo/Kconfig" diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0010-.gitattributes.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0010-.gitattributes.patch new file mode 100644 index 0000000..8c27b1a --- /dev/null +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0010-.gitattributes.patch @@ -0,0 +1,8 @@ +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/.gitattributes 2024-11-17 23:15:08.000000000 +0100 ++++ ./.gitattributes 1970-01-01 01:00:00.000000000 +0100 +@@ -1,5 +0,0 @@ +-# SPDX-License-Identifier: GPL-2.0-only +-*.[ch] diff=cpp +-*.dts diff=dts +-*.dts[io] diff=dts +-*.rs diff=rust diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0010-fixdep.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0010-fixdep.patch deleted file mode 100644 index 8a876a4702aab9ab92841a04413abe33fb0f8c3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17268 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 OCiX^}yfpJZ`TqbwhBM3n diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0012-lexer.lex.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0012-lexer.lex.c.patch deleted file mode 100644 index 3e40e04..0000000 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0012-lexer.lex.c.patch +++ /dev/null @@ -1,4043 +0,0 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/scripts/kconfig/lexer.lex.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./scripts/kconfig/lexer.lex.c 2026-03-23 18:27:35.901813722 +0100 -@@ -0,0 +1,4040 @@ -+ -+#define YY_INT_ALIGNED short int -+ -+/* A lexical scanner generated by flex */ -+ -+#define FLEX_SCANNER -+#define YY_FLEX_MAJOR_VERSION 2 -+#define YY_FLEX_MINOR_VERSION 6 -+#define YY_FLEX_SUBMINOR_VERSION 4 -+#if YY_FLEX_SUBMINOR_VERSION > 0 -+#define FLEX_BETA -+#endif -+ -+/* First, we deal with platform-specific or compiler-specific issues. */ -+ -+/* begin standard C headers. */ -+#include -+#include -+#include -+#include -+ -+/* end standard C headers. */ -+ -+/* flex integer type definitions */ -+ -+#ifndef FLEXINT_H -+#define FLEXINT_H -+ -+/* C99 systems have . Non-C99 systems may or may not. */ -+ -+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L -+ -+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, -+ * if you want the limit (max/min) macros for int types. -+ */ -+#ifndef __STDC_LIMIT_MACROS -+#define __STDC_LIMIT_MACROS 1 -+#endif -+ -+#include -+typedef int8_t flex_int8_t; -+typedef uint8_t flex_uint8_t; -+typedef int16_t flex_int16_t; -+typedef uint16_t flex_uint16_t; -+typedef int32_t flex_int32_t; -+typedef uint32_t flex_uint32_t; -+#else -+typedef signed char flex_int8_t; -+typedef short int flex_int16_t; -+typedef int flex_int32_t; -+typedef unsigned char flex_uint8_t; -+typedef unsigned short int flex_uint16_t; -+typedef unsigned int flex_uint32_t; -+ -+/* Limits of integral types. */ -+#ifndef INT8_MIN -+#define INT8_MIN (-128) -+#endif -+#ifndef INT16_MIN -+#define INT16_MIN (-32767-1) -+#endif -+#ifndef INT32_MIN -+#define INT32_MIN (-2147483647-1) -+#endif -+#ifndef INT8_MAX -+#define INT8_MAX (127) -+#endif -+#ifndef INT16_MAX -+#define INT16_MAX (32767) -+#endif -+#ifndef INT32_MAX -+#define INT32_MAX (2147483647) -+#endif -+#ifndef UINT8_MAX -+#define UINT8_MAX (255U) -+#endif -+#ifndef UINT16_MAX -+#define UINT16_MAX (65535U) -+#endif -+#ifndef UINT32_MAX -+#define UINT32_MAX (4294967295U) -+#endif -+ -+#ifndef SIZE_MAX -+#define SIZE_MAX (~(size_t)0) -+#endif -+ -+#endif /* ! C99 */ -+ -+#endif /* ! FLEXINT_H */ -+ -+/* begin standard C++ headers. */ -+ -+/* TODO: this is always defined, so inline it */ -+#define yyconst const -+ -+#if defined(__GNUC__) && __GNUC__ >= 3 -+#define yynoreturn __attribute__((__noreturn__)) -+#else -+#define yynoreturn -+#endif -+ -+/* Returned upon end-of-file. */ -+#define YY_NULL 0 -+ -+/* Promotes a possibly negative, possibly signed char to an -+ * integer in range [0..255] for use as an array index. -+ */ -+#define YY_SC_TO_UI(c) ((YY_CHAR) (c)) -+ -+/* Enter a start condition. This macro really ought to take a parameter, -+ * but we do it the disgusting crufty way forced on us by the ()-less -+ * definition of BEGIN. -+ */ -+#define BEGIN (yy_start) = 1 + 2 * -+/* Translate the current start state into a value that can be later handed -+ * to BEGIN to return to the state. The YYSTATE alias is for lex -+ * compatibility. -+ */ -+#define YY_START (((yy_start) - 1) / 2) -+#define YYSTATE YY_START -+/* Action number for EOF rule of a given start state. */ -+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) -+/* Special action meaning "start processing a new file". */ -+#define YY_NEW_FILE yyrestart( yyin ) -+#define YY_END_OF_BUFFER_CHAR 0 -+ -+/* Size of default input buffer. */ -+#ifndef YY_BUF_SIZE -+#ifdef __ia64__ -+/* On IA-64, the buffer size is 16k, not 8k. -+ * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. -+ * Ditto for the __ia64__ case accordingly. -+ */ -+#define YY_BUF_SIZE 32768 -+#else -+#define YY_BUF_SIZE 16384 -+#endif /* __ia64__ */ -+#endif -+ -+/* The state buf must be large enough to hold one state per character in the main buffer. -+ */ -+#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) -+ -+#ifndef YY_TYPEDEF_YY_BUFFER_STATE -+#define YY_TYPEDEF_YY_BUFFER_STATE -+typedef struct yy_buffer_state *YY_BUFFER_STATE; -+#endif -+ -+#ifndef YY_TYPEDEF_YY_SIZE_T -+#define YY_TYPEDEF_YY_SIZE_T -+typedef size_t yy_size_t; -+#endif -+ -+extern int yyleng; -+ -+extern FILE *yyin, *yyout; -+ -+#define EOB_ACT_CONTINUE_SCAN 0 -+#define EOB_ACT_END_OF_FILE 1 -+#define EOB_ACT_LAST_MATCH 2 -+ -+ /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires -+ * access to the local variable yy_act. Since yyless() is a macro, it would break -+ * existing scanners that call yyless() from OUTSIDE yylex. -+ * One obvious solution it to make yy_act a global. I tried that, and saw -+ * a 5% performance hit in a non-yylineno scanner, because yy_act is -+ * normally declared as a register variable-- so it is not worth it. -+ */ -+ #define YY_LESS_LINENO(n) \ -+ do { \ -+ int yyl;\ -+ for ( yyl = n; yyl < yyleng; ++yyl )\ -+ if ( yytext[yyl] == '\n' )\ -+ --yylineno;\ -+ }while(0) -+ #define YY_LINENO_REWIND_TO(dst) \ -+ do {\ -+ const char *p;\ -+ for ( p = yy_cp-1; p >= (dst); --p)\ -+ if ( *p == '\n' )\ -+ --yylineno;\ -+ }while(0) -+ -+/* Return all but the first "n" matched characters back to the input stream. */ -+#define yyless(n) \ -+ do \ -+ { \ -+ /* Undo effects of setting up yytext. */ \ -+ int yyless_macro_arg = (n); \ -+ YY_LESS_LINENO(yyless_macro_arg);\ -+ *yy_cp = (yy_hold_char); \ -+ YY_RESTORE_YY_MORE_OFFSET \ -+ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ -+ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ -+ } \ -+ while ( 0 ) -+#define unput(c) yyunput( c, (yytext_ptr) ) -+ -+#ifndef YY_STRUCT_YY_BUFFER_STATE -+#define YY_STRUCT_YY_BUFFER_STATE -+struct yy_buffer_state -+ { -+ FILE *yy_input_file; -+ -+ char *yy_ch_buf; /* input buffer */ -+ char *yy_buf_pos; /* current position in input buffer */ -+ -+ /* Size of input buffer in bytes, not including room for EOB -+ * characters. -+ */ -+ int yy_buf_size; -+ -+ /* Number of characters read into yy_ch_buf, not including EOB -+ * characters. -+ */ -+ int yy_n_chars; -+ -+ /* Whether we "own" the buffer - i.e., we know we created it, -+ * and can realloc() it to grow it, and should free() it to -+ * delete it. -+ */ -+ int yy_is_our_buffer; -+ -+ /* Whether this is an "interactive" input source; if so, and -+ * if we're using stdio for input, then we want to use getc() -+ * instead of fread(), to make sure we stop fetching input after -+ * each newline. -+ */ -+ int yy_is_interactive; -+ -+ /* Whether we're considered to be at the beginning of a line. -+ * If so, '^' rules will be active on the next match, otherwise -+ * not. -+ */ -+ int yy_at_bol; -+ -+ int yy_bs_lineno; /**< The line count. */ -+ int yy_bs_column; /**< The column count. */ -+ -+ /* Whether to try to fill the input buffer when we reach the -+ * end of it. -+ */ -+ int yy_fill_buffer; -+ -+ int yy_buffer_status; -+ -+#define YY_BUFFER_NEW 0 -+#define YY_BUFFER_NORMAL 1 -+ /* When an EOF's been seen but there's still some text to process -+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we -+ * shouldn't try reading from the input source any more. We might -+ * still have a bunch of tokens to match, though, because of -+ * possible backing-up. -+ * -+ * When we actually see the EOF, we change the status to "new" -+ * (via yyrestart()), so that the user can continue scanning by -+ * just pointing yyin at a new input file. -+ */ -+#define YY_BUFFER_EOF_PENDING 2 -+ -+ }; -+#endif /* !YY_STRUCT_YY_BUFFER_STATE */ -+ -+/* Stack of input buffers. */ -+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ -+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ -+static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */ -+ -+/* We provide macros for accessing buffer states in case in the -+ * future we want to put the buffer states in a more general -+ * "scanner state". -+ * -+ * Returns the top of the stack, or NULL. -+ */ -+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ -+ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ -+ : NULL) -+/* Same as previous macro, but useful when we know that the buffer stack is not -+ * NULL or when we need an lvalue. For internal use only. -+ */ -+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] -+ -+/* yy_hold_char holds the character lost when yytext is formed. */ -+static char yy_hold_char; -+static int yy_n_chars; /* number of characters read into yy_ch_buf */ -+int yyleng; -+ -+/* Points to current character in buffer. */ -+static char *yy_c_buf_p = NULL; -+static int yy_init = 0; /* whether we need to initialize */ -+static int yy_start = 0; /* start state number */ -+ -+/* Flag which is used to allow yywrap()'s to do buffer switches -+ * instead of setting up a fresh yyin. A bit of a hack ... -+ */ -+static int yy_did_buffer_switch_on_eof; -+ -+void yyrestart ( FILE *input_file ); -+void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer ); -+YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size ); -+void yy_delete_buffer ( YY_BUFFER_STATE b ); -+void yy_flush_buffer ( YY_BUFFER_STATE b ); -+void yypush_buffer_state ( YY_BUFFER_STATE new_buffer ); -+void yypop_buffer_state ( void ); -+ -+static void yyensure_buffer_stack ( void ); -+static void yy_load_buffer_state ( void ); -+static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file ); -+#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER ) -+ -+YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size ); -+YY_BUFFER_STATE yy_scan_string ( const char *yy_str ); -+YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len ); -+ -+void *yyalloc ( yy_size_t ); -+void *yyrealloc ( void *, yy_size_t ); -+void yyfree ( void * ); -+ -+#define yy_new_buffer yy_create_buffer -+#define yy_set_interactive(is_interactive) \ -+ { \ -+ if ( ! YY_CURRENT_BUFFER ){ \ -+ yyensure_buffer_stack (); \ -+ YY_CURRENT_BUFFER_LVALUE = \ -+ yy_create_buffer( yyin, YY_BUF_SIZE ); \ -+ } \ -+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ -+ } -+#define yy_set_bol(at_bol) \ -+ { \ -+ if ( ! YY_CURRENT_BUFFER ){\ -+ yyensure_buffer_stack (); \ -+ YY_CURRENT_BUFFER_LVALUE = \ -+ yy_create_buffer( yyin, YY_BUF_SIZE ); \ -+ } \ -+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ -+ } -+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) -+ -+/* Begin user sect3 */ -+ -+#define yywrap() (/*CONSTCOND*/1) -+#define YY_SKIP_YYWRAP -+typedef flex_uint8_t YY_CHAR; -+ -+FILE *yyin = NULL, *yyout = NULL; -+ -+typedef int yy_state_type; -+ -+extern int yylineno; -+int yylineno = 1; -+ -+extern char *yytext; -+#ifdef yytext_ptr -+#undef yytext_ptr -+#endif -+#define yytext_ptr yytext -+ -+static const flex_int16_t yy_nxt[][42] = -+ { -+ { -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -+ 0, 0 -+ }, -+ -+ { -+ 9, 10, 11, 12, 13, 14, 15, 16, 17, 14, -+ 18, 19, 20, 21, 22, 23, 24, 25, 26, 21, -+ 21, 27, 28, 29, 30, 21, 21, 31, 32, 21, -+ 33, 21, 34, 35, 36, 37, 38, 21, 39, 21, -+ 21, 40 -+ -+ }, -+ -+ { -+ 9, 10, 11, 12, 13, 14, 15, 16, 17, 14, -+ 18, 19, 20, 21, 22, 23, 24, 25, 26, 21, -+ 21, 27, 28, 29, 30, 21, 21, 31, 32, 21, -+ 33, 21, 34, 35, 36, 37, 38, 21, 39, 21, -+ 21, 40 -+ }, -+ -+ { -+ 9, 41, 42, 43, 41, 41, 41, 41, 41, 41, -+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -+ 41, 41 -+ -+ }, -+ -+ { -+ 9, 41, 42, 43, 41, 41, 41, 41, 41, 41, -+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, -+ 41, 41 -+ }, -+ -+ { -+ 9, 44, 45, 46, 44, 44, 44, 44, 44, 44, -+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, -+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, -+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, -+ 44, 44 -+ -+ }, -+ -+ { -+ 9, 44, 45, 46, 44, 44, 44, 44, 44, 44, -+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, -+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, -+ 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, -+ 44, 44 -+ }, -+ -+ { -+ 9, 47, 47, 48, 47, 49, 47, 50, 47, 49, -+ 47, 47, 47, 47, 47, 47, 47, 47, 51, 47, -+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -+ 47, 47 -+ -+ }, -+ -+ { -+ 9, 47, 47, 48, 47, 49, 47, 50, 47, 49, -+ 47, 47, 47, 47, 47, 47, 47, 47, 51, 47, -+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -+ 47, 47 -+ }, -+ -+ { -+ -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -+ -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -+ -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -+ -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -+ -9, -9 -+ -+ }, -+ -+ { -+ 9, -10, -10, -10, -10, -10, -10, -10, -10, -10, -+ -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -+ -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -+ -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -+ -10, -10 -+ }, -+ -+ { -+ 9, -11, 52, -11, -11, -11, -11, -11, -11, -11, -+ -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -+ -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -+ -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -+ -11, -11 -+ -+ }, -+ -+ { -+ 9, -12, -12, -12, -12, -12, -12, -12, -12, -12, -+ -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -+ -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -+ -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, -+ -12, -12 -+ }, -+ -+ { -+ 9, -13, -13, -13, -13, -13, -13, -13, -13, -13, -+ -13, -13, -13, -13, -13, -13, 53, -13, -13, -13, -+ -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -+ -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, -+ -13, -13 -+ -+ }, -+ -+ { -+ 9, -14, -14, -14, -14, -14, -14, -14, -14, -14, -+ -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -+ -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -+ -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, -+ -14, -14 -+ }, -+ -+ { -+ 9, 54, 54, -15, 54, 54, 54, 54, 54, 54, -+ 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, -+ 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, -+ 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, -+ 54, 54 -+ -+ }, -+ -+ { -+ 9, -16, -16, -16, -16, -16, -16, 55, -16, -16, -+ -16, -16, -16, 55, -16, -16, -16, -16, -16, 55, -+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, -+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, -+ 55, -16 -+ }, -+ -+ { -+ 9, -17, -17, -17, -17, -17, -17, -17, 56, -17, -+ -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, -+ -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, -+ -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, -+ -17, -17 -+ -+ }, -+ -+ { -+ 9, -18, -18, -18, -18, -18, -18, -18, -18, -18, -+ -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -+ -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -+ -18, -18, -18, -18, -18, -18, -18, -18, -18, -18, -+ -18, -18 -+ }, -+ -+ { -+ 9, -19, -19, -19, -19, -19, -19, -19, -19, -19, -+ -19, -19, -19, -19, -19, -19, -19, -19, -19, -19, -+ -19, -19, -19, -19, -19, -19, -19, -19, -19, -19, -+ -19, -19, -19, -19, -19, -19, -19, -19, -19, -19, -+ -19, -19 -+ -+ }, -+ -+ { -+ 9, -20, -20, -20, -20, -20, -20, -20, -20, -20, -+ -20, -20, -20, -20, -20, -20, 57, -20, -20, -20, -+ -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, -+ -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, -+ -20, -20 -+ }, -+ -+ { -+ 9, -21, -21, -21, -21, -21, -21, 55, -21, -21, -+ -21, -21, -21, 58, -21, -21, -21, -21, -21, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -21 -+ -+ }, -+ -+ { -+ 9, -22, -22, -22, -22, -22, -22, -22, -22, -22, -+ -22, -22, -22, -22, -22, -22, 59, -22, -22, -22, -+ -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -+ -22, -22, -22, -22, -22, -22, -22, -22, -22, -22, -+ -22, -22 -+ }, -+ -+ { -+ 9, -23, -23, -23, -23, -23, -23, -23, -23, -23, -+ -23, -23, -23, -23, -23, -23, 60, -23, -23, -23, -+ -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -+ -23, -23, -23, -23, -23, -23, -23, -23, -23, -23, -+ -23, -23 -+ -+ }, -+ -+ { -+ 9, -24, -24, -24, -24, -24, -24, -24, -24, -24, -+ -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -+ -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -+ -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -+ -24, -24 -+ }, -+ -+ { -+ 9, -25, -25, -25, -25, -25, -25, -25, -25, -25, -+ -25, -25, -25, -25, -25, -25, 61, -25, -25, -25, -+ -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -+ -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -+ -25, -25 -+ -+ }, -+ -+ { -+ 9, -26, -26, 62, -26, -26, -26, -26, -26, -26, -+ -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -+ -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -+ -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, -+ -26, -26 -+ }, -+ -+ { -+ 9, -27, -27, -27, -27, -27, -27, 55, -27, -27, -+ -27, -27, -27, 58, -27, -27, -27, -27, -27, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 63, 58, 58, 58, 58, 58, 58, 58, -+ 58, -27 -+ -+ }, -+ -+ { -+ 9, -28, -28, -28, -28, -28, -28, 55, -28, -28, -+ -28, -28, -28, 58, -28, -28, -28, -28, -28, 58, -+ 58, 58, 58, 58, 58, 58, 58, 64, 58, 58, -+ 58, 58, 65, 58, 58, 58, 58, 58, 58, 58, -+ 58, -28 -+ }, -+ -+ { -+ 9, -29, -29, -29, -29, -29, -29, 55, -29, -29, -+ -29, -29, -29, 58, -29, -29, -29, -29, -29, 58, -+ 58, 58, 58, 58, 66, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -29 -+ -+ }, -+ -+ { -+ 9, -30, -30, -30, -30, -30, -30, 55, -30, -30, -+ -30, -30, -30, 58, -30, -30, -30, -30, -30, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 67, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -30 -+ }, -+ -+ { -+ 9, -31, -31, -31, -31, -31, -31, 55, -31, -31, -+ -31, -31, -31, 58, -31, -31, -31, -31, -31, 58, -+ 58, 58, 58, 58, 68, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -31 -+ -+ }, -+ -+ { -+ 9, -32, -32, -32, -32, -32, -32, 55, -32, -32, -+ -32, -32, -32, 58, -32, -32, -32, -32, -32, 58, -+ 58, 58, 58, 58, 58, 69, 58, 58, 58, 58, -+ 70, 71, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -32 -+ }, -+ -+ { -+ 9, -33, -33, -33, -33, -33, -33, 55, -33, -33, -+ -33, -33, -33, 58, -33, -33, -33, -33, -33, 58, -+ 72, 58, 58, 58, 73, 58, 58, 58, 58, 58, -+ 58, 58, 74, 58, 58, 58, 58, 58, 58, 58, -+ 58, -33 -+ -+ }, -+ -+ { -+ 9, -34, -34, -34, -34, -34, -34, 55, -34, -34, -+ -34, -34, -34, 58, -34, -34, -34, -34, -34, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 75, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -34 -+ }, -+ -+ { -+ 9, -35, -35, -35, -35, -35, -35, 55, -35, -35, -+ -35, -35, -35, 58, -35, -35, -35, -35, -35, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 76, 58, 58, 58, 58, 58, -+ 58, -35 -+ -+ }, -+ -+ { -+ 9, -36, -36, -36, -36, -36, -36, 55, -36, -36, -+ -36, -36, -36, 58, -36, -36, -36, -36, -36, 58, -+ 77, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -36 -+ }, -+ -+ { -+ 9, -37, -37, -37, -37, -37, -37, 55, -37, -37, -+ -37, -37, -37, 58, -37, -37, -37, -37, -37, 58, -+ 58, 58, 58, 58, 78, 58, 58, 58, 58, 58, -+ 58, 58, 79, 58, 58, 58, 80, 58, 58, 58, -+ 58, -37 -+ -+ }, -+ -+ { -+ 9, -38, -38, -38, -38, -38, -38, 55, -38, -38, -+ -38, -38, -38, 58, -38, -38, -38, -38, -38, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 81, 58, 58, 58, 58, 58, -+ 58, -38 -+ }, -+ -+ { -+ 9, -39, -39, -39, -39, -39, -39, 55, -39, -39, -+ -39, -39, -39, 58, -39, -39, -39, -39, -39, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 82, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -39 -+ -+ }, -+ -+ { -+ 9, -40, -40, -40, -40, -40, -40, -40, -40, -40, -+ -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -+ -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -+ -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, -+ -40, 83 -+ }, -+ -+ { -+ 9, 84, 85, -41, 84, 84, 84, 84, 84, 84, -+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, -+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, -+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, -+ 84, 84 -+ -+ }, -+ -+ { -+ 9, -42, -42, -42, -42, -42, -42, -42, -42, -42, -+ -42, -42, -42, -42, -42, -42, -42, -42, -42, -42, -+ -42, -42, -42, -42, -42, -42, -42, -42, -42, -42, -+ -42, -42, -42, -42, -42, -42, -42, -42, -42, -42, -+ -42, -42 -+ }, -+ -+ { -+ 9, -43, -43, -43, -43, -43, -43, -43, -43, -43, -+ -43, -43, -43, -43, -43, -43, -43, -43, -43, -43, -+ -43, -43, -43, -43, -43, -43, -43, -43, -43, -43, -+ -43, -43, -43, -43, -43, -43, -43, -43, -43, -43, -+ -43, -43 -+ -+ }, -+ -+ { -+ 9, 86, 86, -44, 86, 86, 86, 86, 86, 86, -+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, -+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, -+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, -+ 86, 86 -+ }, -+ -+ { -+ 9, -45, 87, 88, -45, -45, -45, -45, -45, -45, -+ -45, -45, -45, -45, -45, -45, -45, -45, -45, -45, -+ -45, -45, -45, -45, -45, -45, -45, -45, -45, -45, -+ -45, -45, -45, -45, -45, -45, -45, -45, -45, -45, -+ -45, -45 -+ -+ }, -+ -+ { -+ 9, 89, -46, -46, 89, 89, 89, 89, 89, 89, -+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, -+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, -+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, -+ 89, 89 -+ }, -+ -+ { -+ 9, 90, 90, -47, 90, -47, 90, -47, 90, -47, -+ 90, 90, 90, 90, 90, 90, 90, 90, -47, 90, -+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, -+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, -+ 90, 90 -+ -+ }, -+ -+ { -+ 9, -48, -48, -48, -48, -48, -48, -48, -48, -48, -+ -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -+ -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -+ -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -+ -48, -48 -+ }, -+ -+ { -+ 9, -49, -49, -49, -49, -49, -49, -49, -49, -49, -+ -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, -+ -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, -+ -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, -+ -49, -49 -+ -+ }, -+ -+ { -+ 9, 91, 91, -50, 91, 91, 91, 91, 91, 91, -+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, -+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, -+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, -+ 91, 91 -+ }, -+ -+ { -+ 9, 92, 92, -51, 92, 92, 92, 92, 92, 92, -+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, -+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, -+ 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, -+ 92, 92 -+ -+ }, -+ -+ { -+ 9, -52, 52, -52, -52, -52, -52, -52, -52, -52, -+ -52, -52, -52, -52, -52, -52, -52, -52, -52, -52, -+ -52, -52, -52, -52, -52, -52, -52, -52, -52, -52, -+ -52, -52, -52, -52, -52, -52, -52, -52, -52, -52, -+ -52, -52 -+ }, -+ -+ { -+ 9, -53, -53, -53, -53, -53, -53, -53, -53, -53, -+ -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, -+ -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, -+ -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, -+ -53, -53 -+ -+ }, -+ -+ { -+ 9, 54, 54, -54, 54, 54, 54, 54, 54, 54, -+ 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, -+ 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, -+ 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, -+ 54, 54 -+ }, -+ -+ { -+ 9, -55, -55, -55, -55, -55, -55, 55, -55, -55, -+ -55, -55, -55, 55, -55, -55, -55, -55, -55, 55, -+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, -+ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, -+ 55, -55 -+ -+ }, -+ -+ { -+ 9, -56, -56, -56, -56, -56, -56, -56, -56, -56, -+ -56, -56, -56, -56, -56, -56, -56, -56, -56, -56, -+ -56, -56, -56, -56, -56, -56, -56, -56, -56, -56, -+ -56, -56, -56, -56, -56, -56, -56, -56, -56, -56, -+ -56, -56 -+ }, -+ -+ { -+ 9, -57, -57, -57, -57, -57, -57, -57, -57, -57, -+ -57, -57, -57, -57, -57, -57, -57, -57, -57, -57, -+ -57, -57, -57, -57, -57, -57, -57, -57, -57, -57, -+ -57, -57, -57, -57, -57, -57, -57, -57, -57, -57, -+ -57, -57 -+ -+ }, -+ -+ { -+ 9, -58, -58, -58, -58, -58, -58, 55, -58, -58, -+ -58, -58, -58, 58, -58, -58, -58, -58, -58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -58 -+ }, -+ -+ { -+ 9, -59, -59, -59, -59, -59, -59, -59, -59, -59, -+ -59, -59, -59, -59, -59, -59, -59, -59, -59, -59, -+ -59, -59, -59, -59, -59, -59, -59, -59, -59, -59, -+ -59, -59, -59, -59, -59, -59, -59, -59, -59, -59, -+ -59, -59 -+ -+ }, -+ -+ { -+ 9, -60, -60, -60, -60, -60, -60, -60, -60, -60, -+ -60, -60, -60, -60, -60, -60, -60, -60, -60, -60, -+ -60, -60, -60, -60, -60, -60, -60, -60, -60, -60, -+ -60, -60, -60, -60, -60, -60, -60, -60, -60, -60, -+ -60, -60 -+ }, -+ -+ { -+ 9, -61, -61, -61, -61, -61, -61, -61, -61, -61, -+ -61, -61, -61, -61, -61, -61, -61, -61, -61, -61, -+ -61, -61, -61, -61, -61, -61, -61, -61, -61, -61, -+ -61, -61, -61, -61, -61, -61, -61, -61, -61, -61, -+ -61, -61 -+ -+ }, -+ -+ { -+ 9, -62, -62, -62, -62, -62, -62, -62, -62, -62, -+ -62, -62, -62, -62, -62, -62, -62, -62, -62, -62, -+ -62, -62, -62, -62, -62, -62, -62, -62, -62, -62, -+ -62, -62, -62, -62, -62, -62, -62, -62, -62, -62, -+ -62, -62 -+ }, -+ -+ { -+ 9, -63, -63, -63, -63, -63, -63, 55, -63, -63, -+ -63, -63, -63, 58, -63, -63, -63, -63, -63, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 93, 58, 58, 58, 58, 58, 58, 58, -+ 58, -63 -+ -+ }, -+ -+ { -+ 9, -64, -64, -64, -64, -64, -64, 55, -64, -64, -+ -64, -64, -64, 58, -64, -64, -64, -64, -64, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 94, 58, 58, 58, 58, 58, 58, 58, -+ 58, -64 -+ }, -+ -+ { -+ 9, -65, -65, -65, -65, -65, -65, 55, -65, -65, -+ -65, -65, -65, 58, -65, -65, -65, -65, -65, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 95, 96, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -65 -+ -+ }, -+ -+ { -+ 9, -66, -66, -66, -66, -66, -66, 55, -66, -66, -+ -66, -66, -66, 58, -66, -66, -66, -66, -66, 58, -+ 58, 58, 58, 58, 58, 97, 58, 58, 58, 58, -+ 58, 58, 58, 98, 58, 58, 58, 58, 58, 58, -+ 58, -66 -+ }, -+ -+ { -+ 9, -67, -67, -67, -67, -67, -67, 55, -67, -67, -+ -67, -67, -67, 58, -67, -67, -67, -67, -67, 58, -+ 58, 58, 58, 99, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -67 -+ -+ }, -+ -+ { -+ 9, -68, -68, -68, -68, -68, -68, 55, -68, -68, -+ -68, -68, -68, 58, -68, -68, -68, -68, -68, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 100, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 101, -+ 58, -68 -+ }, -+ -+ { -+ 9, -69, -69, -69, -69, -69, -69, 55, -69, -69, -+ -69, -69, -69, 58, -69, -69, -69, -69, -69, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -69 -+ -+ }, -+ -+ { -+ 9, -70, -70, -70, -70, -70, -70, 55, -70, -70, -+ -70, -70, -70, 58, -70, -70, -70, -70, -70, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 102, 58, 58, 58, 58, 58, 58, -+ 58, -70 -+ }, -+ -+ { -+ 9, -71, -71, -71, -71, -71, -71, 55, -71, -71, -+ -71, -71, -71, 58, -71, -71, -71, -71, -71, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 103, 58, 58, 58, -+ 58, -71 -+ -+ }, -+ -+ { -+ 9, -72, -72, -72, -72, -72, -72, 55, -72, -72, -+ -72, -72, -72, 58, -72, -72, -72, -72, -72, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 104, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -72 -+ }, -+ -+ { -+ 9, -73, -73, -73, -73, -73, -73, 55, -73, -73, -+ -73, -73, -73, 58, -73, -73, -73, -73, -73, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 105, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -73 -+ -+ }, -+ -+ { -+ 9, -74, -74, -74, -74, -74, -74, 55, -74, -74, -+ -74, -74, -74, 58, -74, -74, -74, -74, -74, 58, -+ 58, 58, 58, 106, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -74 -+ }, -+ -+ { -+ 9, -75, -75, -75, -75, -75, -75, 55, -75, -75, -+ -75, -75, -75, 58, -75, -75, -75, -75, -75, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -75 -+ -+ }, -+ -+ { -+ 9, -76, -76, -76, -76, -76, -76, 55, -76, -76, -+ -76, -76, -76, 58, -76, -76, -76, -76, -76, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 107, 58, 58, 58, 58, 58, 58, 58, -+ 58, -76 -+ }, -+ -+ { -+ 9, -77, -77, -77, -77, -77, -77, 55, -77, -77, -+ -77, -77, -77, 58, -77, -77, -77, -77, -77, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 108, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -77 -+ -+ }, -+ -+ { -+ 9, -78, -78, -78, -78, -78, -78, 55, -78, -78, -+ -78, -78, -78, 58, -78, -78, -78, -78, -78, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 109, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -78 -+ }, -+ -+ { -+ 9, -79, -79, -79, -79, -79, -79, 55, -79, -79, -+ -79, -79, -79, 58, -79, -79, -79, -79, -79, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 110, 58, 58, -+ 58, -79 -+ -+ }, -+ -+ { -+ 9, -80, -80, -80, -80, -80, -80, 55, -80, -80, -+ -80, -80, -80, 58, -80, -80, -80, -80, -80, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 111, 58, 58, 58, 58, 58, -+ 58, -80 -+ }, -+ -+ { -+ 9, -81, -81, -81, -81, -81, -81, 55, -81, -81, -+ -81, -81, -81, 58, -81, -81, -81, -81, -81, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 112, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -81 -+ -+ }, -+ -+ { -+ 9, -82, -82, -82, -82, -82, -82, 55, -82, -82, -+ -82, -82, -82, 58, -82, -82, -82, -82, -82, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 113, 58, 58, 58, 58, -+ 58, -82 -+ }, -+ -+ { -+ 9, -83, -83, -83, -83, -83, -83, -83, -83, -83, -+ -83, -83, -83, -83, -83, -83, -83, -83, -83, -83, -+ -83, -83, -83, -83, -83, -83, -83, -83, -83, -83, -+ -83, -83, -83, -83, -83, -83, -83, -83, -83, -83, -+ -83, -83 -+ -+ }, -+ -+ { -+ 9, 84, 85, -84, 84, 84, 84, 84, 84, 84, -+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, -+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, -+ 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, -+ 84, 84 -+ }, -+ -+ { -+ 9, 85, 85, -85, 85, 85, 85, 85, 85, 85, -+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, -+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, -+ 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, -+ 85, 85 -+ -+ }, -+ -+ { -+ 9, 86, 86, -86, 86, 86, 86, 86, 86, 86, -+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, -+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, -+ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, -+ 86, 86 -+ }, -+ -+ { -+ 9, -87, 87, 88, -87, -87, -87, -87, -87, -87, -+ -87, -87, -87, -87, -87, -87, -87, -87, -87, -87, -+ -87, -87, -87, -87, -87, -87, -87, -87, -87, -87, -+ -87, -87, -87, -87, -87, -87, -87, -87, -87, -87, -+ -87, -87 -+ -+ }, -+ -+ { -+ 9, 89, -88, -88, 89, 89, 89, 89, 89, 89, -+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, -+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, -+ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, -+ 89, 89 -+ }, -+ -+ { -+ 9, -89, -89, -89, -89, -89, -89, -89, -89, -89, -+ -89, -89, -89, -89, -89, -89, -89, -89, -89, -89, -+ -89, -89, -89, -89, -89, -89, -89, -89, -89, -89, -+ -89, -89, -89, -89, -89, -89, -89, -89, -89, -89, -+ -89, -89 -+ -+ }, -+ -+ { -+ 9, 90, 90, -90, 90, -90, 90, -90, 90, -90, -+ 90, 90, 90, 90, 90, 90, 90, 90, -90, 90, -+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, -+ 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, -+ 90, 90 -+ }, -+ -+ { -+ 9, 91, 91, -91, 91, 91, 91, 91, 91, 91, -+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, -+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, -+ 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, -+ 91, 91 -+ -+ }, -+ -+ { -+ 9, -92, -92, -92, -92, -92, -92, -92, -92, -92, -+ -92, -92, -92, -92, -92, -92, -92, -92, -92, -92, -+ -92, -92, -92, -92, -92, -92, -92, -92, -92, -92, -+ -92, -92, -92, -92, -92, -92, -92, -92, -92, -92, -+ -92, -92 -+ }, -+ -+ { -+ 9, -93, -93, -93, -93, -93, -93, 55, -93, -93, -+ -93, -93, -93, 58, -93, -93, -93, -93, -93, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 114, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -93 -+ -+ }, -+ -+ { -+ 9, -94, -94, -94, -94, -94, -94, 55, -94, -94, -+ -94, -94, -94, 58, -94, -94, -94, -94, -94, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 115, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -94 -+ }, -+ -+ { -+ 9, -95, -95, -95, -95, -95, -95, 55, -95, -95, -+ -95, -95, -95, 58, -95, -95, -95, -95, -95, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 116, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -95 -+ -+ }, -+ -+ { -+ 9, -96, -96, -96, -96, -96, -96, 55, -96, -96, -+ -96, -96, -96, 58, -96, -96, -96, -96, -96, 58, -+ 58, 58, 58, 58, 58, 117, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -96 -+ }, -+ -+ { -+ 9, -97, -97, -97, -97, -97, -97, 55, -97, -97, -+ -97, -97, -97, 58, -97, -97, -97, -97, -97, 118, -+ 119, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -97 -+ -+ }, -+ -+ { -+ 9, -98, -98, -98, -98, -98, -98, 55, -98, -98, -+ -98, -98, -98, 58, -98, -98, -98, -98, -98, 58, -+ 58, 58, 58, 58, 120, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -98 -+ }, -+ -+ { -+ 9, -99, -99, -99, -99, -99, -99, 55, -99, -99, -+ -99, -99, -99, 58, -99, -99, -99, -99, -99, 58, -+ 58, 58, 121, 58, 58, 58, 58, 58, 122, 58, -+ 123, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -99 -+ -+ }, -+ -+ { -+ 9, -100, -100, -100, -100, -100, -100, 55, -100, -100, -+ -100, -100, -100, 58, -100, -100, -100, -100, -100, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 124, 58, 58, 58, 58, 58, 58, -+ 58, -100 -+ }, -+ -+ { -+ 9, -101, -101, -101, -101, -101, -101, 55, -101, -101, -+ -101, -101, -101, 58, -101, -101, -101, -101, -101, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -101 -+ -+ }, -+ -+ { -+ 9, -102, -102, -102, -102, -102, -102, 55, -102, -102, -+ -102, -102, -102, 58, -102, -102, -102, -102, -102, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 125, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -102 -+ }, -+ -+ { -+ 9, -103, -103, -103, -103, -103, -103, 55, -103, -103, -+ -103, -103, -103, 58, -103, -103, -103, -103, -103, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -103 -+ -+ }, -+ -+ { -+ 9, -104, -104, -104, -104, -104, -104, 55, -104, -104, -+ -104, -104, -104, 58, -104, -104, -104, -104, -104, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 126, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -104 -+ }, -+ -+ { -+ 9, -105, -105, -105, -105, -105, -105, 55, -105, -105, -+ -105, -105, -105, 58, -105, -105, -105, -105, -105, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 127, 58, 58, -+ 58, -105 -+ -+ }, -+ -+ { -+ 9, -106, -106, -106, -106, -106, -106, 55, -106, -106, -+ -106, -106, -106, 58, -106, -106, -106, -106, -106, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 128, 58, 58, -+ 58, -106 -+ }, -+ -+ { -+ 9, -107, -107, -107, -107, -107, -107, 55, -107, -107, -+ -107, -107, -107, 58, -107, -107, -107, -107, -107, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 129, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -107 -+ -+ }, -+ -+ { -+ 9, -108, -108, -108, -108, -108, -108, 55, -108, -108, -+ -108, -108, -108, 58, -108, -108, -108, -108, -108, 58, -+ 58, 58, 58, 58, 58, 58, 130, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -108 -+ }, -+ -+ { -+ 9, -109, -109, -109, -109, -109, -109, 55, -109, -109, -+ -109, -109, -109, 58, -109, -109, -109, -109, -109, 58, -+ 58, 58, 58, 58, 131, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -109 -+ -+ }, -+ -+ { -+ 9, -110, -110, -110, -110, -110, -110, 55, -110, -110, -+ -110, -110, -110, 58, -110, -110, -110, -110, -110, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 132, 58, 58, 58, 58, 58, -+ 58, -110 -+ }, -+ -+ { -+ 9, -111, -111, -111, -111, -111, -111, 55, -111, -111, -+ -111, -111, -111, 58, -111, -111, -111, -111, -111, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 133, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -111 -+ -+ }, -+ -+ { -+ 9, -112, -112, -112, -112, -112, -112, 55, -112, -112, -+ -112, -112, -112, 58, -112, -112, -112, -112, -112, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 134, 58, 58, 58, 58, -+ 58, -112 -+ }, -+ -+ { -+ 9, -113, -113, -113, -113, -113, -113, 55, -113, -113, -+ -113, -113, -113, 58, -113, -113, -113, -113, -113, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 135, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -113 -+ -+ }, -+ -+ { -+ 9, -114, -114, -114, -114, -114, -114, 55, -114, -114, -+ -114, -114, -114, 58, -114, -114, -114, -114, -114, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -114 -+ }, -+ -+ { -+ 9, -115, -115, -115, -115, -115, -115, 55, -115, -115, -+ -115, -115, -115, 58, -115, -115, -115, -115, -115, 58, -+ 58, 58, 136, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -115 -+ -+ }, -+ -+ { -+ 9, -116, -116, -116, -116, -116, -116, 55, -116, -116, -+ -116, -116, -116, 58, -116, -116, -116, -116, -116, 58, -+ 58, 58, 58, 58, 137, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -116 -+ }, -+ -+ { -+ 9, -117, -117, -117, -117, -117, -117, 55, -117, -117, -+ -117, -117, -117, 58, -117, -117, -117, -117, -117, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 138, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -117 -+ -+ }, -+ -+ { -+ 9, -118, -118, -118, -118, -118, -118, 55, -118, -118, -+ -118, -118, -118, 58, -118, -118, -118, -118, -118, 58, -+ 58, 139, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 140, 58, 58, 58, -+ 58, -118 -+ }, -+ -+ { -+ 9, -119, -119, -119, -119, -119, -119, 55, -119, -119, -+ -119, -119, -119, 58, -119, -119, -119, -119, -119, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 141, 58, 58, -+ 58, -119 -+ -+ }, -+ -+ { -+ 9, -120, -120, -120, -120, -120, -120, 55, -120, -120, -+ -120, -120, -120, 58, -120, -120, -120, -120, -120, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 142, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -120 -+ }, -+ -+ { -+ 9, -121, -121, -121, -121, -121, -121, 55, -121, -121, -+ -121, -121, -121, 58, -121, -121, -121, -121, -121, 58, -+ 58, 58, 58, 58, 58, 58, 58, 143, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -121 -+ -+ }, -+ -+ { -+ 9, -122, -122, -122, -122, -122, -122, 55, -122, -122, -+ -122, -122, -122, 58, -122, -122, -122, -122, -122, 58, -+ 58, 58, 58, 58, 58, 144, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -122 -+ }, -+ -+ { -+ 9, -123, -123, -123, -123, -123, -123, 55, -123, -123, -+ -123, -123, -123, 58, -123, -123, -123, -123, -123, 58, -+ 58, 58, 58, 58, 145, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -123 -+ -+ }, -+ -+ { -+ 9, -124, -124, -124, -124, -124, -124, 55, -124, -124, -+ -124, -124, -124, 58, -124, -124, -124, -124, -124, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -124 -+ }, -+ -+ { -+ 9, -125, -125, -125, -125, -125, -125, 55, -125, -125, -+ -125, -125, -125, 58, -125, -125, -125, -125, -125, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 146, -125 -+ -+ }, -+ -+ { -+ 9, -126, -126, -126, -126, -126, -126, 55, -126, -126, -+ -126, -126, -126, 58, -126, -126, -126, -126, -126, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 147, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -126 -+ }, -+ -+ { -+ 9, -127, -127, -127, -127, -127, -127, 55, -127, -127, -+ -127, -127, -127, 58, -127, -127, -127, -127, -127, 58, -+ 58, 58, 148, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -127 -+ -+ }, -+ -+ { -+ 9, -128, -128, -128, -128, -128, -128, 55, -128, -128, -+ -128, -128, -128, 58, -128, -128, -128, -128, -128, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 149, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -128 -+ }, -+ -+ { -+ 9, -129, -129, -129, -129, -129, -129, 55, -129, -129, -+ -129, -129, -129, 58, -129, -129, -129, -129, -129, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 150, 58, 58, 58, 58, 58, 58, -+ 58, -129 -+ -+ }, -+ -+ { -+ 9, -130, -130, -130, -130, -130, -130, 55, -130, -130, -+ -130, -130, -130, 58, -130, -130, -130, -130, -130, 58, -+ 58, 58, 58, 58, 151, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -130 -+ }, -+ -+ { -+ 9, -131, -131, -131, -131, -131, -131, 55, -131, -131, -+ -131, -131, -131, 58, -131, -131, -131, -131, -131, 58, -+ 58, 58, 152, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -131 -+ -+ }, -+ -+ { -+ 9, -132, -132, -132, -132, -132, -132, 55, -132, -132, -+ -132, -132, -132, 58, -132, -132, -132, -132, -132, 58, -+ 58, 58, 153, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -132 -+ }, -+ -+ { -+ 9, -133, -133, -133, -133, -133, -133, 55, -133, -133, -+ -133, -133, -133, 58, -133, -133, -133, -133, -133, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 154, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -133 -+ -+ }, -+ -+ { -+ 9, -134, -134, -134, -134, -134, -134, 55, -134, -134, -+ -134, -134, -134, 58, -134, -134, -134, -134, -134, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 155, 58, 58, 58, -+ 58, -134 -+ }, -+ -+ { -+ 9, -135, -135, -135, -135, -135, -135, 55, -135, -135, -+ -135, -135, -135, 58, -135, -135, -135, -135, -135, 58, -+ 58, 156, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -135 -+ -+ }, -+ -+ { -+ 9, -136, -136, -136, -136, -136, -136, 55, -136, -136, -+ -136, -136, -136, 58, -136, -136, -136, -136, -136, 58, -+ 58, 58, 58, 58, 157, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -136 -+ }, -+ -+ { -+ 9, -137, -137, -137, -137, -137, -137, 55, -137, -137, -+ -137, -137, -137, 58, -137, -137, -137, -137, -137, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 158, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -137 -+ -+ }, -+ -+ { -+ 9, -138, -138, -138, -138, -138, -138, 55, -138, -138, -+ -138, -138, -138, 58, -138, -138, -138, -138, -138, 58, -+ 58, 58, 58, 58, 58, 58, 159, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -138 -+ }, -+ -+ { -+ 9, -139, -139, -139, -139, -139, -139, 55, -139, -139, -+ -139, -139, -139, 58, -139, -139, -139, -139, -139, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 160, 58, 58, 58, 58, 58, 58, 58, -+ 58, -139 -+ -+ }, -+ -+ { -+ 9, -140, -140, -140, -140, -140, -140, 55, -140, -140, -+ -140, -140, -140, 58, -140, -140, -140, -140, -140, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 161, 58, 58, 58, 58, 58, -+ 58, -140 -+ }, -+ -+ { -+ 9, -141, -141, -141, -141, -141, -141, 55, -141, -141, -+ -141, -141, -141, 58, -141, -141, -141, -141, -141, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 162, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -141 -+ -+ }, -+ -+ { -+ 9, -142, -142, -142, -142, -142, -142, 55, -142, -142, -+ -142, -142, -142, 58, -142, -142, -142, -142, -142, 58, -+ 58, 58, 58, 163, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -142 -+ }, -+ -+ { -+ 9, -143, -143, -143, -143, -143, -143, 55, -143, -143, -+ -143, -143, -143, 58, -143, -143, -143, -143, -143, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 164, 58, 58, 58, 58, 58, 58, 58, -+ 58, -143 -+ -+ }, -+ -+ { -+ 9, -144, -144, -144, -144, -144, -144, 55, -144, -144, -+ -144, -144, -144, 58, -144, -144, -144, -144, -144, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -144 -+ }, -+ -+ { -+ 9, -145, -145, -145, -145, -145, -145, 55, -145, -145, -+ -145, -145, -145, 58, -145, -145, -145, -145, -145, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 165, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -145 -+ -+ }, -+ -+ { -+ 9, -146, -146, -146, -146, -146, -146, 55, -146, -146, -+ -146, -146, -146, 58, -146, -146, -146, -146, -146, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -146 -+ }, -+ -+ { -+ 9, -147, -147, -147, -147, -147, -147, 55, -147, -147, -+ -147, -147, -147, 58, -147, -147, -147, -147, -147, 58, -+ 58, 58, 58, 58, 166, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -147 -+ -+ }, -+ -+ { -+ 9, -148, -148, -148, -148, -148, -148, 55, -148, -148, -+ -148, -148, -148, 58, -148, -148, -148, -148, -148, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 167, 58, 58, 58, 58, 58, 58, 58, -+ 58, -148 -+ }, -+ -+ { -+ 9, -149, -149, -149, -149, -149, -149, 55, -149, -149, -+ -149, -149, -149, 58, -149, -149, -149, -149, -149, 58, -+ 58, 58, 58, 58, 168, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -149 -+ -+ }, -+ -+ { -+ 9, -150, -150, -150, -150, -150, -150, 55, -150, -150, -+ -150, -150, -150, 58, -150, -150, -150, -150, -150, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 169, 58, 58, 58, -+ 58, -150 -+ }, -+ -+ { -+ 9, -151, -151, -151, -151, -151, -151, 55, -151, -151, -+ -151, -151, -151, 58, -151, -151, -151, -151, -151, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -151 -+ -+ }, -+ -+ { -+ 9, -152, -152, -152, -152, -152, -152, 55, -152, -152, -+ -152, -152, -152, 58, -152, -152, -152, -152, -152, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 170, 58, 58, 58, -+ 58, -152 -+ }, -+ -+ { -+ 9, -153, -153, -153, -153, -153, -153, 55, -153, -153, -+ -153, -153, -153, 58, -153, -153, -153, -153, -153, 58, -+ 58, 58, 58, 58, 171, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -153 -+ -+ }, -+ -+ { -+ 9, -154, -154, -154, -154, -154, -154, 55, -154, -154, -+ -154, -154, -154, 58, -154, -154, -154, -154, -154, 58, -+ 58, 58, 58, 58, 58, 58, 172, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -154 -+ }, -+ -+ { -+ 9, -155, -155, -155, -155, -155, -155, 55, -155, -155, -+ -155, -155, -155, 58, -155, -155, -155, -155, -155, 58, -+ 173, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -155 -+ -+ }, -+ -+ { -+ 9, -156, -156, -156, -156, -156, -156, 55, -156, -156, -+ -156, -156, -156, 58, -156, -156, -156, -156, -156, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 174, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -156 -+ }, -+ -+ { -+ 9, -157, -157, -157, -157, -157, -157, 55, -157, -157, -+ -157, -157, -157, 58, -157, -157, -157, -157, -157, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -157 -+ -+ }, -+ -+ { -+ 9, -158, -158, -158, -158, -158, -158, 55, -158, -158, -+ -158, -158, -158, 58, -158, -158, -158, -158, -158, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 175, 58, 58, 58, -+ 58, -158 -+ }, -+ -+ { -+ 9, -159, -159, -159, -159, -159, -159, 55, -159, -159, -+ -159, -159, -159, 58, -159, -159, -159, -159, -159, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -159 -+ -+ }, -+ -+ { -+ 9, -160, -160, -160, -160, -160, -160, 55, -160, -160, -+ -160, -160, -160, 58, -160, -160, -160, -160, -160, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 176, 58, 58, 58, 58, 58, 58, 58, -+ 58, -160 -+ }, -+ -+ { -+ 9, -161, -161, -161, -161, -161, -161, 55, -161, -161, -+ -161, -161, -161, 58, -161, -161, -161, -161, -161, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 177, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -161 -+ -+ }, -+ -+ { -+ 9, -162, -162, -162, -162, -162, -162, 55, -162, -162, -+ -162, -162, -162, 58, -162, -162, -162, -162, -162, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 178, 58, 58, 58, -+ 58, -162 -+ }, -+ -+ { -+ 9, -163, -163, -163, -163, -163, -163, 55, -163, -163, -+ -163, -163, -163, 58, -163, -163, -163, -163, -163, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 179, 58, 58, 58, 58, -+ 58, -163 -+ -+ }, -+ -+ { -+ 9, -164, -164, -164, -164, -164, -164, 55, -164, -164, -+ -164, -164, -164, 58, -164, -164, -164, -164, -164, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 180, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -164 -+ }, -+ -+ { -+ 9, -165, -165, -165, -165, -165, -165, 55, -165, -165, -+ -165, -165, -165, 58, -165, -165, -165, -165, -165, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 181, 58, 58, -+ 58, -165 -+ -+ }, -+ -+ { -+ 9, -166, -166, -166, -166, -166, -166, 55, -166, -166, -+ -166, -166, -166, 58, -166, -166, -166, -166, -166, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 182, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -166 -+ }, -+ -+ { -+ 9, -167, -167, -167, -167, -167, -167, 55, -167, -167, -+ -167, -167, -167, 58, -167, -167, -167, -167, -167, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 183, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -167 -+ -+ }, -+ -+ { -+ 9, -168, -168, -168, -168, -168, -168, 55, -168, -168, -+ -168, -168, -168, 58, -168, -168, -168, -168, -168, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 184, 58, 58, 58, 58, -+ 58, -168 -+ }, -+ -+ { -+ 9, -169, -169, -169, -169, -169, -169, 55, -169, -169, -+ -169, -169, -169, 58, -169, -169, -169, -169, -169, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -169 -+ -+ }, -+ -+ { -+ 9, -170, -170, -170, -170, -170, -170, 55, -170, -170, -+ -170, -170, -170, 58, -170, -170, -170, -170, -170, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -170 -+ }, -+ -+ { -+ 9, -171, -171, -171, -171, -171, -171, 55, -171, -171, -+ -171, -171, -171, 58, -171, -171, -171, -171, -171, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -171 -+ -+ }, -+ -+ { -+ 9, -172, -172, -172, -172, -172, -172, 55, -172, -172, -+ -172, -172, -172, 58, -172, -172, -172, -172, -172, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -172 -+ }, -+ -+ { -+ 9, -173, -173, -173, -173, -173, -173, 55, -173, -173, -+ -173, -173, -173, 58, -173, -173, -173, -173, -173, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 185, 58, 58, 58, -+ 58, -173 -+ -+ }, -+ -+ { -+ 9, -174, -174, -174, -174, -174, -174, 55, -174, -174, -+ -174, -174, -174, 58, -174, -174, -174, -174, -174, 58, -+ 58, 58, 58, 58, 186, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -174 -+ }, -+ -+ { -+ 9, -175, -175, -175, -175, -175, -175, 55, -175, -175, -+ -175, -175, -175, 58, -175, -175, -175, -175, -175, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -175 -+ -+ }, -+ -+ { -+ 9, -176, -176, -176, -176, -176, -176, 55, -176, -176, -+ -176, -176, -176, 58, -176, -176, -176, -176, -176, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 187, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -176 -+ }, -+ -+ { -+ 9, -177, -177, -177, -177, -177, -177, 55, -177, -177, -+ -177, -177, -177, 58, -177, -177, -177, -177, -177, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 188, 58, 58, 58, 58, -+ 58, -177 -+ -+ }, -+ -+ { -+ 9, -178, -178, -178, -178, -178, -178, 55, -178, -178, -+ -178, -178, -178, 58, -178, -178, -178, -178, -178, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -178 -+ }, -+ -+ { -+ 9, -179, -179, -179, -179, -179, -179, 55, -179, -179, -+ -179, -179, -179, 58, -179, -179, -179, -179, -179, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -179 -+ -+ }, -+ -+ { -+ 9, -180, -180, -180, -180, -180, -180, 55, -180, -180, -+ -180, -180, -180, 58, -180, -180, -180, -180, -180, 58, -+ 58, 58, 189, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -180 -+ }, -+ -+ { -+ 9, -181, -181, -181, -181, -181, -181, 55, -181, -181, -+ -181, -181, -181, 58, -181, -181, -181, -181, -181, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -181 -+ -+ }, -+ -+ { -+ 9, -182, -182, -182, -182, -182, -182, 55, -182, -182, -+ -182, -182, -182, 58, -182, -182, -182, -182, -182, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 190, 58, 58, -+ 58, -182 -+ }, -+ -+ { -+ 9, -183, -183, -183, -183, -183, -183, 55, -183, -183, -+ -183, -183, -183, 58, -183, -183, -183, -183, -183, 58, -+ 58, 58, 58, 58, 58, 191, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -183 -+ -+ }, -+ -+ { -+ 9, -184, -184, -184, -184, -184, -184, 55, -184, -184, -+ -184, -184, -184, 58, -184, -184, -184, -184, -184, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -184 -+ }, -+ -+ { -+ 9, -185, -185, -185, -185, -185, -185, 55, -185, -185, -+ -185, -185, -185, 58, -185, -185, -185, -185, -185, 58, -+ 58, 58, 58, 58, 192, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -185 -+ -+ }, -+ -+ { -+ 9, -186, -186, -186, -186, -186, -186, 55, -186, -186, -+ -186, -186, -186, 58, -186, -186, -186, -186, -186, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -186 -+ }, -+ -+ { -+ 9, -187, -187, -187, -187, -187, -187, 55, -187, -187, -+ -187, -187, -187, 58, -187, -187, -187, -187, -187, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -187 -+ -+ }, -+ -+ { -+ 9, -188, -188, -188, -188, -188, -188, 55, -188, -188, -+ -188, -188, -188, 58, -188, -188, -188, -188, -188, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 193, 58, 58, 58, -+ 58, -188 -+ }, -+ -+ { -+ 9, -189, -189, -189, -189, -189, -189, 55, -189, -189, -+ -189, -189, -189, 58, -189, -189, -189, -189, -189, 58, -+ 58, 58, 58, 58, 194, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -189 -+ -+ }, -+ -+ { -+ 9, -190, -190, -190, -190, -190, -190, 55, -190, -190, -+ -190, -190, -190, 58, -190, -190, -190, -190, -190, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -190 -+ }, -+ -+ { -+ 9, -191, -191, -191, -191, -191, -191, 55, -191, -191, -+ -191, -191, -191, 58, -191, -191, -191, -191, -191, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 195, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -191 -+ -+ }, -+ -+ { -+ 9, -192, -192, -192, -192, -192, -192, 55, -192, -192, -+ -192, -192, -192, 58, -192, -192, -192, -192, -192, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -192 -+ }, -+ -+ { -+ 9, -193, -193, -193, -193, -193, -193, 55, -193, -193, -+ -193, -193, -193, 58, -193, -193, -193, -193, -193, 58, -+ 196, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -193 -+ -+ }, -+ -+ { -+ 9, -194, -194, -194, -194, -194, -194, 55, -194, -194, -+ -194, -194, -194, 58, -194, -194, -194, -194, -194, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -194 -+ }, -+ -+ { -+ 9, -195, -195, -195, -195, -195, -195, 55, -195, -195, -+ -195, -195, -195, 58, -195, -195, -195, -195, -195, 58, -+ 58, 58, 58, 58, 58, 58, 197, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -195 -+ -+ }, -+ -+ { -+ 9, -196, -196, -196, -196, -196, -196, 55, -196, -196, -+ -196, -196, -196, 58, -196, -196, -196, -196, -196, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 198, 58, 58, 58, -+ 58, -196 -+ }, -+ -+ { -+ 9, -197, -197, -197, -197, -197, -197, 55, -197, -197, -+ -197, -197, -197, 58, -197, -197, -197, -197, -197, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -197 -+ -+ }, -+ -+ { -+ 9, -198, -198, -198, -198, -198, -198, 55, -198, -198, -+ -198, -198, -198, 58, -198, -198, -198, -198, -198, 58, -+ 58, 58, 58, 58, 199, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -198 -+ }, -+ -+ { -+ 9, -199, -199, -199, -199, -199, -199, 55, -199, -199, -+ -199, -199, -199, 58, -199, -199, -199, -199, -199, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, -+ 58, -199 -+ -+ }, -+ -+ } ; -+ -+static yy_state_type yy_get_previous_state ( void ); -+static yy_state_type yy_try_NUL_trans ( yy_state_type current_state ); -+static int yy_get_next_buffer ( void ); -+static void yynoreturn yy_fatal_error ( const char* msg ); -+ -+/* Done after the current pattern has been matched and before the -+ * corresponding action - sets up yytext. -+ */ -+#define YY_DO_BEFORE_ACTION \ -+ (yytext_ptr) = yy_bp; \ -+ yyleng = (int) (yy_cp - yy_bp); \ -+ (yy_hold_char) = *yy_cp; \ -+ *yy_cp = '\0'; \ -+ (yy_c_buf_p) = yy_cp; -+#define YY_NUM_RULES 62 -+#define YY_END_OF_BUFFER 63 -+/* This struct is not used in this scanner, -+ but its presence is necessary. */ -+struct yy_trans_info -+ { -+ flex_int32_t yy_verify; -+ flex_int32_t yy_nxt; -+ }; -+static const flex_int16_t yy_accept[200] = -+ { 0, -+ 2, 2, 0, 0, 0, 0, 0, 0, 63, 49, -+ 2, 4, 41, 46, 1, 48, 49, 42, 43, 49, -+ 47, 49, 37, 35, 39, 49, 47, 47, 47, 47, -+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 49, -+ 50, 52, 51, 61, 58, 60, 54, 57, 56, 53, -+ 55, 2, 36, 1, 48, 34, 45, 47, 44, 38, -+ 40, 3, 47, 47, 47, 47, 47, 47, 18, 47, -+ 47, 47, 47, 47, 25, 47, 47, 47, 47, 47, -+ 47, 47, 33, 50, 50, 61, 58, 60, 59, 54, -+ 53, 55, 47, 47, 47, 47, 47, 47, 47, 47, -+ -+ 17, 47, 20, 47, 47, 47, 47, 47, 47, 47, -+ 47, 47, 47, 5, 47, 47, 47, 47, 47, 47, -+ 47, 47, 47, 16, 47, 47, 22, 47, 47, 47, -+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, -+ 47, 47, 47, 14, 47, 19, 47, 47, 47, 47, -+ 27, 47, 47, 47, 47, 47, 6, 47, 8, 47, -+ 47, 47, 47, 47, 47, 47, 47, 47, 26, 28, -+ 29, 30, 47, 47, 7, 47, 47, 11, 12, 47, -+ 15, 47, 47, 24, 47, 32, 9, 47, 47, 21, -+ 47, 31, 47, 13, 47, 47, 23, 47, 10 -+ -+ } ; -+ -+static const YY_CHAR yy_ec[256] = -+ { 0, -+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, -+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -+ 1, 2, 4, 5, 6, 7, 1, 8, 9, 10, -+ 11, 1, 12, 1, 13, 1, 1, 13, 13, 13, -+ 13, 13, 13, 13, 13, 13, 13, 14, 1, 15, -+ 16, 17, 1, 1, 13, 13, 13, 13, 13, 13, -+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, -+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, -+ 1, 18, 1, 1, 19, 1, 20, 21, 22, 23, -+ -+ 24, 25, 26, 27, 28, 13, 13, 29, 30, 31, -+ 32, 33, 13, 34, 35, 36, 37, 38, 13, 39, -+ 40, 13, 1, 41, 1, 1, 1, 1, 1, 1, -+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -+ -+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -+ 1, 1, 1, 1, 1 -+ } ; -+ -+/* Table of booleans, true if rule could match eol. */ -+static const flex_int32_t yy_rule_can_match_eol[63] = -+ { 0, -+0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, -+ 1, 0, 0, }; -+ -+extern int yy_flex_debug; -+int yy_flex_debug = 0; -+ -+/* The intent behind this definition is that it'll catch -+ * any uses of REJECT which flex missed. -+ */ -+#define REJECT reject_used_but_not_detected -+#define yymore() yymore_used_but_not_detected -+#define YY_MORE_ADJ 0 -+#define YY_RESTORE_YY_MORE_OFFSET -+char *yytext; -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2002 Roman Zippel -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include "lkc.h" -+#include "preprocess.h" -+ -+#include "parser.tab.h" -+ -+#define YY_DECL static int yylex1(void) -+ -+#define START_STRSIZE 16 -+ -+/* The Kconfig file currently being parsed. */ -+const char *cur_filename; -+ -+/* -+ * The line number of the current statement. This does not match yylineno. -+ * yylineno is used by the lexer, while cur_lineno is used by the parser. -+ */ -+int cur_lineno; -+ -+static int prev_prev_token = T_EOL; -+static int prev_token = T_EOL; -+static char *text; -+static int text_size, text_asize; -+ -+struct buffer { -+ struct buffer *parent; -+ YY_BUFFER_STATE state; -+ int yylineno; -+ const char *filename; -+ int source_lineno; -+}; -+ -+static struct buffer *current_buf; -+ -+static int last_ts, first_ts; -+ -+static char *expand_token(const char *in, size_t n); -+static void append_expanded_string(const char *in); -+static void zconf_endhelp(void); -+static void zconf_endfile(void); -+ -+static void new_string(void) -+{ -+ text = xmalloc(START_STRSIZE); -+ text_asize = START_STRSIZE; -+ text_size = 0; -+ *text = 0; -+} -+ -+static void append_string(const char *str, int size) -+{ -+ int new_size = text_size + size + 1; -+ if (new_size > text_asize) { -+ new_size += START_STRSIZE - 1; -+ new_size &= -START_STRSIZE; -+ text = xrealloc(text, new_size); -+ text_asize = new_size; -+ } -+ memcpy(text + text_size, str, size); -+ text_size += size; -+ text[text_size] = 0; -+} -+ -+static void alloc_string(const char *str, int size) -+{ -+ text = xmalloc(size + 1); -+ memcpy(text, str, size); -+ text[size] = 0; -+} -+ -+static void warn_ignored_character(char chr) -+{ -+ fprintf(stderr, -+ "%s:%d:warning: ignoring unsupported character '%c'\n", -+ cur_filename, yylineno, chr); -+} -+ -+#define INITIAL 0 -+#define ASSIGN_VAL 1 -+#define HELP 2 -+#define STRING 3 -+ -+#ifndef YY_NO_UNISTD_H -+/* Special case for "unistd.h", since it is non-ANSI. We include it way -+ * down here because we want the user's section 1 to have been scanned first. -+ * The user has a chance to override it with an option. -+ */ -+#include -+#endif -+ -+#ifndef YY_EXTRA_TYPE -+#define YY_EXTRA_TYPE void * -+#endif -+ -+static int yy_init_globals ( void ); -+ -+/* Accessor methods to globals. -+ These are made visible to non-reentrant scanners for convenience. */ -+ -+int yylex_destroy ( void ); -+ -+int yyget_debug ( void ); -+ -+void yyset_debug ( int debug_flag ); -+ -+YY_EXTRA_TYPE yyget_extra ( void ); -+ -+void yyset_extra ( YY_EXTRA_TYPE user_defined ); -+ -+FILE *yyget_in ( void ); -+ -+void yyset_in ( FILE * _in_str ); -+ -+FILE *yyget_out ( void ); -+ -+void yyset_out ( FILE * _out_str ); -+ -+ int yyget_leng ( void ); -+ -+char *yyget_text ( void ); -+ -+int yyget_lineno ( void ); -+ -+void yyset_lineno ( int _line_number ); -+ -+/* Macros after this point can all be overridden by user definitions in -+ * section 1. -+ */ -+ -+#ifndef YY_SKIP_YYWRAP -+#ifdef __cplusplus -+extern "C" int yywrap ( void ); -+#else -+extern int yywrap ( void ); -+#endif -+#endif -+ -+#ifndef YY_NO_UNPUT -+ -+ static void yyunput ( int c, char *buf_ptr ); -+ -+#endif -+ -+#ifndef yytext_ptr -+static void yy_flex_strncpy ( char *, const char *, int ); -+#endif -+ -+#ifdef YY_NEED_STRLEN -+static int yy_flex_strlen ( const char * ); -+#endif -+ -+#ifndef YY_NO_INPUT -+#ifdef __cplusplus -+static int yyinput ( void ); -+#else -+static int input ( void ); -+#endif -+ -+#endif -+ -+/* Amount of stuff to slurp up with each read. */ -+#ifndef YY_READ_BUF_SIZE -+#ifdef __ia64__ -+/* On IA-64, the buffer size is 16k, not 8k */ -+#define YY_READ_BUF_SIZE 16384 -+#else -+#define YY_READ_BUF_SIZE 8192 -+#endif /* __ia64__ */ -+#endif -+ -+/* Copy whatever the last rule matched to the standard output. */ -+#ifndef ECHO -+/* This used to be an fputs(), but since the string might contain NUL's, -+ * we now use fwrite(). -+ */ -+#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0) -+#endif -+ -+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, -+ * is returned in "result". -+ */ -+#ifndef YY_INPUT -+#define YY_INPUT(buf,result,max_size) \ -+ errno=0; \ -+ while ( (result = (int) read( fileno(yyin), buf, (yy_size_t) max_size )) < 0 ) \ -+ { \ -+ if( errno != EINTR) \ -+ { \ -+ YY_FATAL_ERROR( "input in flex scanner failed" ); \ -+ break; \ -+ } \ -+ errno=0; \ -+ clearerr(yyin); \ -+ }\ -+\ -+ -+#endif -+ -+/* No semi-colon after return; correct usage is to write "yyterminate();" - -+ * we don't want an extra ';' after the "return" because that will cause -+ * some compilers to complain about unreachable statements. -+ */ -+#ifndef yyterminate -+#define yyterminate() return YY_NULL -+#endif -+ -+/* Number of entries by which start-condition stack grows. */ -+#ifndef YY_START_STACK_INCR -+#define YY_START_STACK_INCR 25 -+#endif -+ -+/* Report a fatal error. */ -+#ifndef YY_FATAL_ERROR -+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) -+#endif -+ -+/* end tables serialization structures and prototypes */ -+ -+/* Default declaration of generated scanner - a define so the user can -+ * easily add parameters. -+ */ -+#ifndef YY_DECL -+#define YY_DECL_IS_OURS 1 -+ -+extern int yylex (void); -+ -+#define YY_DECL int yylex (void) -+#endif /* !YY_DECL */ -+ -+/* Code executed at the beginning of each rule, after yytext and yyleng -+ * have been set up. -+ */ -+#ifndef YY_USER_ACTION -+#define YY_USER_ACTION -+#endif -+ -+/* Code executed at the end of each rule. */ -+#ifndef YY_BREAK -+#define YY_BREAK /*LINTED*/break; -+#endif -+ -+#define YY_RULE_SETUP \ -+ YY_USER_ACTION -+ -+/** The main scanner function which does all the work. -+ */ -+YY_DECL -+{ -+ yy_state_type yy_current_state; -+ char *yy_cp, *yy_bp; -+ int yy_act; -+ -+ if ( !(yy_init) ) -+ { -+ (yy_init) = 1; -+ -+#ifdef YY_USER_INIT -+ YY_USER_INIT; -+#endif -+ -+ if ( ! (yy_start) ) -+ (yy_start) = 1; /* first start state */ -+ -+ if ( ! yyin ) -+ yyin = stdin; -+ -+ if ( ! yyout ) -+ yyout = stdout; -+ -+ if ( ! YY_CURRENT_BUFFER ) { -+ yyensure_buffer_stack (); -+ YY_CURRENT_BUFFER_LVALUE = -+ yy_create_buffer( yyin, YY_BUF_SIZE ); -+ } -+ -+ yy_load_buffer_state( ); -+ } -+ -+ { -+ -+ char open_quote = 0; -+ -+ while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ -+ { -+ yy_cp = (yy_c_buf_p); -+ -+ /* Support of yytext. */ -+ *yy_cp = (yy_hold_char); -+ -+ /* yy_bp points to the position in yy_ch_buf of the start of -+ * the current run. -+ */ -+ yy_bp = yy_cp; -+ -+ yy_current_state = (yy_start); -+yy_match: -+ while ( (yy_current_state = yy_nxt[yy_current_state][ yy_ec[YY_SC_TO_UI(*yy_cp)] ]) > 0 ) -+ ++yy_cp; -+ -+ yy_current_state = -yy_current_state; -+ -+yy_find_action: -+ yy_act = yy_accept[yy_current_state]; -+ -+ YY_DO_BEFORE_ACTION; -+ -+ if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] ) -+ { -+ int yyl; -+ for ( yyl = 0; yyl < yyleng; ++yyl ) -+ if ( yytext[yyl] == '\n' ) -+ -+ yylineno++; -+; -+ } -+ -+do_action: /* This label is used only to access EOF actions. */ -+ -+ switch ( yy_act ) -+ { /* beginning of action switch */ -+case 1: -+YY_RULE_SETUP -+/* ignore comment */ -+ YY_BREAK -+case 2: -+YY_RULE_SETUP -+/* whitespaces */ -+ YY_BREAK -+case 3: -+/* rule 3 can match eol */ -+YY_RULE_SETUP -+/* escaped new line */ -+ YY_BREAK -+case 4: -+/* rule 4 can match eol */ -+YY_RULE_SETUP -+return T_EOL; -+ YY_BREAK -+case 5: -+YY_RULE_SETUP -+return T_BOOL; -+ YY_BREAK -+case 6: -+YY_RULE_SETUP -+return T_CHOICE; -+ YY_BREAK -+case 7: -+YY_RULE_SETUP -+return T_COMMENT; -+ YY_BREAK -+case 8: -+YY_RULE_SETUP -+return T_CONFIG; -+ YY_BREAK -+case 9: -+YY_RULE_SETUP -+return T_DEF_BOOL; -+ YY_BREAK -+case 10: -+YY_RULE_SETUP -+return T_DEF_TRISTATE; -+ YY_BREAK -+case 11: -+YY_RULE_SETUP -+return T_DEFAULT; -+ YY_BREAK -+case 12: -+YY_RULE_SETUP -+return T_DEPENDS; -+ YY_BREAK -+case 13: -+YY_RULE_SETUP -+return T_ENDCHOICE; -+ YY_BREAK -+case 14: -+YY_RULE_SETUP -+return T_ENDIF; -+ YY_BREAK -+case 15: -+YY_RULE_SETUP -+return T_ENDMENU; -+ YY_BREAK -+case 16: -+YY_RULE_SETUP -+return T_HELP; -+ YY_BREAK -+case 17: -+YY_RULE_SETUP -+return T_HEX; -+ YY_BREAK -+case 18: -+YY_RULE_SETUP -+return T_IF; -+ YY_BREAK -+case 19: -+YY_RULE_SETUP -+return T_IMPLY; -+ YY_BREAK -+case 20: -+YY_RULE_SETUP -+return T_INT; -+ YY_BREAK -+case 21: -+YY_RULE_SETUP -+return T_MAINMENU; -+ YY_BREAK -+case 22: -+YY_RULE_SETUP -+return T_MENU; -+ YY_BREAK -+case 23: -+YY_RULE_SETUP -+return T_MENUCONFIG; -+ YY_BREAK -+case 24: -+YY_RULE_SETUP -+return T_MODULES; -+ YY_BREAK -+case 25: -+YY_RULE_SETUP -+return T_ON; -+ YY_BREAK -+case 26: -+YY_RULE_SETUP -+return T_PROMPT; -+ YY_BREAK -+case 27: -+YY_RULE_SETUP -+return T_RANGE; -+ YY_BREAK -+case 28: -+YY_RULE_SETUP -+return T_SELECT; -+ YY_BREAK -+case 29: -+YY_RULE_SETUP -+return T_SOURCE; -+ YY_BREAK -+case 30: -+YY_RULE_SETUP -+return T_STRING; -+ YY_BREAK -+case 31: -+YY_RULE_SETUP -+return T_TRISTATE; -+ YY_BREAK -+case 32: -+YY_RULE_SETUP -+return T_VISIBLE; -+ YY_BREAK -+case 33: -+YY_RULE_SETUP -+return T_OR; -+ YY_BREAK -+case 34: -+YY_RULE_SETUP -+return T_AND; -+ YY_BREAK -+case 35: -+YY_RULE_SETUP -+return T_EQUAL; -+ YY_BREAK -+case 36: -+YY_RULE_SETUP -+return T_UNEQUAL; -+ YY_BREAK -+case 37: -+YY_RULE_SETUP -+return T_LESS; -+ YY_BREAK -+case 38: -+YY_RULE_SETUP -+return T_LESS_EQUAL; -+ YY_BREAK -+case 39: -+YY_RULE_SETUP -+return T_GREATER; -+ YY_BREAK -+case 40: -+YY_RULE_SETUP -+return T_GREATER_EQUAL; -+ YY_BREAK -+case 41: -+YY_RULE_SETUP -+return T_NOT; -+ YY_BREAK -+case 42: -+YY_RULE_SETUP -+return T_OPEN_PAREN; -+ YY_BREAK -+case 43: -+YY_RULE_SETUP -+return T_CLOSE_PAREN; -+ YY_BREAK -+case 44: -+YY_RULE_SETUP -+return T_COLON_EQUAL; -+ YY_BREAK -+case 45: -+YY_RULE_SETUP -+return T_PLUS_EQUAL; -+ YY_BREAK -+case 46: -+YY_RULE_SETUP -+{ -+ open_quote = yytext[0]; -+ new_string(); -+ BEGIN(STRING); -+ } -+ YY_BREAK -+case 47: -+YY_RULE_SETUP -+{ -+ alloc_string(yytext, yyleng); -+ yylval.string = text; -+ return T_WORD; -+ } -+ YY_BREAK -+case 48: -+YY_RULE_SETUP -+{ -+ /* this token includes at least one '$' */ -+ yylval.string = expand_token(yytext, yyleng); -+ if (strlen(yylval.string)) -+ return T_WORD; -+ free(yylval.string); -+ } -+ YY_BREAK -+case 49: -+YY_RULE_SETUP -+warn_ignored_character(*yytext); -+ YY_BREAK -+ -+case 50: -+YY_RULE_SETUP -+{ -+ alloc_string(yytext, yyleng); -+ yylval.string = text; -+ return T_ASSIGN_VAL; -+ } -+ YY_BREAK -+case 51: -+/* rule 51 can match eol */ -+YY_RULE_SETUP -+{ BEGIN(INITIAL); return T_EOL; } -+ YY_BREAK -+case 52: -+YY_RULE_SETUP -+ -+ YY_BREAK -+ -+case 53: -+YY_RULE_SETUP -+append_expanded_string(yytext); -+ YY_BREAK -+case 54: -+YY_RULE_SETUP -+{ -+ append_string(yytext, yyleng); -+ } -+ YY_BREAK -+case 55: -+YY_RULE_SETUP -+{ -+ append_string(yytext + 1, yyleng - 1); -+ } -+ YY_BREAK -+case 56: -+YY_RULE_SETUP -+{ -+ if (open_quote == yytext[0]) { -+ BEGIN(INITIAL); -+ yylval.string = text; -+ return T_WORD_QUOTE; -+ } else -+ append_string(yytext, 1); -+ } -+ YY_BREAK -+case 57: -+/* rule 57 can match eol */ -+YY_RULE_SETUP -+{ -+ fprintf(stderr, -+ "%s:%d:warning: multi-line strings not supported\n", -+ cur_filename, cur_lineno); -+ unput('\n'); -+ BEGIN(INITIAL); -+ yylval.string = text; -+ return T_WORD_QUOTE; -+ } -+ YY_BREAK -+case YY_STATE_EOF(STRING): -+{ -+ BEGIN(INITIAL); -+ yylval.string = text; -+ return T_WORD_QUOTE; -+ } -+ YY_BREAK -+ -+case 58: -+YY_RULE_SETUP -+{ -+ int ts, i; -+ -+ ts = 0; -+ for (i = 0; i < yyleng; i++) { -+ if (yytext[i] == '\t') -+ ts = (ts & ~7) + 8; -+ else -+ ts++; -+ } -+ last_ts = ts; -+ if (first_ts) { -+ if (ts < first_ts) { -+ zconf_endhelp(); -+ return T_HELPTEXT; -+ } -+ ts -= first_ts; -+ while (ts > 8) { -+ append_string(" ", 8); -+ ts -= 8; -+ } -+ append_string(" ", ts); -+ } -+ } -+ YY_BREAK -+case 59: -+/* rule 59 can match eol */ -+*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ -+YY_LINENO_REWIND_TO(yy_cp - 1); -+(yy_c_buf_p) = yy_cp -= 1; -+YY_DO_BEFORE_ACTION; /* set up yytext again */ -+YY_RULE_SETUP -+{ -+ zconf_endhelp(); -+ return T_HELPTEXT; -+ } -+ YY_BREAK -+case 60: -+/* rule 60 can match eol */ -+YY_RULE_SETUP -+{ -+ append_string("\n", 1); -+ } -+ YY_BREAK -+case 61: -+YY_RULE_SETUP -+{ -+ while (yyleng) { -+ if ((yytext[yyleng-1] != ' ') && (yytext[yyleng-1] != '\t')) -+ break; -+ yyleng--; -+ } -+ append_string(yytext, yyleng); -+ if (!first_ts) -+ first_ts = last_ts; -+ } -+ YY_BREAK -+case YY_STATE_EOF(HELP): -+{ -+ zconf_endhelp(); -+ return T_HELPTEXT; -+ } -+ YY_BREAK -+ -+case YY_STATE_EOF(INITIAL): -+case YY_STATE_EOF(ASSIGN_VAL): -+{ -+ BEGIN(INITIAL); -+ -+ if (prev_token != T_EOL && prev_token != T_HELPTEXT) -+ fprintf(stderr, "%s:%d:warning: no new line at end of file\n", -+ cur_filename, yylineno); -+ -+ if (current_buf) { -+ zconf_endfile(); -+ return T_EOL; -+ } -+ fclose(yyin); -+ yyterminate(); -+} -+ YY_BREAK -+case 62: -+YY_RULE_SETUP -+YY_FATAL_ERROR( "flex scanner jammed" ); -+ YY_BREAK -+ -+ case YY_END_OF_BUFFER: -+ { -+ /* Amount of text matched not including the EOB char. */ -+ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; -+ -+ /* Undo the effects of YY_DO_BEFORE_ACTION. */ -+ *yy_cp = (yy_hold_char); -+ YY_RESTORE_YY_MORE_OFFSET -+ -+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) -+ { -+ /* We're scanning a new file or input source. It's -+ * possible that this happened because the user -+ * just pointed yyin at a new source and called -+ * yylex(). If so, then we have to assure -+ * consistency between YY_CURRENT_BUFFER and our -+ * globals. Here is the right place to do so, because -+ * this is the first action (other than possibly a -+ * back-up) that will match for the new input source. -+ */ -+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; -+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; -+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; -+ } -+ -+ /* Note that here we test for yy_c_buf_p "<=" to the position -+ * of the first EOB in the buffer, since yy_c_buf_p will -+ * already have been incremented past the NUL character -+ * (since all states make transitions on EOB to the -+ * end-of-buffer state). Contrast this with the test -+ * in input(). -+ */ -+ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) -+ { /* This was really a NUL. */ -+ yy_state_type yy_next_state; -+ -+ (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; -+ -+ yy_current_state = yy_get_previous_state( ); -+ -+ /* Okay, we're now positioned to make the NUL -+ * transition. We couldn't have -+ * yy_get_previous_state() go ahead and do it -+ * for us because it doesn't know how to deal -+ * with the possibility of jamming (and we don't -+ * want to build jamming into it because then it -+ * will run more slowly). -+ */ -+ -+ yy_next_state = yy_try_NUL_trans( yy_current_state ); -+ -+ yy_bp = (yytext_ptr) + YY_MORE_ADJ; -+ -+ if ( yy_next_state ) -+ { -+ /* Consume the NUL. */ -+ yy_cp = ++(yy_c_buf_p); -+ yy_current_state = yy_next_state; -+ goto yy_match; -+ } -+ -+ else -+ { -+ yy_cp = (yy_c_buf_p); -+ goto yy_find_action; -+ } -+ } -+ -+ else switch ( yy_get_next_buffer( ) ) -+ { -+ case EOB_ACT_END_OF_FILE: -+ { -+ (yy_did_buffer_switch_on_eof) = 0; -+ -+ if ( yywrap( ) ) -+ { -+ /* Note: because we've taken care in -+ * yy_get_next_buffer() to have set up -+ * yytext, we can now set up -+ * yy_c_buf_p so that if some total -+ * hoser (like flex itself) wants to -+ * call the scanner after we return the -+ * YY_NULL, it'll still work - another -+ * YY_NULL will get returned. -+ */ -+ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; -+ -+ yy_act = YY_STATE_EOF(YY_START); -+ goto do_action; -+ } -+ -+ else -+ { -+ if ( ! (yy_did_buffer_switch_on_eof) ) -+ YY_NEW_FILE; -+ } -+ break; -+ } -+ -+ case EOB_ACT_CONTINUE_SCAN: -+ (yy_c_buf_p) = -+ (yytext_ptr) + yy_amount_of_matched_text; -+ -+ yy_current_state = yy_get_previous_state( ); -+ -+ yy_cp = (yy_c_buf_p); -+ yy_bp = (yytext_ptr) + YY_MORE_ADJ; -+ goto yy_match; -+ -+ case EOB_ACT_LAST_MATCH: -+ (yy_c_buf_p) = -+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; -+ -+ yy_current_state = yy_get_previous_state( ); -+ -+ yy_cp = (yy_c_buf_p); -+ yy_bp = (yytext_ptr) + YY_MORE_ADJ; -+ goto yy_find_action; -+ } -+ break; -+ } -+ -+ default: -+ YY_FATAL_ERROR( -+ "fatal flex scanner internal error--no action found" ); -+ } /* end of action switch */ -+ } /* end of scanning one token */ -+ } /* end of user's declarations */ -+} /* end of yylex */ -+ -+/* yy_get_next_buffer - try to read in a new buffer -+ * -+ * Returns a code representing an action: -+ * EOB_ACT_LAST_MATCH - -+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position -+ * EOB_ACT_END_OF_FILE - end of file -+ */ -+static int yy_get_next_buffer (void) -+{ -+ char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; -+ char *source = (yytext_ptr); -+ int number_to_move, i; -+ int ret_val; -+ -+ if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) -+ YY_FATAL_ERROR( -+ "fatal flex scanner internal error--end of buffer missed" ); -+ -+ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) -+ { /* Don't try to fill the buffer, so this is an EOF. */ -+ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) -+ { -+ /* We matched a single character, the EOB, so -+ * treat this as a final EOF. -+ */ -+ return EOB_ACT_END_OF_FILE; -+ } -+ -+ else -+ { -+ /* We matched some text prior to the EOB, first -+ * process it. -+ */ -+ return EOB_ACT_LAST_MATCH; -+ } -+ } -+ -+ /* Try to read more data. */ -+ -+ /* First move last chars to start of buffer. */ -+ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1); -+ -+ for ( i = 0; i < number_to_move; ++i ) -+ *(dest++) = *(source++); -+ -+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) -+ /* don't do the read, it's not guaranteed to return an EOF, -+ * just force an EOF -+ */ -+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; -+ -+ else -+ { -+ int num_to_read = -+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; -+ -+ while ( num_to_read <= 0 ) -+ { /* Not enough room in the buffer - grow it. */ -+ -+ /* just a shorter name for the current buffer */ -+ YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; -+ -+ int yy_c_buf_p_offset = -+ (int) ((yy_c_buf_p) - b->yy_ch_buf); -+ -+ if ( b->yy_is_our_buffer ) -+ { -+ int new_size = b->yy_buf_size * 2; -+ -+ if ( new_size <= 0 ) -+ b->yy_buf_size += b->yy_buf_size / 8; -+ else -+ b->yy_buf_size *= 2; -+ -+ b->yy_ch_buf = (char *) -+ /* Include room in for 2 EOB chars. */ -+ yyrealloc( (void *) b->yy_ch_buf, -+ (yy_size_t) (b->yy_buf_size + 2) ); -+ } -+ else -+ /* Can't grow it, we don't own it. */ -+ b->yy_ch_buf = NULL; -+ -+ if ( ! b->yy_ch_buf ) -+ YY_FATAL_ERROR( -+ "fatal error - scanner input buffer overflow" ); -+ -+ (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; -+ -+ num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - -+ number_to_move - 1; -+ -+ } -+ -+ if ( num_to_read > YY_READ_BUF_SIZE ) -+ num_to_read = YY_READ_BUF_SIZE; -+ -+ /* Read in more data. */ -+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), -+ (yy_n_chars), num_to_read ); -+ -+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); -+ } -+ -+ if ( (yy_n_chars) == 0 ) -+ { -+ if ( number_to_move == YY_MORE_ADJ ) -+ { -+ ret_val = EOB_ACT_END_OF_FILE; -+ yyrestart( yyin ); -+ } -+ -+ else -+ { -+ ret_val = EOB_ACT_LAST_MATCH; -+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = -+ YY_BUFFER_EOF_PENDING; -+ } -+ } -+ -+ else -+ ret_val = EOB_ACT_CONTINUE_SCAN; -+ -+ if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { -+ /* Extend the array by 50%, plus the number we really need. */ -+ int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); -+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc( -+ (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size ); -+ if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) -+ YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); -+ /* "- 2" to take care of EOB's */ -+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2); -+ } -+ -+ (yy_n_chars) += number_to_move; -+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; -+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; -+ -+ (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; -+ -+ return ret_val; -+} -+ -+/* yy_get_previous_state - get the state just before the EOB char was reached */ -+ -+ static yy_state_type yy_get_previous_state (void) -+{ -+ yy_state_type yy_current_state; -+ char *yy_cp; -+ -+ yy_current_state = (yy_start); -+ -+ for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) -+ { -+ yy_current_state = yy_nxt[yy_current_state][(*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1)]; -+ } -+ -+ return yy_current_state; -+} -+ -+/* yy_try_NUL_trans - try to make a transition on the NUL character -+ * -+ * synopsis -+ * next_state = yy_try_NUL_trans( current_state ); -+ */ -+ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) -+{ -+ int yy_is_jam; -+ -+ yy_current_state = yy_nxt[yy_current_state][1]; -+ yy_is_jam = (yy_current_state <= 0); -+ -+ return yy_is_jam ? 0 : yy_current_state; -+} -+ -+#ifndef YY_NO_UNPUT -+ -+ static void yyunput (int c, char * yy_bp ) -+{ -+ char *yy_cp; -+ -+ yy_cp = (yy_c_buf_p); -+ -+ /* undo effects of setting up yytext */ -+ *yy_cp = (yy_hold_char); -+ -+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) -+ { /* need to shift things up to make room */ -+ /* +2 for EOB chars. */ -+ int number_to_move = (yy_n_chars) + 2; -+ char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ -+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; -+ char *source = -+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; -+ -+ while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) -+ *--dest = *--source; -+ -+ yy_cp += (int) (dest - source); -+ yy_bp += (int) (dest - source); -+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = -+ (yy_n_chars) = (int) YY_CURRENT_BUFFER_LVALUE->yy_buf_size; -+ -+ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) -+ YY_FATAL_ERROR( "flex scanner push-back overflow" ); -+ } -+ -+ *--yy_cp = (char) c; -+ -+ if ( c == '\n' ){ -+ --yylineno; -+ } -+ -+ (yytext_ptr) = yy_bp; -+ (yy_hold_char) = *yy_cp; -+ (yy_c_buf_p) = yy_cp; -+} -+ -+#endif -+ -+#ifndef YY_NO_INPUT -+#ifdef __cplusplus -+ static int yyinput (void) -+#else -+ static int input (void) -+#endif -+ -+{ -+ int c; -+ -+ *(yy_c_buf_p) = (yy_hold_char); -+ -+ if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) -+ { -+ /* yy_c_buf_p now points to the character we want to return. -+ * If this occurs *before* the EOB characters, then it's a -+ * valid NUL; if not, then we've hit the end of the buffer. -+ */ -+ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) -+ /* This was really a NUL. */ -+ *(yy_c_buf_p) = '\0'; -+ -+ else -+ { /* need more input */ -+ int offset = (int) ((yy_c_buf_p) - (yytext_ptr)); -+ ++(yy_c_buf_p); -+ -+ switch ( yy_get_next_buffer( ) ) -+ { -+ case EOB_ACT_LAST_MATCH: -+ /* This happens because yy_g_n_b() -+ * sees that we've accumulated a -+ * token and flags that we need to -+ * try matching the token before -+ * proceeding. But for input(), -+ * there's no matching to consider. -+ * So convert the EOB_ACT_LAST_MATCH -+ * to EOB_ACT_END_OF_FILE. -+ */ -+ -+ /* Reset buffer status. */ -+ yyrestart( yyin ); -+ -+ /*FALLTHROUGH*/ -+ -+ case EOB_ACT_END_OF_FILE: -+ { -+ if ( yywrap( ) ) -+ return 0; -+ -+ if ( ! (yy_did_buffer_switch_on_eof) ) -+ YY_NEW_FILE; -+#ifdef __cplusplus -+ return yyinput(); -+#else -+ return input(); -+#endif -+ } -+ -+ case EOB_ACT_CONTINUE_SCAN: -+ (yy_c_buf_p) = (yytext_ptr) + offset; -+ break; -+ } -+ } -+ } -+ -+ c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ -+ *(yy_c_buf_p) = '\0'; /* preserve yytext */ -+ (yy_hold_char) = *++(yy_c_buf_p); -+ -+ if ( c == '\n' ) -+ -+ yylineno++; -+; -+ -+ return c; -+} -+#endif /* ifndef YY_NO_INPUT */ -+ -+/** Immediately switch to a different input stream. -+ * @param input_file A readable stream. -+ * -+ * @note This function does not reset the start condition to @c INITIAL . -+ */ -+ void yyrestart (FILE * input_file ) -+{ -+ -+ if ( ! YY_CURRENT_BUFFER ){ -+ yyensure_buffer_stack (); -+ YY_CURRENT_BUFFER_LVALUE = -+ yy_create_buffer( yyin, YY_BUF_SIZE ); -+ } -+ -+ yy_init_buffer( YY_CURRENT_BUFFER, input_file ); -+ yy_load_buffer_state( ); -+} -+ -+/** Switch to a different input buffer. -+ * @param new_buffer The new input buffer. -+ * -+ */ -+ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) -+{ -+ -+ /* TODO. We should be able to replace this entire function body -+ * with -+ * yypop_buffer_state(); -+ * yypush_buffer_state(new_buffer); -+ */ -+ yyensure_buffer_stack (); -+ if ( YY_CURRENT_BUFFER == new_buffer ) -+ return; -+ -+ if ( YY_CURRENT_BUFFER ) -+ { -+ /* Flush out information for old buffer. */ -+ *(yy_c_buf_p) = (yy_hold_char); -+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); -+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); -+ } -+ -+ YY_CURRENT_BUFFER_LVALUE = new_buffer; -+ yy_load_buffer_state( ); -+ -+ /* We don't actually know whether we did this switch during -+ * EOF (yywrap()) processing, but the only time this flag -+ * is looked at is after yywrap() is called, so it's safe -+ * to go ahead and always set it. -+ */ -+ (yy_did_buffer_switch_on_eof) = 1; -+} -+ -+static void yy_load_buffer_state (void) -+{ -+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; -+ (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; -+ yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; -+ (yy_hold_char) = *(yy_c_buf_p); -+} -+ -+/** Allocate and initialize an input buffer state. -+ * @param file A readable stream. -+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. -+ * -+ * @return the allocated buffer state. -+ */ -+ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) -+{ -+ YY_BUFFER_STATE b; -+ -+ b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) ); -+ if ( ! b ) -+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); -+ -+ b->yy_buf_size = size; -+ -+ /* yy_ch_buf has to be 2 characters longer than the size given because -+ * we need to put in 2 end-of-buffer characters. -+ */ -+ b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) ); -+ if ( ! b->yy_ch_buf ) -+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); -+ -+ b->yy_is_our_buffer = 1; -+ -+ yy_init_buffer( b, file ); -+ -+ return b; -+} -+ -+/** Destroy the buffer. -+ * @param b a buffer created with yy_create_buffer() -+ * -+ */ -+ void yy_delete_buffer (YY_BUFFER_STATE b ) -+{ -+ -+ if ( ! b ) -+ return; -+ -+ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ -+ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; -+ -+ if ( b->yy_is_our_buffer ) -+ yyfree( (void *) b->yy_ch_buf ); -+ -+ yyfree( (void *) b ); -+} -+ -+/* Initializes or reinitializes a buffer. -+ * This function is sometimes called more than once on the same buffer, -+ * such as during a yyrestart() or at EOF. -+ */ -+ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) -+ -+{ -+ int oerrno = errno; -+ -+ yy_flush_buffer( b ); -+ -+ b->yy_input_file = file; -+ b->yy_fill_buffer = 1; -+ -+ /* If b is the current buffer, then yy_init_buffer was _probably_ -+ * called from yyrestart() or through yy_get_next_buffer. -+ * In that case, we don't want to reset the lineno or column. -+ */ -+ if (b != YY_CURRENT_BUFFER){ -+ b->yy_bs_lineno = 1; -+ b->yy_bs_column = 0; -+ } -+ -+ b->yy_is_interactive = 0; -+ -+ errno = oerrno; -+} -+ -+/** Discard all buffered characters. On the next scan, YY_INPUT will be called. -+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. -+ * -+ */ -+ void yy_flush_buffer (YY_BUFFER_STATE b ) -+{ -+ if ( ! b ) -+ return; -+ -+ b->yy_n_chars = 0; -+ -+ /* We always need two end-of-buffer characters. The first causes -+ * a transition to the end-of-buffer state. The second causes -+ * a jam in that state. -+ */ -+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; -+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; -+ -+ b->yy_buf_pos = &b->yy_ch_buf[0]; -+ -+ b->yy_at_bol = 1; -+ b->yy_buffer_status = YY_BUFFER_NEW; -+ -+ if ( b == YY_CURRENT_BUFFER ) -+ yy_load_buffer_state( ); -+} -+ -+/** Pushes the new state onto the stack. The new state becomes -+ * the current state. This function will allocate the stack -+ * if necessary. -+ * @param new_buffer The new state. -+ * -+ */ -+void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) -+{ -+ if (new_buffer == NULL) -+ return; -+ -+ yyensure_buffer_stack(); -+ -+ /* This block is copied from yy_switch_to_buffer. */ -+ if ( YY_CURRENT_BUFFER ) -+ { -+ /* Flush out information for old buffer. */ -+ *(yy_c_buf_p) = (yy_hold_char); -+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); -+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); -+ } -+ -+ /* Only push if top exists. Otherwise, replace top. */ -+ if (YY_CURRENT_BUFFER) -+ (yy_buffer_stack_top)++; -+ YY_CURRENT_BUFFER_LVALUE = new_buffer; -+ -+ /* copied from yy_switch_to_buffer. */ -+ yy_load_buffer_state( ); -+ (yy_did_buffer_switch_on_eof) = 1; -+} -+ -+/** Removes and deletes the top of the stack, if present. -+ * The next element becomes the new top. -+ * -+ */ -+void yypop_buffer_state (void) -+{ -+ if (!YY_CURRENT_BUFFER) -+ return; -+ -+ yy_delete_buffer(YY_CURRENT_BUFFER ); -+ YY_CURRENT_BUFFER_LVALUE = NULL; -+ if ((yy_buffer_stack_top) > 0) -+ --(yy_buffer_stack_top); -+ -+ if (YY_CURRENT_BUFFER) { -+ yy_load_buffer_state( ); -+ (yy_did_buffer_switch_on_eof) = 1; -+ } -+} -+ -+/* Allocates the stack if it does not exist. -+ * Guarantees space for at least one push. -+ */ -+static void yyensure_buffer_stack (void) -+{ -+ yy_size_t num_to_alloc; -+ -+ if (!(yy_buffer_stack)) { -+ -+ /* First allocation is just for 2 elements, since we don't know if this -+ * scanner will even need a stack. We use 2 instead of 1 to avoid an -+ * immediate realloc on the next call. -+ */ -+ num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ -+ (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc -+ (num_to_alloc * sizeof(struct yy_buffer_state*) -+ ); -+ if ( ! (yy_buffer_stack) ) -+ YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); -+ -+ memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); -+ -+ (yy_buffer_stack_max) = num_to_alloc; -+ (yy_buffer_stack_top) = 0; -+ return; -+ } -+ -+ if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ -+ -+ /* Increase the buffer to prepare for a possible push. */ -+ yy_size_t grow_size = 8 /* arbitrary grow size */; -+ -+ num_to_alloc = (yy_buffer_stack_max) + grow_size; -+ (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc -+ ((yy_buffer_stack), -+ num_to_alloc * sizeof(struct yy_buffer_state*) -+ ); -+ if ( ! (yy_buffer_stack) ) -+ YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); -+ -+ /* zero only the new slots.*/ -+ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); -+ (yy_buffer_stack_max) = num_to_alloc; -+ } -+} -+ -+/** Setup the input buffer state to scan directly from a user-specified character buffer. -+ * @param base the character buffer -+ * @param size the size in bytes of the character buffer -+ * -+ * @return the newly allocated buffer state object. -+ */ -+YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) -+{ -+ YY_BUFFER_STATE b; -+ -+ if ( size < 2 || -+ base[size-2] != YY_END_OF_BUFFER_CHAR || -+ base[size-1] != YY_END_OF_BUFFER_CHAR ) -+ /* They forgot to leave room for the EOB's. */ -+ return NULL; -+ -+ b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) ); -+ if ( ! b ) -+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); -+ -+ b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */ -+ b->yy_buf_pos = b->yy_ch_buf = base; -+ b->yy_is_our_buffer = 0; -+ b->yy_input_file = NULL; -+ b->yy_n_chars = b->yy_buf_size; -+ b->yy_is_interactive = 0; -+ b->yy_at_bol = 1; -+ b->yy_fill_buffer = 0; -+ b->yy_buffer_status = YY_BUFFER_NEW; -+ -+ yy_switch_to_buffer( b ); -+ -+ return b; -+} -+ -+/** Setup the input buffer state to scan a string. The next call to yylex() will -+ * scan from a @e copy of @a str. -+ * @param yystr a NUL-terminated string to scan -+ * -+ * @return the newly allocated buffer state object. -+ * @note If you want to scan bytes that may contain NUL values, then use -+ * yy_scan_bytes() instead. -+ */ -+YY_BUFFER_STATE yy_scan_string (const char * yystr ) -+{ -+ -+ return yy_scan_bytes( yystr, (int) strlen(yystr) ); -+} -+ -+/** Setup the input buffer state to scan the given bytes. The next call to yylex() will -+ * scan from a @e copy of @a bytes. -+ * @param yybytes the byte buffer to scan -+ * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. -+ * -+ * @return the newly allocated buffer state object. -+ */ -+YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, int _yybytes_len ) -+{ -+ YY_BUFFER_STATE b; -+ char *buf; -+ yy_size_t n; -+ int i; -+ -+ /* Get memory for full buffer, including space for trailing EOB's. */ -+ n = (yy_size_t) (_yybytes_len + 2); -+ buf = (char *) yyalloc( n ); -+ if ( ! buf ) -+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); -+ -+ for ( i = 0; i < _yybytes_len; ++i ) -+ buf[i] = yybytes[i]; -+ -+ buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; -+ -+ b = yy_scan_buffer( buf, n ); -+ if ( ! b ) -+ YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); -+ -+ /* It's okay to grow etc. this buffer, and we should throw it -+ * away when we're done. -+ */ -+ b->yy_is_our_buffer = 1; -+ -+ return b; -+} -+ -+#ifndef YY_EXIT_FAILURE -+#define YY_EXIT_FAILURE 2 -+#endif -+ -+static void yynoreturn yy_fatal_error (const char* msg ) -+{ -+ fprintf( stderr, "%s\n", msg ); -+ exit( YY_EXIT_FAILURE ); -+} -+ -+/* Redefine yyless() so it works in section 3 code. */ -+ -+#undef yyless -+#define yyless(n) \ -+ do \ -+ { \ -+ /* Undo effects of setting up yytext. */ \ -+ int yyless_macro_arg = (n); \ -+ YY_LESS_LINENO(yyless_macro_arg);\ -+ yytext[yyleng] = (yy_hold_char); \ -+ (yy_c_buf_p) = yytext + yyless_macro_arg; \ -+ (yy_hold_char) = *(yy_c_buf_p); \ -+ *(yy_c_buf_p) = '\0'; \ -+ yyleng = yyless_macro_arg; \ -+ } \ -+ while ( 0 ) -+ -+/* Accessor methods (get/set functions) to struct members. */ -+ -+/** Get the current line number. -+ * -+ */ -+int yyget_lineno (void) -+{ -+ -+ return yylineno; -+} -+ -+/** Get the input stream. -+ * -+ */ -+FILE *yyget_in (void) -+{ -+ return yyin; -+} -+ -+/** Get the output stream. -+ * -+ */ -+FILE *yyget_out (void) -+{ -+ return yyout; -+} -+ -+/** Get the length of the current token. -+ * -+ */ -+int yyget_leng (void) -+{ -+ return yyleng; -+} -+ -+/** Get the current token. -+ * -+ */ -+ -+char *yyget_text (void) -+{ -+ return yytext; -+} -+ -+/** Set the current line number. -+ * @param _line_number line number -+ * -+ */ -+void yyset_lineno (int _line_number ) -+{ -+ -+ yylineno = _line_number; -+} -+ -+/** Set the input stream. This does not discard the current -+ * input buffer. -+ * @param _in_str A readable stream. -+ * -+ * @see yy_switch_to_buffer -+ */ -+void yyset_in (FILE * _in_str ) -+{ -+ yyin = _in_str ; -+} -+ -+void yyset_out (FILE * _out_str ) -+{ -+ yyout = _out_str ; -+} -+ -+int yyget_debug (void) -+{ -+ return yy_flex_debug; -+} -+ -+void yyset_debug (int _bdebug ) -+{ -+ yy_flex_debug = _bdebug ; -+} -+ -+static int yy_init_globals (void) -+{ -+ /* Initialization is the same as for the non-reentrant scanner. -+ * This function is called from yylex_destroy(), so don't allocate here. -+ */ -+ -+ /* We do not touch yylineno unless the option is enabled. */ -+ yylineno = 1; -+ -+ (yy_buffer_stack) = NULL; -+ (yy_buffer_stack_top) = 0; -+ (yy_buffer_stack_max) = 0; -+ (yy_c_buf_p) = NULL; -+ (yy_init) = 0; -+ (yy_start) = 0; -+ -+/* Defined in main.c */ -+#ifdef YY_STDINIT -+ yyin = stdin; -+ yyout = stdout; -+#else -+ yyin = NULL; -+ yyout = NULL; -+#endif -+ -+ /* For future reference: Set errno on error, since we are called by -+ * yylex_init() -+ */ -+ return 0; -+} -+ -+/* yylex_destroy is for both reentrant and non-reentrant scanners. */ -+int yylex_destroy (void) -+{ -+ -+ /* Pop the buffer stack, destroying each element. */ -+ while(YY_CURRENT_BUFFER){ -+ yy_delete_buffer( YY_CURRENT_BUFFER ); -+ YY_CURRENT_BUFFER_LVALUE = NULL; -+ yypop_buffer_state(); -+ } -+ -+ /* Destroy the stack itself. */ -+ yyfree((yy_buffer_stack) ); -+ (yy_buffer_stack) = NULL; -+ -+ /* Reset the globals. This is important in a non-reentrant scanner so the next time -+ * yylex() is called, initialization will occur. */ -+ yy_init_globals( ); -+ -+ return 0; -+} -+ -+/* -+ * Internal utility routines. -+ */ -+ -+#ifndef yytext_ptr -+static void yy_flex_strncpy (char* s1, const char * s2, int n ) -+{ -+ -+ int i; -+ for ( i = 0; i < n; ++i ) -+ s1[i] = s2[i]; -+} -+#endif -+ -+#ifdef YY_NEED_STRLEN -+static int yy_flex_strlen (const char * s ) -+{ -+ int n; -+ for ( n = 0; s[n]; ++n ) -+ ; -+ -+ return n; -+} -+#endif -+ -+void *yyalloc (yy_size_t size ) -+{ -+ return malloc(size); -+} -+ -+void *yyrealloc (void * ptr, yy_size_t size ) -+{ -+ -+ /* The cast to (char *) in the following accommodates both -+ * implementations that use char* generic pointers, and those -+ * that use void* generic pointers. It works with the latter -+ * because both ANSI C and C++ allow castless assignment from -+ * any pointer type to void*, and deal with argument conversions -+ * as though doing an assignment. -+ */ -+ return realloc(ptr, size); -+} -+ -+void yyfree (void * ptr ) -+{ -+ free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ -+} -+ -+#define YYTABLES_NAME "yytables" -+ -+/* second stage lexer */ -+int yylex(void) -+{ -+ int token; -+ -+repeat: -+ token = yylex1(); -+ -+ if (prev_token == T_EOL || prev_token == T_HELPTEXT) { -+ if (token == T_EOL) -+ /* Do not pass unneeded T_EOL to the parser. */ -+ goto repeat; -+ else -+ /* -+ * For the parser, update lineno at the first token -+ * of each statement. Generally, \n is a statement -+ * terminator in Kconfig, but it is not always true -+ * because \n could be escaped by a backslash. -+ */ -+ cur_lineno = yylineno; -+ } -+ -+ if (prev_prev_token == T_EOL && prev_token == T_WORD && -+ (token == T_EQUAL || token == T_COLON_EQUAL || token == T_PLUS_EQUAL)) -+ BEGIN(ASSIGN_VAL); -+ -+ prev_prev_token = prev_token; -+ prev_token = token; -+ -+ return token; -+} -+ -+static char *expand_token(const char *in, size_t n) -+{ -+ char *out; -+ int c; -+ char c2; -+ const char *rest, *end; -+ -+ new_string(); -+ append_string(in, n); -+ -+ /* -+ * get the whole line because we do not know the end of token. -+ * input() returns 0 (not EOF!) when it reachs the end of file. -+ */ -+ while ((c = input()) != 0) { -+ if (c == '\n') { -+ unput(c); -+ break; -+ } -+ c2 = c; -+ append_string(&c2, 1); -+ } -+ -+ rest = text; -+ out = expand_one_token(&rest); -+ -+ /* push back unused characters to the input stream */ -+ end = rest + strlen(rest); -+ while (end > rest) -+ unput(*--end); -+ -+ free(text); -+ -+ return out; -+} -+ -+static void append_expanded_string(const char *str) -+{ -+ const char *end; -+ char *res; -+ -+ str++; -+ -+ res = expand_dollar(&str); -+ -+ /* push back unused characters to the input stream */ -+ end = str + strlen(str); -+ while (end > str) -+ unput(*--end); -+ -+ append_string(res, strlen(res)); -+ -+ free(res); -+} -+ -+void zconf_starthelp(void) -+{ -+ new_string(); -+ last_ts = first_ts = 0; -+ BEGIN(HELP); -+} -+ -+static void zconf_endhelp(void) -+{ -+ yylval.string = text; -+ BEGIN(INITIAL); -+} -+ -+/* -+ * Try to open specified file with following names: -+ * ./name -+ * $(srctree)/name -+ * The latter is used when srctree is separate from objtree -+ * when compiling the kernel. -+ * Return NULL if file is not found. -+ */ -+FILE *zconf_fopen(const char *name) -+{ -+ char *env, fullname[PATH_MAX+1]; -+ FILE *f; -+ -+ f = fopen(name, "r"); -+ if (!f && name != NULL && name[0] != '/') { -+ env = getenv(SRCTREE); -+ if (env) { -+ snprintf(fullname, sizeof(fullname), -+ "%s/%s", env, name); -+ f = fopen(fullname, "r"); -+ } -+ } -+ return f; -+} -+ -+void zconf_initscan(const char *name) -+{ -+ yyin = zconf_fopen(name); -+ if (!yyin) { -+ fprintf(stderr, "can't find file %s\n", name); -+ exit(1); -+ } -+ -+ cur_filename = file_lookup(name); -+ yylineno = 1; -+} -+ -+void zconf_nextfile(const char *name) -+{ -+ struct buffer *buf = xmalloc(sizeof(*buf)); -+ bool recur_include = false; -+ -+ buf->state = YY_CURRENT_BUFFER; -+ buf->yylineno = yylineno; -+ buf->filename = cur_filename; -+ buf->source_lineno = cur_lineno; -+ buf->parent = current_buf; -+ current_buf = buf; -+ yyin = zconf_fopen(name); -+ if (!yyin) { -+ fprintf(stderr, "%s:%d: can't open file \"%s\"\n", -+ cur_filename, cur_lineno, name); -+ exit(1); -+ } -+ yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE)); -+ -+ for (buf = current_buf; buf; buf = buf->parent) { -+ if (!strcmp(buf->filename, name)) -+ recur_include = true; -+ } -+ -+ if (recur_include) { -+ fprintf(stderr, -+ "Recursive inclusion detected.\n" -+ "Inclusion path:\n" -+ " current file : %s\n", name); -+ -+ for (buf = current_buf; buf; buf = buf->parent) -+ fprintf(stderr, " included from: %s:%d\n", -+ buf->filename, buf->source_lineno); -+ exit(1); -+ } -+ -+ yylineno = 1; -+ cur_filename = file_lookup(name); -+} -+ -+static void zconf_endfile(void) -+{ -+ struct buffer *tmp; -+ -+ fclose(yyin); -+ yy_delete_buffer(YY_CURRENT_BUFFER); -+ yy_switch_to_buffer(current_buf->state); -+ yylineno = current_buf->yylineno; -+ cur_filename = current_buf->filename; -+ tmp = current_buf; -+ current_buf = current_buf->parent; -+ free(tmp); -+} -+ diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0006-tty_flip.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0012-tty_flip.h.patch similarity index 73% rename from build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0006-tty_flip.h.patch rename to build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0012-tty_flip.h.patch index 15feec9..68e98cf 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0006-tty_flip.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0012-tty_flip.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/include/linux/tty_flip.h 2026-03-23 18:27:18.051337836 +0100 -+++ ./include/linux/tty_flip.h 2026-03-13 13:24:37.106929020 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/include/linux/tty_flip.h 2024-11-17 23:15:08.000000000 +0100 ++++ ./include/linux/tty_flip.h 2025-08-29 08:46:41.279848444 +0200 @@ -5,6 +5,10 @@ #include #include diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0007-main.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0013-main.c.patch similarity index 71% rename from build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0007-main.c.patch rename to build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0013-main.c.patch index b29f282..27a8824 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0007-main.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0013-main.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/init/main.c 2026-03-23 18:27:18.137885491 +0100 -+++ ./init/main.c 2026-03-13 13:24:37.036201866 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/init/main.c 2024-11-17 23:15:08.000000000 +0100 ++++ ./init/main.c 2025-08-29 08:46:41.312755195 +0200 @@ -109,6 +109,10 @@ #include #include diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0013-parser.tab.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0013-parser.tab.c.patch deleted file mode 100644 index aeead48..0000000 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0013-parser.tab.c.patch +++ /dev/null @@ -1,2228 +0,0 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/scripts/kconfig/parser.tab.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./scripts/kconfig/parser.tab.c 2026-03-23 18:27:35.954815135 +0100 -@@ -0,0 +1,2225 @@ -+/* A Bison parser, made by GNU Bison 3.8.2. */ -+ -+/* Bison implementation for Yacc-like parsers in C -+ -+ Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation, -+ Inc. -+ -+ This program is free software: you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation, either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+/* As a special exception, you may create a larger work that contains -+ part or all of the Bison parser skeleton and distribute that work -+ under terms of your choice, so long as that work isn't itself a -+ parser generator using the skeleton or a modified version thereof -+ as a parser skeleton. Alternatively, if you modify or redistribute -+ the parser skeleton itself, you may (at your option) remove this -+ special exception, which will cause the skeleton and the resulting -+ Bison output files to be licensed under the GNU General Public -+ License without this special exception. -+ -+ This special exception was added by the Free Software Foundation in -+ version 2.2 of Bison. */ -+ -+/* C LALR(1) parser skeleton written by Richard Stallman, by -+ simplifying the original so-called "semantic" parser. */ -+ -+/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, -+ especially those whose name start with YY_ or yy_. They are -+ private implementation details that can be changed or removed. */ -+ -+/* All symbols defined below should begin with yy or YY, to avoid -+ infringing on user name space. This should be done even for local -+ variables, as they might otherwise be expanded by user macros. -+ There are some unavoidable exceptions within include files to -+ define necessary library symbols; they are noted "INFRINGES ON -+ USER NAME SPACE" below. */ -+ -+/* Identify Bison output, and Bison version. */ -+#define YYBISON 30802 -+ -+/* Bison version string. */ -+#define YYBISON_VERSION "3.8.2" -+ -+/* Skeleton name. */ -+#define YYSKELETON_NAME "yacc.c" -+ -+/* Pure parsers. */ -+#define YYPURE 0 -+ -+/* Push parsers. */ -+#define YYPUSH 0 -+ -+/* Pull parsers. */ -+#define YYPULL 1 -+ -+ -+ -+ -+/* First part of user prologue. */ -+ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include "lkc.h" -+#include "internal.h" -+#include "preprocess.h" -+ -+#define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt) -+ -+#define PRINTD 0x0001 -+#define DEBUG_PARSE 0x0002 -+ -+int cdebug = PRINTD; -+ -+static void yyerror(const char *err); -+static void zconfprint(const char *err, ...); -+static void zconf_error(const char *err, ...); -+static bool zconf_endtoken(const char *tokenname, -+ const char *expected_tokenname); -+ -+struct menu *current_menu, *current_entry, *current_choice; -+ -+ -+ -+# ifndef YY_CAST -+# ifdef __cplusplus -+# define YY_CAST(Type, Val) static_cast (Val) -+# define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast (Val) -+# else -+# define YY_CAST(Type, Val) ((Type) (Val)) -+# define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val)) -+# endif -+# endif -+# ifndef YY_NULLPTR -+# if defined __cplusplus -+# if 201103L <= __cplusplus -+# define YY_NULLPTR nullptr -+# else -+# define YY_NULLPTR 0 -+# endif -+# else -+# define YY_NULLPTR ((void*)0) -+# endif -+# endif -+ -+#include "parser.tab.h" -+/* Symbol kind. */ -+enum yysymbol_kind_t -+{ -+ YYSYMBOL_YYEMPTY = -2, -+ YYSYMBOL_YYEOF = 0, /* "end of file" */ -+ YYSYMBOL_YYerror = 1, /* error */ -+ YYSYMBOL_YYUNDEF = 2, /* "invalid token" */ -+ YYSYMBOL_T_HELPTEXT = 3, /* T_HELPTEXT */ -+ YYSYMBOL_T_WORD = 4, /* T_WORD */ -+ YYSYMBOL_T_WORD_QUOTE = 5, /* T_WORD_QUOTE */ -+ YYSYMBOL_T_BOOL = 6, /* T_BOOL */ -+ YYSYMBOL_T_CHOICE = 7, /* T_CHOICE */ -+ YYSYMBOL_T_CLOSE_PAREN = 8, /* T_CLOSE_PAREN */ -+ YYSYMBOL_T_COLON_EQUAL = 9, /* T_COLON_EQUAL */ -+ YYSYMBOL_T_COMMENT = 10, /* T_COMMENT */ -+ YYSYMBOL_T_CONFIG = 11, /* T_CONFIG */ -+ YYSYMBOL_T_DEFAULT = 12, /* T_DEFAULT */ -+ YYSYMBOL_T_DEF_BOOL = 13, /* T_DEF_BOOL */ -+ YYSYMBOL_T_DEF_TRISTATE = 14, /* T_DEF_TRISTATE */ -+ YYSYMBOL_T_DEPENDS = 15, /* T_DEPENDS */ -+ YYSYMBOL_T_ENDCHOICE = 16, /* T_ENDCHOICE */ -+ YYSYMBOL_T_ENDIF = 17, /* T_ENDIF */ -+ YYSYMBOL_T_ENDMENU = 18, /* T_ENDMENU */ -+ YYSYMBOL_T_HELP = 19, /* T_HELP */ -+ YYSYMBOL_T_HEX = 20, /* T_HEX */ -+ YYSYMBOL_T_IF = 21, /* T_IF */ -+ YYSYMBOL_T_IMPLY = 22, /* T_IMPLY */ -+ YYSYMBOL_T_INT = 23, /* T_INT */ -+ YYSYMBOL_T_MAINMENU = 24, /* T_MAINMENU */ -+ YYSYMBOL_T_MENU = 25, /* T_MENU */ -+ YYSYMBOL_T_MENUCONFIG = 26, /* T_MENUCONFIG */ -+ YYSYMBOL_T_MODULES = 27, /* T_MODULES */ -+ YYSYMBOL_T_ON = 28, /* T_ON */ -+ YYSYMBOL_T_OPEN_PAREN = 29, /* T_OPEN_PAREN */ -+ YYSYMBOL_T_PLUS_EQUAL = 30, /* T_PLUS_EQUAL */ -+ YYSYMBOL_T_PROMPT = 31, /* T_PROMPT */ -+ YYSYMBOL_T_RANGE = 32, /* T_RANGE */ -+ YYSYMBOL_T_SELECT = 33, /* T_SELECT */ -+ YYSYMBOL_T_SOURCE = 34, /* T_SOURCE */ -+ YYSYMBOL_T_STRING = 35, /* T_STRING */ -+ YYSYMBOL_T_TRISTATE = 36, /* T_TRISTATE */ -+ YYSYMBOL_T_VISIBLE = 37, /* T_VISIBLE */ -+ YYSYMBOL_T_EOL = 38, /* T_EOL */ -+ YYSYMBOL_T_ASSIGN_VAL = 39, /* T_ASSIGN_VAL */ -+ YYSYMBOL_T_OR = 40, /* T_OR */ -+ YYSYMBOL_T_AND = 41, /* T_AND */ -+ YYSYMBOL_T_EQUAL = 42, /* T_EQUAL */ -+ YYSYMBOL_T_UNEQUAL = 43, /* T_UNEQUAL */ -+ YYSYMBOL_T_LESS = 44, /* T_LESS */ -+ YYSYMBOL_T_LESS_EQUAL = 45, /* T_LESS_EQUAL */ -+ YYSYMBOL_T_GREATER = 46, /* T_GREATER */ -+ YYSYMBOL_T_GREATER_EQUAL = 47, /* T_GREATER_EQUAL */ -+ YYSYMBOL_T_NOT = 48, /* T_NOT */ -+ YYSYMBOL_YYACCEPT = 49, /* $accept */ -+ YYSYMBOL_input = 50, /* input */ -+ YYSYMBOL_mainmenu_stmt = 51, /* mainmenu_stmt */ -+ YYSYMBOL_stmt_list = 52, /* stmt_list */ -+ YYSYMBOL_stmt_list_in_choice = 53, /* stmt_list_in_choice */ -+ YYSYMBOL_config_entry_start = 54, /* config_entry_start */ -+ YYSYMBOL_config_stmt = 55, /* config_stmt */ -+ YYSYMBOL_menuconfig_entry_start = 56, /* menuconfig_entry_start */ -+ YYSYMBOL_menuconfig_stmt = 57, /* menuconfig_stmt */ -+ YYSYMBOL_config_option_list = 58, /* config_option_list */ -+ YYSYMBOL_config_option = 59, /* config_option */ -+ YYSYMBOL_choice = 60, /* choice */ -+ YYSYMBOL_choice_entry = 61, /* choice_entry */ -+ YYSYMBOL_choice_end = 62, /* choice_end */ -+ YYSYMBOL_choice_stmt = 63, /* choice_stmt */ -+ YYSYMBOL_choice_option_list = 64, /* choice_option_list */ -+ YYSYMBOL_choice_option = 65, /* choice_option */ -+ YYSYMBOL_type = 66, /* type */ -+ YYSYMBOL_default = 67, /* default */ -+ YYSYMBOL_if_entry = 68, /* if_entry */ -+ YYSYMBOL_if_end = 69, /* if_end */ -+ YYSYMBOL_if_stmt = 70, /* if_stmt */ -+ YYSYMBOL_if_stmt_in_choice = 71, /* if_stmt_in_choice */ -+ YYSYMBOL_menu = 72, /* menu */ -+ YYSYMBOL_menu_entry = 73, /* menu_entry */ -+ YYSYMBOL_menu_end = 74, /* menu_end */ -+ YYSYMBOL_menu_stmt = 75, /* menu_stmt */ -+ YYSYMBOL_menu_option_list = 76, /* menu_option_list */ -+ YYSYMBOL_source_stmt = 77, /* source_stmt */ -+ YYSYMBOL_comment = 78, /* comment */ -+ YYSYMBOL_comment_stmt = 79, /* comment_stmt */ -+ YYSYMBOL_comment_option_list = 80, /* comment_option_list */ -+ YYSYMBOL_help_start = 81, /* help_start */ -+ YYSYMBOL_help = 82, /* help */ -+ YYSYMBOL_depends = 83, /* depends */ -+ YYSYMBOL_visible = 84, /* visible */ -+ YYSYMBOL_prompt_stmt_opt = 85, /* prompt_stmt_opt */ -+ YYSYMBOL_end = 86, /* end */ -+ YYSYMBOL_if_expr = 87, /* if_expr */ -+ YYSYMBOL_expr = 88, /* expr */ -+ YYSYMBOL_nonconst_symbol = 89, /* nonconst_symbol */ -+ YYSYMBOL_symbol = 90, /* symbol */ -+ YYSYMBOL_assignment_stmt = 91, /* assignment_stmt */ -+ YYSYMBOL_assign_op = 92, /* assign_op */ -+ YYSYMBOL_assign_val = 93 /* assign_val */ -+}; -+typedef enum yysymbol_kind_t yysymbol_kind_t; -+ -+ -+ -+ -+#ifdef short -+# undef short -+#endif -+ -+/* On compilers that do not define __PTRDIFF_MAX__ etc., make sure -+ and (if available) are included -+ so that the code can choose integer types of a good width. */ -+ -+#ifndef __PTRDIFF_MAX__ -+# include /* INFRINGES ON USER NAME SPACE */ -+# if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ -+# include /* INFRINGES ON USER NAME SPACE */ -+# define YY_STDINT_H -+# endif -+#endif -+ -+/* Narrow types that promote to a signed type and that can represent a -+ signed or unsigned integer of at least N bits. In tables they can -+ save space and decrease cache pressure. Promoting to a signed type -+ helps avoid bugs in integer arithmetic. */ -+ -+#ifdef __INT_LEAST8_MAX__ -+typedef __INT_LEAST8_TYPE__ yytype_int8; -+#elif defined YY_STDINT_H -+typedef int_least8_t yytype_int8; -+#else -+typedef signed char yytype_int8; -+#endif -+ -+#ifdef __INT_LEAST16_MAX__ -+typedef __INT_LEAST16_TYPE__ yytype_int16; -+#elif defined YY_STDINT_H -+typedef int_least16_t yytype_int16; -+#else -+typedef short yytype_int16; -+#endif -+ -+/* Work around bug in HP-UX 11.23, which defines these macros -+ incorrectly for preprocessor constants. This workaround can likely -+ be removed in 2023, as HPE has promised support for HP-UX 11.23 -+ (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of -+ . */ -+#ifdef __hpux -+# undef UINT_LEAST8_MAX -+# undef UINT_LEAST16_MAX -+# define UINT_LEAST8_MAX 255 -+# define UINT_LEAST16_MAX 65535 -+#endif -+ -+#if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__ -+typedef __UINT_LEAST8_TYPE__ yytype_uint8; -+#elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \ -+ && UINT_LEAST8_MAX <= INT_MAX) -+typedef uint_least8_t yytype_uint8; -+#elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX -+typedef unsigned char yytype_uint8; -+#else -+typedef short yytype_uint8; -+#endif -+ -+#if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__ -+typedef __UINT_LEAST16_TYPE__ yytype_uint16; -+#elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \ -+ && UINT_LEAST16_MAX <= INT_MAX) -+typedef uint_least16_t yytype_uint16; -+#elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX -+typedef unsigned short yytype_uint16; -+#else -+typedef int yytype_uint16; -+#endif -+ -+#ifndef YYPTRDIFF_T -+# if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__ -+# define YYPTRDIFF_T __PTRDIFF_TYPE__ -+# define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__ -+# elif defined PTRDIFF_MAX -+# ifndef ptrdiff_t -+# include /* INFRINGES ON USER NAME SPACE */ -+# endif -+# define YYPTRDIFF_T ptrdiff_t -+# define YYPTRDIFF_MAXIMUM PTRDIFF_MAX -+# else -+# define YYPTRDIFF_T long -+# define YYPTRDIFF_MAXIMUM LONG_MAX -+# endif -+#endif -+ -+#ifndef YYSIZE_T -+# ifdef __SIZE_TYPE__ -+# define YYSIZE_T __SIZE_TYPE__ -+# elif defined size_t -+# define YYSIZE_T size_t -+# elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ -+# include /* INFRINGES ON USER NAME SPACE */ -+# define YYSIZE_T size_t -+# else -+# define YYSIZE_T unsigned -+# endif -+#endif -+ -+#define YYSIZE_MAXIMUM \ -+ YY_CAST (YYPTRDIFF_T, \ -+ (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1) \ -+ ? YYPTRDIFF_MAXIMUM \ -+ : YY_CAST (YYSIZE_T, -1))) -+ -+#define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X)) -+ -+ -+/* Stored state numbers (used for stacks). */ -+typedef yytype_uint8 yy_state_t; -+ -+/* State numbers in computations. */ -+typedef int yy_state_fast_t; -+ -+#ifndef YY_ -+# if defined YYENABLE_NLS && YYENABLE_NLS -+# if ENABLE_NLS -+# include /* INFRINGES ON USER NAME SPACE */ -+# define YY_(Msgid) dgettext ("bison-runtime", Msgid) -+# endif -+# endif -+# ifndef YY_ -+# define YY_(Msgid) Msgid -+# endif -+#endif -+ -+ -+#ifndef YY_ATTRIBUTE_PURE -+# if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__) -+# define YY_ATTRIBUTE_PURE __attribute__ ((__pure__)) -+# else -+# define YY_ATTRIBUTE_PURE -+# endif -+#endif -+ -+#ifndef YY_ATTRIBUTE_UNUSED -+# if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__) -+# define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__)) -+# else -+# define YY_ATTRIBUTE_UNUSED -+# endif -+#endif -+ -+/* Suppress unused-variable warnings by "using" E. */ -+#if ! defined lint || defined __GNUC__ -+# define YY_USE(E) ((void) (E)) -+#else -+# define YY_USE(E) /* empty */ -+#endif -+ -+/* Suppress an incorrect diagnostic about yylval being uninitialized. */ -+#if defined __GNUC__ && ! defined __ICC && 406 <= __GNUC__ * 100 + __GNUC_MINOR__ -+# if __GNUC__ * 100 + __GNUC_MINOR__ < 407 -+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ -+ _Pragma ("GCC diagnostic push") \ -+ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") -+# else -+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ -+ _Pragma ("GCC diagnostic push") \ -+ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \ -+ _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") -+# endif -+# define YY_IGNORE_MAYBE_UNINITIALIZED_END \ -+ _Pragma ("GCC diagnostic pop") -+#else -+# define YY_INITIAL_VALUE(Value) Value -+#endif -+#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN -+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN -+# define YY_IGNORE_MAYBE_UNINITIALIZED_END -+#endif -+#ifndef YY_INITIAL_VALUE -+# define YY_INITIAL_VALUE(Value) /* Nothing. */ -+#endif -+ -+#if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__ -+# define YY_IGNORE_USELESS_CAST_BEGIN \ -+ _Pragma ("GCC diagnostic push") \ -+ _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"") -+# define YY_IGNORE_USELESS_CAST_END \ -+ _Pragma ("GCC diagnostic pop") -+#endif -+#ifndef YY_IGNORE_USELESS_CAST_BEGIN -+# define YY_IGNORE_USELESS_CAST_BEGIN -+# define YY_IGNORE_USELESS_CAST_END -+#endif -+ -+ -+#define YY_ASSERT(E) ((void) (0 && (E))) -+ -+#if !defined yyoverflow -+ -+/* The parser invokes alloca or malloc; define the necessary symbols. */ -+ -+# ifdef YYSTACK_USE_ALLOCA -+# if YYSTACK_USE_ALLOCA -+# ifdef __GNUC__ -+# define YYSTACK_ALLOC __builtin_alloca -+# elif defined __BUILTIN_VA_ARG_INCR -+# include /* INFRINGES ON USER NAME SPACE */ -+# elif defined _AIX -+# define YYSTACK_ALLOC __alloca -+# elif defined _MSC_VER -+# include /* INFRINGES ON USER NAME SPACE */ -+# define alloca _alloca -+# else -+# define YYSTACK_ALLOC alloca -+# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS -+# include /* INFRINGES ON USER NAME SPACE */ -+ /* Use EXIT_SUCCESS as a witness for stdlib.h. */ -+# ifndef EXIT_SUCCESS -+# define EXIT_SUCCESS 0 -+# endif -+# endif -+# endif -+# endif -+# endif -+ -+# ifdef YYSTACK_ALLOC -+ /* Pacify GCC's 'empty if-body' warning. */ -+# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) -+# ifndef YYSTACK_ALLOC_MAXIMUM -+ /* The OS might guarantee only one guard page at the bottom of the stack, -+ and a page size can be as small as 4096 bytes. So we cannot safely -+ invoke alloca (N) if N exceeds 4096. Use a slightly smaller number -+ to allow for a few compiler-allocated temporary stack slots. */ -+# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ -+# endif -+# else -+# define YYSTACK_ALLOC YYMALLOC -+# define YYSTACK_FREE YYFREE -+# ifndef YYSTACK_ALLOC_MAXIMUM -+# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM -+# endif -+# if (defined __cplusplus && ! defined EXIT_SUCCESS \ -+ && ! ((defined YYMALLOC || defined malloc) \ -+ && (defined YYFREE || defined free))) -+# include /* INFRINGES ON USER NAME SPACE */ -+# ifndef EXIT_SUCCESS -+# define EXIT_SUCCESS 0 -+# endif -+# endif -+# ifndef YYMALLOC -+# define YYMALLOC malloc -+# if ! defined malloc && ! defined EXIT_SUCCESS -+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ -+# endif -+# endif -+# ifndef YYFREE -+# define YYFREE free -+# if ! defined free && ! defined EXIT_SUCCESS -+void free (void *); /* INFRINGES ON USER NAME SPACE */ -+# endif -+# endif -+# endif -+#endif /* !defined yyoverflow */ -+ -+#if (! defined yyoverflow \ -+ && (! defined __cplusplus \ -+ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) -+ -+/* A type that is properly aligned for any stack member. */ -+union yyalloc -+{ -+ yy_state_t yyss_alloc; -+ YYSTYPE yyvs_alloc; -+}; -+ -+/* The size of the maximum gap between one aligned stack and the next. */ -+# define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1) -+ -+/* The size of an array large to enough to hold all stacks, each with -+ N elements. */ -+# define YYSTACK_BYTES(N) \ -+ ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE)) \ -+ + YYSTACK_GAP_MAXIMUM) -+ -+# define YYCOPY_NEEDED 1 -+ -+/* Relocate STACK from its old location to the new one. The -+ local variables YYSIZE and YYSTACKSIZE give the old and new number of -+ elements in the stack, and YYPTR gives the new location of the -+ stack. Advance YYPTR to a properly aligned location for the next -+ stack. */ -+# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ -+ do \ -+ { \ -+ YYPTRDIFF_T yynewbytes; \ -+ YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ -+ Stack = &yyptr->Stack_alloc; \ -+ yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \ -+ yyptr += yynewbytes / YYSIZEOF (*yyptr); \ -+ } \ -+ while (0) -+ -+#endif -+ -+#if defined YYCOPY_NEEDED && YYCOPY_NEEDED -+/* Copy COUNT objects from SRC to DST. The source and destination do -+ not overlap. */ -+# ifndef YYCOPY -+# if defined __GNUC__ && 1 < __GNUC__ -+# define YYCOPY(Dst, Src, Count) \ -+ __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src))) -+# else -+# define YYCOPY(Dst, Src, Count) \ -+ do \ -+ { \ -+ YYPTRDIFF_T yyi; \ -+ for (yyi = 0; yyi < (Count); yyi++) \ -+ (Dst)[yyi] = (Src)[yyi]; \ -+ } \ -+ while (0) -+# endif -+# endif -+#endif /* !YYCOPY_NEEDED */ -+ -+/* YYFINAL -- State number of the termination state. */ -+#define YYFINAL 6 -+/* YYLAST -- Last index in YYTABLE. */ -+#define YYLAST 183 -+ -+/* YYNTOKENS -- Number of terminals. */ -+#define YYNTOKENS 49 -+/* YYNNTS -- Number of nonterminals. */ -+#define YYNNTS 45 -+/* YYNRULES -- Number of rules. */ -+#define YYNRULES 101 -+/* YYNSTATES -- Number of states. */ -+#define YYNSTATES 180 -+ -+/* YYMAXUTOK -- Last valid token kind. */ -+#define YYMAXUTOK 303 -+ -+ -+/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM -+ as returned by yylex, with out-of-bounds checking. */ -+#define YYTRANSLATE(YYX) \ -+ (0 <= (YYX) && (YYX) <= YYMAXUTOK \ -+ ? YY_CAST (yysymbol_kind_t, yytranslate[YYX]) \ -+ : YYSYMBOL_YYUNDEF) -+ -+/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM -+ as returned by yylex. */ -+static const yytype_int8 yytranslate[] = -+{ -+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, -+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -+ 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, -+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, -+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, -+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, -+ 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, -+ 45, 46, 47, 48 -+}; -+ -+#if YYDEBUG -+/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ -+static const yytype_int16 yyrline[] = -+{ -+ 0, 108, 108, 108, 112, 117, 119, 120, 121, 122, -+ 123, 124, 125, 126, 127, 128, 131, 133, 134, 135, -+ 136, 141, 147, 175, 181, 190, 192, 193, 194, 197, -+ 203, 209, 218, 224, 230, 236, 246, 257, 270, 280, -+ 283, 285, 286, 287, 290, 296, 302, 309, 310, 311, -+ 312, 313, 316, 317, 318, 322, 330, 338, 341, 346, -+ 353, 358, 366, 369, 371, 372, 375, 384, 391, 394, -+ 396, 401, 407, 425, 432, 439, 441, 446, 447, 448, -+ 451, 452, 455, 456, 457, 458, 459, 460, 461, 462, -+ 463, 464, 465, 469, 471, 472, 477, 480, 481, 482, -+ 486, 487 -+}; -+#endif -+ -+/** Accessing symbol of state STATE. */ -+#define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State]) -+ -+#if YYDEBUG || 0 -+/* The user-facing name of the symbol whose (internal) number is -+ YYSYMBOL. No bounds checking. */ -+static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED; -+ -+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. -+ First, the terminals, then, starting at YYNTOKENS, nonterminals. */ -+static const char *const yytname[] = -+{ -+ "\"end of file\"", "error", "\"invalid token\"", "T_HELPTEXT", "T_WORD", -+ "T_WORD_QUOTE", "T_BOOL", "T_CHOICE", "T_CLOSE_PAREN", "T_COLON_EQUAL", -+ "T_COMMENT", "T_CONFIG", "T_DEFAULT", "T_DEF_BOOL", "T_DEF_TRISTATE", -+ "T_DEPENDS", "T_ENDCHOICE", "T_ENDIF", "T_ENDMENU", "T_HELP", "T_HEX", -+ "T_IF", "T_IMPLY", "T_INT", "T_MAINMENU", "T_MENU", "T_MENUCONFIG", -+ "T_MODULES", "T_ON", "T_OPEN_PAREN", "T_PLUS_EQUAL", "T_PROMPT", -+ "T_RANGE", "T_SELECT", "T_SOURCE", "T_STRING", "T_TRISTATE", "T_VISIBLE", -+ "T_EOL", "T_ASSIGN_VAL", "T_OR", "T_AND", "T_EQUAL", "T_UNEQUAL", -+ "T_LESS", "T_LESS_EQUAL", "T_GREATER", "T_GREATER_EQUAL", "T_NOT", -+ "$accept", "input", "mainmenu_stmt", "stmt_list", "stmt_list_in_choice", -+ "config_entry_start", "config_stmt", "menuconfig_entry_start", -+ "menuconfig_stmt", "config_option_list", "config_option", "choice", -+ "choice_entry", "choice_end", "choice_stmt", "choice_option_list", -+ "choice_option", "type", "default", "if_entry", "if_end", "if_stmt", -+ "if_stmt_in_choice", "menu", "menu_entry", "menu_end", "menu_stmt", -+ "menu_option_list", "source_stmt", "comment", "comment_stmt", -+ "comment_option_list", "help_start", "help", "depends", "visible", -+ "prompt_stmt_opt", "end", "if_expr", "expr", "nonconst_symbol", "symbol", -+ "assignment_stmt", "assign_op", "assign_val", YY_NULLPTR -+}; -+ -+static const char * -+yysymbol_name (yysymbol_kind_t yysymbol) -+{ -+ return yytname[yysymbol]; -+} -+#endif -+ -+#define YYPACT_NINF (-63) -+ -+#define yypact_value_is_default(Yyn) \ -+ ((Yyn) == YYPACT_NINF) -+ -+#define YYTABLE_NINF (-4) -+ -+#define yytable_value_is_error(Yyn) \ -+ 0 -+ -+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing -+ STATE-NUM. */ -+static const yytype_int16 yypact[] = -+{ -+ 4, 21, 19, -63, 32, -3, -63, 63, -1, 14, -+ 7, 42, 51, 2, 60, 51, 72, -63, -63, -63, -+ -63, -63, -63, -63, -63, -63, -63, -63, -63, -63, -+ -63, -63, -63, -63, -63, 30, -63, -63, -63, 44, -+ -63, 53, -63, 54, -63, 2, 2, 31, -63, 136, -+ 55, 56, 58, 117, 117, 15, 156, 101, 3, 101, -+ 83, -63, -63, 65, -63, -63, 8, -63, -63, 2, -+ 2, 71, 71, 71, 71, 71, 71, -63, -63, -63, -+ -63, -63, -63, -63, 76, 68, -63, 51, -63, 69, -+ 105, 71, 51, -63, -63, -63, 108, 2, 111, -63, -+ -63, 110, 51, 115, -63, -63, -63, 78, 86, 87, -+ 90, -63, -63, -63, -63, -63, -63, -63, -63, 100, -+ -63, -63, -63, -63, -63, -63, -63, 92, -63, -63, -+ -63, -63, -63, -63, -63, 2, -63, 100, -63, 100, -+ 71, 100, 100, 96, 20, -63, 100, 100, 100, -63, -+ -63, -63, -63, 156, 2, 103, 41, 104, 107, 100, -+ 109, -63, -63, 113, 122, 124, 130, -63, 46, -63, -+ -63, -63, -63, 131, -63, -63, -63, -63, -63, -63 -+}; -+ -+/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. -+ Performed when YYTABLE does not specify something else to do. Zero -+ means the default is an error. */ -+static const yytype_int8 yydefact[] = -+{ -+ 5, 0, 0, 5, 0, 0, 1, 0, 0, 0, -+ 0, 0, 0, 0, 0, 0, 0, 25, 9, 25, -+ 12, 40, 16, 7, 5, 10, 63, 5, 11, 13, -+ 69, 8, 6, 4, 15, 0, 98, 99, 97, 100, -+ 36, 0, 93, 0, 95, 0, 0, 0, 94, 82, -+ 0, 0, 0, 22, 24, 37, 0, 0, 60, 0, -+ 68, 14, 101, 0, 67, 21, 0, 90, 55, 0, -+ 0, 0, 0, 0, 0, 0, 0, 59, 23, 66, -+ 47, 52, 53, 54, 0, 0, 50, 0, 49, 0, -+ 0, 0, 0, 51, 48, 26, 75, 0, 0, 28, -+ 27, 0, 0, 0, 41, 43, 42, 0, 0, 0, -+ 0, 18, 39, 16, 19, 17, 38, 57, 56, 80, -+ 65, 64, 62, 61, 70, 96, 89, 91, 92, 87, -+ 88, 83, 84, 85, 86, 0, 71, 80, 35, 80, -+ 0, 80, 80, 0, 80, 72, 80, 80, 80, 20, -+ 78, 79, 77, 0, 0, 0, 0, 0, 0, 80, -+ 0, 76, 29, 0, 0, 0, 0, 58, 81, 74, -+ 73, 33, 30, 0, 32, 31, 45, 46, 44, 34 -+}; -+ -+/* YYPGOTO[NTERM-NUM]. */ -+static const yytype_int8 yypgoto[] = -+{ -+ -63, -63, -63, 35, 25, -63, -54, -63, -63, 127, -+ -63, -63, -63, -63, -63, -63, -63, -63, -63, -53, -+ -10, -63, -63, -63, -63, -63, -63, -63, -63, -63, -+ -52, -63, -63, 116, -38, -63, -63, -5, 17, -45, -+ -7, -62, -63, -63, -63 -+}; -+ -+/* YYDEFGOTO[NTERM-NUM]. */ -+static const yytype_uint8 yydefgoto[] = -+{ -+ 0, 2, 3, 4, 56, 17, 18, 19, 20, 53, -+ 95, 21, 22, 112, 23, 55, 104, 96, 97, 24, -+ 117, 25, 114, 26, 27, 122, 28, 58, 29, 30, -+ 31, 60, 98, 99, 100, 121, 143, 118, 155, 47, -+ 48, 49, 32, 39, 63 -+}; -+ -+/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If -+ positive, shift that token. If negative, reduce the rule whose -+ number is the opposite. If YYTABLE_NINF, syntax error. */ -+static const yytype_int16 yytable[] = -+{ -+ 66, 67, 111, 113, 115, 43, 42, 44, 51, 129, -+ 130, 131, 132, 133, 134, 35, 126, 106, 84, 6, -+ 120, 101, 124, 36, 127, 128, 5, 102, 1, 140, -+ 84, 45, -3, 8, 85, 33, 9, 34, 7, 10, -+ 119, 154, 11, 12, 37, 40, 103, 41, 69, 70, -+ 46, 116, 144, 13, 123, 42, 38, 14, 15, 57, -+ 69, 70, 59, -2, 8, 50, 16, 9, 61, 68, -+ 10, 69, 70, 11, 12, 42, 44, 52, 159, 170, -+ 137, 69, 70, 62, 13, 141, 69, 70, 14, 15, -+ 156, 64, 65, 77, 78, 147, 79, 16, 84, 111, -+ 113, 115, 8, 125, 135, 9, 136, 138, 10, 168, -+ 139, 11, 12, 142, 145, 146, 149, 108, 109, 110, -+ 148, 154, 13, 80, 150, 151, 14, 15, 152, 81, -+ 82, 83, 84, 70, 162, 16, 85, 86, 153, 87, -+ 88, 169, 171, 167, 89, 172, 54, 174, 90, 91, -+ 92, 175, 93, 94, 157, 0, 158, 107, 160, 161, -+ 176, 163, 177, 164, 165, 166, 11, 12, 178, 179, -+ 0, 105, 108, 109, 110, 0, 173, 13, 71, 72, -+ 73, 74, 75, 76 -+}; -+ -+static const yytype_int16 yycheck[] = -+{ -+ 45, 46, 56, 56, 56, 12, 4, 5, 15, 71, -+ 72, 73, 74, 75, 76, 1, 8, 55, 15, 0, -+ 58, 6, 60, 9, 69, 70, 5, 12, 24, 91, -+ 15, 29, 0, 1, 19, 38, 4, 38, 3, 7, -+ 37, 21, 10, 11, 30, 38, 31, 5, 40, 41, -+ 48, 56, 97, 21, 59, 4, 42, 25, 26, 24, -+ 40, 41, 27, 0, 1, 5, 34, 4, 38, 38, -+ 7, 40, 41, 10, 11, 4, 5, 5, 140, 38, -+ 87, 40, 41, 39, 21, 92, 40, 41, 25, 26, -+ 135, 38, 38, 38, 38, 102, 38, 34, 15, 153, -+ 153, 153, 1, 38, 28, 4, 38, 38, 7, 154, -+ 5, 10, 11, 5, 3, 5, 38, 16, 17, 18, -+ 5, 21, 21, 6, 38, 38, 25, 26, 38, 12, -+ 13, 14, 15, 41, 38, 34, 19, 20, 113, 22, -+ 23, 38, 38, 153, 27, 38, 19, 38, 31, 32, -+ 33, 38, 35, 36, 137, -1, 139, 1, 141, 142, -+ 38, 144, 38, 146, 147, 148, 10, 11, 38, 38, -+ -1, 55, 16, 17, 18, -1, 159, 21, 42, 43, -+ 44, 45, 46, 47 -+}; -+ -+/* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of -+ state STATE-NUM. */ -+static const yytype_int8 yystos[] = -+{ -+ 0, 24, 50, 51, 52, 5, 0, 52, 1, 4, -+ 7, 10, 11, 21, 25, 26, 34, 54, 55, 56, -+ 57, 60, 61, 63, 68, 70, 72, 73, 75, 77, -+ 78, 79, 91, 38, 38, 1, 9, 30, 42, 92, -+ 38, 5, 4, 89, 5, 29, 48, 88, 89, 90, -+ 5, 89, 5, 58, 58, 64, 53, 52, 76, 52, -+ 80, 38, 39, 93, 38, 38, 88, 88, 38, 40, -+ 41, 42, 43, 44, 45, 46, 47, 38, 38, 38, -+ 6, 12, 13, 14, 15, 19, 20, 22, 23, 27, -+ 31, 32, 33, 35, 36, 59, 66, 67, 81, 82, -+ 83, 6, 12, 31, 65, 82, 83, 1, 16, 17, -+ 18, 55, 62, 68, 71, 79, 86, 69, 86, 37, -+ 83, 84, 74, 86, 83, 38, 8, 88, 88, 90, -+ 90, 90, 90, 90, 90, 28, 38, 89, 38, 5, -+ 90, 89, 5, 85, 88, 3, 5, 89, 5, 38, -+ 38, 38, 38, 53, 21, 87, 88, 87, 87, 90, -+ 87, 87, 38, 87, 87, 87, 87, 69, 88, 38, -+ 38, 38, 38, 87, 38, 38, 38, 38, 38, 38 -+}; -+ -+/* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */ -+static const yytype_int8 yyr1[] = -+{ -+ 0, 49, 50, 50, 51, 52, 52, 52, 52, 52, -+ 52, 52, 52, 52, 52, 52, 53, 53, 53, 53, -+ 53, 54, 55, 56, 57, 58, 58, 58, 58, 59, -+ 59, 59, 59, 59, 59, 59, 60, 61, 62, 63, -+ 64, 64, 64, 64, 65, 65, 65, 66, 66, 66, -+ 66, 66, 67, 67, 67, 68, 69, 70, 71, 72, -+ 73, 74, 75, 76, 76, 76, 77, 78, 79, 80, -+ 80, 81, 82, 83, 84, 85, 85, 86, 86, 86, -+ 87, 87, 88, 88, 88, 88, 88, 88, 88, 88, -+ 88, 88, 88, 89, 90, 90, 91, 92, 92, 92, -+ 93, 93 -+}; -+ -+/* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */ -+static const yytype_int8 yyr2[] = -+{ -+ 0, 2, 2, 1, 3, 0, 2, 2, 2, 2, -+ 2, 2, 2, 2, 4, 3, 0, 2, 2, 2, -+ 3, 3, 2, 3, 2, 0, 2, 2, 2, 3, -+ 4, 4, 4, 4, 5, 2, 2, 2, 1, 3, -+ 0, 2, 2, 2, 4, 4, 4, 1, 1, 1, -+ 1, 1, 1, 1, 1, 3, 1, 3, 3, 3, -+ 2, 1, 3, 0, 2, 2, 3, 3, 2, 0, -+ 2, 2, 2, 4, 3, 0, 2, 2, 2, 2, -+ 0, 2, 1, 3, 3, 3, 3, 3, 3, 3, -+ 2, 3, 3, 1, 1, 1, 4, 1, 1, 1, -+ 0, 1 -+}; -+ -+ -+enum { YYENOMEM = -2 }; -+ -+#define yyerrok (yyerrstatus = 0) -+#define yyclearin (yychar = YYEMPTY) -+ -+#define YYACCEPT goto yyacceptlab -+#define YYABORT goto yyabortlab -+#define YYERROR goto yyerrorlab -+#define YYNOMEM goto yyexhaustedlab -+ -+ -+#define YYRECOVERING() (!!yyerrstatus) -+ -+#define YYBACKUP(Token, Value) \ -+ do \ -+ if (yychar == YYEMPTY) \ -+ { \ -+ yychar = (Token); \ -+ yylval = (Value); \ -+ YYPOPSTACK (yylen); \ -+ yystate = *yyssp; \ -+ goto yybackup; \ -+ } \ -+ else \ -+ { \ -+ yyerror (YY_("syntax error: cannot back up")); \ -+ YYERROR; \ -+ } \ -+ while (0) -+ -+/* Backward compatibility with an undocumented macro. -+ Use YYerror or YYUNDEF. */ -+#define YYERRCODE YYUNDEF -+ -+ -+/* Enable debugging if requested. */ -+#if YYDEBUG -+ -+# ifndef YYFPRINTF -+# include /* INFRINGES ON USER NAME SPACE */ -+# define YYFPRINTF fprintf -+# endif -+ -+# define YYDPRINTF(Args) \ -+do { \ -+ if (yydebug) \ -+ YYFPRINTF Args; \ -+} while (0) -+ -+ -+ -+ -+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \ -+do { \ -+ if (yydebug) \ -+ { \ -+ YYFPRINTF (stderr, "%s ", Title); \ -+ yy_symbol_print (stderr, \ -+ Kind, Value); \ -+ YYFPRINTF (stderr, "\n"); \ -+ } \ -+} while (0) -+ -+ -+/*-----------------------------------. -+| Print this symbol's value on YYO. | -+`-----------------------------------*/ -+ -+static void -+yy_symbol_value_print (FILE *yyo, -+ yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep) -+{ -+ FILE *yyoutput = yyo; -+ YY_USE (yyoutput); -+ if (!yyvaluep) -+ return; -+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN -+ YY_USE (yykind); -+ YY_IGNORE_MAYBE_UNINITIALIZED_END -+} -+ -+ -+/*---------------------------. -+| Print this symbol on YYO. | -+`---------------------------*/ -+ -+static void -+yy_symbol_print (FILE *yyo, -+ yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep) -+{ -+ YYFPRINTF (yyo, "%s %s (", -+ yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind)); -+ -+ yy_symbol_value_print (yyo, yykind, yyvaluep); -+ YYFPRINTF (yyo, ")"); -+} -+ -+/*------------------------------------------------------------------. -+| yy_stack_print -- Print the state stack from its BOTTOM up to its | -+| TOP (included). | -+`------------------------------------------------------------------*/ -+ -+static void -+yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop) -+{ -+ YYFPRINTF (stderr, "Stack now"); -+ for (; yybottom <= yytop; yybottom++) -+ { -+ int yybot = *yybottom; -+ YYFPRINTF (stderr, " %d", yybot); -+ } -+ YYFPRINTF (stderr, "\n"); -+} -+ -+# define YY_STACK_PRINT(Bottom, Top) \ -+do { \ -+ if (yydebug) \ -+ yy_stack_print ((Bottom), (Top)); \ -+} while (0) -+ -+ -+/*------------------------------------------------. -+| Report that the YYRULE is going to be reduced. | -+`------------------------------------------------*/ -+ -+static void -+yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp, -+ int yyrule) -+{ -+ int yylno = yyrline[yyrule]; -+ int yynrhs = yyr2[yyrule]; -+ int yyi; -+ YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n", -+ yyrule - 1, yylno); -+ /* The symbols being reduced. */ -+ for (yyi = 0; yyi < yynrhs; yyi++) -+ { -+ YYFPRINTF (stderr, " $%d = ", yyi + 1); -+ yy_symbol_print (stderr, -+ YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]), -+ &yyvsp[(yyi + 1) - (yynrhs)]); -+ YYFPRINTF (stderr, "\n"); -+ } -+} -+ -+# define YY_REDUCE_PRINT(Rule) \ -+do { \ -+ if (yydebug) \ -+ yy_reduce_print (yyssp, yyvsp, Rule); \ -+} while (0) -+ -+/* Nonzero means print parse trace. It is left uninitialized so that -+ multiple parsers can coexist. */ -+int yydebug; -+#else /* !YYDEBUG */ -+# define YYDPRINTF(Args) ((void) 0) -+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) -+# define YY_STACK_PRINT(Bottom, Top) -+# define YY_REDUCE_PRINT(Rule) -+#endif /* !YYDEBUG */ -+ -+ -+/* YYINITDEPTH -- initial size of the parser's stacks. */ -+#ifndef YYINITDEPTH -+# define YYINITDEPTH 200 -+#endif -+ -+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only -+ if the built-in stack extension method is used). -+ -+ Do not make this value too large; the results are undefined if -+ YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) -+ evaluated with infinite-precision integer arithmetic. */ -+ -+#ifndef YYMAXDEPTH -+# define YYMAXDEPTH 10000 -+#endif -+ -+ -+ -+ -+ -+ -+/*-----------------------------------------------. -+| Release the memory associated to this symbol. | -+`-----------------------------------------------*/ -+ -+static void -+yydestruct (const char *yymsg, -+ yysymbol_kind_t yykind, YYSTYPE *yyvaluep) -+{ -+ YY_USE (yyvaluep); -+ if (!yymsg) -+ yymsg = "Deleting"; -+ YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp); -+ -+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN -+ switch (yykind) -+ { -+ case YYSYMBOL_choice_entry: /* choice_entry */ -+ { -+ fprintf(stderr, "%s:%d: missing end statement for this entry\n", -+ ((*yyvaluep).menu)->filename, ((*yyvaluep).menu)->lineno); -+ if (current_menu == ((*yyvaluep).menu)) -+ menu_end_menu(); -+} -+ break; -+ -+ case YYSYMBOL_if_entry: /* if_entry */ -+ { -+ fprintf(stderr, "%s:%d: missing end statement for this entry\n", -+ ((*yyvaluep).menu)->filename, ((*yyvaluep).menu)->lineno); -+ if (current_menu == ((*yyvaluep).menu)) -+ menu_end_menu(); -+} -+ break; -+ -+ case YYSYMBOL_menu_entry: /* menu_entry */ -+ { -+ fprintf(stderr, "%s:%d: missing end statement for this entry\n", -+ ((*yyvaluep).menu)->filename, ((*yyvaluep).menu)->lineno); -+ if (current_menu == ((*yyvaluep).menu)) -+ menu_end_menu(); -+} -+ break; -+ -+ default: -+ break; -+ } -+ YY_IGNORE_MAYBE_UNINITIALIZED_END -+} -+ -+ -+/* Lookahead token kind. */ -+int yychar; -+ -+/* The semantic value of the lookahead symbol. */ -+YYSTYPE yylval; -+/* Number of syntax errors so far. */ -+int yynerrs; -+ -+ -+ -+ -+/*----------. -+| yyparse. | -+`----------*/ -+ -+int -+yyparse (void) -+{ -+ yy_state_fast_t yystate = 0; -+ /* Number of tokens to shift before error messages enabled. */ -+ int yyerrstatus = 0; -+ -+ /* Refer to the stacks through separate pointers, to allow yyoverflow -+ to reallocate them elsewhere. */ -+ -+ /* Their size. */ -+ YYPTRDIFF_T yystacksize = YYINITDEPTH; -+ -+ /* The state stack: array, bottom, top. */ -+ yy_state_t yyssa[YYINITDEPTH]; -+ yy_state_t *yyss = yyssa; -+ yy_state_t *yyssp = yyss; -+ -+ /* The semantic value stack: array, bottom, top. */ -+ YYSTYPE yyvsa[YYINITDEPTH]; -+ YYSTYPE *yyvs = yyvsa; -+ YYSTYPE *yyvsp = yyvs; -+ -+ int yyn; -+ /* The return value of yyparse. */ -+ int yyresult; -+ /* Lookahead symbol kind. */ -+ yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY; -+ /* The variables used to return semantic value and location from the -+ action routines. */ -+ YYSTYPE yyval; -+ -+ -+ -+#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) -+ -+ /* The number of symbols on the RHS of the reduced rule. -+ Keep to zero when no symbol should be popped. */ -+ int yylen = 0; -+ -+ YYDPRINTF ((stderr, "Starting parse\n")); -+ -+ yychar = YYEMPTY; /* Cause a token to be read. */ -+ -+ goto yysetstate; -+ -+ -+/*------------------------------------------------------------. -+| yynewstate -- push a new state, which is found in yystate. | -+`------------------------------------------------------------*/ -+yynewstate: -+ /* In all cases, when you get here, the value and location stacks -+ have just been pushed. So pushing a state here evens the stacks. */ -+ yyssp++; -+ -+ -+/*--------------------------------------------------------------------. -+| yysetstate -- set current state (the top of the stack) to yystate. | -+`--------------------------------------------------------------------*/ -+yysetstate: -+ YYDPRINTF ((stderr, "Entering state %d\n", yystate)); -+ YY_ASSERT (0 <= yystate && yystate < YYNSTATES); -+ YY_IGNORE_USELESS_CAST_BEGIN -+ *yyssp = YY_CAST (yy_state_t, yystate); -+ YY_IGNORE_USELESS_CAST_END -+ YY_STACK_PRINT (yyss, yyssp); -+ -+ if (yyss + yystacksize - 1 <= yyssp) -+#if !defined yyoverflow && !defined YYSTACK_RELOCATE -+ YYNOMEM; -+#else -+ { -+ /* Get the current used size of the three stacks, in elements. */ -+ YYPTRDIFF_T yysize = yyssp - yyss + 1; -+ -+# if defined yyoverflow -+ { -+ /* Give user a chance to reallocate the stack. Use copies of -+ these so that the &'s don't force the real ones into -+ memory. */ -+ yy_state_t *yyss1 = yyss; -+ YYSTYPE *yyvs1 = yyvs; -+ -+ /* Each stack pointer address is followed by the size of the -+ data in use in that stack, in bytes. This used to be a -+ conditional around just the two extra args, but that might -+ be undefined if yyoverflow is a macro. */ -+ yyoverflow (YY_("memory exhausted"), -+ &yyss1, yysize * YYSIZEOF (*yyssp), -+ &yyvs1, yysize * YYSIZEOF (*yyvsp), -+ &yystacksize); -+ yyss = yyss1; -+ yyvs = yyvs1; -+ } -+# else /* defined YYSTACK_RELOCATE */ -+ /* Extend the stack our own way. */ -+ if (YYMAXDEPTH <= yystacksize) -+ YYNOMEM; -+ yystacksize *= 2; -+ if (YYMAXDEPTH < yystacksize) -+ yystacksize = YYMAXDEPTH; -+ -+ { -+ yy_state_t *yyss1 = yyss; -+ union yyalloc *yyptr = -+ YY_CAST (union yyalloc *, -+ YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize)))); -+ if (! yyptr) -+ YYNOMEM; -+ YYSTACK_RELOCATE (yyss_alloc, yyss); -+ YYSTACK_RELOCATE (yyvs_alloc, yyvs); -+# undef YYSTACK_RELOCATE -+ if (yyss1 != yyssa) -+ YYSTACK_FREE (yyss1); -+ } -+# endif -+ -+ yyssp = yyss + yysize - 1; -+ yyvsp = yyvs + yysize - 1; -+ -+ YY_IGNORE_USELESS_CAST_BEGIN -+ YYDPRINTF ((stderr, "Stack size increased to %ld\n", -+ YY_CAST (long, yystacksize))); -+ YY_IGNORE_USELESS_CAST_END -+ -+ if (yyss + yystacksize - 1 <= yyssp) -+ YYABORT; -+ } -+#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */ -+ -+ -+ if (yystate == YYFINAL) -+ YYACCEPT; -+ -+ goto yybackup; -+ -+ -+/*-----------. -+| yybackup. | -+`-----------*/ -+yybackup: -+ /* Do appropriate processing given the current state. Read a -+ lookahead token if we need one and don't already have one. */ -+ -+ /* First try to decide what to do without reference to lookahead token. */ -+ yyn = yypact[yystate]; -+ if (yypact_value_is_default (yyn)) -+ goto yydefault; -+ -+ /* Not known => get a lookahead token if don't already have one. */ -+ -+ /* YYCHAR is either empty, or end-of-input, or a valid lookahead. */ -+ if (yychar == YYEMPTY) -+ { -+ YYDPRINTF ((stderr, "Reading a token\n")); -+ yychar = yylex (); -+ } -+ -+ if (yychar <= YYEOF) -+ { -+ yychar = YYEOF; -+ yytoken = YYSYMBOL_YYEOF; -+ YYDPRINTF ((stderr, "Now at end of input.\n")); -+ } -+ else if (yychar == YYerror) -+ { -+ /* The scanner already issued an error message, process directly -+ to error recovery. But do not keep the error token as -+ lookahead, it is too special and may lead us to an endless -+ loop in error recovery. */ -+ yychar = YYUNDEF; -+ yytoken = YYSYMBOL_YYerror; -+ goto yyerrlab1; -+ } -+ else -+ { -+ yytoken = YYTRANSLATE (yychar); -+ YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); -+ } -+ -+ /* If the proper action on seeing token YYTOKEN is to reduce or to -+ detect an error, take that action. */ -+ yyn += yytoken; -+ if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) -+ goto yydefault; -+ yyn = yytable[yyn]; -+ if (yyn <= 0) -+ { -+ if (yytable_value_is_error (yyn)) -+ goto yyerrlab; -+ yyn = -yyn; -+ goto yyreduce; -+ } -+ -+ /* Count tokens shifted since error; after three, turn off error -+ status. */ -+ if (yyerrstatus) -+ yyerrstatus--; -+ -+ /* Shift the lookahead token. */ -+ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); -+ yystate = yyn; -+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN -+ *++yyvsp = yylval; -+ YY_IGNORE_MAYBE_UNINITIALIZED_END -+ -+ /* Discard the shifted token. */ -+ yychar = YYEMPTY; -+ goto yynewstate; -+ -+ -+/*-----------------------------------------------------------. -+| yydefault -- do the default action for the current state. | -+`-----------------------------------------------------------*/ -+yydefault: -+ yyn = yydefact[yystate]; -+ if (yyn == 0) -+ goto yyerrlab; -+ goto yyreduce; -+ -+ -+/*-----------------------------. -+| yyreduce -- do a reduction. | -+`-----------------------------*/ -+yyreduce: -+ /* yyn is the number of a rule to reduce with. */ -+ yylen = yyr2[yyn]; -+ -+ /* If YYLEN is nonzero, implement the default value of the action: -+ '$$ = $1'. -+ -+ Otherwise, the following line sets YYVAL to garbage. -+ This behavior is undocumented and Bison -+ users should not rely upon it. Assigning to YYVAL -+ unconditionally makes the parser a bit smaller, and it avoids a -+ GCC warning that YYVAL may be used uninitialized. */ -+ yyval = yyvsp[1-yylen]; -+ -+ -+ YY_REDUCE_PRINT (yyn); -+ switch (yyn) -+ { -+ case 4: /* mainmenu_stmt: T_MAINMENU T_WORD_QUOTE T_EOL */ -+{ -+ menu_add_prompt(P_MENU, (yyvsp[-1].string), NULL); -+} -+ break; -+ -+ case 14: /* stmt_list: stmt_list T_WORD error T_EOL */ -+ { zconf_error("unknown statement \"%s\"", (yyvsp[-2].string)); } -+ break; -+ -+ case 15: /* stmt_list: stmt_list error T_EOL */ -+ { zconf_error("invalid statement"); } -+ break; -+ -+ case 20: /* stmt_list_in_choice: stmt_list_in_choice error T_EOL */ -+ { zconf_error("invalid statement"); } -+ break; -+ -+ case 21: /* config_entry_start: T_CONFIG nonconst_symbol T_EOL */ -+{ -+ menu_add_entry((yyvsp[-1].symbol)); -+ printd(DEBUG_PARSE, "%s:%d:config %s\n", cur_filename, cur_lineno, (yyvsp[-1].symbol)->name); -+} -+ break; -+ -+ case 22: /* config_stmt: config_entry_start config_option_list */ -+{ -+ if (current_choice) { -+ if (!current_entry->prompt) { -+ fprintf(stderr, "%s:%d: error: choice member must have a prompt\n", -+ current_entry->filename, current_entry->lineno); -+ yynerrs++; -+ } -+ -+ if (current_entry->sym->type != S_BOOLEAN) { -+ fprintf(stderr, "%s:%d: error: choice member must be bool\n", -+ current_entry->filename, current_entry->lineno); -+ yynerrs++; -+ } -+ -+ /* -+ * If the same symbol appears twice in a choice block, the list -+ * node would be added twice, leading to a broken linked list. -+ * list_empty() ensures that this symbol has not yet added. -+ */ -+ if (list_empty(¤t_entry->sym->choice_link)) -+ list_add_tail(¤t_entry->sym->choice_link, -+ ¤t_choice->choice_members); -+ } -+ -+ printd(DEBUG_PARSE, "%s:%d:endconfig\n", cur_filename, cur_lineno); -+} -+ break; -+ -+ case 23: /* menuconfig_entry_start: T_MENUCONFIG nonconst_symbol T_EOL */ -+{ -+ menu_add_entry((yyvsp[-1].symbol)); -+ printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", cur_filename, cur_lineno, (yyvsp[-1].symbol)->name); -+} -+ break; -+ -+ case 24: /* menuconfig_stmt: menuconfig_entry_start config_option_list */ -+{ -+ if (current_entry->prompt) -+ current_entry->prompt->type = P_MENU; -+ else -+ zconfprint("warning: menuconfig statement without prompt"); -+ printd(DEBUG_PARSE, "%s:%d:endconfig\n", cur_filename, cur_lineno); -+} -+ break; -+ -+ case 29: /* config_option: type prompt_stmt_opt T_EOL */ -+{ -+ menu_set_type((yyvsp[-2].type)); -+ printd(DEBUG_PARSE, "%s:%d:type(%u)\n", cur_filename, cur_lineno, (yyvsp[-2].type)); -+} -+ break; -+ -+ case 30: /* config_option: T_PROMPT T_WORD_QUOTE if_expr T_EOL */ -+{ -+ menu_add_prompt(P_PROMPT, (yyvsp[-2].string), (yyvsp[-1].expr)); -+ printd(DEBUG_PARSE, "%s:%d:prompt\n", cur_filename, cur_lineno); -+} -+ break; -+ -+ case 31: /* config_option: default expr if_expr T_EOL */ -+{ -+ menu_add_expr(P_DEFAULT, (yyvsp[-2].expr), (yyvsp[-1].expr)); -+ if ((yyvsp[-3].type) != S_UNKNOWN) -+ menu_set_type((yyvsp[-3].type)); -+ printd(DEBUG_PARSE, "%s:%d:default(%u)\n", cur_filename, cur_lineno, -+ (yyvsp[-3].type)); -+} -+ break; -+ -+ case 32: /* config_option: T_SELECT nonconst_symbol if_expr T_EOL */ -+{ -+ menu_add_symbol(P_SELECT, (yyvsp[-2].symbol), (yyvsp[-1].expr)); -+ printd(DEBUG_PARSE, "%s:%d:select\n", cur_filename, cur_lineno); -+} -+ break; -+ -+ case 33: /* config_option: T_IMPLY nonconst_symbol if_expr T_EOL */ -+{ -+ menu_add_symbol(P_IMPLY, (yyvsp[-2].symbol), (yyvsp[-1].expr)); -+ printd(DEBUG_PARSE, "%s:%d:imply\n", cur_filename, cur_lineno); -+} -+ break; -+ -+ case 34: /* config_option: T_RANGE symbol symbol if_expr T_EOL */ -+{ -+ menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,(yyvsp[-3].symbol), (yyvsp[-2].symbol)), (yyvsp[-1].expr)); -+ printd(DEBUG_PARSE, "%s:%d:range\n", cur_filename, cur_lineno); -+} -+ break; -+ -+ case 35: /* config_option: T_MODULES T_EOL */ -+{ -+ if (modules_sym) -+ zconf_error("symbol '%s' redefines option 'modules' already defined by symbol '%s'", -+ current_entry->sym->name, modules_sym->name); -+ modules_sym = current_entry->sym; -+} -+ break; -+ -+ case 36: /* choice: T_CHOICE T_EOL */ -+{ -+ struct symbol *sym = sym_lookup(NULL, 0); -+ -+ menu_add_entry(sym); -+ menu_set_type(S_BOOLEAN); -+ INIT_LIST_HEAD(¤t_entry->choice_members); -+ -+ printd(DEBUG_PARSE, "%s:%d:choice\n", cur_filename, cur_lineno); -+} -+ break; -+ -+ case 37: /* choice_entry: choice choice_option_list */ -+{ -+ if (!current_entry->prompt) { -+ fprintf(stderr, "%s:%d: error: choice must have a prompt\n", -+ current_entry->filename, current_entry->lineno); -+ yynerrs++; -+ } -+ -+ (yyval.menu) = menu_add_menu(); -+ -+ current_choice = current_entry; -+} -+ break; -+ -+ case 38: /* choice_end: end */ -+{ -+ current_choice = NULL; -+ -+ if (zconf_endtoken((yyvsp[0].string), "choice")) { -+ menu_end_menu(); -+ printd(DEBUG_PARSE, "%s:%d:endchoice\n", cur_filename, cur_lineno); -+ } -+} -+ break; -+ -+ case 44: /* choice_option: T_PROMPT T_WORD_QUOTE if_expr T_EOL */ -+{ -+ menu_add_prompt(P_PROMPT, (yyvsp[-2].string), (yyvsp[-1].expr)); -+ printd(DEBUG_PARSE, "%s:%d:prompt\n", cur_filename, cur_lineno); -+} -+ break; -+ -+ case 45: /* choice_option: T_BOOL T_WORD_QUOTE if_expr T_EOL */ -+{ -+ menu_add_prompt(P_PROMPT, (yyvsp[-2].string), (yyvsp[-1].expr)); -+ printd(DEBUG_PARSE, "%s:%d:bool\n", cur_filename, cur_lineno); -+} -+ break; -+ -+ case 46: /* choice_option: T_DEFAULT nonconst_symbol if_expr T_EOL */ -+{ -+ menu_add_symbol(P_DEFAULT, (yyvsp[-2].symbol), (yyvsp[-1].expr)); -+ printd(DEBUG_PARSE, "%s:%d:default\n", cur_filename, cur_lineno); -+} -+ break; -+ -+ case 47: /* type: T_BOOL */ -+ { (yyval.type) = S_BOOLEAN; } -+ break; -+ -+ case 48: /* type: T_TRISTATE */ -+ { (yyval.type) = S_TRISTATE; } -+ break; -+ -+ case 49: /* type: T_INT */ -+ { (yyval.type) = S_INT; } -+ break; -+ -+ case 50: /* type: T_HEX */ -+ { (yyval.type) = S_HEX; } -+ break; -+ -+ case 51: /* type: T_STRING */ -+ { (yyval.type) = S_STRING; } -+ break; -+ -+ case 52: /* default: T_DEFAULT */ -+ { (yyval.type) = S_UNKNOWN; } -+ break; -+ -+ case 53: /* default: T_DEF_BOOL */ -+ { (yyval.type) = S_BOOLEAN; } -+ break; -+ -+ case 54: /* default: T_DEF_TRISTATE */ -+ { (yyval.type) = S_TRISTATE; } -+ break; -+ -+ case 55: /* if_entry: T_IF expr T_EOL */ -+{ -+ printd(DEBUG_PARSE, "%s:%d:if\n", cur_filename, cur_lineno); -+ menu_add_entry(NULL); -+ menu_add_dep((yyvsp[-1].expr)); -+ (yyval.menu) = menu_add_menu(); -+} -+ break; -+ -+ case 56: /* if_end: end */ -+{ -+ if (zconf_endtoken((yyvsp[0].string), "if")) { -+ menu_end_menu(); -+ printd(DEBUG_PARSE, "%s:%d:endif\n", cur_filename, cur_lineno); -+ } -+} -+ break; -+ -+ case 59: /* menu: T_MENU T_WORD_QUOTE T_EOL */ -+{ -+ menu_add_entry(NULL); -+ menu_add_prompt(P_MENU, (yyvsp[-1].string), NULL); -+ printd(DEBUG_PARSE, "%s:%d:menu\n", cur_filename, cur_lineno); -+} -+ break; -+ -+ case 60: /* menu_entry: menu menu_option_list */ -+{ -+ (yyval.menu) = menu_add_menu(); -+} -+ break; -+ -+ case 61: /* menu_end: end */ -+{ -+ if (zconf_endtoken((yyvsp[0].string), "menu")) { -+ menu_end_menu(); -+ printd(DEBUG_PARSE, "%s:%d:endmenu\n", cur_filename, cur_lineno); -+ } -+} -+ break; -+ -+ case 66: /* source_stmt: T_SOURCE T_WORD_QUOTE T_EOL */ -+{ -+ printd(DEBUG_PARSE, "%s:%d:source %s\n", cur_filename, cur_lineno, (yyvsp[-1].string)); -+ zconf_nextfile((yyvsp[-1].string)); -+ free((yyvsp[-1].string)); -+} -+ break; -+ -+ case 67: /* comment: T_COMMENT T_WORD_QUOTE T_EOL */ -+{ -+ menu_add_entry(NULL); -+ menu_add_prompt(P_COMMENT, (yyvsp[-1].string), NULL); -+ printd(DEBUG_PARSE, "%s:%d:comment\n", cur_filename, cur_lineno); -+} -+ break; -+ -+ case 71: /* help_start: T_HELP T_EOL */ -+{ -+ printd(DEBUG_PARSE, "%s:%d:help\n", cur_filename, cur_lineno); -+ zconf_starthelp(); -+} -+ break; -+ -+ case 72: /* help: help_start T_HELPTEXT */ -+{ -+ if (current_entry->help) { -+ free(current_entry->help); -+ zconfprint("warning: '%s' defined with more than one help text -- only the last one will be used", -+ current_entry->sym->name ?: ""); -+ } -+ -+ /* Is the help text empty or all whitespace? */ -+ if ((yyvsp[0].string)[strspn((yyvsp[0].string), " \f\n\r\t\v")] == '\0') -+ zconfprint("warning: '%s' defined with blank help text", -+ current_entry->sym->name ?: ""); -+ -+ current_entry->help = (yyvsp[0].string); -+} -+ break; -+ -+ case 73: /* depends: T_DEPENDS T_ON expr T_EOL */ -+{ -+ menu_add_dep((yyvsp[-1].expr)); -+ printd(DEBUG_PARSE, "%s:%d:depends on\n", cur_filename, cur_lineno); -+} -+ break; -+ -+ case 74: /* visible: T_VISIBLE if_expr T_EOL */ -+{ -+ menu_add_visibility((yyvsp[-1].expr)); -+} -+ break; -+ -+ case 76: /* prompt_stmt_opt: T_WORD_QUOTE if_expr */ -+{ -+ menu_add_prompt(P_PROMPT, (yyvsp[-1].string), (yyvsp[0].expr)); -+} -+ break; -+ -+ case 77: /* end: T_ENDMENU T_EOL */ -+ { (yyval.string) = "menu"; } -+ break; -+ -+ case 78: /* end: T_ENDCHOICE T_EOL */ -+ { (yyval.string) = "choice"; } -+ break; -+ -+ case 79: /* end: T_ENDIF T_EOL */ -+ { (yyval.string) = "if"; } -+ break; -+ -+ case 80: /* if_expr: %empty */ -+ { (yyval.expr) = NULL; } -+ break; -+ -+ case 81: /* if_expr: T_IF expr */ -+ { (yyval.expr) = (yyvsp[0].expr); } -+ break; -+ -+ case 82: /* expr: symbol */ -+ { (yyval.expr) = expr_alloc_symbol((yyvsp[0].symbol)); } -+ break; -+ -+ case 83: /* expr: symbol T_LESS symbol */ -+ { (yyval.expr) = expr_alloc_comp(E_LTH, (yyvsp[-2].symbol), (yyvsp[0].symbol)); } -+ break; -+ -+ case 84: /* expr: symbol T_LESS_EQUAL symbol */ -+ { (yyval.expr) = expr_alloc_comp(E_LEQ, (yyvsp[-2].symbol), (yyvsp[0].symbol)); } -+ break; -+ -+ case 85: /* expr: symbol T_GREATER symbol */ -+ { (yyval.expr) = expr_alloc_comp(E_GTH, (yyvsp[-2].symbol), (yyvsp[0].symbol)); } -+ break; -+ -+ case 86: /* expr: symbol T_GREATER_EQUAL symbol */ -+ { (yyval.expr) = expr_alloc_comp(E_GEQ, (yyvsp[-2].symbol), (yyvsp[0].symbol)); } -+ break; -+ -+ case 87: /* expr: symbol T_EQUAL symbol */ -+ { (yyval.expr) = expr_alloc_comp(E_EQUAL, (yyvsp[-2].symbol), (yyvsp[0].symbol)); } -+ break; -+ -+ case 88: /* expr: symbol T_UNEQUAL symbol */ -+ { (yyval.expr) = expr_alloc_comp(E_UNEQUAL, (yyvsp[-2].symbol), (yyvsp[0].symbol)); } -+ break; -+ -+ case 89: /* expr: T_OPEN_PAREN expr T_CLOSE_PAREN */ -+ { (yyval.expr) = (yyvsp[-1].expr); } -+ break; -+ -+ case 90: /* expr: T_NOT expr */ -+ { (yyval.expr) = expr_alloc_one(E_NOT, (yyvsp[0].expr)); } -+ break; -+ -+ case 91: /* expr: expr T_OR expr */ -+ { (yyval.expr) = expr_alloc_two(E_OR, (yyvsp[-2].expr), (yyvsp[0].expr)); } -+ break; -+ -+ case 92: /* expr: expr T_AND expr */ -+ { (yyval.expr) = expr_alloc_two(E_AND, (yyvsp[-2].expr), (yyvsp[0].expr)); } -+ break; -+ -+ case 93: /* nonconst_symbol: T_WORD */ -+ { (yyval.symbol) = sym_lookup((yyvsp[0].string), 0); free((yyvsp[0].string)); } -+ break; -+ -+ case 95: /* symbol: T_WORD_QUOTE */ -+ { (yyval.symbol) = sym_lookup((yyvsp[0].string), SYMBOL_CONST); free((yyvsp[0].string)); } -+ break; -+ -+ case 96: /* assignment_stmt: T_WORD assign_op assign_val T_EOL */ -+ { variable_add((yyvsp[-3].string), (yyvsp[-1].string), (yyvsp[-2].flavor)); free((yyvsp[-3].string)); free((yyvsp[-1].string)); } -+ break; -+ -+ case 97: /* assign_op: T_EQUAL */ -+ { (yyval.flavor) = VAR_RECURSIVE; } -+ break; -+ -+ case 98: /* assign_op: T_COLON_EQUAL */ -+ { (yyval.flavor) = VAR_SIMPLE; } -+ break; -+ -+ case 99: /* assign_op: T_PLUS_EQUAL */ -+ { (yyval.flavor) = VAR_APPEND; } -+ break; -+ -+ case 100: /* assign_val: %empty */ -+ { (yyval.string) = xstrdup(""); } -+ break; -+ -+ -+ -+ default: break; -+ } -+ /* User semantic actions sometimes alter yychar, and that requires -+ that yytoken be updated with the new translation. We take the -+ approach of translating immediately before every use of yytoken. -+ One alternative is translating here after every semantic action, -+ but that translation would be missed if the semantic action invokes -+ YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or -+ if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an -+ incorrect destructor might then be invoked immediately. In the -+ case of YYERROR or YYBACKUP, subsequent parser actions might lead -+ to an incorrect destructor call or verbose syntax error message -+ before the lookahead is translated. */ -+ YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc); -+ -+ YYPOPSTACK (yylen); -+ yylen = 0; -+ -+ *++yyvsp = yyval; -+ -+ /* Now 'shift' the result of the reduction. Determine what state -+ that goes to, based on the state we popped back to and the rule -+ number reduced by. */ -+ { -+ const int yylhs = yyr1[yyn] - YYNTOKENS; -+ const int yyi = yypgoto[yylhs] + *yyssp; -+ yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp -+ ? yytable[yyi] -+ : yydefgoto[yylhs]); -+ } -+ -+ goto yynewstate; -+ -+ -+/*--------------------------------------. -+| yyerrlab -- here on detecting error. | -+`--------------------------------------*/ -+yyerrlab: -+ /* Make sure we have latest lookahead translation. See comments at -+ user semantic actions for why this is necessary. */ -+ yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar); -+ /* If not already recovering from an error, report this error. */ -+ if (!yyerrstatus) -+ { -+ ++yynerrs; -+ yyerror (YY_("syntax error")); -+ } -+ -+ if (yyerrstatus == 3) -+ { -+ /* If just tried and failed to reuse lookahead token after an -+ error, discard it. */ -+ -+ if (yychar <= YYEOF) -+ { -+ /* Return failure if at end of input. */ -+ if (yychar == YYEOF) -+ YYABORT; -+ } -+ else -+ { -+ yydestruct ("Error: discarding", -+ yytoken, &yylval); -+ yychar = YYEMPTY; -+ } -+ } -+ -+ /* Else will try to reuse lookahead token after shifting the error -+ token. */ -+ goto yyerrlab1; -+ -+ -+/*---------------------------------------------------. -+| yyerrorlab -- error raised explicitly by YYERROR. | -+`---------------------------------------------------*/ -+yyerrorlab: -+ /* Pacify compilers when the user code never invokes YYERROR and the -+ label yyerrorlab therefore never appears in user code. */ -+ if (0) -+ YYERROR; -+ ++yynerrs; -+ -+ /* Do not reclaim the symbols of the rule whose action triggered -+ this YYERROR. */ -+ YYPOPSTACK (yylen); -+ yylen = 0; -+ YY_STACK_PRINT (yyss, yyssp); -+ yystate = *yyssp; -+ goto yyerrlab1; -+ -+ -+/*-------------------------------------------------------------. -+| yyerrlab1 -- common code for both syntax error and YYERROR. | -+`-------------------------------------------------------------*/ -+yyerrlab1: -+ yyerrstatus = 3; /* Each real token shifted decrements this. */ -+ -+ /* Pop stack until we find a state that shifts the error token. */ -+ for (;;) -+ { -+ yyn = yypact[yystate]; -+ if (!yypact_value_is_default (yyn)) -+ { -+ yyn += YYSYMBOL_YYerror; -+ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror) -+ { -+ yyn = yytable[yyn]; -+ if (0 < yyn) -+ break; -+ } -+ } -+ -+ /* Pop the current state because it cannot handle the error token. */ -+ if (yyssp == yyss) -+ YYABORT; -+ -+ -+ yydestruct ("Error: popping", -+ YY_ACCESSING_SYMBOL (yystate), yyvsp); -+ YYPOPSTACK (1); -+ yystate = *yyssp; -+ YY_STACK_PRINT (yyss, yyssp); -+ } -+ -+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN -+ *++yyvsp = yylval; -+ YY_IGNORE_MAYBE_UNINITIALIZED_END -+ -+ -+ /* Shift the error token. */ -+ YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp); -+ -+ yystate = yyn; -+ goto yynewstate; -+ -+ -+/*-------------------------------------. -+| yyacceptlab -- YYACCEPT comes here. | -+`-------------------------------------*/ -+yyacceptlab: -+ yyresult = 0; -+ goto yyreturnlab; -+ -+ -+/*-----------------------------------. -+| yyabortlab -- YYABORT comes here. | -+`-----------------------------------*/ -+yyabortlab: -+ yyresult = 1; -+ goto yyreturnlab; -+ -+ -+/*-----------------------------------------------------------. -+| yyexhaustedlab -- YYNOMEM (memory exhaustion) comes here. | -+`-----------------------------------------------------------*/ -+yyexhaustedlab: -+ yyerror (YY_("memory exhausted")); -+ yyresult = 2; -+ goto yyreturnlab; -+ -+ -+/*----------------------------------------------------------. -+| yyreturnlab -- parsing is finished, clean up and return. | -+`----------------------------------------------------------*/ -+yyreturnlab: -+ if (yychar != YYEMPTY) -+ { -+ /* Make sure we have latest lookahead translation. See comments at -+ user semantic actions for why this is necessary. */ -+ yytoken = YYTRANSLATE (yychar); -+ yydestruct ("Cleanup: discarding lookahead", -+ yytoken, &yylval); -+ } -+ /* Do not reclaim the symbols of the rule whose action triggered -+ this YYABORT or YYACCEPT. */ -+ YYPOPSTACK (yylen); -+ YY_STACK_PRINT (yyss, yyssp); -+ while (yyssp != yyss) -+ { -+ yydestruct ("Cleanup: popping", -+ YY_ACCESSING_SYMBOL (+*yyssp), yyvsp); -+ YYPOPSTACK (1); -+ } -+#ifndef yyoverflow -+ if (yyss != yyssa) -+ YYSTACK_FREE (yyss); -+#endif -+ -+ return yyresult; -+} -+ -+ -+ -+/** -+ * choice_check_sanity - check sanity of a choice member -+ * -+ * @menu: menu of the choice member -+ * -+ * Return: -1 if an error is found, 0 otherwise. -+ */ -+static int choice_check_sanity(const struct menu *menu) -+{ -+ struct property *prop; -+ int ret = 0; -+ -+ for (prop = menu->sym->prop; prop; prop = prop->next) { -+ if (prop->type == P_DEFAULT) { -+ fprintf(stderr, "%s:%d: error: %s", -+ prop->filename, prop->lineno, -+ "defaults for choice values not supported\n"); -+ ret = -1; -+ } -+ -+ if (prop->menu != menu && prop->type == P_PROMPT && -+ prop->menu->parent != menu->parent) { -+ fprintf(stderr, "%s:%d: error: %s", -+ prop->filename, prop->lineno, -+ "choice value has a prompt outside its choice group\n"); -+ ret = -1; -+ } -+ } -+ -+ return ret; -+} -+ -+void conf_parse(const char *name) -+{ -+ struct menu *menu; -+ -+ autoconf_cmd = str_new(); -+ -+ str_printf(&autoconf_cmd, "\ndeps_config := \\\n"); -+ -+ zconf_initscan(name); -+ -+ _menu_init(); -+ -+ if (getenv("ZCONF_DEBUG")) -+ yydebug = 1; -+ yyparse(); -+ -+ str_printf(&autoconf_cmd, -+ "\n" -+ "$(autoconfig): $(deps_config)\n" -+ "$(deps_config): ;\n"); -+ -+ env_write_dep(&autoconf_cmd); -+ -+ /* Variables are expanded in the parse phase. We can free them here. */ -+ variable_all_del(); -+ -+ if (yynerrs) -+ exit(1); -+ if (!modules_sym) -+ modules_sym = &symbol_no; -+ -+ if (!menu_has_prompt(&rootmenu)) { -+ current_entry = &rootmenu; -+ menu_add_prompt(P_MENU, "Main menu", NULL); -+ } -+ -+ menu_finalize(); -+ -+ menu_for_each_entry(menu) { -+ struct menu *child; -+ -+ if (menu->sym && sym_check_deps(menu->sym)) -+ yynerrs++; -+ -+ if (menu->sym && sym_is_choice(menu->sym)) { -+ menu_for_each_sub_entry(child, menu) -+ if (child->sym && choice_check_sanity(child)) -+ yynerrs++; -+ } -+ } -+ -+ if (yynerrs) -+ exit(1); -+ conf_set_changed(true); -+} -+ -+static bool zconf_endtoken(const char *tokenname, -+ const char *expected_tokenname) -+{ -+ if (strcmp(tokenname, expected_tokenname)) { -+ zconf_error("unexpected '%s' within %s block", -+ tokenname, expected_tokenname); -+ yynerrs++; -+ return false; -+ } -+ if (strcmp(current_menu->filename, cur_filename)) { -+ zconf_error("'%s' in different file than '%s'", -+ tokenname, expected_tokenname); -+ fprintf(stderr, "%s:%d: location of the '%s'\n", -+ current_menu->filename, current_menu->lineno, -+ expected_tokenname); -+ yynerrs++; -+ return false; -+ } -+ return true; -+} -+ -+static void zconfprint(const char *err, ...) -+{ -+ va_list ap; -+ -+ fprintf(stderr, "%s:%d: ", cur_filename, cur_lineno); -+ va_start(ap, err); -+ vfprintf(stderr, err, ap); -+ va_end(ap); -+ fprintf(stderr, "\n"); -+} -+ -+static void zconf_error(const char *err, ...) -+{ -+ va_list ap; -+ -+ yynerrs++; -+ fprintf(stderr, "%s:%d: ", cur_filename, cur_lineno); -+ va_start(ap, err); -+ vfprintf(stderr, err, ap); -+ va_end(ap); -+ fprintf(stderr, "\n"); -+} -+ -+static void yyerror(const char *err) -+{ -+ fprintf(stderr, "%s:%d: %s\n", cur_filename, cur_lineno, err); -+} -+ -+static void print_quoted_string(FILE *out, const char *str) -+{ -+ const char *p; -+ int len; -+ -+ putc('"', out); -+ while ((p = strchr(str, '"'))) { -+ len = p - str; -+ if (len) -+ fprintf(out, "%.*s", len, str); -+ fputs("\\\"", out); -+ str = p + 1; -+ } -+ fputs(str, out); -+ putc('"', out); -+} -+ -+static void print_symbol(FILE *out, const struct menu *menu) -+{ -+ struct symbol *sym = menu->sym; -+ struct property *prop; -+ -+ if (sym_is_choice(sym)) -+ fprintf(out, "\nchoice\n"); -+ else -+ fprintf(out, "\nconfig %s\n", sym->name); -+ switch (sym->type) { -+ case S_BOOLEAN: -+ fputs(" bool\n", out); -+ break; -+ case S_TRISTATE: -+ fputs(" tristate\n", out); -+ break; -+ case S_STRING: -+ fputs(" string\n", out); -+ break; -+ case S_INT: -+ fputs(" integer\n", out); -+ break; -+ case S_HEX: -+ fputs(" hex\n", out); -+ break; -+ default: -+ fputs(" ???\n", out); -+ break; -+ } -+ for (prop = sym->prop; prop; prop = prop->next) { -+ if (prop->menu != menu) -+ continue; -+ switch (prop->type) { -+ case P_PROMPT: -+ fputs(" prompt ", out); -+ print_quoted_string(out, prop->text); -+ if (!expr_is_yes(prop->visible.expr)) { -+ fputs(" if ", out); -+ expr_fprint(prop->visible.expr, out); -+ } -+ fputc('\n', out); -+ break; -+ case P_DEFAULT: -+ fputs( " default ", out); -+ expr_fprint(prop->expr, out); -+ if (!expr_is_yes(prop->visible.expr)) { -+ fputs(" if ", out); -+ expr_fprint(prop->visible.expr, out); -+ } -+ fputc('\n', out); -+ break; -+ case P_SELECT: -+ fputs( " select ", out); -+ expr_fprint(prop->expr, out); -+ fputc('\n', out); -+ break; -+ case P_IMPLY: -+ fputs( " imply ", out); -+ expr_fprint(prop->expr, out); -+ fputc('\n', out); -+ break; -+ case P_RANGE: -+ fputs( " range ", out); -+ expr_fprint(prop->expr, out); -+ fputc('\n', out); -+ break; -+ case P_MENU: -+ fputs( " menu ", out); -+ print_quoted_string(out, prop->text); -+ fputc('\n', out); -+ break; -+ default: -+ fprintf(out, " unknown prop %d!\n", prop->type); -+ break; -+ } -+ } -+ if (menu->help) { -+ int len = strlen(menu->help); -+ while (menu->help[--len] == '\n') -+ menu->help[len] = 0; -+ fprintf(out, " help\n%s\n", menu->help); -+ } -+} -+ -+void zconfdump(FILE *out) -+{ -+ struct property *prop; -+ struct symbol *sym; -+ struct menu *menu; -+ -+ menu = rootmenu.list; -+ while (menu) { -+ if ((sym = menu->sym)) -+ print_symbol(out, menu); -+ else if ((prop = menu->prompt)) { -+ switch (prop->type) { -+ case P_COMMENT: -+ fputs("\ncomment ", out); -+ print_quoted_string(out, prop->text); -+ fputs("\n", out); -+ break; -+ case P_MENU: -+ fputs("\nmenu ", out); -+ print_quoted_string(out, prop->text); -+ fputs("\n", out); -+ break; -+ default: -+ ; -+ } -+ if (!expr_is_yes(prop->visible.expr)) { -+ fputs(" depends ", out); -+ expr_fprint(prop->visible.expr, out); -+ fputc('\n', out); -+ } -+ } -+ -+ if (menu->list) -+ menu = menu->list; -+ else if (menu->next) -+ menu = menu->next; -+ else while ((menu = menu->parent)) { -+ if (menu->prompt && menu->prompt->type == P_MENU) -+ fputs("\nendmenu\n", out); -+ if (menu->next) { -+ menu = menu->next; -+ break; -+ } -+ } -+ } -+} diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0014-Kconfig.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0014-Kconfig.patch new file mode 100644 index 0000000..2694d88 --- /dev/null +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0014-Kconfig.patch @@ -0,0 +1,9 @@ +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/Kconfig 2024-11-17 23:15:08.000000000 +0100 ++++ ./Kconfig 2025-08-29 08:46:41.313994652 +0200 +@@ -30,3 +30,6 @@ + source "lib/Kconfig.debug" + + source "Documentation/Kconfig" ++ ++# SOO subsystems and drivers ++source "soo/Kconfig" diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0014-parser.tab.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0014-parser.tab.h.patch deleted file mode 100644 index baf9ee1..0000000 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0014-parser.tab.h.patch +++ /dev/null @@ -1,136 +0,0 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/scripts/kconfig/parser.tab.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./scripts/kconfig/parser.tab.h 2026-03-23 18:27:35.928935130 +0100 -@@ -0,0 +1,133 @@ -+/* A Bison parser, made by GNU Bison 3.8.2. */ -+ -+/* Bison interface for Yacc-like parsers in C -+ -+ Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation, -+ Inc. -+ -+ This program is free software: you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation, either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+/* As a special exception, you may create a larger work that contains -+ part or all of the Bison parser skeleton and distribute that work -+ under terms of your choice, so long as that work isn't itself a -+ parser generator using the skeleton or a modified version thereof -+ as a parser skeleton. Alternatively, if you modify or redistribute -+ the parser skeleton itself, you may (at your option) remove this -+ special exception, which will cause the skeleton and the resulting -+ Bison output files to be licensed under the GNU General Public -+ License without this special exception. -+ -+ This special exception was added by the Free Software Foundation in -+ version 2.2 of Bison. */ -+ -+/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, -+ especially those whose name start with YY_ or yy_. They are -+ private implementation details that can be changed or removed. */ -+ -+#ifndef YY_YY_SCRIPTS_KCONFIG_PARSER_TAB_H_INCLUDED -+# define YY_YY_SCRIPTS_KCONFIG_PARSER_TAB_H_INCLUDED -+/* Debug traces. */ -+#ifndef YYDEBUG -+# define YYDEBUG 1 -+#endif -+#if YYDEBUG -+extern int yydebug; -+#endif -+ -+/* Token kinds. */ -+#ifndef YYTOKENTYPE -+# define YYTOKENTYPE -+ enum yytokentype -+ { -+ YYEMPTY = -2, -+ YYEOF = 0, /* "end of file" */ -+ YYerror = 256, /* error */ -+ YYUNDEF = 257, /* "invalid token" */ -+ T_HELPTEXT = 258, /* T_HELPTEXT */ -+ T_WORD = 259, /* T_WORD */ -+ T_WORD_QUOTE = 260, /* T_WORD_QUOTE */ -+ T_BOOL = 261, /* T_BOOL */ -+ T_CHOICE = 262, /* T_CHOICE */ -+ T_CLOSE_PAREN = 263, /* T_CLOSE_PAREN */ -+ T_COLON_EQUAL = 264, /* T_COLON_EQUAL */ -+ T_COMMENT = 265, /* T_COMMENT */ -+ T_CONFIG = 266, /* T_CONFIG */ -+ T_DEFAULT = 267, /* T_DEFAULT */ -+ T_DEF_BOOL = 268, /* T_DEF_BOOL */ -+ T_DEF_TRISTATE = 269, /* T_DEF_TRISTATE */ -+ T_DEPENDS = 270, /* T_DEPENDS */ -+ T_ENDCHOICE = 271, /* T_ENDCHOICE */ -+ T_ENDIF = 272, /* T_ENDIF */ -+ T_ENDMENU = 273, /* T_ENDMENU */ -+ T_HELP = 274, /* T_HELP */ -+ T_HEX = 275, /* T_HEX */ -+ T_IF = 276, /* T_IF */ -+ T_IMPLY = 277, /* T_IMPLY */ -+ T_INT = 278, /* T_INT */ -+ T_MAINMENU = 279, /* T_MAINMENU */ -+ T_MENU = 280, /* T_MENU */ -+ T_MENUCONFIG = 281, /* T_MENUCONFIG */ -+ T_MODULES = 282, /* T_MODULES */ -+ T_ON = 283, /* T_ON */ -+ T_OPEN_PAREN = 284, /* T_OPEN_PAREN */ -+ T_PLUS_EQUAL = 285, /* T_PLUS_EQUAL */ -+ T_PROMPT = 286, /* T_PROMPT */ -+ T_RANGE = 287, /* T_RANGE */ -+ T_SELECT = 288, /* T_SELECT */ -+ T_SOURCE = 289, /* T_SOURCE */ -+ T_STRING = 290, /* T_STRING */ -+ T_TRISTATE = 291, /* T_TRISTATE */ -+ T_VISIBLE = 292, /* T_VISIBLE */ -+ T_EOL = 293, /* T_EOL */ -+ T_ASSIGN_VAL = 294, /* T_ASSIGN_VAL */ -+ T_OR = 295, /* T_OR */ -+ T_AND = 296, /* T_AND */ -+ T_EQUAL = 297, /* T_EQUAL */ -+ T_UNEQUAL = 298, /* T_UNEQUAL */ -+ T_LESS = 299, /* T_LESS */ -+ T_LESS_EQUAL = 300, /* T_LESS_EQUAL */ -+ T_GREATER = 301, /* T_GREATER */ -+ T_GREATER_EQUAL = 302, /* T_GREATER_EQUAL */ -+ T_NOT = 303 /* T_NOT */ -+ }; -+ typedef enum yytokentype yytoken_kind_t; -+#endif -+ -+/* Value type. */ -+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -+union YYSTYPE -+{ -+ -+ char *string; -+ struct symbol *symbol; -+ struct expr *expr; -+ struct menu *menu; -+ enum symbol_type type; -+ enum variable_flavor flavor; -+ -+ -+}; -+typedef union YYSTYPE YYSTYPE; -+# define YYSTYPE_IS_TRIVIAL 1 -+# define YYSTYPE_IS_DECLARED 1 -+#endif -+ -+ -+extern YYSTYPE yylval; -+ -+ -+int yyparse (void); -+ -+ -+#endif /* !YY_YY_SCRIPTS_KCONFIG_PARSER_TAB_H_INCLUDED */ diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0015-.mailmap.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0015-.mailmap.patch new file mode 100644 index 0000000..a357c22 --- /dev/null +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0015-.mailmap.patch @@ -0,0 +1,738 @@ +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/.mailmap 2024-11-17 23:15:08.000000000 +0100 ++++ ./.mailmap 1970-01-01 01:00:00.000000000 +0100 +@@ -1,735 +0,0 @@ +-# +-# This list is used by git-shortlog to fix a few botched name translations +-# in the git archive, either because the author's full name was messed up +-# and/or not always written the same way, making contributions from the +-# same person appearing not to be so or badly displayed. Also allows for +-# old email addresses to map to new email addresses. +-# +-# For format details, see "man gitmailmap" or "MAPPING AUTHORS" in +-# "man git-shortlog" on older systems. +-# +-# Please keep this list dictionary sorted. +-# +-Aaron Durbin +-Abel Vesa +-Abel Vesa +-Abhijeet Dharmapurikar +-Abhinav Kumar +-Ahmad Masri +-Adam Oldham +-Adam Radford +-Adriana Reus +-Adrian Bunk +-Ajay Kaher +-Akhil P Oommen +-Alan Cox +-Alan Cox +-Aleksandar Markovic +-Aleksey Gorelov +-Alexander Lobakin +-Alexander Lobakin +-Alexander Lobakin +-Alexander Mikhalitsyn +-Alexander Mikhalitsyn +-Alexandre Belloni +-Alexandre Ghiti +-Alexei Avshalom Lazar +-Alexei Starovoitov +-Alexei Starovoitov +-Alexei Starovoitov +-Alexey Makhalov +-Alex Elder +-Alex Elder +-Alex Elder +-Alex Elder +-Alex Elder +-Alex Elder +-Alex Elder +-Alex Elder +-Alex Elder +-Alex Elder +-Alex Hung +-Alex Shi +-Alex Shi +-Alex Shi +-Aloka Dixit +-Al Viro +-Al Viro +-Amit Blay +-Amit Nischal +-Andi Kleen +-Andi Shyti +-Andreas Herrmann +-Andreas Hindborg +-Andrej Shadura +-Andrej Shadura +-Andrew Morton +-Andrew Murray +-Andrew Murray +-Andrew Vasquez +-Andrey Konovalov +-Andrey Ryabinin +-Andrey Ryabinin +-Andrzej Hajda +-André Almeida +-Andy Adamson +-Andy Chiu +-Andy Chiu +-Andy Shevchenko +-Andy Shevchenko +-Anilkumar Kolli +-Anirudh Ghayal +-Antoine Tenart +-Antoine Tenart +-Antonio Ospite +-Anup Patel +-Archit Taneja +-Ard Biesheuvel +-Arnaud Patard +-Arnd Bergmann +-Arun Kumar Neelakantam +-Ashok Raj Nagarajan +-Ashwin Chaugule +-Asutosh Das +-Atish Patra +-Avaneesh Kumar Dwivedi +-Axel Dyks +-Axel Lin +-Balakrishna Godavarthi +-Banajit Goswami +-Baochen Qiang +-Baolin Wang +-Baolin Wang +-Baolin Wang +-Baolin Wang +-Barry Song <21cnbao@gmail.com> +-Barry Song +-Barry Song +-Barry Song +-Barry Song +-Bart Van Assche +-Bart Van Assche +-Bartosz Golaszewski +-Ben Dooks +-Ben Dooks +-Ben Gardner +-Ben M Cahill +-Ben Widawsky +-Ben Widawsky +-Ben Widawsky +-Benjamin Poirier +-Benjamin Tissoires +-Benjamin Tissoires +-Bjorn Andersson +-Bjorn Andersson +-Bjorn Andersson +-Björn Steinbrink +-Björn Töpel +-Björn Töpel +-Boris Brezillon +-Boris Brezillon +-Boris Brezillon +-Boris Brezillon +-Brendan Higgins +-Brian Avery +-Brian King +-Brian Silverman +-Bryan Tan +-Cai Huoqing +-Can Guo +-Carl Huang +-Carlos Bilbao +-Changbin Du +-Changbin Du +-Chao Yu +-Chao Yu +-Chester Lin +-Chris Chiu +-Chris Chiu +-Chris Lew +-Christian Borntraeger +-Christian Borntraeger +-Christian Borntraeger +-Christian Brauner +-Christian Brauner +-Christian Brauner +-Christian Marangi +-Christophe Ricard +-Christoph Hellwig +-Chuck Lever +-Chuck Lever +-Chuck Lever +-Claudiu Beznea +-Colin Ian King +-Corey Minyard +-Damian Hobson-Garcia +-Dan Carpenter +-Daniel Borkmann +-Daniel Borkmann +-Daniel Borkmann +-Daniel Borkmann +-Daniel Borkmann +-Daniel Borkmann +-David Brownell +-David Collins +-David Heidelberg +-David Rheinsberg +-David Rheinsberg +-David Rheinsberg +-David Woodhouse +-Dedy Lansky +-Deepak Kumar Singh +-Dengcheng Zhu +-Dengcheng Zhu +-Dengcheng Zhu +-Dengcheng Zhu +- +-Dikshita Agarwal +-Dmitry Baryshkov +-Dmitry Baryshkov <[dbaryshkov@gmail.com]> +-Dmitry Baryshkov +-Dmitry Baryshkov +-Dmitry Safonov <0x7f454c46@gmail.com> +-Dmitry Safonov <0x7f454c46@gmail.com> +-Dmitry Safonov <0x7f454c46@gmail.com> +-Domen Puncer +-Douglas Gilbert +-Ed L. Cashin +-Elliot Berman +-Enric Balletbo i Serra +-Enric Balletbo i Serra +-Erik Kaneda +-Eugen Hristev +-Eugen Hristev +-Evgeniy Polyakov +-Ezequiel Garcia +-Faith Ekstrand +-Faith Ekstrand +-Faith Ekstrand +-Fangrui Song +-Felipe W Damasio +-Felix Kuhling +-Felix Moeller +-Fenglin Wu +-Filipe Lautert +-Finn Thain +-Fiona Behrens +-Fiona Behrens +-Fiona Behrens +-Franck Bui-Huu +-Frank Rowand +-Frank Rowand +-Frank Rowand +-Frank Rowand +-Frank Zago +-Gao Xiang +-Gao Xiang +-Gao Xiang +-Gao Xiang +-Geliang Tang +-Geliang Tang +-Geliang Tang +-Geliang Tang +-Geliang Tang +-Geliang Tang +-Georgi Djakov +-Gerald Schaefer +-Gerald Schaefer +-Gerald Schaefer +-Greg Kroah-Hartman +-Greg Kroah-Hartman +-Greg Kroah-Hartman +-Greg Kurz +-Gregory CLEMENT +-Guilherme G. Piccoli +-Guilherme G. Piccoli +-Gokul Sriram Palanisamy +-Govindaraj Saminathan +-Guo Ren +-Guo Ren +-Guru Das Srinagesh +-Gustavo Padovan +-Gustavo Padovan +-Hanjun Guo +-Heiko Carstens +-Heiko Carstens +-Heiko Stuebner +-Heiko Stuebner +-Heiko Stuebner +-Henk Vergonet +-Henrik Kretzschmar +-Henrik Rydberg +-Herbert Xu +-Huacai Chen +-Huacai Chen +-J. Bruce Fields +-J. Bruce Fields +-Jacob Shin +-Jack Pham +-Jaegeuk Kim +-Jaegeuk Kim +-Jaegeuk Kim +-Jakub Kicinski +-James Bottomley +-James Bottomley +-James Clark +-James E Wilson +-James Hogan +-James Hogan +-James Ketrenos +-Jan Glauber +-Jan Glauber +-Jan Glauber +-Jan Kuliga +-Jarkko Sakkinen +-Jarkko Sakkinen +-Jarkko Sakkinen +-Jason Gunthorpe +-Jason Gunthorpe +-Jason Gunthorpe +- +-Javi Merino +-Jayachandran C +-Jayachandran C +-Jayachandran C +-Jayachandran C +- +-Jean Tourrilhes +-Jeevan Shriram +-Jeff Garzik +-Jeff Layton +-Jeff Layton +-Jeff Layton +-Jeffrey Hugo +-Jens Axboe +-Jens Axboe +-Jens Axboe +-Jens Axboe +-Jens Osterkamp +-Jernej Skrabec +-Jesper Dangaard Brouer +-Jesper Dangaard Brouer +-Jesper Dangaard Brouer +-Jesper Dangaard Brouer +-Jesper Dangaard Brouer +-Jessica Zhang +-Jilai Wang +-Jiri Kosina +-Jiri Kosina +-Jiri Kosina +-Jiri Pirko +-Jiri Pirko +-Jiri Pirko +-Jiri Slaby +-Jiri Slaby +-Jiri Slaby +-Jiri Slaby +-Jiri Slaby +-Jisheng Zhang +-Jisheng Zhang +-Jishnu Prakash +-Joel Granados +-Johan Hovold +-Johan Hovold +-John Crispin +-John Fastabend +-John Garry +-John Keeping +-John Moon +-John Paul Adrian Glaubitz +-John Stultz +- +- +-Jonas Gorski +-Jordan Crouse +- +- +- +- +- +-Josh Poimboeuf +-Josh Poimboeuf +-Jouni Malinen +-Juha Yrjola +-Juha Yrjola +-Juha Yrjola +-Julien Thierry +-Iskren Chernev +-Kalle Valo +-Kalyan Thota +-Karthikeyan Periyasamy +-Kathiravan T +-Kay Sievers +-Kees Cook +-Kees Cook +-Kees Cook +-Kees Cook +-Kees Cook +-Keith Busch +-Keith Busch +-Kenneth W Chen +-Kenneth Westfield +-Kiran Gunda +-Kirill Tkhai +-Kishon Vijay Abraham I +-Konrad Dybcio +-Konrad Dybcio +-Konstantin Khlebnikov +-Konstantin Khlebnikov +-Koushik +-Krishna Manikandan +-Krzysztof Kozlowski +-Krzysztof Kozlowski +-Krzysztof Kozlowski +-Kshitiz Godara +-Kuninori Morimoto +-Kuogee Hsieh +-Lee Jones +-Lee Jones +-Lee Jones +-Lee Jones +-Leonard Crestez +-Leonard Crestez +-Leonardo Bras +-Leonard Göhrs +-Leonid I Ananiev +-Leon Romanovsky +-Leon Romanovsky +-Leon Romanovsky +-Leo Yan +-Liam Mark +-Linas Vepstas +-Linus Lüssing +-Linus Lüssing +- +-Li Yang +-Li Yang +-Lior David +-Lorenzo Pieralisi +-Lorenzo Stoakes +-Luca Ceresoli +-Luca Weiss +-Lukasz Luba +-Luo Jie +-Maciej W. Rozycki +-Maciej W. Rozycki +-Maharaja Kennadyrajan +-Maheshwar Ajja +-Malathi Gottam +-Manikanta Pubbisetty +-Manivannan Sadhasivam +-Manoj Basapathi +-Marcin Nowakowski +-Marc Zyngier +-Marek Behún +-Marek Behún Marek Behun +-Mark Brown +-Mark Starovoytov +-Markus Schneider-Pargmann +-Mark Yao +-Martin Kepplinger +-Martin Kepplinger +-Martin Kepplinger +-Martyna Szapar-Mudlaw +-Mathieu Othacehe +-Mat Martineau +-Mat Martineau +-Matthew Wilcox +-Matthew Wilcox +-Matthew Wilcox +-Matthew Wilcox +-Matthew Wilcox +-Matthew Wilcox +-Matthew Wilcox +-Matthias Fuchs +-Matthieu Baerts +-Matthieu CASTET +-Matti Vaittinen +-Matt Ranostay +-Matt Ranostay +-Matt Ranostay Matthew Ranostay +-Matt Ranostay +-Matt Redfearn +-Maulik Shah +-Mauro Carvalho Chehab +-Mauro Carvalho Chehab +-Mauro Carvalho Chehab +-Mauro Carvalho Chehab +-Mauro Carvalho Chehab +-Mauro Carvalho Chehab +-Mauro Carvalho Chehab +-Maxim Mikityanskiy +-Maxim Mikityanskiy +-Maxime Ripard +-Maxime Ripard +-Maxime Ripard +-Maya Erez +-Mayuresh Janorkar +-Md Sadre Alam +-Miaoqing Pan +-Michael Buesch +-Michal Simek +-Michel Dänzer +-Michel Lespinasse +-Michel Lespinasse +-Michel Lespinasse +-Miguel Ojeda +-Mike Rapoport +-Mike Rapoport +-Mike Rapoport +-Mike Tipton +-Miodrag Dinic +-Miquel Raynal +-Mitesh shah +-Mohit Kumar +-Morten Welinder +-Morten Welinder +-Morten Welinder +-Morten Welinder +-Mukesh Ojha +-Muna Sinada +-Murali Nalajala +-Mythri P K +-Nadav Amit +-Nadav Amit +-Nadia Yvette Chambers William Lee Irwin III +-Naoya Horiguchi +-Naoya Horiguchi +-Nathan Chancellor +-Naveen N Rao +-Naveen N Rao +-Neeraj Upadhyay +-Neeraj Upadhyay +-Neil Armstrong +-Nguyen Anh Quynh +-Nicholas Piggin +-Nicholas Piggin +-Nicholas Piggin +-Nicholas Piggin +-Nicholas Piggin +-Nicolas Ferre +-Nicolas Pitre +-Nicolas Pitre +-Nicolas Saenz Julienne +-Nicolas Saenz Julienne +-Niklas Söderlund +-Nikolay Aleksandrov +-Nikolay Aleksandrov +-Nikolay Aleksandrov +-Nikolay Aleksandrov +-Nikolay Aleksandrov +-Odelu Kukatla +-Oleksandr Natalenko +-Oleksij Rempel +-Oleksij Rempel +-Oleksij Rempel +-Oleksij Rempel +-Oleksij Rempel +-Oliver Upton +-Ondřej Jirman +-Oza Pawandeep +-Pali Rohár +-Paolo 'Blaisorblade' Giarrusso +-Patrick Mochel +-Paul Burton +-Paul Burton +-Paul E. McKenney +-Paul E. McKenney +-Paul E. McKenney +-Paul E. McKenney +-Paul Mackerras +-Paul Mackerras +-Paul Moore +-Paul Moore +-Pavankumar Kondeti +-Peter A Jonsson +-Peter Oruba +-Peter Oruba +-Pierre-Louis Bossart +-Pratyush Anand +-Praveen BP +-Pradeep Kumar Chitrapu +-Prasad Sodagudi +-Punit Agrawal +-Puranjay Mohan +-Qais Yousef +-Qais Yousef +-Quentin Monnet +-Quentin Monnet +-Quentin Perret +-Rafael J. Wysocki +-Rajeev Nandan +-Rajendra Nayak +-Rajeshwari Ravindra Kamble +-Raju P.L.S.S.S.N +-Rajesh Shah +-Rakesh Pillai +-Ralf Baechle +-Ralf Wildenhues +-Ram Chandra Jangir +-Randy Dunlap +-Randy Dunlap +-Randy Dunlap +-Randy Dunlap +-Ravi Kumar Bokka +-Ravi Kumar Siddojigari +-Rémi Denis-Courmont +-Ricardo Ribalda +-Ricardo Ribalda Ricardo Ribalda Delgado +-Ricardo Ribalda +-Richard Genoud +-Richard Leitner +-Richard Leitner +-Richard Leitner +-Robert Foss +-Rocky Liao +-Roman Gushchin +-Roman Gushchin +-Roman Gushchin +-Ronak Doshi +-Muchun Song +-Muchun Song +-Ross Zwisler +-Rudolf Marek +-Rui Saraiva +-Sachin P Sant +-Sai Prakash Ranjan +-Sakari Ailus +-Sam Ravnborg +-Sankeerth Billakanti +-Santosh Shilimkar +-Santosh Shilimkar +-Sarangdhar Joshi +-Sascha Hauer +-Sahitya Tummala +-Sathishkumar Muruganandam +-Satya Priya +-S.Çağlar Onur +-Sayali Lokhande +-Sean Christopherson +-Sean Nyekjaer +-Sean Tranchetti +-Sebastian Reichel +-Sebastian Reichel +-Sedat Dilek +-Senthilkumar N L +-Serge Hallyn +-Serge Hallyn +-Seth Forshee +-Shakeel Butt +-Shannon Nelson +-Shannon Nelson +-Shannon Nelson +-Sharath Chandra Vurukala +-Shiraz Hashim +-Shuah Khan +-Shuah Khan +-Shuah Khan +-Shuah Khan +-Sibi Sankar +-Sid Manning +-Simon Arlott +-Simona Vetter +-Simona Vetter +-Simona Vetter +-Simona Vetter +-Simon Horman +-Simon Horman +-Simon Kelley +-Sricharan Ramabadhran +-Srinivas Ramana +-Sriram R +-Sriram Yagnaraman +-Stanislav Fomichev +-Stefan Wahren +-Stéphane Witzmann +-Stephen Hemminger +-Stephen Hemminger +-Stephen Hemminger +-Stephen Hemminger +-Steve Wise +-Steve Wise +-Subash Abhinov Kasiviswanathan +-Subbaraman Narayanamurthy +-Subhash Jadavani +-Sudarshan Rajagopalan +-Sudeep Holla Sudeep KarkadaNagesha +-Sumit Semwal +-Surabhi Vishnoi +-Takashi YOSHII +-Tamizh Chelvam Raja +-Taniya Das +-Tanzir Hasan +-Tejun Heo +-Tomeu Vizoso +-Thomas Graf +-Thomas Körper +-Thomas Pedersen +-Thorsten Blum +-Tiezhu Yang +-Tingwei Zhang +-Tirupathi Reddy +-Tobias Klauser +-Tobias Klauser +-Tobias Klauser +-Tobias Klauser +-Todor Tomov +-Tony Luck +-Trilok Soni +-TripleX Chung +-TripleX Chung +-Tsuneo Yoshioka +-Tudor Ambarus +-Tvrtko Ursulin +-Tvrtko Ursulin +-Tvrtko Ursulin +-Tvrtko Ursulin +-Tvrtko Ursulin +-Tycho Andersen +-Tzung-Bi Shih +-Uwe Kleine-König +-Uwe Kleine-König +-Uwe Kleine-König +-Uwe Kleine-König +-Uwe Kleine-König +-Vadim Fedorenko +-Vadim Fedorenko +-Vadim Fedorenko +-Valdis Kletnieks +-Vara Reddy +-Varadarajan Narayanan +-Vasanthakumar Thiagarajan +-Vasily Averin +-Vasily Averin +-Vasily Averin +-Vasily Averin +-Valentin Schneider +-Veera Sundaram Sankaran +-Veerabhadrarao Badiganti +-Venkateswara Naralasetty +-Vikash Garodia +-Vinod Koul +-Vinod Koul +-Vinod Koul +-Viresh Kumar +-Viresh Kumar +-Viresh Kumar +-Viresh Kumar +-Viresh Kumar +-Vishnu Dasa +-Vivek Aknurwar +-Vivien Didelot +-Vlad Dogaru +-Vladimir Davydov +-Vladimir Davydov +-Weiwen Hu +-WeiXiong Liao +-Wen Gong +-Wesley Cheng +-Will Deacon +-Wolfram Sang +-Wolfram Sang +-Yakir Yang +-Yusuke Goda +-Zack Rusin +-Zhu Yanjun diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0009-Makefile.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0016-Makefile.patch similarity index 67% rename from build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0009-Makefile.patch rename to build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0016-Makefile.patch index d6f28bf..4bd2e12 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0009-Makefile.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0016-Makefile.patch @@ -1,6 +1,6 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/Makefile 2026-03-23 18:27:32.466964354 +0100 -+++ ./Makefile 2026-03-23 18:28:40.268531413 +0100 -@@ -744,6 +744,10 @@ +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/Makefile 2025-08-30 15:42:55.070030785 +0200 ++++ ./Makefile 2025-08-29 08:46:41.335442977 +0200 +@@ -738,6 +738,10 @@ # Defaults to vmlinux, but the arch makefile usually adds further targets all: vmlinux @@ -11,7 +11,7 @@ CFLAGS_GCOV := -fprofile-arcs -ftest-coverage ifdef CONFIG_CC_IS_GCC CFLAGS_GCOV += -fno-tree-loop-im -@@ -1117,6 +1121,10 @@ +@@ -1104,6 +1108,10 @@ export MODORDER := $(extmod_prefix)modules.order export MODULES_NSDEPS := $(extmod_prefix)modules.nsdeps diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0015-Kconfig.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0018-Kconfig.patch similarity index 66% rename from build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0015-Kconfig.patch rename to build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0018-Kconfig.patch index b21360e..3418d4a 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0015-Kconfig.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0018-Kconfig.patch @@ -1,6 +1,6 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/drivers/Kconfig 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/drivers/Kconfig 2026-03-13 13:24:35.605124126 +0100 -@@ -0,0 +1,51 @@ +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/drivers/Kconfig 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/drivers/Kconfig 2025-08-29 08:46:41.395616621 +0200 +@@ -0,0 +1,44 @@ +# +# SOO device configuration +# @@ -40,15 +40,8 @@ + The vlogs driver is used to logs Capsules logs - logs are store in + `/var/log/soo/capsule_N.log` (N corresponds to the SlotID of the capsule). + -+config VFBDEV_BACKEND -+ bool "vfbdev Framebuffer Backend support for SOO Capsules" -+ help -+ The vfbdev driver is used to allow capsules to access a framebuffer from Linux. ++endmenu ++ + -+config VINPUT_BACKEND -+ bool "vinput Input support for SOO Capsules" -+ help -+ The vinput driver is used to allow capsules to access a mouse/keyboard inputs from Linux. + -+endmenu + diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0018-Makefile.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0018-Makefile.patch deleted file mode 100644 index fc8308d..0000000 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0018-Makefile.patch +++ /dev/null @@ -1,4 +0,0 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/drivers/vdummyback/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/drivers/vdummyback/Makefile 2026-03-13 13:24:35.605183303 +0100 -@@ -0,0 +1 @@ -+obj-y := vdummy.o diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/1016-Makefile.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0019-Makefile.patch similarity index 52% rename from build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/1016-Makefile.patch rename to build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0019-Makefile.patch index d6b6a09..588941f 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/1016-Makefile.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0019-Makefile.patch @@ -1,6 +1,6 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/drivers/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/drivers/Makefile 2026-03-13 13:24:35.605109501 +0100 -@@ -0,0 +1,14 @@ +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/drivers/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/drivers/Makefile 2025-08-29 08:46:41.395638406 +0200 +@@ -0,0 +1,12 @@ +# +# Makefile for SOO general drivers. +# @@ -13,5 +13,3 @@ +obj-$(CONFIG_VSENSELED_BACKEND) += vsenseledback/ +obj-$(CONFIG_VSENSEJ_BACKEND) += vsensejback/ +obj-$(CONFIG_VLOGS_BACKEND) += vlogsback/ -+obj-$(CONFIG_VFBDEV_BACKEND) += vfbdevback/ -+obj-$(CONFIG_VINPUT_BACKEND) += vinputback/ diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0020-Makefile.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0020-Makefile.patch deleted file mode 100644 index 8aac44b..0000000 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0020-Makefile.patch +++ /dev/null @@ -1,5 +0,0 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/drivers/vlogsback/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/drivers/vlogsback/Makefile 2026-03-13 13:24:35.605328217 +0100 -@@ -0,0 +1,2 @@ -+obj-y := vlogs.o -+ diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0017-vdevback.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0020-vdevback.c.patch similarity index 97% rename from build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0017-vdevback.c.patch rename to build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0020-vdevback.c.patch index 60de69e..99e3f75 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0017-vdevback.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0020-vdevback.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/drivers/vdevback.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/drivers/vdevback.c 2026-03-13 13:24:35.605293994 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/drivers/vdevback.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/drivers/vdevback.c 2025-08-29 08:46:41.395627342 +0200 @@ -0,0 +1,309 @@ + +/* diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0021-Makefile.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0021-Makefile.patch new file mode 100644 index 0000000..240394b --- /dev/null +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0021-Makefile.patch @@ -0,0 +1,4 @@ +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/drivers/vdummyback/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/drivers/vdummyback/Makefile 2025-08-29 08:46:41.395603823 +0200 +@@ -0,0 +1 @@ ++obj-y := vdummy.o diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0022-Makefile.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0022-Makefile.patch deleted file mode 100644 index fc149a9..0000000 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0022-Makefile.patch +++ /dev/null @@ -1,5 +0,0 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/drivers/vsensejback/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/drivers/vsensejback/Makefile 2026-03-13 13:24:35.605061497 +0100 -@@ -0,0 +1,2 @@ -+obj-y := vsensej.o rpisense-joystick.o -+ diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0019-vdummy.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0022-vdummy.c.patch similarity index 95% rename from build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0019-vdummy.c.patch rename to build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0022-vdummy.c.patch index 4ee36d7..b9778da 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0019-vdummy.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0022-vdummy.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/drivers/vdummyback/vdummy.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/drivers/vdummyback/vdummy.c 2026-03-13 13:24:35.605155010 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/drivers/vdummyback/vdummy.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/drivers/vdummyback/vdummy.c 2025-08-29 08:46:41.395591085 +0200 @@ -0,0 +1,183 @@ +/* + * Copyright (C) 2016-2018 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0023-Makefile.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0023-Makefile.patch new file mode 100644 index 0000000..cc5f7b9 --- /dev/null +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0023-Makefile.patch @@ -0,0 +1,5 @@ +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/drivers/vsensejback/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/drivers/vsensejback/Makefile 2025-08-29 08:46:41.395756896 +0200 +@@ -0,0 +1,2 @@ ++obj-y := vsensej.o rpisense-joystick.o ++ diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0023-rpisense-joystick.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0024-rpisense-joystick.c.patch similarity index 94% rename from build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0023-rpisense-joystick.c.patch rename to build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0024-rpisense-joystick.c.patch index b928843..5363b96 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0023-rpisense-joystick.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0024-rpisense-joystick.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/drivers/vsensejback/rpisense-joystick.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/drivers/vsensejback/rpisense-joystick.c 2026-03-13 13:24:35.605041516 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/drivers/vsensejback/rpisense-joystick.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/drivers/vsensejback/rpisense-joystick.c 2025-08-29 08:46:41.395745962 +0200 @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2021 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0024-rpisense-joystick.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0025-rpisense-joystick.h.patch similarity index 84% rename from build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0024-rpisense-joystick.h.patch rename to build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0025-rpisense-joystick.h.patch index 4761785..381130a 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0024-rpisense-joystick.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0025-rpisense-joystick.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/drivers/vsensejback/rpisense-joystick.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/drivers/vsensejback/rpisense-joystick.h 2026-03-13 13:24:35.605076147 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/drivers/vsensejback/rpisense-joystick.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/drivers/vsensejback/rpisense-joystick.h 2025-08-29 08:46:41.395767060 +0200 @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2021 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0026-Makefile.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0026-Makefile.patch deleted file mode 100644 index 575e395..0000000 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0026-Makefile.patch +++ /dev/null @@ -1,5 +0,0 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/drivers/vsenseledback/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/drivers/vsenseledback/Makefile 2026-03-13 13:24:35.605215605 +0100 -@@ -0,0 +1,2 @@ -+obj-y := vsenseled.o rpisense-led.o -+ diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0025-vsensej.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0026-vsensej.c.patch similarity index 96% rename from build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0025-vsensej.c.patch rename to build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0026-vsensej.c.patch index a9357d7..08ba07f 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0025-vsensej.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0026-vsensej.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/drivers/vsensejback/vsensej.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/drivers/vsensejback/vsensej.c 2026-03-13 13:24:35.605091471 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/drivers/vsensejback/vsensej.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/drivers/vsensejback/vsensej.c 2025-08-29 08:46:41.395731342 +0200 @@ -0,0 +1,216 @@ +/* + * Copyright (C) 2021 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0027-Makefile.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0027-Makefile.patch new file mode 100644 index 0000000..7be9314 --- /dev/null +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0027-Makefile.patch @@ -0,0 +1,5 @@ +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/drivers/vsenseledback/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/drivers/vsenseledback/Makefile 2025-08-29 08:46:41.395669758 +0200 +@@ -0,0 +1,2 @@ ++obj-y := vsenseled.o rpisense-led.o ++ diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0027-rpisense-led.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0028-rpisense-led.c.patch similarity index 96% rename from build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0027-rpisense-led.c.patch rename to build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0028-rpisense-led.c.patch index 9876d24..f341fd3 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0027-rpisense-led.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0028-rpisense-led.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/drivers/vsenseledback/rpisense-led.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/drivers/vsenseledback/rpisense-led.c 2026-03-13 13:24:35.605234942 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/drivers/vsenseledback/rpisense-led.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/drivers/vsenseledback/rpisense-led.c 2025-08-29 08:46:41.395683766 +0200 @@ -0,0 +1,186 @@ +/* + * Copyright (C) 2021 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0028-rpisense-led.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0029-rpisense-led.h.patch similarity index 81% rename from build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0028-rpisense-led.h.patch rename to build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0029-rpisense-led.h.patch index 0ed23d5..2a05999 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0028-rpisense-led.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0029-rpisense-led.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/drivers/vsenseledback/rpisense-led.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/drivers/vsenseledback/rpisense-led.h 2026-03-13 13:24:35.605250970 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/drivers/vsenseledback/rpisense-led.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/drivers/vsenseledback/rpisense-led.h 2025-08-29 08:46:41.395707716 +0200 @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2021 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0030-Makefile.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0030-Makefile.patch deleted file mode 100644 index d291236..0000000 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0030-Makefile.patch +++ /dev/null @@ -1,5 +0,0 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/drivers/vuartback/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/drivers/vuartback/Makefile 2026-03-13 13:24:35.605009191 +0100 -@@ -0,0 +1,2 @@ -+obj-y := vuart.o -+ diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0029-vsenseled.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0030-vsenseled.c.patch similarity index 95% rename from build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0029-vsenseled.c.patch rename to build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0030-vsenseled.c.patch index 13bde01..21e6640 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0029-vsenseled.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0030-vsenseled.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/drivers/vsenseledback/vsenseled.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/drivers/vsenseledback/vsenseled.c 2026-03-13 13:24:35.605273330 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/drivers/vsenseledback/vsenseled.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/drivers/vsenseledback/vsenseled.c 2025-08-29 08:46:41.395696210 +0200 @@ -0,0 +1,186 @@ +/* + * Copyright (C) 2021 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0031-Makefile.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0031-Makefile.patch new file mode 100644 index 0000000..7decedb --- /dev/null +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0031-Makefile.patch @@ -0,0 +1,5 @@ +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/drivers/vuartback/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/drivers/vuartback/Makefile 2025-08-29 08:46:41.395791618 +0200 +@@ -0,0 +1,2 @@ ++obj-y := vuart.o ++ diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0031-vuart.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0032-vuart.c.patch similarity index 96% rename from build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0031-vuart.c.patch rename to build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0032-vuart.c.patch index 228f277..dc00f61 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0031-vuart.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0032-vuart.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/drivers/vuartback/vuart.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/drivers/vuartback/vuart.c 2026-03-22 19:53:57.190073788 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/drivers/vuartback/vuart.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/drivers/vuartback/vuart.c 2025-08-29 08:46:41.395804736 +0200 @@ -0,0 +1,327 @@ +/* + * Copyright (C) 2016-2018 Daniel Rossier @@ -89,7 +89,7 @@ +{ + struct vdev_console *console; + -+ console = kzalloc(sizeof(*console), GFP_ATOMIC); ++ console = kzalloc(sizeof(vdev_console), GFP_ATOMIC); + BUG_ON(!console); + + console->vdev_console = vdev_console; diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0032-avz.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0033-avz.h.patch similarity index 97% rename from build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0032-avz.h.patch rename to build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0033-avz.h.patch index 18cb657..f1f5d39 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0032-avz.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0033-avz.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/include/avz/uapi/avz.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/include/avz/uapi/avz.h 2026-03-13 13:24:35.604235416 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/avz/uapi/avz.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/include/avz/uapi/avz.h 2025-08-29 08:46:41.396291602 +0200 @@ -0,0 +1,304 @@ +/* + * Copyright (C) 2016-2022 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0033-asf.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0034-asf.h.patch similarity index 91% rename from build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0033-asf.h.patch rename to build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0034-asf.h.patch index c3b4f6f..769322a 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0033-asf.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0034-asf.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/include/soo/asf.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/include/soo/asf.h 2026-03-13 13:24:35.604002769 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/asf.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/include/soo/asf.h 2025-08-29 08:46:41.396126462 +0200 @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2014-2019 Jean-Pierre Miceli diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0034-avzcons.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0035-avzcons.h.patch similarity index 80% rename from build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0034-avzcons.h.patch rename to build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0035-avzcons.h.patch index 97e6879..53fb55d 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0034-avzcons.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0035-avzcons.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/include/soo/avzcons.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/include/soo/avzcons.h 2026-03-13 13:24:35.603944665 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/avzcons.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/include/soo/avzcons.h 2025-08-29 08:46:41.396061626 +0200 @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2016-2018 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0035-capsule.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0036-capsule.h.patch similarity index 87% rename from build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0035-capsule.h.patch rename to build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0036-capsule.h.patch index e365855..b523e1a 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0035-capsule.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0036-capsule.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/include/soo/capsule.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/include/soo/capsule.h 2026-03-13 13:24:35.603984456 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/capsule.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/include/soo/capsule.h 2025-08-30 15:30:27.244692708 +0200 @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2017-2025 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0036-debug.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0037-debug.h.patch similarity index 82% rename from build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0036-debug.h.patch rename to build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0037-debug.h.patch index e692579..f09aaa0 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0036-debug.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0037-debug.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/include/soo/debug.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/include/soo/debug.h 2026-03-13 13:24:35.604137736 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/debug.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/include/soo/debug.h 2025-08-29 08:46:41.396116173 +0200 @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2022 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0037-vdummy.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0038-vdummy.h.patch similarity index 87% rename from build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0037-vdummy.h.patch rename to build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0038-vdummy.h.patch index 50743d6..bb268ab 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0037-vdummy.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0038-vdummy.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/include/soo/dev/vdummy.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/include/soo/dev/vdummy.h 2026-03-13 13:24:35.603789768 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/dev/vdummy.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/include/soo/dev/vdummy.h 2025-08-29 08:46:41.396228573 +0200 @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2014-2019 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0039-vsensej.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0039-vsensej.h.patch index d721444..bb7d17c 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0039-vsensej.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0039-vsensej.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/include/soo/dev/vsensej.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/include/soo/dev/vsensej.h 2026-03-13 13:24:35.603829545 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/dev/vsensej.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/include/soo/dev/vsensej.h 2025-08-29 08:46:41.396239269 +0200 @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2014-2019 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0040-vsenseled.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0040-vsenseled.h.patch index 577ae20..81da864 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0040-vsenseled.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0040-vsenseled.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/include/soo/dev/vsenseled.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/include/soo/dev/vsenseled.h 2026-03-13 13:24:35.603847878 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/dev/vsenseled.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/include/soo/dev/vsenseled.h 2025-08-29 08:46:41.396248777 +0200 @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2014-2019 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0041-vuart.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0041-vuart.h.patch index 61a1798..b39dd81 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0041-vuart.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0041-vuart.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/include/soo/dev/vuart.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/include/soo/dev/vuart.h 2026-03-13 13:24:35.603811583 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/dev/vuart.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/include/soo/dev/vuart.h 2025-08-29 08:46:41.396215270 +0200 @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2016-2018 Baptiste Delporte diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0042-device_access.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0042-device_access.h.patch index c9ee839..9b2e26c 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0042-device_access.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0042-device_access.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/include/soo/device_access.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/include/soo/device_access.h 2026-03-13 13:24:35.603909386 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/device_access.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/include/soo/device_access.h 2025-08-29 08:46:41.396157469 +0200 @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2017-2019 Baptiste Delporte diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0043-err.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0043-err.h.patch index 26ae691..93b4af1 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0043-err.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0043-err.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/include/soo/err.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/include/soo/err.h 2026-03-13 13:24:35.604059654 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/err.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/include/soo/err.h 2025-08-29 08:46:41.395968708 +0200 @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2016-2018 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0044-errno-base.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0044-errno-base.h.patch index 39c1e21..d181f66 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0044-errno-base.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0044-errno-base.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/include/soo/errno-base.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/include/soo/errno-base.h 2026-03-13 13:24:35.604021853 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/errno-base.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/include/soo/errno-base.h 2025-08-29 08:46:41.396136541 +0200 @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2016-2018 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0045-errno.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0045-errno.h.patch index 1fc0450..5d03bc1 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0045-errno.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0045-errno.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/include/soo/errno.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/include/soo/errno.h 2026-03-13 13:24:35.603963114 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/errno.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/include/soo/errno.h 2025-08-29 08:46:41.395877288 +0200 @@ -0,0 +1,127 @@ +/* + * Copyright (C) 2016-2018 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0046-evtchn.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0046-evtchn.h.patch index bb693e1..7f4c6ba 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0046-evtchn.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0046-evtchn.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/include/soo/evtchn.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/include/soo/evtchn.h 2026-03-16 21:07:27.541939519 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/evtchn.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/include/soo/evtchn.h 2025-08-29 08:46:41.396167849 +0200 @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2016-2019 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0047-gnttab.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0047-gnttab.h.patch index 1131c97..29fec47 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0047-gnttab.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0047-gnttab.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/include/soo/gnttab.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/include/soo/gnttab.h 2026-03-13 13:24:35.603890882 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/gnttab.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/include/soo/gnttab.h 2025-08-29 08:46:41.396082852 +0200 @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2016-2019 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0048-guest_api.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0048-guest_api.h.patch index a2cdb63..e2fb1d4 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0048-guest_api.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0048-guest_api.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/include/soo/guest_api.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/include/soo/guest_api.h 2026-03-13 13:24:35.603489339 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/guest_api.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/include/soo/guest_api.h 2025-08-29 08:46:41.395855756 +0200 @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2016-2019 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0049-hypervisor.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0049-hypervisor.h.patch index 8e56f75..36da0b8 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0049-hypervisor.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0049-hypervisor.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/include/soo/hypervisor.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/include/soo/hypervisor.h 2026-03-13 13:24:35.604157141 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/hypervisor.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/include/soo/hypervisor.h 2025-08-29 08:46:41.396189602 +0200 @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2016-2025 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0050-paging.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0050-paging.h.patch index 39dab3c..6bcb4cd 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0050-paging.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0050-paging.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/include/soo/paging.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/include/soo/paging.h 2026-03-13 13:24:35.603714819 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/paging.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/include/soo/paging.h 2025-08-29 08:46:41.395959078 +0200 @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2016-2019 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0051-ring.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0051-ring.h.patch index 3a361bd..e030a45 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0051-ring.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0051-ring.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/include/soo/ring.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/include/soo/ring.h 2026-03-13 13:24:35.604078178 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/ring.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/include/soo/ring.h 2025-08-29 08:46:41.396016625 +0200 @@ -0,0 +1,227 @@ + +/* diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0052-roxml.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0052-roxml.h.patch index 7ae5578..d1b0e5b 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0052-roxml.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0052-roxml.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/include/soo/roxml.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/include/soo/roxml.h 2026-03-13 13:24:35.603512017 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/roxml.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/include/soo/roxml.h 2025-08-29 08:46:41.396030920 +0200 @@ -0,0 +1,1375 @@ +/** + * \file roxml.h diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0053-simulation.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0053-simulation.h.patch index 26f7fa2..7414df6 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0053-simulation.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0053-simulation.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/include/soo/simulation.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/include/soo/simulation.h 2026-03-13 13:24:35.603751289 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/simulation.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/include/soo/simulation.h 2025-08-29 08:46:41.396004234 +0200 @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2021 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0054-soo.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0054-soo.h.patch index 07aabe8..cc0e96c 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0054-soo.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0054-soo.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/include/soo/soo.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/include/soo/soo.h 2026-03-13 13:24:35.603926672 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/soo.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/include/soo/soo.h 2025-08-29 08:46:41.396092873 +0200 @@ -0,0 +1,38 @@ + +/* diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0055-strtod.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0055-strtod.h.patch index e020ad3..cbc151d 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0055-strtod.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0055-strtod.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/include/soo/strtod.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/include/soo/strtod.h 2026-03-13 13:24:35.603696226 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/strtod.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/include/soo/strtod.h 2025-08-29 08:46:41.395979772 +0200 @@ -0,0 +1,26 @@ + +/* diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0056-sysfs.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0056-sysfs.h.patch index 90f8a3f..ac21c58 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0056-sysfs.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0056-sysfs.h.patch @@ -1,6 +1,6 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/include/soo/sysfs.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/include/soo/sysfs.h 2026-03-13 13:24:35.603733276 +0100 -@@ -0,0 +1,65 @@ +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/sysfs.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/include/soo/sysfs.h 2025-08-29 08:46:41.395990253 +0200 +@@ -0,0 +1,57 @@ + +/* + * Copyright (C) 2020 Daniel Rossier @@ -40,14 +40,6 @@ + /**** vsensej ****/ + vsensej_js, + -+ /**** vfbdev ****/ -+ vfbdev_hres, -+ vfbdev_vres, -+ vfbdev_bpp, -+ vfbdev_size, -+ vfbdev_addr, -+ vfbdev_pid, -+ + /**** vwagoled ****/ + vwagoled_notify, + vwagoled_debug, diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0057-types.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0057-types.h.patch index 5e08eac..c75bad3 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0057-types.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0057-types.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/include/soo/types.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/include/soo/types.h 2026-03-13 13:24:35.604099650 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/types.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/include/soo/types.h 2025-08-29 08:46:41.395866708 +0200 @@ -0,0 +1,28 @@ + +/* diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0058-asf.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0058-asf.h.patch index afdd2a3..ea7adeb 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0058-asf.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0058-asf.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/include/soo/uapi/asf.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/include/soo/uapi/asf.h 2026-03-13 13:24:35.603676192 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/uapi/asf.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/include/soo/uapi/asf.h 2025-08-29 08:46:41.395913063 +0200 @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2014-2019 Jean-Pierre Miceli diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0059-console.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0059-console.h.patch index dd81c73..ffe8f10 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0059-console.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0059-console.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/include/soo/uapi/console.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/include/soo/uapi/console.h 2026-03-13 13:24:35.603614636 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/uapi/console.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/include/soo/uapi/console.h 2025-08-29 08:46:41.395947568 +0200 @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2016-2025 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0060-debug.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0060-debug.h.patch index 83983b7..c93fc0e 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0060-debug.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0060-debug.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/include/soo/uapi/debug.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/include/soo/uapi/debug.h 2026-03-13 13:24:35.603590309 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/uapi/debug.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/include/soo/uapi/debug.h 2025-08-29 08:46:41.395937531 +0200 @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2015-2019 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0061-injector.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0061-injector.h.patch index 3e63dd5..f8a56f2 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0061-injector.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0061-injector.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/include/soo/uapi/injector.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/include/soo/uapi/injector.h 2026-03-13 13:24:35.603632973 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/uapi/injector.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/include/soo/uapi/injector.h 2025-08-29 08:46:41.395900289 +0200 @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2016 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0062-soo.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0062-soo.h.patch index 7b180e9..8766ecd 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0062-soo.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0062-soo.h.patch @@ -1,6 +1,6 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/include/soo/uapi/soo.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/include/soo/uapi/soo.h 2026-03-20 09:16:24.194824702 +0100 -@@ -0,0 +1,495 @@ +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/uapi/soo.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/include/soo/uapi/soo.h 2025-08-29 08:46:41.395924678 +0200 +@@ -0,0 +1,460 @@ +/* + * Copyright (C) 2014-2025 Daniel Rossier + * @@ -75,19 +75,6 @@ + +void do_gnttab(gnttab_op_t *args); + -+/* -+ * Page frame number to set the framebuffer addresses. -+ * The physical addresses may be splitted in multiple parts, which requires to have -+ * multiple set of strating page frame and page count -+ */ -+ -+#define MAX_FBDEV_PFN 8 -+typedef struct fbdev_pfns { -+ size_t pfn_count; -+ addr_t pfn[MAX_FBDEV_PFN]; -+ size_t page_count[MAX_FBDEV_PFN]; -+} fbdev_pfns_t; -+ +#define AVZ_SCHEDULER_FLIP 0 + +/* @@ -315,15 +302,11 @@ +#define AVZ_SET_ME_STATE 11 +#define AVZ_GET_DOM_DESC 12 +#define AVZ_GRANT_TABLE_OP 13 -+#define AVZ_FBDEV_SET_PFNS 14 -+#define AVZ_FBDEV_CHANGE_FOCUS 15 -+#define AVZ_FBDEV_GET_ME_ADDR 16 + +/* AVZ_INJECT_CAPSULE */ +typedef struct { + void *itb_paddr; + int slotID; -+ int capsuleID; +} avz_inject_capsule_t; + +/* AVZ_START_CAPSULE */ @@ -380,21 +363,6 @@ + gnttab_op_t gnttab_op; +} avz_gnttab_t; + -+/* AVZ_FBDEV_SET_PFNS */ -+typedef struct { -+ fbdev_pfns_t fbdev; -+} avz_fbdev_pfns_t; -+ -+/* AVZ_FBDEV_CHANGE_FOCUS */ -+typedef struct { -+ int new_slotID; -+} avz_fbdev_focus_t; -+ -+/* AVZ_FBDEV_GET_ME_ADDR */ -+typedef struct { -+ addr_t paddr; -+} avz_fbdev_addr_t; -+ +/* + * AVZ hypercall argument + */ @@ -414,9 +382,6 @@ + avz_console_io_t avz_console_io_args; + avz_domctl_t avz_domctl_args; + avz_gnttab_t avz_gnttab_args; -+ avz_fbdev_pfns_t avz_fbdev_pfns_args; -+ avz_fbdev_focus_t avz_fbdev_focus_args; -+ avz_fbdev_addr_t avz_fbdev_addr_args; + } u; +} avz_hyp_t; + diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0063-vbstore.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0063-vbstore.h.patch index 29fd68f..bdb5fe6 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0063-vbstore.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0063-vbstore.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/include/soo/vbstore.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/include/soo/vbstore.h 2026-03-13 13:24:35.604040279 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/vbstore.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/include/soo/vbstore.h 2025-08-29 08:46:41.396147259 +0200 @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2016-2018 Baptiste Delporte diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0064-vbus.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0064-vbus.h.patch index af03140..8669905 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0064-vbus.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0064-vbus.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/include/soo/vbus.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/include/soo/vbus.h 2026-03-13 13:24:35.603547515 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/vbus.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/include/soo/vbus.h 2025-08-29 08:46:41.396103436 +0200 @@ -0,0 +1,336 @@ +/* + * Copyright (C) 2014-2019 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0065-vdevback.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0065-vdevback.h.patch index f9f129b..4e31e10 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0065-vdevback.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0065-vdevback.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/include/soo/vdevback.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/include/soo/vdevback.h 2026-03-13 13:24:35.604174597 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/vdevback.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/include/soo/vdevback.h 2025-08-29 08:46:41.396178895 +0200 @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2020 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0066-Kconfig.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0066-Kconfig.patch index 172149e..9cb8bc1 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0066-Kconfig.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0066-Kconfig.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/Kconfig 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/Kconfig 2026-03-13 13:24:35.604269436 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/Kconfig 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/Kconfig 2025-08-29 08:46:41.396316962 +0200 @@ -0,0 +1,16 @@ + +config SOO diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0067-Makefile.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0067-Makefile.patch index 5c4cab9..5f7536a 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0067-Makefile.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0067-Makefile.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/kernel/arm64/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/kernel/arm64/Makefile 2026-03-13 13:24:35.603047039 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/arm64/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/kernel/arm64/Makefile 2025-08-29 08:46:41.395083833 +0200 @@ -0,0 +1,3 @@ + +obj-y += paging.o diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0068-paging.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0068-paging.c.patch index f1175d4..e553f92 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0068-paging.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0068-paging.c.patch @@ -1,6 +1,6 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/kernel/arm64/paging.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/kernel/arm64/paging.c 2026-03-16 21:08:22.571493942 +0100 -@@ -0,0 +1,78 @@ +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/arm64/paging.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/kernel/arm64/paging.c 2025-08-29 08:46:41.395097877 +0200 +@@ -0,0 +1,76 @@ +/* + * Copyright (C) 2016-2021 Daniel Rossier + * @@ -43,7 +43,7 @@ + BUG_ON(!pg); + + pages[0] = pg; -+ va = vmap(pages, 1, VM_MAP, PAGE_KERNEL); ++ va = vmap(pages, 1, VM_MAP, pgprot_noncached(PAGE_KERNEL)); + BUG_ON(!va); + + uncp->vaddr = va; @@ -54,19 +54,17 @@ + +void free_uncached_zeroed_page(struct uncached_page *p) +{ -+ if (!p) -+ return; -+ -+ vunmap(p->vaddr); -+ __free_page(p->pg); ++ if (!p) return; ++ vunmap(p->vaddr); // unmap the uncached VA ++ __free_page(p->pg); // free the physical page + kfree(p); +} + +void *paging_remap(unsigned long paddr, size_t size) { + void *vaddr; + -+ vaddr = ioremap_cache(paddr, size); /* Normal WB Cacheable */ -+ BUG_ON(!vaddr); ++ vaddr = ioremap_wc(paddr, size); ++ BUG_ON(!vaddr); + + return vaddr; +} diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0069-asf.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0069-asf.c.patch index 7a618bc..0a9fe17 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0069-asf.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0069-asf.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/kernel/asf/asf.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/kernel/asf/asf.c 2026-03-13 13:24:35.602731909 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/asf/asf.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/kernel/asf/asf.c 2025-08-29 08:46:41.394937038 +0200 @@ -0,0 +1,525 @@ +/* + * Copyright (C) 2019-2020 Jean-Pierre Miceli diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0070-asf_priv.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0070-asf_priv.h.patch index 2c10be2..7974a64 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0070-asf_priv.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0070-asf_priv.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/kernel/asf/asf_priv.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/kernel/asf/asf_priv.h 2026-03-13 13:24:35.602758437 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/asf/asf_priv.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/kernel/asf/asf_priv.h 2025-08-29 08:46:41.394923897 +0200 @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2019-2020 Jean-Pierre Miceli diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0071-asf_test.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0071-asf_test.c.patch index f8c7d95..72c155d 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0071-asf_test.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0071-asf_test.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/kernel/asf/asf_test.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/kernel/asf/asf_test.c 2026-03-13 13:24:35.602701088 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/asf/asf_test.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/kernel/asf/asf_test.c 2025-08-29 08:46:41.394908547 +0200 @@ -0,0 +1,175 @@ +/* + * Copyright (C) 2019-2020 Jean-Pierre Miceli diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0072-Makefile.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0072-Makefile.patch index 8e22c19..61e4ff7 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0072-Makefile.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0072-Makefile.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/kernel/asf/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/kernel/asf/Makefile 2026-03-13 13:24:35.602775346 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/asf/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/kernel/asf/Makefile 2025-08-29 08:46:41.394951154 +0200 @@ -0,0 +1 @@ +obj-y += asf.o asf_test.o \ No newline at end of file diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0073-capsule.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0073-capsule.c.patch index 6a11f06..b35e01f 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0073-capsule.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0073-capsule.c.patch @@ -1,6 +1,6 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/kernel/capsule.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/kernel/capsule.c 2026-03-20 09:16:37.469025577 +0100 -@@ -0,0 +1,500 @@ +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/capsule.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/kernel/capsule.c 2025-08-30 15:37:09.704925348 +0200 +@@ -0,0 +1,496 @@ +/* + * Copyright (C) 2017-2024 Daniel Rossier + * @@ -93,10 +93,7 @@ + me = dma_alloc_coherent(capsule_dev, size, &dma_handle, GFP_KERNEL); + BUG_ON(!me); + -+ if (copy_from_user(me, buffer, size)) { -+ dma_free_coherent(capsule_dev, size, me, dma_handle); -+ return -1; -+ } ++ memcpy(me, buffer, size); + + /* Since the ME buffer is in the CMA zone and allocated via the + * dma_alloc_cohenrent() function, we cannot use virt_to_phys(). So, we @@ -107,9 +104,8 @@ + + args.cmd = AVZ_INJECT_CAPSULE; + -+ args.u.avz_inject_capsule_args.itb_paddr = (void *) dma_to_phys(capsule_dev, dma_handle); ++ args.u.avz_inject_capsule_args.itb_paddr = (void *) dma_handle; + args.u.avz_inject_capsule_args.slotID = slotID; -+ args.u.avz_inject_capsule_args.capsuleID = 0; + + avz_hypercall(&args); + @@ -197,7 +193,7 @@ + args.cmd = AVZ_ME_READ_SNAPSHOT; + + args.u.avz_snapshot_args.slotID = slotID; -+ args.u.avz_snapshot_args.snapshot_paddr = (void *) dma_to_phys(capsule_dev, dma_handle); ++ args.u.avz_snapshot_args.snapshot_paddr = (void *) dma_handle; + args.u.avz_snapshot_args.size = *size; + + avz_hypercall(&args); @@ -260,7 +256,7 @@ + + args.u.avz_snapshot_args.size = snapshot_size; + args.u.avz_snapshot_args.slotID = -1; -+ args.u.avz_snapshot_args.snapshot_paddr = (void *) dma_to_phys(capsule_dev, dma_handle); ++ args.u.avz_snapshot_args.snapshot_paddr = (void *) dma_handle; + + DBG("%s: Now asking AVZ to re-implement the snapshot of size %d bytes...\n", __func__, snapshot_size); + diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0074-console.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0074-console.c.patch index cc47619..a1f546e 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0074-console.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0074-console.c.patch @@ -1,6 +1,6 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/kernel/console/console.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/kernel/console/console.c 2026-03-19 16:39:49.260891031 +0100 -@@ -0,0 +1,150 @@ +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/console/console.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/kernel/console/console.c 2025-08-29 08:46:41.394716106 +0200 +@@ -0,0 +1,152 @@ +/* + * Copyright (C) 2016-2019 Daniel Rossier + * @@ -64,11 +64,6 @@ + +int vfb_set_focus(int next_domain) +{ -+ avz_hyp_t hyp_args; -+ hyp_args.cmd = AVZ_FBDEV_CHANGE_FOCUS; -+ hyp_args.u.avz_fbdev_focus_args.new_slotID = next_domain; -+ avz_hypercall(&hyp_args); -+ + vfb_active = next_domain; + return vfb_active; +} @@ -90,13 +85,20 @@ + u32 focus_max = N_SWITCH_FOCUS - 1; + avz_hyp_t args; + -+ /* First capsule is in slot #2 */ ++#if 0 /* Interactions with RT domain? */ ++ int next = 1; ++#endif + int next = 2; + + np = of_find_node_by_name(NULL, "console"); + if (np) + of_property_read_u32((const struct device_node *) np, "focus-dom-max", &focus_max); + ++/* Debugging purpose - enabled forces to forward to an ME */ ++#if 0 ++ me_cons_sendc(1, ch); ++#endif ++ + if ((SWITCH_CODE != 0) && (ch == SWITCH_CODE)) { + + /* We eat CTRL- in groups of 2 to switch console input. */ @@ -109,7 +111,6 @@ + next = ((next == 1) ? next+1 : next); + + avzcons_set_focus(active); -+ vfb_set_focus(active); + + switch_code_count = 0; + @@ -126,6 +127,7 @@ + case 0: /* Input to the agency */ + return 0; + ++ case 1: /* RT domain */ + case 2: /* Input to ME #1 */ + case 3: /* Input to ME #2 */ + case 4: /* Input to ME #3 */ diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0075-lprintk.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0075-lprintk.c.patch index 219cbe0..f09c6b8 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0075-lprintk.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0075-lprintk.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/kernel/console/lprintk.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/kernel/console/lprintk.c 2026-03-13 13:24:35.602814743 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/console/lprintk.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/kernel/console/lprintk.c 2025-08-29 08:46:41.394703669 +0200 @@ -0,0 +1,203 @@ +/* + * Copyright (C) 2016-2018 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0076-Makefile.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0076-Makefile.patch index 328a336..cf355a2 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0076-Makefile.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0076-Makefile.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/kernel/console/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/kernel/console/Makefile 2026-03-13 13:24:35.602856966 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/console/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/kernel/console/Makefile 2025-08-29 08:46:41.394689894 +0200 @@ -0,0 +1,5 @@ + + diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0077-core.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0077-core.c.patch index c4f7ed7..1126a0b 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0077-core.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0077-core.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/kernel/core.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/kernel/core.c 2026-03-19 17:07:34.227996874 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/core.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/kernel/core.c 2025-08-30 15:29:26.627707308 +0200 @@ -0,0 +1,300 @@ +/* + * Copyright (C) 2014-2019 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0078-debug.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0078-debug.c.patch index 9114871..ce99a8c 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0078-debug.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0078-debug.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/kernel/debug/debug.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/kernel/debug/debug.c 2026-03-13 13:24:35.602939122 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/debug/debug.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/kernel/debug/debug.c 2025-08-29 08:46:41.394757773 +0200 @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2022 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0079-Kconfig.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0079-Kconfig.patch index 7fc0da1..7633a3e 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0079-Kconfig.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0079-Kconfig.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/kernel/debug/Kconfig 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/kernel/debug/Kconfig 2026-03-13 13:24:35.602895315 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/debug/Kconfig 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/kernel/debug/Kconfig 2025-08-29 08:46:41.394743058 +0200 @@ -0,0 +1,9 @@ +menuconfig VIRTSHARE_DEBUG + default y diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0080-Makefile.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0080-Makefile.patch index 4a8f5d5..0cb6980 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0080-Makefile.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0080-Makefile.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/kernel/debug/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/kernel/debug/Makefile 2026-03-13 13:24:35.602957917 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/debug/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/kernel/debug/Makefile 2025-08-29 08:46:41.394768534 +0200 @@ -0,0 +1,3 @@ + +obj-y += meminfo.o diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0081-meminfo.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0081-meminfo.c.patch index 4507b80..8b1ff15 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0081-meminfo.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0081-meminfo.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/kernel/debug/meminfo.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/kernel/debug/meminfo.c 2026-03-13 13:24:35.602918778 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/debug/meminfo.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/kernel/debug/meminfo.c 2025-08-29 08:46:41.394779494 +0200 @@ -0,0 +1,148 @@ +/* + * Copyright (C) 2017 Baptiste Delporte diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0082-evtchn.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0082-evtchn.c.patch index 5415b8f..e9baead 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0082-evtchn.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0082-evtchn.c.patch @@ -1,6 +1,6 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/kernel/evtchn.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/kernel/evtchn.c 2026-03-23 10:03:37.924311794 +0100 -@@ -0,0 +1,413 @@ +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/evtchn.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/kernel/evtchn.c 2025-08-29 08:46:41.394868986 +0200 +@@ -0,0 +1,427 @@ + +/* + * Copyright (C) 2014-2016 Daniel Rossier @@ -57,27 +57,29 @@ +/* + * This lock protects updates to the following mapping and reference-count + * arrays. The lock does not need to be acquired to read the mapping tables. -+ * -+ * All evtchn-indexed arrays are GLOBAL (not per-CPU): an evtchn binding is a -+ * system-wide property. The original per-CPU design caused SMP races where -+ * virq_handle() on CPU Y would not find evtchns bound on CPU X, silently -+ * dropping all ME→Linux event channel notifications. + */ +static DEFINE_SPINLOCK(virq_mapping_update_lock); + -+static int evtchn_to_virq[NR_EVTCHN]; /* evtchn -> virq (global) */ -+static u32 virq_to_evtchn[NR_VIRQS]; /* virq -> evtchn (global) */ -+static bool evtchn_valid[NR_EVTCHN]; /* evtchn in use (global) */ -+static bool evtchn_masked[NR_EVTCHN]; /* evtchn masked (global) */ -+static int virq_bindcount[NR_VIRQS]; /* reference counts (global) */ ++typedef struct { ++ int evtchn_to_virq[NR_EVTCHN]; /* evtchn -> IRQ */ ++ u32 virq_to_evtchn[NR_VIRQS]; /* IRQ -> evtchn */ ++ bool valid[NR_EVTCHN]; /* Indicate if the event channel can be used for notification for example */ ++ bool evtchn_mask[NR_EVTCHN]; ++ int virq_bindcount[NR_VIRQS]; ++} evtchn_info_t; ++ ++static DEFINE_PER_CPU(evtchn_info_t, evtchn_info); + ++/* ++ * Get the evtchn from a irq_data structure which contains a (unique) CPU bound to the IRQ processing. ++ */ +inline unsigned int evtchn_from_virq_and_cpu(unsigned int virq, unsigned int cpu) { -+ return virq_to_evtchn[virq]; ++ return per_cpu(evtchn_info, cpu).virq_to_evtchn[virq]; +} + +inline unsigned int evtchn_from_virq(int virq) +{ -+ return virq_to_evtchn[virq]; ++ return evtchn_from_virq_and_cpu(virq, smp_processor_id()); +} + +inline unsigned int evtchn_from_irq_data(struct irq_data *irq_data) @@ -89,17 +91,17 @@ +#define __evtchn_from_virq evtchn_from_irq_data + +static inline bool evtchn_is_masked(unsigned int b) { -+ return evtchn_masked[b]; ++ return per_cpu(evtchn_info, smp_processor_id()).evtchn_mask[b]; +} + +#if 0 /* debug */ +static void dump_evtchn_pending(void) { + int i; + -+ lprintk(" Evtchn info in Agency\n\n"); ++ lprintk(" Evtchn info in Agency CPU %d\n\n", smp_processor_id()); + + for (i = 0; i < NR_EVTCHN; i++) -+ lprintk("e:%d m:%d p:%d ", i, evtchn_masked[i], ++ lprintk("e:%d m:%d p:%d ", i, per_cpu(evtchn_info, smp_processor_id()).evtchn_mask[i], + avz_shared->evtchn_pending[i]); + + lprintk("\n\n"); @@ -140,17 +142,17 @@ + if (evtchn == NR_EVTCHN) + break; + -+ BUG_ON(!evtchn_valid[evtchn]); ++ BUG_ON(!per_cpu(evtchn_info, smp_processor_id()).valid[evtchn]); + + loopmax++; + + if (loopmax > 500) /* Probably something wrong ;-) */ + lprintk("%s: Warning trying to process evtchn: %d IRQ: %d for quite a long time on CPU %d / masked: %d...\n", -+ __func__, evtchn, evtchn_to_virq[evtchn], smp_processor_id(), evtchn_is_masked(evtchn)); ++ __func__, evtchn, per_cpu(evtchn_info, smp_processor_id()).evtchn_to_virq[evtchn], smp_processor_id(), evtchn_is_masked(evtchn)); + -+ virq = evtchn_to_virq[evtchn]; ++ virq = per_cpu(evtchn_info, smp_processor_id()).evtchn_to_virq[evtchn]; + -+ clear_evtchn(evtchn); ++ clear_evtchn(evtchn_from_virq(virq)); + + generic_handle_irq(VIRQ_BASE + virq); + @@ -166,9 +168,8 @@ +{ + int virq; + -+ /* virq_bindcount is now global; simple scan suffices */ + for (virq = 0; virq < NR_VIRQS; virq++) -+ if (virq_bindcount[virq] == 0) ++ if (per_cpu(evtchn_info, cpu).virq_bindcount[virq] == 0) + break; + + if (virq == NR_VIRQS) @@ -184,14 +185,15 @@ + + spin_lock(&virq_mapping_update_lock); + -+ if ((virq = evtchn_to_virq[evtchn]) == -1) { ++ if ((virq = per_cpu(evtchn_info, cpu).evtchn_to_virq[evtchn]) == -1) { + virq = find_unbound_virq(cpu); -+ evtchn_to_virq[evtchn] = virq; -+ virq_to_evtchn[virq] = evtchn; -+ evtchn_valid[evtchn] = true; ++ per_cpu(evtchn_info, cpu).evtchn_to_virq[evtchn] = virq; ++ per_cpu(evtchn_info, cpu).virq_to_evtchn[virq] = evtchn; ++ per_cpu(evtchn_info, cpu).valid[evtchn] = true; ++ + } + -+ virq_bindcount[virq]++; ++ per_cpu(evtchn_info, cpu).virq_bindcount[virq]++; + + spin_unlock(&virq_mapping_update_lock); + @@ -210,7 +212,7 @@ + + avz_hypercall(&args); + -+ evtchn_valid[evtchn] = false; ++ evtchn_info.valid[evtchn] = false; +} + +static int bind_interdomain_evtchn_to_virq(unsigned int remote_domain, unsigned int remote_evtchn) @@ -253,11 +255,12 @@ +static void unbind_from_virq(unsigned int virq) +{ + avz_hyp_t args; -+ int evtchn = virq_to_evtchn[virq]; ++ int evtchn = evtchn_from_virq(virq); ++ int cpu = smp_processor_id(); + + spin_lock(&virq_mapping_update_lock); + -+ if (--virq_bindcount[virq] == 0) { ++ if (--per_cpu(evtchn_info, cpu).virq_bindcount[virq] == 0) { + + args.cmd = AVZ_EVENT_CHANNEL_OP; + args.u.avz_evtchn.evtchn_op.cmd = EVTCHNOP_close; @@ -266,8 +269,8 @@ + + avz_hypercall(&args); + -+ evtchn_to_virq[evtchn] = -1; -+ evtchn_valid[evtchn] = false; ++ per_cpu(evtchn_info, cpu).evtchn_to_virq[evtchn] = -1; ++ per_cpu(evtchn_info, cpu).valid[evtchn] = false; + } + + spin_unlock(&virq_mapping_update_lock); @@ -365,39 +368,50 @@ + +void notify_remote_via_virq(int virq) +{ -+ /* virq_to_evtchn is now a global array — direct lookup */ -+ notify_remote_via_evtchn(virq_to_evtchn[virq]); ++ int evtchn = evtchn_from_virq(virq); ++ ++ notify_remote_via_evtchn(evtchn); +} + +void mask_evtchn(int evtchn) +{ -+ evtchn_masked[evtchn] = true; ++ per_cpu(evtchn_info, smp_processor_id()).evtchn_mask[evtchn] = true; +} + +void unmask_evtchn(int evtchn) +{ -+ evtchn_masked[evtchn] = false; ++ per_cpu(evtchn_info, smp_processor_id()).evtchn_mask[evtchn] = false; +} + +void virq_init(void) +{ + struct irq_desc *irqdesc; /* Linux IRQ descriptor */ -+ int i; + -+ /* Initialize global evtchn state */ -+ for (i = 0; i < NR_EVTCHN; i++) { -+ evtchn_to_virq[i] = -1; -+ evtchn_valid[i] = false; -+ evtchn_masked[i] = true; /* all masked until explicitly unmasked */ -+ } ++ int i, cpu; ++ cpumask_t cpumask = CPU_MASK_ALL; ++ ++ /* ++ * For each CPU, initialize event channels for all IRQs. ++ * An IRQ will processed by only one CPU, but it may be rebound to another CPU as well. ++ */ ++ ++ for_each_cpu(cpu, &cpumask) { ++ ++ /* No event-channel -> IRQ mappings. */ ++ for (i = 0; i < NR_EVTCHN; i++) { ++ per_cpu(evtchn_info, cpu).evtchn_to_virq[i] = -1; ++ per_cpu(evtchn_info, cpu).valid[i] = false; ++ ++ per_cpu(evtchn_info, cpu).evtchn_mask[i] = true; ++ } + +#ifdef CONFIG_SPARSE_IRQ -+ irq_alloc_descs(VIRQ_BASE, VIRQ_BASE, NR_VIRQS, numa_node_id()); ++ irq_alloc_descs(VIRQ_BASE, VIRQ_BASE, NR_VIRQS, numa_node_id()); +#endif + -+ for (i = 0; i < NR_VIRQS; i++) { -+ virq_to_evtchn[i] = 0; -+ virq_bindcount[i] = 0; ++ /* Dynamic IRQ space is currently unbound. Zero the refcnts. */ ++ for (i = 0; i < NR_VIRQS; i++) ++ per_cpu(evtchn_info, cpu).virq_bindcount[i] = 0; + } + + /* Configure the irqdesc associated to VIRQs */ diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0083-gnttab.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0083-gnttab.c.patch index d497cd1..a8c919b 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0083-gnttab.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0083-gnttab.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/kernel/gnttab.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/kernel/gnttab.c 2026-03-13 13:24:35.603255383 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/gnttab.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/kernel/gnttab.c 2025-08-29 08:46:41.394805040 +0200 @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2016-2019 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0084-hypervisor.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0084-hypervisor.c.patch index 21b163d..536e031 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0084-hypervisor.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0084-hypervisor.c.patch @@ -1,6 +1,6 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/kernel/hypervisor.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/kernel/hypervisor.c 2026-03-17 12:45:49.802208271 +0100 -@@ -0,0 +1,134 @@ +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/hypervisor.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/kernel/hypervisor.c 2025-08-30 15:04:15.207689288 +0200 +@@ -0,0 +1,108 @@ +/* + * Copyright (C) 2016-2019 Daniel Rossier + * @@ -42,11 +42,9 @@ + * - p_val2: a (virtual) address to a second value + */ + -+ #if 0 +void avz_hypercall(void *args) +{ + avz_hyp_t *__avz_hyp, *avz_hyp = (avz_hyp_t *) args; -+ unsigned long flags; + + /* Make sure the avz_hyp details are in a linear-mapped zone + * to be able to pass the physical address to the hypervisor. @@ -57,36 +55,12 @@ + memcpy(__avz_hyp, avz_hyp, sizeof(avz_hyp_t)); + + dcache_clean_inval_poc((unsigned long) __avz_hyp, sizeof(avz_hyp_t)); -+ -+ local_irq_save(flags); + __avz_hypercall(AVZ_HYPERCALL_TRAP, virt_to_phys(__avz_hyp)); -+ local_irq_restore(flags); -+ ++ + memcpy(avz_hyp, __avz_hyp, sizeof(avz_hyp_t)); + + kfree(__avz_hyp); +} -+#endif -+ -+void avz_hypercall(void *args) -+{ -+ avz_hyp_t *__avz_hyp; -+ avz_hyp_t *avz_hyp = (avz_hyp_t *) args; -+ -+ __avz_hyp = kmalloc(sizeof(avz_hyp_t), GFP_ATOMIC); -+ BUG_ON(!__avz_hyp); -+ -+ memcpy(__avz_hyp, avz_hyp, sizeof(avz_hyp_t)); -+ -+ dcache_clean_inval_poc((unsigned long) __avz_hyp, sizeof(avz_hyp_t)); -+ __avz_hypercall(AVZ_HYPERCALL_TRAP, virt_to_phys(__avz_hyp)); -+ dcache_clean_inval_poc((unsigned long) __avz_hyp, sizeof(avz_hyp_t)); -+ -+ memcpy(avz_hyp, __avz_hyp, sizeof(avz_hyp_t)); -+ -+ kfree(__avz_hyp); -+ -+} + +void avz_get_shared(void) { + avz_hyp_t args; diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0085-Makefile.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0085-Makefile.patch index a90edcc..ccf21c1 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0085-Makefile.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0085-Makefile.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/kernel/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/kernel/Makefile 2026-03-13 13:24:35.603218084 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/kernel/Makefile 2025-08-29 08:46:41.394827303 +0200 @@ -0,0 +1,27 @@ +# +# Makefile for the linux kernel. diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0086-setup.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0086-setup.c.patch index 5e50203..8b4e7f3 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0086-setup.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0086-setup.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/kernel/setup.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/kernel/setup.c 2026-03-13 13:24:35.602977333 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/setup.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/kernel/setup.c 2025-08-29 08:46:41.394853981 +0200 @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2014-2021 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0087-soo_guest_activity.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0087-soo_guest_activity.c.patch index b5cd869..500f0f1 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0087-soo_guest_activity.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0087-soo_guest_activity.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/kernel/soo_guest_activity.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/kernel/soo_guest_activity.c 2026-03-13 13:24:35.602992950 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/soo_guest_activity.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/kernel/soo_guest_activity.c 2025-08-29 08:46:41.394793300 +0200 @@ -0,0 +1,191 @@ +/* + * Copyright (C) 2016-2019 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0088-sysfs.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0088-sysfs.c.patch index a7714ae..f29f618 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0088-sysfs.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0088-sysfs.c.patch @@ -1,6 +1,6 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/kernel/sysfs.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/kernel/sysfs.c 2026-03-13 13:24:35.603386917 +0100 -@@ -0,0 +1,193 @@ +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/sysfs.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/kernel/sysfs.c 2025-08-29 08:46:41.394665675 +0200 +@@ -0,0 +1,158 @@ + +/* + * Copyright (C) 2020 Daniel Rossier @@ -34,19 +34,12 @@ + [agencyUID] = "agencyUID", + [name] = "name", + [vsensej_js]= "vsensej_js", -+ [vfbdev_hres] = "vfbdev_hres", -+ [vfbdev_vres] = "vfbdev_vres", -+ [vfbdev_bpp] = "vfbdev_bpp", -+ [vfbdev_size] = "vfbdev_size", -+ [vfbdev_addr] = "vfbdev_addr", -+ [vfbdev_pid] = "vfbdev_pid", +}; + +static struct kobject *root_kobj; + +static struct kobject *backend_kobj; +static struct kobject *backend_vsensej_kobj; -+static struct kobject *backend_vfbdev_kobj; + + +/* Internal list structure to manage the diversity of callback functions related to attributes */ @@ -115,13 +108,6 @@ +static struct kobj_attribute vsensej_js_attr = __ATTR(vsensej_js, 0664, attr_show, attr_store); + + -+static struct kobj_attribute vfbdev_hres_attr = __ATTR(vfbdev_hres, 0664, attr_show, attr_store); -+static struct kobj_attribute vfbdev_vres_attr = __ATTR(vfbdev_vres, 0664, attr_show, attr_store); -+static struct kobj_attribute vfbdev_bpp_attr = __ATTR(vfbdev_bpp, 0664, attr_show, attr_store); -+static struct kobj_attribute vfbdev_size_attr = __ATTR(vfbdev_size, 0664, attr_show, attr_store); -+static struct kobj_attribute vfbdev_addr_attr = __ATTR(vfbdev_addr, 0664, attr_show, attr_store); -+static struct kobj_attribute vfbdev_pid_attr = __ATTR(vfbdev_pid, 0664, attr_show, attr_store); -+ +/* Groups of attributes for SOO (root) */ +static struct attribute *soo_attrs[] = { + &agencyUID_attr.attr, @@ -144,20 +130,6 @@ + .attrs = backend_vsensej_attrs, +}; + -+static struct attribute *backend_vfbdev_attrs[] = { -+ &vfbdev_hres_attr.attr, -+ &vfbdev_vres_attr.attr, -+ &vfbdev_bpp_attr.attr, -+ &vfbdev_size_attr.attr, -+ &vfbdev_addr_attr.attr, -+ &vfbdev_pid_attr.attr, -+ NULL, /* need to NULL terminate the list of attributes */ -+}; -+ -+static struct attribute_group backend_vfbdev_group = { -+ .attrs = backend_vfbdev_attrs, -+}; -+ +void soo_sysfs_init(void) { + int ret; + @@ -184,13 +156,6 @@ + + ret = sysfs_create_group(backend_vsensej_kobj, &backend_vsensej_group); + BUG_ON(ret); -+ -+ /**** vfbdev ****/ -+ backend_vfbdev_kobj = kobject_create_and_add("vfbdev", backend_kobj); -+ BUG_ON(!backend_vfbdev_kobj); -+ -+ ret = sysfs_create_group(backend_vfbdev_kobj, &backend_vfbdev_group); -+ BUG_ON(ret); +} + + diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0089-Makefile.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0089-Makefile.patch index d8e7eed..631a67b 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0089-Makefile.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0089-Makefile.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/kernel/vbstore/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/kernel/vbstore/Makefile 2026-03-13 13:24:35.603345761 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/vbstore/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/kernel/vbstore/Makefile 2025-08-29 08:46:41.395136816 +0200 @@ -0,0 +1,3 @@ + +obj-y += vbstore.o diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0090-vbstorage.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0090-vbstorage.c.patch index 1a8d3d1..2375844 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0090-vbstorage.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0090-vbstorage.c.patch @@ -1,6 +1,6 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/kernel/vbstore/vbstorage.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/kernel/vbstore/vbstorage.c 2026-03-13 13:24:35.603315739 +0100 -@@ -0,0 +1,528 @@ +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/vbstore/vbstorage.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/kernel/vbstore/vbstorage.c 2025-08-29 08:46:41.395120704 +0200 +@@ -0,0 +1,518 @@ +/* + * Copyright (C) 2016-2019 Daniel Rossier + * Copyright (C) 2018 Baptiste Delporte @@ -518,14 +518,4 @@ + np = of_find_compatible_node(NULL, NULL, "vlogs,backend"); + if (of_device_is_available(np)) + vbs_store_mkdir("/backend/vlogs"); -+ -+ /* Agency backend side of virtual vfbdev device */ -+ np = of_find_compatible_node(NULL, NULL, "vfbdev,backend"); -+ if (of_device_is_available(np)) -+ vbs_store_mkdir("/backend/vfbdev"); -+ -+ /* Agency backend side of virtual vinput device */ -+ np = of_find_compatible_node(NULL, NULL, "vinput,backend"); -+ if (of_device_is_available(np)) -+ vbs_store_mkdir("/backend/vinput"); +} diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0091-vbstore.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0091-vbstore.c.patch index b614442..b80de25 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0091-vbstore.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0091-vbstore.c.patch @@ -1,6 +1,6 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/kernel/vbstore/vbstore.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/kernel/vbstore/vbstore.c 2026-03-17 12:39:07.337636770 +0100 -@@ -0,0 +1,484 @@ +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/vbstore/vbstore.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/kernel/vbstore/vbstore.c 2025-08-29 08:46:41.395147867 +0200 +@@ -0,0 +1,475 @@ +/* + * Copyright (C) 2016-2019 Daniel Rossier + * Copyright (C) 2018 Baptiste Delporte @@ -27,7 +27,7 @@ +#include +#include +#include -+#include ++#include /* GFP Flags for kmalloc */ + +#include +#include @@ -73,17 +73,18 @@ + +typedef struct { + struct list_head list; -+ vbstore_intf_t *intf; ++ vbstore_intf_t *intf; /* Domain source identification */ + struct vbs_node *notify_node; ++ + uint32_t transactionID; ++ +} notify_item_t; + +/* + * Read / write primitives to access the ring. Work on a specific ring + * retrieved through the given event channel. + */ -+static void vbs_s_write(vbstore_intf_t *intf, const void *data, unsigned len) -+{ ++static void vbs_s_write(vbstore_intf_t *intf, const void *data, unsigned len) { + VBSTORE_RING_IDX prod; + volatile char *dst; + @@ -93,6 +94,7 @@ + /* Check if we are at the end of the ring, i.e. there is no place for len bytes */ + if (prod + len >= VBSTORE_RING_SIZE) { + prod = intf->rsp_pvt = 0; ++ + if (prod + len > intf->rsp_cons) + BUG(); + } @@ -110,10 +112,10 @@ + + /* Other side must not see new producer until data is there. */ + mb(); ++ +} + -+static void vbs_s_read(vbstore_intf_t *intf, void *data, unsigned len) -+{ ++static void vbs_s_read(vbstore_intf_t *intf, void *data, unsigned len) { + VBSTORE_RING_IDX cons; + volatile const char *src; + @@ -139,8 +141,8 @@ +/* + * Send the response to the request + */ -+static void send_reply(volatile vbstore_intf_t *intf, vbus_msg_t *reply) -+{ ++static void send_reply(volatile vbstore_intf_t *intf, vbus_msg_t *reply) { ++ + /* vbs_s_write() performs a copy of the msg */ + vbs_s_write(intf, reply, sizeof(vbus_msg_t)); + @@ -153,20 +155,18 @@ + + /* Implies mb(): other side will see the updated producer. */ + -+ DBG(" VBstore replying with msg type: %d for msg: %d notifying on remote evtchn: %d ...\n", -+ reply->type, reply->id, -+ avz_shared->dom_desc.u.agency.vbstore_evtchn[intf->domid]); ++ DBG(" VBstore replying with msg type: %d for msg: %d notifying on remote evtchn: %d ...\n", reply->type, reply->id, ++ avz_shared->dom_desc.u.agency.vbstore_evtchn[intf->domid]); + + /* We are vbstore, so we notify the remote which is our local :-) */ -+ notify_remote_via_evtchn(avz_shared->dom_desc.u.agency.vbstore_evtchn[intf->domid]); ++ notify_remote_via_evtchn(avz_shared->dom_desc.u.agency.vbstore_evtchn[intf->domid]); +} + +/* + * Send a WATCH_EVENT to all of the observers watching the modified path and + * value. + */ -+void vbs_notify_watchers(vbus_msg_t msg, struct vbs_node *node) -+{ ++void vbs_notify_watchers(vbus_msg_t msg, struct vbs_node *node) { + const struct vbs_node *current_node = node; + struct vbs_watcher *watcher; + char path[VBS_KEY_LENGTH]; @@ -184,10 +184,8 @@ + + vbs_get_absolute_path(node, path); + -+ DBG("SENDING WATCH_EVENT %s to watcher revtchn: %d (intf: %p)\n", -+ path, -+ avz_shared->dom_desc.u.agency.vbstore_evtchn[watcher->intf->domid], -+ watcher->intf); ++ DBG("SENDING WATCH_EVENT %s to watcher revtchn: %d (intf: %p)\n", path, ++ avz_shared->dom_desc.u.agency.vbstore_evtchn[watcher->intf->domid], watcher->intf); + + msg.payload = path; + msg.len = strlen(path) + 1; @@ -208,8 +206,7 @@ + * This function is executed with IRQs remaining disabled. + * + */ -+static irqreturn_t vbstore_interrupt(int irq, void *__vbstore_intf) -+{ ++static irqreturn_t vbstore_interrupt(int irq, void *__vbstore_intf) { + volatile vbstore_intf_t *intf = (vbstore_intf_t *) __vbstore_intf; + vbus_msg_t *msg; + struct vbs_node *node; @@ -232,8 +229,7 @@ + + msg = kzalloc(sizeof(vbus_msg_t), GFP_ATOMIC); + if (msg == NULL) { -+ lprintk("%s - line %d: allocation of kmalloc() failed\n", -+ __func__, __LINE__); ++ lprintk("%s - line %d: allocation of kmalloc() failed\n", __func__, __LINE__); + BUG(); + } + @@ -246,10 +242,10 @@ + /* Now, the new message got the ID and the transactionID */ + payload = kzalloc(msg->len, GFP_ATOMIC); + if (payload == NULL) { -+ lprintk("%s: failure returned by kmalloc at line %d\n", -+ __func__, __LINE__); ++ lprintk("%s: failure returned by kmalloc at line %d\n", __func__, __LINE__); + BUG(); + } ++ + vbs_s_read(intf, payload, msg->len); + } + @@ -258,14 +254,15 @@ + case VBS_DIRECTORY: + BUG_ON(payload == NULL); + length = vbs_store_readdir(payload, reply, VBSTORE_RING_SIZE); ++ + DBG("VBS_DIRECTORY(%s) reply: %s length %i\n", payload, reply, length); + break; + + case VBS_DIRECTORY_EXISTS: + BUG_ON(payload == NULL); + length = vbs_store_dir_exists(payload, reply); -+ DBG("VBS_DIRECTORY_EXISTS(%s) reply: %s length %i\n", -+ payload, reply, length); ++ ++ DBG("VBS_DIRECTORY_EXISTS(%s) reply: %s length %i\n", payload, reply, length); + break; + + case VBS_MKDIR: @@ -305,17 +302,14 @@ + /* Perform the write in the vbs store and retrieve associated node for notification. */ + vbs_store_write_notify(payload, value, &node); + -+ DBG("VBS_WRITE(%s) = %s transactionID = %d\n", -+ payload, value, msg->transactionID); ++ DBG("VBS_WRITE(%s) = %s transactionID = %d\n", payload, value, msg->transactionID); + + if (node != NULL) { + + found = false; + list_for_each_entry(notify_item, ¬ify_list, list) { -+ if ((notify_item->notify_node == node) && -+ (notify_item->intf == intf) && -+ ((msg->transactionID == 0) || -+ (notify_item->transactionID == msg->transactionID))) { ++ if ((notify_item->notify_node == node) && (notify_item->intf == intf) && ++ ((msg->transactionID == 0) || (notify_item->transactionID == msg->transactionID))) { + found = true; + break; + } @@ -324,8 +318,7 @@ + if (!found) { + notify_item = kmalloc(sizeof(notify_item_t), GFP_ATOMIC); + if (notify_item == NULL) { -+ lprintk("%s: failure returned by kmalloc at line %d\n", -+ __func__, __LINE__); ++ lprintk("%s: failure returned by kmalloc at line %d\n", __func__, __LINE__); + BUG(); + } + @@ -336,40 +329,42 @@ + list_add_tail(¬ify_item->list, ¬ify_list); + } + } ++ + break; + + case VBS_READ: + BUG_ON(payload == NULL); + vbs_store_read(payload, &reply, VBSTORE_RING_SIZE); + length = strlen(reply) + 1; ++ + DBG("VBS_READ(%s) '%s' %i\n", payload, reply, length); + break; + ++ ++ + case VBS_TRANSACTION_END: + -+ DBG("VBS_TRANSACTION_END: evtchn : %d\n", -+ avz_shared->dom_desc.u.agency.vbstore_evtchn[intf->domid]); ++ DBG("VBS_TRANSACTION_END: evtchn : %d\n", avz_shared->dom_desc.u.agency.vbstore_evtchn[intf->domid]); + + /* A Write operation has been done, we need to notify the watchers. */ + -+ list_for_each_entry_safe(notify_item, tmp_notify_ptr, -+ ¬ify_list, list) { ++ list_for_each_entry_safe(notify_item, tmp_notify_ptr, ¬ify_list, list) { + + if ((notify_item->intf == intf) && -+ ((msg->transactionID == 0) || -+ (notify_item->transactionID == msg->transactionID))) { ++ ((msg->transactionID == 0) || (notify_item->transactionID == msg->transactionID))) { + + vbs_notify_watchers(*msg, notify_item->notify_node); + + list_del(¬ify_item->list); ++ + kfree(notify_item); ++ + } + } + break; + + default: -+ lprintk("------------------- vbs_%i(%s) Unexpected !!\n", -+ msg->type, payload); ++ lprintk("------------------- vbs_%i(%s) Unexpected !!\n", msg->type, payload); + BUG(); + break; + } @@ -384,52 +379,51 @@ + + kfree(msg); + kfree(payload); ++ + } + + BUG_ON(!irqs_disabled()); + + return IRQ_HANDLED; -+} ++ } + +/** + * @brief Initialize the VBstore subsystem used to manage information between + * backend and frontend drivers. -+ * -+ * Each domain has its own VBstore page which is under control of the ++ * ++ * Each domain has its own VBstore page which is under control of the + * Linux domain. Therefore, the Linux domain must grant shared VBstore pages + * to each SO3 domain. + */ -+void vbstore_init(void) -+{ ++void vbstore_init(void) { + int res = 0; + int i; -+ avz_hyp_t args; ++ avz_hyp_t args; + struct uncached_page *ucp[MAX_DOMAINS]; + -+ lprintk("... vbstore SOO Agency setting up...\n"); ++ lprintk("... vbstore SOO Agency setting up...\n"); + + /* Allocate a vbstore page for each domain */ + for (i = 0; i < MAX_DOMAINS; i++) { + + /* To make sure we have synchronized vbstore pages, we ask for a non-cached -+ * memory page. ++ * memory page. + */ + ucp[i] = alloc_uncached_zeroed_page(GFP_KERNEL); + + /* Make sure the page will not be cached */ + vbstore_intf[i] = (struct vbstore_domain_interface *) ucp[i]->vaddr; -+ vbstore_intf[i]->domid = i; ++ vbstore_intf[i]->domid = i; + + if (i == DOMID_AGENCY) + /* Set our local interface to vbstore */ -+ __intf = vbstore_intf[i]; -+ else ++ __intf = vbstore_intf[i]; ++ else + /* Prepare the capsule to retrieve their dedicated vbstore page */ -+ vbstore_grant_ref[i] = gnttab_grant_foreign_access(i, -+ page_to_pfn(ucp[i]->pg)); ++ vbstore_grant_ref[i] = gnttab_grant_foreign_access(i, page_to_pfn(ucp[i]->pg)); + } -+ -+ /* ++ ++ /* + * Initialize the list of notification to be propagated belonging + * to a transaction. + */ @@ -440,38 +434,33 @@ + */ + for (i = 0; i < MAX_DOMAINS; i++) { + -+ args.cmd = AVZ_EVENT_CHANNEL_OP; -+ args.u.avz_evtchn.evtchn_op.cmd = EVTCHNOP_alloc_unbound; ++ args.cmd = AVZ_EVENT_CHANNEL_OP; ++ args.u.avz_evtchn.evtchn_op.cmd = EVTCHNOP_alloc_unbound; ++ + args.u.avz_evtchn.evtchn_op.u.alloc_unbound.dom = DOMID_SELF; -+ args.u.avz_evtchn.evtchn_op.u.alloc_unbound.remote_dom = i; -+ -+ avz_hypercall(&args); -+ -+ /* Store the allocated unbound evtchn.*/ -+ DBG("%s: allocating unbound evtchn %d for vbstore shared page on domain: %d (intf = %lx)...\n", -+ __func__, -+ args.u.avz_evtchn.evtchn_op.u.alloc_unbound.evtchn, -+ i, vbstore_intf[i]); -+ -+ /* This evtchn will be the remote for all clients, including the agency itself and the ME (using their levtchn). */ -+ avz_shared->dom_desc.u.agency.vbstore_evtchn[i] = -+ args.u.avz_evtchn.evtchn_op.u.alloc_unbound.evtchn; -+ } -+ -+ /* Now, initialize the basic vbstore virtual database */ ++ args.u.avz_evtchn.evtchn_op.u.alloc_unbound.remote_dom = i; ++ ++ avz_hypercall(&args); ++ ++ /* Store the allocated unbound evtchn.*/ ++ DBG("%s: allocating unbound evtchn %d for vbstore shared page on domain: %d (intf = %lx)...\n", __func__, ++ args.u.avz_evtchn.evtchn_op.u.alloc_unbound.evtchn, i, vbstore_intf[i]); ++ ++ /* This evtchn will be the remote for all clients, including the agency itself and the ME (using their levtchn). */ ++ avz_shared->dom_desc.u.agency.vbstore_evtchn[i] = args.u.avz_evtchn.evtchn_op.u.alloc_unbound.evtchn; ++ } ++ ++ /* Now, initialize the basic vbstore virtual database */ + vbstorage_agency_init(); + + /* Bind the vbstore listening event channels */ + for (i = 0; i < MAX_DOMAINS; i++) { + + /* Bind IRQ used as event channel to discuss with the ME to the vbstore interrupt handler */ -+ DBG("%s: binding evtchn %d to vbstore_interrupt handler..\n", -+ __func__, avz_shared->dom_desc.u.agency.vbstore_evtchn[i]); ++ DBG("%s: binding evtchn %d to vbstore_interrupt handler..\n", __func__, avz_shared->dom_desc.u.agency.vbstore_evtchn[i]); + -+ res = bind_evtchn_to_virq_handler( -+ avz_shared->dom_desc.u.agency.vbstore_evtchn[i], -+ vbstore_interrupt, NULL, IRQF_DISABLED, -+ "vbstore", vbstore_intf[i]); ++ res = bind_evtchn_to_virq_handler(avz_shared->dom_desc.u.agency.vbstore_evtchn[i], ++ vbstore_interrupt, NULL, IRQF_DISABLED, "vbstore", vbstore_intf[i]); + if (res < 0) { + lprintk(KERN_ERR "VBus request virq failed %i\n", res); + BUG(); @@ -485,3 +474,5 @@ + BUG(); + } +} ++ ++ diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0092-Makefile.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0092-Makefile.patch index d90061c..1b36547 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0092-Makefile.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0092-Makefile.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/kernel/vbus/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/kernel/vbus/Makefile 2026-03-13 13:24:35.603180663 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/vbus/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/kernel/vbus/Makefile 2025-08-29 08:46:41.395011558 +0200 @@ -0,0 +1,11 @@ + +obj-y += vbus_client.o diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0093-vbus_backend.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0093-vbus_backend.c.patch index f34be94..5bbab32 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0093-vbus_backend.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0093-vbus_backend.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/kernel/vbus/vbus_backend.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/kernel/vbus/vbus_backend.c 2026-03-13 13:24:35.603197443 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/vbus/vbus_backend.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/kernel/vbus/vbus_backend.c 2025-08-29 08:46:41.395033838 +0200 @@ -0,0 +1,314 @@ +/* + * Copyright (C) 2016-2019 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0094-vbus.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0094-vbus.c.patch index bcfa1f2..f4df9f2 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0094-vbus.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0094-vbus.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/kernel/vbus/vbus.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/kernel/vbus/vbus.c 2026-03-17 12:39:16.663877659 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/vbus/vbus.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/kernel/vbus/vbus.c 2025-08-29 08:46:41.395052929 +0200 @@ -0,0 +1,870 @@ + +/* diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0095-vbus_client.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0095-vbus_client.c.patch index 5f87372..82a8e23 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0095-vbus_client.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0095-vbus_client.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/kernel/vbus/vbus_client.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/kernel/vbus/vbus_client.c 2026-03-13 13:24:35.603135633 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/vbus/vbus_client.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/kernel/vbus/vbus_client.c 2025-08-29 08:46:41.395021714 +0200 @@ -0,0 +1,189 @@ +/* + * Copyright (C) 2016-2019 Daniel Rossier diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0096-vbus_vbstore.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0096-vbus_vbstore.c.patch index 13e1598..dee3578 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0096-vbus_vbstore.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0096-vbus_vbstore.c.patch @@ -1,6 +1,6 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/kernel/vbus/vbus_vbstore.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/kernel/vbus/vbus_vbstore.c 2026-03-17 17:07:13.824260003 +0100 -@@ -0,0 +1,919 @@ +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/vbus/vbus_vbstore.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/kernel/vbus/vbus_vbstore.c 2025-08-29 08:46:41.394977570 +0200 +@@ -0,0 +1,968 @@ +/* + * Copyright (C) 2016-2019 Daniel Rossier + * Copyright (C) 2018 Baptiste Delporte @@ -99,12 +99,18 @@ + */ +unsigned int transactionID = 0; + ++ +void vbs_dump_watches(void) { ++ + struct vbus_watch *w; ++ + printk("----------- VBstore watches dump --------------\n"); ++ + list_for_each_entry(w, &watches, list) + printk(" %s\n", w->node); ++ + printk("--------------- end --------------------\n"); ++ +} + +/* Local reference to shared vbstore page between us and vbstore */ @@ -122,8 +128,7 @@ + VBSTORE_RING_IDX prod; + volatile char *dst; + -+ DBG("__intf->req_prod: %d __intf->req_pvt: %d __intf->req_cons: %d\n", -+ __intf->req_prod, __intf->req_pvt, __intf->req_cons); ++ DBG("__intf->req_prod: %d __intf->req_pvt: %d __intf->req_cons: %d\n", __intf->req_prod, __intf->req_pvt, __intf->req_cons); + + /* Read indexes, then verify. */ + prod = __intf->req_pvt; @@ -143,7 +148,6 @@ + mb(); + + memcpy((void *) dst, data, len); -+ mb(); + + __intf->req_pvt += len; + @@ -156,8 +160,7 @@ + VBSTORE_RING_IDX cons; + volatile const char *src; + -+ DBG("__intf->rsp_prod: %d __intf->rsp_pvt: %d __intf->rsp_cons: %d\n", -+ __intf->rsp_prod, __intf->rsp_pvt, __intf->rsp_cons); ++ DBG("__intf->rsp_prod: %d __intf->rsp_pvt: %d __intf->rsp_cons: %d\n", __intf->rsp_prod, __intf->rsp_pvt, __intf->rsp_cons); + + /* Read indexes, then verify. */ + cons = __intf->rsp_cons; @@ -183,8 +186,7 @@ + * message to vbstore. It follows a synchronous send/reply scheme. + * A message may have several strings within the payload. These (sub-)strings are known as vectors (msgvec_t). + */ -+static void *vbs_talkv(struct vbus_transaction t, vbus_msg_type_t type, const msgvec_t *vec, -+ unsigned int num_vecs, unsigned int *len) ++static void *vbs_talkv(struct vbus_transaction t, vbus_msg_type_t type, const msgvec_t *vec, unsigned int num_vecs, unsigned int *len) +{ + vbus_msg_t msg; + unsigned int i; @@ -236,16 +238,18 @@ + + /* Store the current vbus_msg into the standby list for waiting the reply from vbstore. */ + spin_lock_irqsave(&vbs_state.msg_list_lock, flags); ++ + list_add_tail(&msg.list, &vbus_msg_standby_list); ++ + spin_unlock_irqrestore(&vbs_state.msg_list_lock, flags); + + __intf->req_prod = __intf->req_pvt; + + mb(); + -+ notify_remote_via_evtchn(avz_shared->dom_desc.u.agency.vbstore_levtchn); ++ notify_remote_via_evtchn(avz_shared->dom_desc.u.agency.vbstore_levtchn); + -+ /* Now we are waiting for the answer from vbstore */ ++ /* Now we are waiting for the answer from vbstore */ + DBG("Now, we wait for the reply / msg ID: %d (0x%lx)\n", msg.id, &msg.list); + + wait_for_completion(msg.reply_wait); @@ -255,8 +259,7 @@ + /* Consistency check */ + if ((msg.reply->type != msg.type) || (msg.reply->id != msg.id)) { + lprintk("%s: reply msg type or ID does not match...\n", __func__); -+ lprintk("VBus received type [%d] expected: %d, received ID [%d] expected: %d\n", -+ msg.reply->type, msg.type, msg.reply->id, msg.id); ++ lprintk("VBus received type [%d] expected: %d, received ID [%d] expected: %d\n", msg.reply->type, msg.type, msg.reply->id, msg.id); + BUG(); + } + @@ -274,12 +277,13 @@ +} + +/* Simplified version of vbs_talkv: single message. */ -+static void *vbs_single(struct vbus_transaction t, vbus_msg_type_t type, -+ const char *string, unsigned int *len) ++static void *vbs_single(struct vbus_transaction t, vbus_msg_type_t type, const char *string, unsigned int *len) +{ + msgvec_t vec; ++ + vec.base = (void *) string; + vec.len = strlen(string) + 1; ++ + return vbs_talkv(t, type, &vec, 1, len); +} + @@ -287,8 +291,10 @@ +{ + unsigned int num; + const char *p; ++ + for (p = strings, num = 0; p < strings + len; p += strlen(p) + 1) + num++; ++ + return num; +} + @@ -296,12 +302,15 @@ +static char *join(const char *dir, const char *name) +{ + char *buffer; ++ + if (strlen(name) == 0) + buffer = kasprintf(GFP_ATOMIC, "%s", dir); + else + buffer = kasprintf(GFP_ATOMIC, "%s/%s", dir, name); ++ + if (!buffer) + BUG(); ++ + return buffer; +} + @@ -316,16 +325,19 @@ + ret = kmalloc(*num * sizeof(char *) + len, GFP_ATOMIC); + if (!ret) + BUG(); ++ + memcpy(&ret[*num], strings, len); + kfree(strings); ++ + strings = (char *)&ret[*num]; -+ for (p = strings, *num = 0; p < strings + len; p += strlen(p) + 1) ++ for (p = strings, *num = 0; p < strings + len; p += strlen(p) + 1) { + ret[(*num)++] = p; ++ } ++ + return ret; +} + -+char **vbus_directory(struct vbus_transaction t, const char *dir, -+ const char *node, unsigned int *num) ++char **vbus_directory(struct vbus_transaction t, const char *dir, const char *node, unsigned int *num) +{ + char *strings, *path; + unsigned int len; @@ -349,14 +361,14 @@ + return rr; + } else + BUG(); ++ +} + +/* + * Check if a directory exists. + * Return 1 if the directory has been found, 0 otherwise. + */ -+int vbus_directory_exists(struct vbus_transaction t, const char *dir, const char *node) -+{ ++int vbus_directory_exists(struct vbus_transaction t, const char *dir, const char *node) { + char *strings, *path; + unsigned int len; + int res; @@ -380,14 +392,15 @@ + * Returns a kmalloced value: call free() on it after use. + * len indicates length in bytes. + */ -+void *vbus_read(struct vbus_transaction t, const char *dir, -+ const char *node, unsigned int *len) ++void *vbus_read(struct vbus_transaction t, const char *dir, const char *node, unsigned int *len) +{ + char *path; + void *ret; + + path = join(dir, node); ++ + ret = vbs_single(t, VBS_READ, path, len); ++ + kfree(path); + + return ret; @@ -396,8 +409,7 @@ +/* Write the value of a single file. + * Returns -err on failure. + */ -+void vbus_write(struct vbus_transaction t, const char *dir, -+ const char *node, const char *string) ++void vbus_write(struct vbus_transaction t, const char *dir, const char *node, const char *string) +{ + const char *path; + msgvec_t vec[2]; @@ -409,6 +421,7 @@ + + vec[0].base = (void *) path; + vec[0].len = strlen(path) + 1; ++ + vec[1].base = (void *) string; + vec[1].len = strlen(string) + 1; + @@ -435,7 +448,8 @@ + str = vbs_single(t, VBS_MKDIR, path, NULL); + if (IS_ERR(str)) + BUG(); -+ if (str) ++ ++ if (str) + kfree(str); + + kfree(path); @@ -454,7 +468,7 @@ + str = vbs_single(t, VBS_RM, path, NULL); + if (IS_ERR(str)) + BUG(); -+ if (str) ++ if (str) + kfree(str); + + kfree(path); @@ -471,6 +485,7 @@ + mutex_lock(&vbs_state.transaction_group_mutex); + + vbs_state.transaction_count++; ++ + transactionID++; + + /* We make sure that an overflow does not lead to value 0 */ @@ -492,24 +507,28 @@ + char *str; + + str = vbs_single(t, VBS_TRANSACTION_END, "", NULL); ++ + if (IS_ERR(str)) + BUG(); + + DBG("Ending transaction ID: %d\n", t.id); + -+ if (str) ++ if (str) + kfree(str); + ++ + mutex_lock(&vbs_state.transaction_mutex); ++ + vbs_state.transaction_count--; ++ + if (vbs_state.transaction_count == 0) + mutex_unlock(&vbs_state.transaction_group_mutex); ++ + mutex_unlock(&vbs_state.transaction_mutex); +} + +/* Single read and scanf: returns -errno or num scanned. */ -+int vbus_scanf(struct vbus_transaction t, const char *dir, -+ const char *node, const char *fmt, ...) ++int vbus_scanf(struct vbus_transaction t, const char *dir, const char *node, const char *fmt, ...) +{ + va_list ap; + int ret; @@ -524,7 +543,7 @@ + va_start(ap, fmt); + ret = vsscanf(val, fmt, ap); + va_end(ap); -+ ++ + kfree(val); + + /* Distinctive errno. */ @@ -538,8 +557,7 @@ +EXPORT_SYMBOL_GPL(vbus_scanf); + +/* Single printf and write: returns -errno or 0. */ -+void vbus_printf(struct vbus_transaction t, const char *dir, -+ const char *node, const char *fmt, ...) ++void vbus_printf(struct vbus_transaction t, const char *dir, const char *node, const char *fmt, ...) +{ + va_list ap; + int ret; @@ -557,6 +575,7 @@ + BUG_ON(ret > PRINTF_BUFFER_SIZE-1); + + vbus_write(t, dir, node, printf_buffer); ++ + kfree(printf_buffer); +} + @@ -573,6 +592,7 @@ + char *p; + + p = vbus_read(t, dir, name, NULL); ++ + if (IS_ERR(p)) + BUG(); + @@ -593,8 +613,10 @@ +static void vbs_watch(const char *path) +{ + msgvec_t vec[1]; ++ + vec[0].base = (void *) path; + vec[0].len = strlen(path) + 1; ++ + if (IS_ERR(vbs_talkv(VBT_NIL, VBS_WATCH, vec, ARRAY_SIZE(vec), NULL))) + BUG(); +} @@ -602,8 +624,10 @@ +static void vbs_unwatch(const char *path) +{ + msgvec_t vec[1]; ++ + vec[0].base = (char *) path; + vec[0].len = strlen(path) + 1; ++ + if (IS_ERR(vbs_talkv(VBT_NIL, VBS_UNWATCH, vec, ARRAY_SIZE(vec), NULL))) + BUG(); +} @@ -616,9 +640,11 @@ +static struct vbus_watch *find_first_watch(struct list_head *__watches, const char *node) +{ + struct vbus_watch *__w; ++ + list_for_each_entry(__w, __watches, list) + if (!strcmp(__w->node, node)) + return __w; ++ + return NULL; +} + @@ -629,14 +655,15 @@ +static struct vbus_watch *get_watch(struct list_head *__watches, struct vbus_watch *w) +{ + struct vbus_watch *__w; ++ + list_for_each_entry(__w, __watches, list) + if (!strcmp(__w->node, w->node) && (__w->callback == w->callback)) + return __w; ++ + return NULL; +} + -+static void __register_vbus_watch(struct list_head *__watches, struct vbus_watch *watch) -+{ ++static void __register_vbus_watch(struct list_head *__watches, struct vbus_watch *watch) { + unsigned long flags; + + /* A watch on a certain node with a certain callback has to be UNIQUE. */ @@ -650,11 +677,15 @@ + /* Prepare to update the list */ + + local_irq_save(flags); ++ + watch->pending = false; ++ + list_add(&watch->list, __watches); ++ + local_irq_restore(flags); +} + ++ +/* Register a watch on a vbstore node */ +void register_vbus_watch(struct vbus_watch *watch) +{ @@ -662,42 +693,45 @@ +} +EXPORT_SYMBOL_GPL(register_vbus_watch); + -+static void ____unregister_vbus_watch(struct list_head *__watches, -+ struct vbus_watch *watch, int vbus) -+{ ++static void ____unregister_vbus_watch(struct list_head *__watches, struct vbus_watch *watch, int vbus) { + unsigned long flags; + + /* Prevent some undesired operations on the list */ + + local_irq_save(flags); ++ + BUG_ON(!get_watch(__watches, watch)); ++ + list_del(&watch->list); + + /* Check if we can remove the watch from vbstore if there is no associated watch + * (with the corresponding node name). + */ + if (vbus && !find_first_watch(__watches, watch->node)) { ++ + local_irq_restore(flags); ++ + vbs_unwatch(watch->node); ++ + } else + local_irq_restore(flags); +} + ++ +static void __unregister_vbus_watch(struct vbus_watch *watch, int vbus) +{ + ____unregister_vbus_watch(&watches, watch, vbus); +} + -+void unregister_vbus_watch(struct vbus_watch *watch) -+{ ++void unregister_vbus_watch(struct vbus_watch *watch) { + __unregister_vbus_watch(watch, 1); +} + -+void unregister_vbus_watch_without_vbus(struct vbus_watch *watch) -+{ ++void unregister_vbus_watch_without_vbus(struct vbus_watch *watch) { + __unregister_vbus_watch(watch, 0); +} + ++ +/* + * Main threaded function to monitor watches on vbstore entries. Various callbacks can be associated to an event path which is notified + * by an event message. The pair has to be unique. @@ -714,25 +748,24 @@ +{ + struct vbus_watch *__w; + bool found; -+ int ret; ++ ++ BUG_ON(smp_processor_id() != AGENCY_CPU); + + for (;;) { -+ /* Use interruptible version to avoid blocked task message every 120 seconds */ -+ ret = wait_for_completion_interruptible(&vbs_state.watch_wait); -+ if (ret == -ERESTARTSYS) { -+ pr_warn("%s wait_for_completion has been interrupted, ignoring\n", __func__); -+ continue; -+ } ++ ++ wait_for_completion(&vbs_state.watch_wait); + + /* Avoiding to be suspended during SOO callback processing... */ + mutex_lock(&vbs_state.watch_mutex); + + do { + found = false; ++ + list_for_each_entry(__w, &watches, list) { + + /* Is the watch is pending ? */ + if (__w->pending) { ++ + found = true; + __w->pending = false; + @@ -757,10 +790,8 @@ + struct vbus_watch *__w; + bool found; + -+ DBG("IRQ: %d intf: %lx req_cons: %d req_prod: %d\n", -+ irq, __intf, __intf->req_cons, __intf->req_prod); -+ DBG("IRQ: %d intf: %lx rsp_cons: %d rsp_prod: %d\n", -+ irq, __intf, __intf->rsp_cons, __intf->rsp_prod); ++ DBG("IRQ: %d intf: %lx req_cons: %d req_prod: %d\n", irq, __intf, __intf->req_cons, __intf->req_prod); ++ DBG("IRQ: %d intf: %lx rsp_cons: %d rsp_prod: %d\n", irq, __intf, __intf->rsp_cons, __intf->rsp_prod); + + BUG_ON(!irqs_disabled()); + @@ -778,33 +809,41 @@ + if (msg->len > 0) { + msg->payload = kzalloc(msg->len, GFP_ATOMIC); + BUG_ON(!msg->payload); ++ + memset(msg->payload, 0, msg->len); ++ + vbs_read(msg->payload, msg->len); ++ + } else + /* Override previous value */ + msg->payload = NULL; + + if (msg->type == VBS_WATCH_EVENT) { ++ + found = false; ++ + list_for_each_entry(__w, &watches, list) { ++ + if (!strcmp(__w->node, msg->payload)) { + __w->pending = true; + found = true; + mb(); + } + } ++ + if (found) + complete(&vbs_state.watch_wait); + + kfree(msg->payload); + kfree(msg); ++ ++ + } else { + + /* Look for the peer vbus_msg which did the request */ + found = false; + -+ list_for_each_entry_safe(orig_msg, orig_msg_tmp, -+ &vbus_msg_standby_list, list) { ++ list_for_each_entry_safe(orig_msg, orig_msg_tmp, &vbus_msg_standby_list, list) { + if (orig_msg->id == msg->id) { + list_del(&orig_msg->list); /* Remove this message from the standby list */ + @@ -821,7 +860,9 @@ + + if (!found) /* A pending message MUST exist */ + BUG(); ++ + } ++ + } + + BUG_ON(!irqs_disabled()); @@ -829,11 +870,11 @@ + return IRQ_HANDLED; +} + -+static void vbs_dump_walk(char *nodename) -+{ ++static void vbs_dump_walk(char *nodename) { + char **dir; + unsigned int i, dir_n = 0; + int ret; ++ + char _local[80]; + char val[20]; + char *msg = val; @@ -842,26 +883,35 @@ + + for (i = 0; i < dir_n; i++) { + strcpy(_local, nodename); ++ + if (strcmp(_local, "/")) + strcat(_local, "/"); ++ + strcat(_local, dir[i]); + + ret = vbs_store_read(_local, &msg, 20); ++ + lprintk("%s ", _local); + + if (ret) + printk("= %s", msg); ++ + lprintk("\n"); ++ + vbs_dump_walk(_local); + } + + kfree(dir); ++ +} + -+void vbs_dump(void) -+{ ++ ++void vbs_dump(void) { ++ + lprintk("----------- VBstore dump --------------\n"); ++ + vbs_dump_walk("/"); ++ + lprintk("--------------- end --------------------\n"); +} + @@ -879,17 +929,16 @@ + /* dev temporary used to set up event channel used by vbstore. */ + + dev.otherend_id = 0; -+ DBG("%s: binding a local event channel to the remote evtchn %d in Agency. ...\n", -+ __func__, avz_shared->dom_desc.u.agency.vbstore_evtchn[DOMID_AGENCY]); ++ DBG("%s: binding a local event channel to the remote evtchn %d in Agency. ...\n", __func__, ++ avz_shared->dom_desc.u.agency.vbstore_evtchn[DOMID_AGENCY]); + -+ vbus_bind_evtchn(&dev, avz_shared->dom_desc.u.agency.vbstore_evtchn[DOMID_AGENCY], ++ vbus_bind_evtchn(&dev, avz_shared->dom_desc.u.agency.vbstore_evtchn[DOMID_AGENCY], + (uint32_t *) &avz_shared->dom_desc.u.agency.vbstore_levtchn); + -+ DBG("Local vbstore_evtchn is %d (remote is %d)\n", -+ avz_shared->dom_desc.u.agency.vbstore_levtchn, -+ avz_shared->dom_desc.u.agency.vbstore_evtchn[DOMID_AGENCY]); ++ DBG("Local vbstore_evtchn is %d (remote is %d)\n", avz_shared->dom_desc.u.agency.vbstore_levtchn, ++ avz_shared->dom_desc.u.agency.vbstore_evtchn[DOMID_AGENCY]); + -+ INIT_LIST_HEAD(&vbs_state.reply_list); ++ INIT_LIST_HEAD(&vbs_state.reply_list); + + mutex_init(&vbs_state.request_mutex); + mutex_init(&vbs_state.transaction_mutex); @@ -899,11 +948,10 @@ + spin_lock_init(&vbs_state.msg_list_lock); + + vbs_state.transaction_count = 0; ++ + init_completion(&vbs_state.watch_wait); + -+ vbus_irq = bind_evtchn_to_virq_handler( -+ avz_shared->dom_desc.u.agency.vbstore_levtchn, -+ vbus_vbstore_isr, NULL, IRQF_DISABLED, "vbus_vbstore", NULL); ++ vbus_irq = bind_evtchn_to_virq_handler(avz_shared->dom_desc.u.agency.vbstore_levtchn, vbus_vbstore_isr, NULL, IRQF_DISABLED, "vbus_vbstore", NULL); + if (vbus_irq <= 0) { + lprintk(KERN_ERR "VBus request irq failed %i\n", vbus_irq); + BUG(); @@ -914,6 +962,7 @@ + return PTR_ERR(task); + + param.sched_priority = 60; ++ + sched_setscheduler_nocheck(task, SCHED_FIFO, ¶m); + + lprintk("%s: done.\n", __func__); diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0097-ctype.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0097-ctype.c.patch index 35e755a..677228d 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0097-ctype.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0097-ctype.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/lib/ctype.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/lib/ctype.c 2026-03-13 13:24:35.604885869 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/lib/ctype.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/lib/ctype.c 2025-08-29 08:46:41.395518498 +0200 @@ -0,0 +1,65 @@ + +#include diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0098-config.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0098-config.h.patch index 51820e6..0e2f3f5 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0098-config.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0098-config.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/lib/libroxml/config.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/lib/libroxml/config.h 2026-03-13 13:24:35.604514034 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/lib/libroxml/config.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/lib/libroxml/config.h 2025-08-29 08:46:41.395210719 +0200 @@ -0,0 +1,26 @@ + +#ifndef LIBROXML_CONFIG_H diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0099-Makefile.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0099-Makefile.patch index 7a38f03..d09bb69 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0099-Makefile.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0099-Makefile.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/lib/libroxml/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/lib/libroxml/Makefile 2026-03-13 13:24:35.604679267 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/lib/libroxml/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/lib/libroxml/Makefile 2025-08-29 08:46:41.395330459 +0200 @@ -0,0 +1,12 @@ +obj-y += roxml_buff.o roxml_commit.o roxml_content.o +obj-y += roxml_core.o roxml_edit.o roxml_mem.o roxml_nav.o diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0100-roxml_buff.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0100-roxml_buff.c.patch index 4a1e52e..3afe821 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0100-roxml_buff.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0100-roxml_buff.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/lib/libroxml/roxml_buff.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/lib/libroxml/roxml_buff.c 2026-03-13 13:24:35.604665947 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/lib/libroxml/roxml_buff.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/lib/libroxml/roxml_buff.c 2025-08-29 08:46:41.395417364 +0200 @@ -0,0 +1,59 @@ +/** + * \file roxml_buff.c diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0101-roxml_buff.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0101-roxml_buff.h.patch index 7105796..f01859d 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0101-roxml_buff.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0101-roxml_buff.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/lib/libroxml/roxml_buff.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/lib/libroxml/roxml_buff.h 2026-03-13 13:24:35.604609223 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/lib/libroxml/roxml_buff.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/lib/libroxml/roxml_buff.h 2025-08-29 08:46:41.395496948 +0200 @@ -0,0 +1,49 @@ +/** + * \file roxml_buff.h diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0102-roxml_commit.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0102-roxml_commit.c.patch index 07782f1..5674aa2 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0102-roxml_commit.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0102-roxml_commit.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/lib/libroxml/roxml_commit.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/lib/libroxml/roxml_commit.c 2026-03-13 13:24:35.604693622 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/lib/libroxml/roxml_commit.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/lib/libroxml/roxml_commit.c 2025-08-29 08:46:41.395341167 +0200 @@ -0,0 +1,366 @@ +/** + * \file roxml_commit.c diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0103-roxml_content.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0103-roxml_content.c.patch index e7cf03f..beb000f 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0103-roxml_content.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0103-roxml_content.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/lib/libroxml/roxml_content.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/lib/libroxml/roxml_content.c 2026-03-13 13:24:35.604745157 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/lib/libroxml/roxml_content.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/lib/libroxml/roxml_content.c 2025-08-29 08:46:41.395234626 +0200 @@ -0,0 +1,493 @@ +/** + * \file roxml_content.c diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0104-roxml_core.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0104-roxml_core.c.patch index 711ab0a..ce80303 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0104-roxml_core.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0104-roxml_core.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/lib/libroxml/roxml_core.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/lib/libroxml/roxml_core.c 2026-03-13 13:24:35.604457825 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/lib/libroxml/roxml_core.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/lib/libroxml/roxml_core.c 2025-08-29 08:46:41.395439641 +0200 @@ -0,0 +1,858 @@ +/** + * \file roxml_core.c diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0105-roxml_core.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0105-roxml_core.h.patch index 85939d3..de8c8f0 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0105-roxml_core.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0105-roxml_core.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/lib/libroxml/roxml_core.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/lib/libroxml/roxml_core.h 2026-03-13 13:24:35.604711753 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/lib/libroxml/roxml_core.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/lib/libroxml/roxml_core.h 2025-08-29 08:46:41.395296382 +0200 @@ -0,0 +1,120 @@ +/** + * \file roxml_core.h diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0106-roxml_defines.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0106-roxml_defines.h.patch index 77e6007..66b10e8 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0106-roxml_defines.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0106-roxml_defines.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/lib/libroxml/roxml_defines.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/lib/libroxml/roxml_defines.h 2026-03-13 13:24:35.604763832 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/lib/libroxml/roxml_defines.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/lib/libroxml/roxml_defines.h 2025-08-29 08:46:41.395354711 +0200 @@ -0,0 +1,416 @@ +/** + * \file roxml_defines.h diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0107-roxml_edit.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0107-roxml_edit.c.patch index a090c01..8a4db04 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0107-roxml_edit.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0107-roxml_edit.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/lib/libroxml/roxml_edit.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/lib/libroxml/roxml_edit.c 2026-03-13 13:24:35.604635472 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/lib/libroxml/roxml_edit.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/lib/libroxml/roxml_edit.c 2025-08-29 08:46:41.395369160 +0200 @@ -0,0 +1,430 @@ +/** + * \file roxml_edit.c diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0108-roxml_file.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0108-roxml_file.c.patch index 0e30547..46a3913 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0108-roxml_file.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0108-roxml_file.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/lib/libroxml/roxml_file.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/lib/libroxml/roxml_file.c 2026-03-13 13:24:35.604853801 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/lib/libroxml/roxml_file.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/lib/libroxml/roxml_file.c 2025-08-29 08:46:41.395284946 +0200 @@ -0,0 +1,103 @@ +/** + * \file roxml_file.c diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0109-roxml_file.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0109-roxml_file.h.patch index beb19dd..8db4a01 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0109-roxml_file.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0109-roxml_file.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/lib/libroxml/roxml_file.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/lib/libroxml/roxml_file.h 2026-03-13 13:24:35.604652909 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/lib/libroxml/roxml_file.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/lib/libroxml/roxml_file.h 2025-08-29 08:46:41.395428349 +0200 @@ -0,0 +1,48 @@ +/** + * \file roxml_file.h diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0110-roxml_internal.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0110-roxml_internal.h.patch index 365b92c..b72ed91 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0110-roxml_internal.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0110-roxml_internal.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/lib/libroxml/roxml_internal.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/lib/libroxml/roxml_internal.h 2026-03-13 13:24:35.604545340 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/lib/libroxml/roxml_internal.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/lib/libroxml/roxml_internal.h 2025-08-29 08:46:41.395395236 +0200 @@ -0,0 +1,56 @@ +/** + * \file roxml_internal.h diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0111-roxml_mem.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0111-roxml_mem.c.patch index 4706941..add4e05 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0111-roxml_mem.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0111-roxml_mem.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/lib/libroxml/roxml_mem.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/lib/libroxml/roxml_mem.c 2026-03-13 13:24:35.604593368 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/lib/libroxml/roxml_mem.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/lib/libroxml/roxml_mem.c 2025-08-29 08:46:41.395274334 +0200 @@ -0,0 +1,143 @@ +/** + * \file roxml_mem.c diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0112-roxml_mem.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0112-roxml_mem.h.patch index 2da25cb..148e7da 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0112-roxml_mem.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0112-roxml_mem.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/lib/libroxml/roxml_mem.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/lib/libroxml/roxml_mem.h 2026-03-13 13:24:35.604839354 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/lib/libroxml/roxml_mem.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/lib/libroxml/roxml_mem.h 2025-08-29 08:46:41.395405647 +0200 @@ -0,0 +1,30 @@ +/** + * \file roxml_mem.h diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0113-roxml_nav.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0113-roxml_nav.c.patch index e9f5199..ab2df28 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0113-roxml_nav.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0113-roxml_nav.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/lib/libroxml/roxml_nav.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/lib/libroxml/roxml_nav.c 2026-03-13 13:24:35.604622399 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/lib/libroxml/roxml_nav.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/lib/libroxml/roxml_nav.c 2025-08-29 08:46:41.395457913 +0200 @@ -0,0 +1,66 @@ +/** + * \file roxml_nav.c diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0114-roxml_parser.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0114-roxml_parser.c.patch index 1dc4fe2..594bccc 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0114-roxml_parser.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0114-roxml_parser.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/lib/libroxml/roxml_parser.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/lib/libroxml/roxml_parser.c 2026-03-13 13:24:35.604727635 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/lib/libroxml/roxml_parser.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/lib/libroxml/roxml_parser.c 2025-08-29 08:46:41.395308183 +0200 @@ -0,0 +1,182 @@ +/** + * \file roxml_parser.c diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0115-roxml_parser.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0115-roxml_parser.h.patch index 1be0fe6..e3d7f1a 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0115-roxml_parser.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0115-roxml_parser.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/lib/libroxml/roxml_parser.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/lib/libroxml/roxml_parser.h 2026-03-13 13:24:35.604780104 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/lib/libroxml/roxml_parser.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/lib/libroxml/roxml_parser.h 2025-08-29 08:46:41.395247491 +0200 @@ -0,0 +1,66 @@ +/** + * \file roxml_parser.h diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0116-roxml_tune.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0116-roxml_tune.h.patch index 6e0b036..e6dbeb3 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0116-roxml_tune.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0116-roxml_tune.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/lib/libroxml/roxml_tune.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/lib/libroxml/roxml_tune.h 2026-03-13 13:24:35.604495226 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/lib/libroxml/roxml_tune.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/lib/libroxml/roxml_tune.h 2025-08-29 08:46:41.395200757 +0200 @@ -0,0 +1,95 @@ +/** + * \file roxml_tune.c diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0117-roxml_types.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0117-roxml_types.h.patch index 8890ef0..df85bda 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0117-roxml_types.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0117-roxml_types.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/lib/libroxml/roxml_types.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/lib/libroxml/roxml_types.h 2026-03-13 13:24:35.604529708 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/lib/libroxml/roxml_types.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/lib/libroxml/roxml_types.h 2025-08-29 08:46:41.395257813 +0200 @@ -0,0 +1,228 @@ +/** + * \file roxml_types.c diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0118-roxml_utils.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0118-roxml_utils.h.patch index 8cd0c43..d6c7f70 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0118-roxml_utils.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0118-roxml_utils.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/lib/libroxml/roxml_utils.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/lib/libroxml/roxml_utils.h 2026-03-13 13:24:35.604823861 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/lib/libroxml/roxml_utils.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/lib/libroxml/roxml_utils.h 2025-08-29 08:46:41.395384524 +0200 @@ -0,0 +1,127 @@ +/** + * \file roxml_utils.h diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0119-roxml_win32_native.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0119-roxml_win32_native.h.patch index 7237173..b47c9ba 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0119-roxml_win32_native.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0119-roxml_win32_native.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/lib/libroxml/roxml_win32_native.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/lib/libroxml/roxml_win32_native.h 2026-03-13 13:24:35.604808984 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/lib/libroxml/roxml_win32_native.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/lib/libroxml/roxml_win32_native.h 2025-08-29 08:46:41.395320700 +0200 @@ -0,0 +1,34 @@ +/** + * \file roxml_win32_native.h diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0120-roxml_xpath.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0120-roxml_xpath.c.patch index e4def8d..a56c58c 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0120-roxml_xpath.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0120-roxml_xpath.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/lib/libroxml/roxml_xpath.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/lib/libroxml/roxml_xpath.c 2026-03-13 13:24:35.604561492 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/lib/libroxml/roxml_xpath.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/lib/libroxml/roxml_xpath.c 2025-08-29 08:46:41.395471270 +0200 @@ -0,0 +1,1645 @@ +/** + * \file roxml_xpath.c diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0121-roxml_xpath.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0121-roxml_xpath.h.patch index a594579..ab7e69e 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0121-roxml_xpath.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0121-roxml_xpath.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/lib/libroxml/roxml_xpath.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/lib/libroxml/roxml_xpath.h 2026-03-13 13:24:35.604794940 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/lib/libroxml/roxml_xpath.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/lib/libroxml/roxml_xpath.h 2025-08-29 08:46:41.395220827 +0200 @@ -0,0 +1,67 @@ +/** + * \file roxml_xpath.h diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0122-Makefile.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0122-Makefile.patch index 95d7e04..e6523cd 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0122-Makefile.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0122-Makefile.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/lib/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/lib/Makefile 2026-03-13 13:24:35.604872442 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/lib/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/lib/Makefile 2025-08-29 08:46:41.395508507 +0200 @@ -0,0 +1,5 @@ +obj-y += strtod.o +obj-y += libroxml/ diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0123-strtod.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0123-strtod.c.patch index 6b6acc2..d82e1ed 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0123-strtod.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0123-strtod.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/lib/strtod.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/lib/strtod.c 2026-03-13 13:24:35.604903286 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/lib/strtod.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/lib/strtod.c 2025-08-29 08:46:41.395531380 +0200 @@ -0,0 +1,2174 @@ +/**************************************************************** + * diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0124-Makefile.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0124-Makefile.patch index 2056cd8..6edfcd5 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0124-Makefile.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0124-Makefile.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/Makefile 2026-03-13 13:24:35.605366060 +0100 +--- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/Makefile 2025-08-29 08:46:41.396307073 +0200 @@ -0,0 +1,5 @@ + +obj-y += kernel/ diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0125-Makefile.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0125-Makefile.patch index 4647212..aba3fc0 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0125-Makefile.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0125-Makefile.patch @@ -1,4 +1,5 @@ ---- ./build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/drivers/vfbdevback/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/drivers/vfbdevback/Makefile 2026-02-17 08:18:11.150593301 +0100 -@@ -0,0 +1 @@ -+obj-y := vfbdev.o +--- /home/jmiceli/Documents/projects/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/drivers/vlogsback/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/drivers/vlogsback/Makefile 2025-09-12 13:46:16.883171946 +0200 +@@ -0,0 +1,2 @@ ++obj-y := vlogs.o ++ diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0021-vlogs.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0126-vlogs.c.patch similarity index 95% rename from build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0021-vlogs.c.patch rename to build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0126-vlogs.c.patch index e3c231d..96e8978 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0021-vlogs.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0126-vlogs.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/drivers/vlogsback/vlogs.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/drivers/vlogsback/vlogs.c 2026-03-13 13:24:35.605346196 +0100 +--- /home/jmiceli/Documents/projects/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/drivers/vlogsback/vlogs.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/drivers/vlogsback/vlogs.c 2025-09-15 14:07:26.277477044 +0200 @@ -0,0 +1,198 @@ +/* + * Copyright (C) 2025 Jean-Pierre Miceli diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0038-vlogs.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0127-vlogs.h.patch similarity index 86% rename from build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0038-vlogs.h.patch rename to build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0127-vlogs.h.patch index 2962d1a..f84b2df 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0038-vlogs.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0127-vlogs.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/soo/include/soo/dev/vlogs.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/include/soo/dev/vlogs.h 2026-03-13 13:24:35.603867558 +0100 +--- /home/jmiceli/Documents/projects/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/dev/vlogs.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/include/soo/dev/vlogs.h 2025-09-12 14:29:41.511151765 +0200 @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2025 Jean-Pierre Miceli diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0128-Makefile.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0128-Makefile.patch deleted file mode 100644 index 99d2ef0..0000000 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0128-Makefile.patch +++ /dev/null @@ -1,5 +0,0 @@ ---- /home/cdk/project/micofe/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/drivers/vinputback/Makefile 1970-01-01 01:00:00.000000000 +0100 -+++ ./soo/drivers/vinputback/Makefile 2026-04-28 16:34:33.037734565 +0200 -@@ -0,0 +1,2 @@ -+obj-y := vinput.o -+ diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0126-vfbdev.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0128-vfbdev.c.patch similarity index 100% rename from build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0126-vfbdev.c.patch rename to build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0128-vfbdev.c.patch diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0127-vfbdev.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0129-vfbdev.h.patch similarity index 100% rename from build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0127-vfbdev.h.patch rename to build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0129-vfbdev.h.patch diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0129-vinput.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0130-vinput.c.patch similarity index 100% rename from build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0129-vinput.c.patch rename to build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0130-vinput.c.patch diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0130-vinput.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0131-vinput.h.patch similarity index 100% rename from build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0130-vinput.h.patch rename to build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0131-vinput.h.patch diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/1001-bcm2711-rpi-4-b.dts.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0132-bcm2711-rpi-4-b.dts.patch similarity index 100% rename from build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/1001-bcm2711-rpi-4-b.dts.patch rename to build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0132-bcm2711-rpi-4-b.dts.patch diff --git a/build/meta-linux/recipes-linux/soo/linux_6.12%.bbappend b/build/meta-linux/recipes-linux/soo/linux_6.12%.bbappend index 6c4ccb3..59ab9bd 100644 --- a/build/meta-linux/recipes-linux/soo/linux_6.12%.bbappend +++ b/build/meta-linux/recipes-linux/soo/linux_6.12%.bbappend @@ -1,3 +1,5 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD SUMMARY = "Linux Operating System running as guest on AVZ" DESCRIPTION = "Linux OS used as main domain (agency) running on the embedded platform" diff --git a/build/meta-qemu/classes/qemu.bbclass b/build/meta-qemu/classes/qemu.bbclass index eaf77e5..30ee400 100644 --- a/build/meta-qemu/classes/qemu.bbclass +++ b/build/meta-qemu/classes/qemu.bbclass @@ -1,11 +1,26 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD # Class for building QEMU in infrabase +do_configure[nostamp] = "1" qemu_do_configure () { - echo "Configuring QEMU..." cd ${IB_DIR}/qemu - ./configure ${QEMU_CONFIGURE:${IB_PLATFORM}} + + # Build the softmmu target of the current platform (QEMU_TARGET, selected + # per IB_PLATFORM), but PRESERVE any other arch already built in a prior + # run — otherwise meson would drop it. So building arm-softmmu then + # aarch64-softmmu (or vice-versa) keeps both qemu-system-* binaries. + tlist="${QEMU_TARGET}" + for t in arm-softmmu aarch64-softmmu; do + if [ "$t" != "${QEMU_TARGET}" ] && ls build/$t/qemu-system-* >/dev/null 2>&1; then + tlist="$tlist,$t" + fi + done + + echo "Configuring QEMU (target-list=$tlist)..." + ./configure --target-list=$tlist ${QEMU_OPTS} } diff --git a/build/meta-qemu/conf/layer.conf b/build/meta-qemu/conf/layer.conf index 476015f..242f622 100644 --- a/build/meta-qemu/conf/layer.conf +++ b/build/meta-qemu/conf/layer.conf @@ -1,3 +1,6 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + BBPATH .= ":${LAYERDIR}" BBFILES += "${LAYERDIR}/recipes-*/*/*.bb ${LAYERDIR}/recipes-*/*/*.bbappend" diff --git a/build/meta-qemu/recipes-qemu/qemu/files/0001-qemu-8.2.2-r0-patches.inc b/build/meta-qemu/recipes-qemu/qemu/files/0001-qemu-8.2.2-r0-patches.inc index 343d052..de740bf 100644 --- a/build/meta-qemu/recipes-qemu/qemu/files/0001-qemu-8.2.2-r0-patches.inc +++ b/build/meta-qemu/recipes-qemu/qemu/files/0001-qemu-8.2.2-r0-patches.inc @@ -1,4 +1,7 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + SRC_URI += "\ - file://0002-virt.h.patch \ file://0001-virt.c.patch \ + file://0002-virt.h.patch \ " diff --git a/build/meta-qemu/recipes-qemu/qemu/files/0001-qemu-8.2.2-r0/0001-virt.c.patch b/build/meta-qemu/recipes-qemu/qemu/files/0001-qemu-8.2.2-r0/0001-virt.c.patch index 12b9088..4f73c20 100644 --- a/build/meta-qemu/recipes-qemu/qemu/files/0001-qemu-8.2.2-r0/0001-virt.c.patch +++ b/build/meta-qemu/recipes-qemu/qemu/files/0001-qemu-8.2.2-r0/0001-virt.c.patch @@ -1,15 +1,17 @@ ---- /home/rossierd/edgemtech/infrabase/build/tmp/work/qemu-8.0.0-r0/qemu-8.0.0/hw/arm/virt.c 2023-04-19 18:31:47.000000000 +0200 -+++ ./hw/arm/virt.c 2023-06-06 18:46:06.848082559 +0200 -@@ -81,6 +81,8 @@ +--- a/hw/arm/virt.c ++++ b/hw/arm/virt.c +@@ -82,6 +82,10 @@ #include "hw/char/pl011.h" #include "qemu/guest-random.h" +#include "hw/input/ps2.h" ++ ++#include "ui/input.h" + #define DEFINE_VIRT_MACHINE_LATEST(major, minor, latest) \ static void virt_##major##_##minor##_class_init(ObjectClass *oc, \ void *data) \ -@@ -144,6 +146,11 @@ +@@ -145,6 +149,12 @@ [VIRT_GIC_ITS] = { 0x08080000, 0x00020000 }, /* This redistributor space allows up to 2*64kB*123 CPUs */ [VIRT_GIC_REDIST] = { 0x080A0000, 0x00F60000 }, @@ -17,23 +19,24 @@ + [VIRT_CLCD] = { 0x08800000, 0x00001000 }, + [VIRT_KMI0] = { 0x08801000, 0x00001000 }, + [VIRT_KMI1] = { 0x08802000, 0x00001000 }, ++ [VIRT_ABSMOUSE] = { 0x08803000, 0x00001000 }, + [VIRT_UART] = { 0x09000000, 0x00001000 }, [VIRT_RTC] = { 0x09010000, 0x00001000 }, [VIRT_FW_CFG] = { 0x09020000, 0x00000018 }, -@@ -198,6 +205,11 @@ +@@ -199,6 +209,11 @@ [VIRT_SECURE_UART] = 8, [VIRT_ACPI_GED] = 9, [VIRT_MMIO] = 16, /* ...to 16 + NUM_VIRTIO_TRANSPORTS - 1 */ + -+ [VIRT_CLCD] = 35, -+ [VIRT_KMI0] = 36, -+ [VIRT_KMI1] = 37, ++ [VIRT_CLCD] = 10, ++ [VIRT_KMI0] = 11, ++ [VIRT_KMI1] = 12, + [VIRT_GIC_V2M] = 48, /* ...to 48 + NUM_GICV2M_SPIS - 1 */ [VIRT_SMMU] = 74, /* ...to 74 + NUM_SMMU_IRQS - 1 */ [VIRT_PLATFORM_BUS] = 112, /* ...to 112 + PLATFORM_BUS_NUM_IRQS -1 */ -@@ -2018,6 +2030,14 @@ +@@ -2022,6 +2037,109 @@ } } @@ -44,11 +47,106 @@ + void *opaque; + int n; +}; ++ ++/* ++ * SO3 absolute pointer ("so3,absmouse"). ++ * ++ * A tiny read-only MMIO device fed by QEMU's *absolute* input handler. ++ * SO3's only other pointer is the relative PL050 PS/2 mouse, which forces ++ * QEMU into relative mode (pointer grab/warp) — broken under Wayland and ++ * always prone to host/guest position drift. Registering an absolute input ++ * handler makes QEMU use absolute pointer mode (no grab, no warp): the host ++ * pointer position maps 1:1 onto the guest. The guest simply polls the X/Y/ ++ * button registers (no IRQ needed; the LVGL/slv mouse read_cb polls every ++ * refresh). Coordinates are reported in QEMU's absolute range ++ * [0 .. INPUT_EVENT_ABS_MAX]; the guest scales them to its screen size. ++ */ ++#define VIRT_ABSMOUSE_REG_X 0x00 /* uint32: 0 .. INPUT_EVENT_ABS_MAX */ ++#define VIRT_ABSMOUSE_REG_Y 0x04 /* uint32: 0 .. INPUT_EVENT_ABS_MAX */ ++#define VIRT_ABSMOUSE_REG_BTN 0x08 /* uint32: bit0 left, bit1 right, bit2 middle */ ++#define VIRT_ABSMOUSE_REG_MAX 0x0c /* uint32: INPUT_EVENT_ABS_MAX (scale reference) */ ++ ++typedef struct { ++ uint32_t x; ++ uint32_t y; ++ uint32_t buttons; ++} VirtAbsMouseState; ++ ++static VirtAbsMouseState virt_absmouse; ++ ++static void virt_absmouse_event(DeviceState *dev, QemuConsole *src, ++ InputEvent *evt) ++{ ++ InputMoveEvent *move; ++ InputBtnEvent *btn; ++ uint32_t bit; ++ ++ switch (evt->type) { ++ case INPUT_EVENT_KIND_ABS: ++ move = evt->u.abs.data; ++ if (move->axis == INPUT_AXIS_X) { ++ virt_absmouse.x = move->value; ++ } else if (move->axis == INPUT_AXIS_Y) { ++ virt_absmouse.y = move->value; ++ } ++ break; ++ case INPUT_EVENT_KIND_BTN: ++ btn = evt->u.btn.data; ++ bit = 0; ++ if (btn->button == INPUT_BUTTON_LEFT) { ++ bit = 1; ++ } else if (btn->button == INPUT_BUTTON_RIGHT) { ++ bit = 2; ++ } else if (btn->button == INPUT_BUTTON_MIDDLE) { ++ bit = 4; ++ } ++ if (bit) { ++ if (btn->down) { ++ virt_absmouse.buttons |= bit; ++ } else { ++ virt_absmouse.buttons &= ~bit; ++ } ++ } ++ break; ++ default: ++ break; ++ } ++} ++ ++static const QemuInputHandler virt_absmouse_handler = { ++ .name = "SO3 absolute pointer", ++ .mask = INPUT_EVENT_MASK_ABS | INPUT_EVENT_MASK_BTN, ++ .event = virt_absmouse_event, ++}; ++ ++static uint64_t virt_absmouse_read(void *opaque, hwaddr addr, unsigned size) ++{ ++ switch (addr) { ++ case VIRT_ABSMOUSE_REG_X: return virt_absmouse.x; ++ case VIRT_ABSMOUSE_REG_Y: return virt_absmouse.y; ++ case VIRT_ABSMOUSE_REG_BTN: return virt_absmouse.buttons; ++ case VIRT_ABSMOUSE_REG_MAX: return INPUT_EVENT_ABS_MAX; ++ default: return 0; ++ } ++} ++ ++static void virt_absmouse_write(void *opaque, hwaddr addr, uint64_t val, ++ unsigned size) ++{ ++ /* Read-only device. */ ++} ++ ++static const MemoryRegionOps virt_absmouse_ops = { ++ .read = virt_absmouse_read, ++ .write = virt_absmouse_write, ++ .endianness = DEVICE_NATIVE_ENDIAN, ++ .valid = { .min_access_size = 4, .max_access_size = 4 }, ++}; + static void machvirt_init(MachineState *machine) { VirtMachineState *vms = VIRT_MACHINE(machine); -@@ -2326,6 +2346,27 @@ +@@ -2326,6 +2444,51 @@ vms->fw_cfg, OBJECT(vms)); } @@ -62,7 +160,8 @@ + memory_region_init_ram(vram, NULL, "virt.vram", vram_size, NULL); + memory_region_add_subregion(sysmem, 0x30000000, vram); + -+ sysbus_create_simple("pl111", (hwaddr) vms->memmap[VIRT_CLCD].base, NULL); ++ sysbus_create_simple("pl111", (hwaddr) vms->memmap[VIRT_CLCD].base, ++ qdev_get_gpio_in(vms->gic, vms->irqmap[VIRT_CLCD])); + + sysbus_create_simple("pl050_keyboard", (hwaddr) vms->memmap[VIRT_KMI0].base, + qdev_get_gpio_in(vms->gic, vms->irqmap[VIRT_KMI0])); @@ -71,6 +170,29 @@ + sysbus_create_simple("pl050_mouse", (hwaddr) vms->memmap[VIRT_KMI1].base, + qdev_get_gpio_in(vms->gic, vms->irqmap[VIRT_KMI1])); + ++ /* SO3 absolute pointer: a polled MMIO device whose registers are ++ * driven by QEMU's absolute input handler. Registering the handler ++ * also switches QEMU to absolute pointer mode (no grab/warp), so the ++ * guest cursor maps 1:1 to the host pointer on every backend ++ * (Wayland/X11) and every monitor. See VirtAbsMouseState above. */ ++ { ++ MemoryRegion *absmouse = g_new(MemoryRegion, 1); ++ ++ memory_region_init_io(absmouse, NULL, &virt_absmouse_ops, ++ &virt_absmouse, "so3.absmouse", 0x1000); ++ memory_region_add_subregion(sysmem, ++ vms->memmap[VIRT_ABSMOUSE].base, absmouse); ++ ++ /* Activate (move to head of the handler list) so this handler ++ * claims pointer BUTTON events too: the relative pl050_mouse ++ * registered earlier also masks BTN, and qemu_input_find_handler() ++ * returns the first matching handler. ABS events already reach us ++ * (only we mask ABS); activating ensures clicks do as well. KEY ++ * events still fall through to the pl050 keyboard. */ ++ qemu_input_handler_activate( ++ qemu_input_handler_register(NULL, &virt_absmouse_handler)); ++ } ++ + } + vms->bootinfo.ram_size = machine->ram_size; diff --git a/build/meta-qemu/recipes-qemu/qemu/files/0001-qemu-8.2.2-r0/0002-virt.h.patch b/build/meta-qemu/recipes-qemu/qemu/files/0001-qemu-8.2.2-r0/0002-virt.h.patch index b103b08..dcac85b 100644 --- a/build/meta-qemu/recipes-qemu/qemu/files/0001-qemu-8.2.2-r0/0002-virt.h.patch +++ b/build/meta-qemu/recipes-qemu/qemu/files/0001-qemu-8.2.2-r0/0002-virt.h.patch @@ -1,6 +1,6 @@ ---- /home/rossierd/edgemtech/infrabase/build/tmp/work/qemu-8.0.0-r0/qemu-8.0.0/include/hw/arm/virt.h 2023-04-19 18:31:47.000000000 +0200 -+++ ./include/hw/arm/virt.h 2023-06-06 18:46:06.923080803 +0200 -@@ -68,6 +68,11 @@ +--- a/include/hw/arm/virt.h ++++ b/include/hw/arm/virt.h +@@ -58,6 +58,12 @@ VIRT_GIC_VCPU, VIRT_GIC_ITS, VIRT_GIC_REDIST, @@ -8,6 +8,7 @@ + VIRT_CLCD, + VIRT_KMI0, + VIRT_KMI1, ++ VIRT_ABSMOUSE, + VIRT_SMMU, VIRT_UART, diff --git a/build/meta-qemu/recipes-qemu/qemu/qemu_8.2.2.bb b/build/meta-qemu/recipes-qemu/qemu/qemu_8.2.2.bb index d8c0871..3aaaa8f 100644 --- a/build/meta-qemu/recipes-qemu/qemu/qemu_8.2.2.bb +++ b/build/meta-qemu/recipes-qemu/qemu/qemu_8.2.2.bb @@ -1,3 +1,5 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD SUMMARY = "QEMU EMulator" DESCRIPTION = "QEMU emulation environment core receipt" @@ -22,8 +24,27 @@ require files/0001-${PF}-patches.inc # Where the working directory will be placed in infrabase root dir IB_TARGET = "${IB_DIR}/qemu" -QEMU_CONFIGURE:virt32 = "--target-list=arm-softmmu --disable-attr --disable-werror --disable-docs" -QEMU_CONFIGURE:virt64 = "--target-list=aarch64-softmmu --disable-attr --disable-werror --disable-docs --enable-sdl" +# Keep generated/fetched trees out of the updiff patchset so only hand-edited +# sources (hw/arm/virt.c, include/hw/arm/virt.h, ...) are diffed against the +# pristine snapshot: +# build/ — QEMU's out-of-tree meson/ninja dir (1000+ generated files) +# subprojects/ — meson subprojects (dtc, libslirp, ...) cloned during +# do_configure, i.e. AFTER the pristine snapshot is taken, so +# they'd otherwise show up as hundreds of "added" files. +# GNUmakefile — meson-generated top-level ninja wrapper (qemu ships a +# Makefile + meson.build; this file is created at configure). +# All three are produced AFTER do_unpack snapshots the pristine tree, so they +# read as "added" in the diff; none are ever hand-edited. + +IB_UPDIFF_EXCLUDE = "build subprojects GNUmakefile" + +# Softmmu target per platform (resolved via IB_PLATFORM/OVERRIDES). The +# bbclass builds this target and keeps any other arch already built, so +# building one platform's qemu doesn't wipe the other's. + +QEMU_TARGET:virt32 = "arm-softmmu" +QEMU_TARGET:virt64 = "aarch64-softmmu" +QEMU_OPTS = "--enable-slirp --disable-attr --disable-werror --disable-docs --enable-sdl" do_clean[nostamp] = "1" do_clean () { diff --git a/build/meta-rootfs/classes/rootfs.bbclass b/build/meta-rootfs/classes/rootfs.bbclass index ace04f1..c46e412 100644 --- a/build/meta-rootfs/classes/rootfs.bbclass +++ b/build/meta-rootfs/classes/rootfs.bbclass @@ -1,11 +1,19 @@ -# Class for building rootfs in infrabase +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + +# Class for building rootfs in infrabase. +# +# bitbake runs unprivileged. cpio extraction (-id) and repack (-o) +# need root to preserve device nodes / setuid bits / ownership, so +# both go through utils_sudo (`sudo -n`). The caller (deploy.sh, +# build.sh, mount.sh) is expected to have opened a sudo session. IB_ROOTFS_PATH:linux = "${IB_DIR}/linux/rootfs" IB_ROOTFS_PATH:so3 = "${IB_DIR}/so3/rootfs" inherit filesystem -def __do_rootfs_mount(d): +def __do_rootfs_mount(d): import os @@ -13,28 +21,34 @@ def __do_rootfs_mount(d): IB_ROOTFS_PATH = d.getVar('IB_ROOTFS_PATH') WORKDIR = d.getVar('WORKDIR') IB_PLATFORM = d.getVar('IB_PLATFORM') - + # Read and preserve the current working directory original_cwd = os.getcwd() if ROOTFS_FILENAME != "": - # Remove a previous mount - os.system("sudo rm -rf {}/fs".format(WORKDIR)) - - os.makedirs("{}/fs".format(WORKDIR), exist_ok=True) - - os.chdir("{}/fs".format(WORKDIR)) - - if not os.path.isfile("{}/board/{}/{}.cpio".format(IB_ROOTFS_PATH, IB_PLATFORM, ROOTFS_FILENAME)): - bb.fatal("{} is missing ...".format("{}/board/{}/{}.cpio".format(IB_ROOTFS_PATH, IB_PLATFORM, ROOTFS_FILENAME))) - - os.system("sudo cpio -id < {}/board/{}/{}.cpio".format(IB_ROOTFS_PATH, IB_PLATFORM, ROOTFS_FILENAME)) - + # Remove a previous mount (cpio -id may have produced root-owned + # files / device nodes, hence sudo). + utils_sudo(["rm", "-rf", f"{WORKDIR}/fs"]) + + os.makedirs(f"{WORKDIR}/fs", exist_ok=True) + + os.chdir(f"{WORKDIR}/fs") + + cpio_path = f"{IB_ROOTFS_PATH}/board/{IB_PLATFORM}/{ROOTFS_FILENAME}.cpio" + if not os.path.isfile(cpio_path): + bb.fatal(f"{cpio_path} is missing ...") + + # `cpio -id` may create device nodes / setuid bits — needs root. + # stdin redirection is done in Python so the cpio archive is read + # from a user-owned fd (Python opens it before forking sudo). + with open(cpio_path, "rb") as f: + utils_sudo(["cpio", "-id"], stdin=f, check=True) + if os.path.lexists(IB_ROOTFS_PATH + "/fs"): os.remove(IB_ROOTFS_PATH + "/fs") - os.symlink("{}/fs".format(WORKDIR), IB_ROOTFS_PATH + "/fs") - + os.symlink(f"{WORKDIR}/fs", IB_ROOTFS_PATH + "/fs") + # Change back to the original working directory os.chdir(original_cwd) else: @@ -52,55 +66,93 @@ def __do_rootfs_umount(d): WORKDIR = d.getVar('WORKDIR') IB_PLATFORM = d.getVar('IB_PLATFORM') - # Read and preserve the current working directory + # Read and preserve the current working directory original_cwd = os.getcwd() - - if ROOTFS_FILENAME != "": - ROOTFS_FILENAME = "{}/board/{}/{}.cpio".format(IB_ROOTFS_PATH, IB_PLATFORM, ROOTFS_FILENAME) - os.system("cp -L {} {}.backup".format(ROOTFS_FILENAME, ROOTFS_FILENAME)) - - os.chdir("{}/fs".format(WORKDIR)) - os.system("sudo truncate -s 0 {}".format(ROOTFS_FILENAME)) + if ROOTFS_FILENAME != "": + ROOTFS_FILENAME = f"{IB_ROOTFS_PATH}/board/{IB_PLATFORM}/{ROOTFS_FILENAME}.cpio" + os.system(f"cp -L {ROOTFS_FILENAME} {ROOTFS_FILENAME}.backup") + + os.chdir(f"{WORKDIR}/fs") + + TMP_CPIO = ROOTFS_FILENAME + ".tmp" + + # find/cpio must run as root to traverse / read root-owned files + # created by the earlier `cpio -id`. We pass the output fd from + # Python so the resulting archive is user-owned regardless of who + # ran the pipeline. + with open(TMP_CPIO, "wb") as f_out: + utils_sudo("find . | LC_ALL=C sort | cpio -o --format='newc' --reproducible", + shell=True, stdout=f_out, check=True) + + # Zero mtime fields in newc cpio headers to make the archive content-deterministic. + # --reproducible only zeroes inodes/devices; timestamps still vary across mounts. + import hashlib + + def _zero_cpio_mtimes(src, dst): + with open(src, 'rb') as fin: + data = fin.read() + out = bytearray() + i = 0 + while i < len(data): + if i + 110 > len(data): + out += data[i:] + break + magic = data[i:i+6] + if magic not in (b'070701', b'070702'): + out += data[i:] + break + hdr = bytearray(data[i:i+110]) + hdr[46:54] = b'00000000' # zero mtime + out += hdr + namesize = int(data[i+94:i+102], 16) + filesize = int(data[i+54:i+62], 16) + name_pad = (4 - ((110 + namesize) % 4)) % 4 + name_end = i + 110 + namesize + name_pad + out += data[i+110:name_end] + if data[i+110:i+110+namesize].rstrip(b'\x00') == b'TRAILER!!!': + out += data[name_end:] + break + file_pad = (4 - (filesize % 4)) % 4 if filesize % 4 else 0 + data_end = name_end + filesize + file_pad + out += data[name_end:data_end] + i = data_end + with open(dst, 'wb') as fout: + fout.write(out) + + def _sha256(path): + h = hashlib.sha256() + try: + with open(path, 'rb') as f: + for chunk in iter(lambda: f.read(65536), b''): + h.update(chunk) + return h.hexdigest() + except Exception: + return None + + STABLE_CPIO = ROOTFS_FILENAME + ".stable" + _zero_cpio_mtimes(TMP_CPIO, STABLE_CPIO) + # TMP_CPIO and STABLE_CPIO are user-owned (Python opened them); + # plain os.remove / os.replace suffice — no sudo. + os.remove(TMP_CPIO) + + if _sha256(STABLE_CPIO) != _sha256(ROOTFS_FILENAME): + os.replace(STABLE_CPIO, ROOTFS_FILENAME) + else: + os.remove(STABLE_CPIO) + + # The unpacked tree under WORKDIR/fs is root-owned (cpio -id). + utils_sudo(["rm", "-rf", f"{WORKDIR}/fs"]) - os.system("sudo find . | sudo cpio -o --format='newc' >> {}".format(ROOTFS_FILENAME)) - os.system("sudo rm -rf {}/fs".format(WORKDIR)) - # Change back to the original working directory os.chdir(original_cwd) else: os.chdir(IB_ROOTFS_PATH) os.system("./umount.sh") - + # Change back to the original working directory os.chdir(original_cwd) -# This function extracts the torizon-rootfs contents from the tar archive -# and writes to the second partition of the disk image -# This function is specific to TorizonOS - -def __torizon_rootfs_archive_path(d): - import os - - IB_ROOTFS_PATH = d.getVar('IB_ROOTFS_PATH') - IB_TORIZON_MACHINE_ID = d.getVar('IB_TORIZON_MACHINE_ID') - IB_TORIZON_MAIN_RECIPE = d.getVar('IB_TORIZON_MAIN_RECIPE') - - # First, check if TorizonOS was built - if not os.path.exists(IB_ROOTFS_PATH): - __do_fs_umount(d) - bb.fatal((f"The image for {IB_TORIZON_MACHINE_ID} was not built, " - f"try running: 'build.sh -t' first rootfs should be at {IB_ROOTFS_PATH}")) - - - p = f"{IB_ROOTFS_PATH}/{IB_TORIZON_MAIN_RECIPE}-{IB_TORIZON_MACHINE_ID}.ota.tar.zst" - - if not os.path.exists(p): - bb.fatal(f"The rootfs archive: {p} is not present") - - return p - - do_rootfs_mount[nostamp] = "1" python do_rootfs_mount () { @@ -122,15 +174,15 @@ do_ramfs_mount[nostamp] = "1" python do_ramfs_mount () { d.setVar('ROOTFS_FILENAME', 'initrd') __do_rootfs_mount(d) -} +} addtask do_ramfs_mount do_ramfs_umount[nostamp] = "1" -python do_ramfs_mount () { +python do_ramfs_umount () { d.setVar('ROOTFS_FILENAME', 'initrd') __do_rootfs_umount(d) -} +} addtask do_ramfs_umount # Deployment tasks diff --git a/build/meta-rootfs/conf/layer.conf b/build/meta-rootfs/conf/layer.conf index e93d8cd..3847e47 100644 --- a/build/meta-rootfs/conf/layer.conf +++ b/build/meta-rootfs/conf/layer.conf @@ -1,3 +1,6 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + BBPATH .= ":${LAYERDIR}" BBFILES += "${LAYERDIR}/recipes-*/*/*.bb ${LAYERDIR}/recipes-*/*/*.bbappend" diff --git a/build/meta-rootfs/recipes-rootfs/buildroot/buildroot_2024.11.bb b/build/meta-rootfs/recipes-rootfs/buildroot/buildroot_2024.11.bb index fb14cff..1595176 100644 --- a/build/meta-rootfs/recipes-rootfs/buildroot/buildroot_2024.11.bb +++ b/build/meta-rootfs/recipes-rootfs/buildroot/buildroot_2024.11.bb @@ -1,3 +1,5 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD SUMMARY = "Buildroot rottfs" DESCRIPTION = "Buildroot is used as rootfs generator" @@ -15,37 +17,48 @@ inherit rootfs SRC_URI = "https://buildroot.org/downloads/buildroot-2024.11.tar.gz;protocol=https" SRC_URI[sha256sum] = "4a601600b846058c2710cfda7d152d5d820b433ff4a4bce65c7eeb49f87e5540" -# defconfig patches +# defconfig patches and auto-getty patches FILESPATH:prepend: := "${THISDIR}/files/0001-${PF}:" -# auto-getty package -FILESPATH:prepend: := "${THISDIR}/files/0002-${PF}:" - -# JSONCPP and LIBHTTPSERVER -FILESPATH:prepend: := "${THISDIR}/files/0003-${PF}:" - require files/0001-${PF}-patches.inc -require files/0002-${PF}-patches.inc -require files/0003-${PF}-patches.inc - + # Where the working directory will be placed in infrabase root dir IB_TARGET = "${IB_ROOTFS_PATH}/buildroot" +# BR2_DL_DIR: buildroot download cache. Defaults to ${HOME}/.buildroot-dl +# — same persistence pattern as BR2_CCACHE_DIR in the defconfigs. Survives +# workspace cleanups in local builds AND in CI (gitlab-runner $HOME is +# stable), saves ~hundreds of MB of tarball re-downloads. Override via +# env or local.conf if a different location is needed (e.g. multi-user +# host where each user wants their own cache). +IB_BUILDROOT_DL_DIR ?= "${HOME}/.buildroot-dl" + do_configure () { cd ${IB_TARGET} - + if [ ! -f ${IB_TARGET}/configs/${IB_PLATFORM}_defconfig ]; then bbfatal "${IB_PLATFORM}_defconfig is missing in buildroot/configs ..." fi - - make O=${IB_ROOTFS_PATH} ${IB_PLATFORM}_defconfig + + mkdir -p "${IB_BUILDROOT_DL_DIR}" + make O=${IB_ROOTFS_PATH} BR2_DL_DIR="${IB_BUILDROOT_DL_DIR}" ${IB_PLATFORM}_defconfig } +do_build[nostamp] = "1" + +# post_image.sh writes rootfs.cpio into ${IB_ROOTFS_PATH}/board/${IB_PLATFORM}, +# which is the board working copy + symlink set up by rootfs-linux:do_attach_ +# infrabase under tmp/work. Make sure that copy exists before we build, +# otherwise post_image.sh has nowhere to deposit rootfs.cpio on a fresh tree. +# (buildroot here is the linux rootfs generator only — OVERRIDES += ":linux".) + +do_build[depends] += "rootfs-linux:do_attach_infrabase" + do_build () { bbnote "Building buildroot based rootfs..." - + cd ${IB_TARGET} - make O=${IB_ROOTFS_PATH} BR2_EXTERNAL_DIRS=.. --no-print-directory + make O=${IB_ROOTFS_PATH} BR2_EXTERNAL_DIRS=.. BR2_DL_DIR="${IB_BUILDROOT_DL_DIR}" --no-print-directory } do_clean[nostamp] = "1" diff --git a/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0-patches.inc b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0-patches.inc index 4a90b67..280ed2f 100644 --- a/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0-patches.inc +++ b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0-patches.inc @@ -1,3 +1,24 @@ SRC_URI += "\ - file://0004-virt64_defconfig.patch \ + file://0001-rpi4_64_defconfig.patch \ + file://0003-virt64_defconfig.patch \ + file://0004-auto-getty.mk.patch \ + file://0005-Config.in.patch \ + file://0006-auto-getty.patch \ + file://0007-autogetty.patch \ + file://0008-auto-root-login.patch \ + file://0009-S91auto-getty.patch \ + file://0010-Config.in.patch \ + file://0011-.br2-external.in.init.patch \ + file://0012-.br2-external.in.jpeg.patch \ + file://0013-.br2-external.in.linux.patch \ + file://0014-.br2-external.in.menus.patch \ + file://0015-.br2-external.in.openssl.patch \ + file://0016-.br2-external.in.paths.patch \ + file://0017-.br2-external.in.skeleton.patch \ + file://0018-.br2-external.in.toolchains.patch \ + file://0019-.br2-external.mk.patch \ + file://0020-.depend.patch \ + file://0021-Config.in.patch \ + file://0022-sfdisk.001.include_sys_syscalls_h.patch.patch \ + file://0023-sfdisk.mk.patch \ " \ No newline at end of file diff --git a/build/meta-rootfs/recipes-rootfs/buildroot/files/0002-buildroot-2024.11-r0/0019-rpi4_64_defconfig.patch b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0001-rpi4_64_defconfig.patch similarity index 99% rename from build/meta-rootfs/recipes-rootfs/buildroot/files/0002-buildroot-2024.11-r0/0019-rpi4_64_defconfig.patch rename to build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0001-rpi4_64_defconfig.patch index 58374cc..3879916 100644 --- a/build/meta-rootfs/recipes-rootfs/buildroot/files/0002-buildroot-2024.11-r0/0019-rpi4_64_defconfig.patch +++ b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0001-rpi4_64_defconfig.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/infrabase/build/tmp/work/buildroot-2024.11-r0/buildroot-2024.11/configs/rpi4_64_defconfig 1970-01-01 01:00:00.000000000 +0100 -+++ ./configs/rpi4_64_defconfig 2025-09-08 14:12:53.809741670 +0200 +--- a/configs/rpi4_64_defconfig ++++ b/configs/rpi4_64_defconfig @@ -0,0 +1,4202 @@ +# +# Automatically generated file; DO NOT EDIT. @@ -1836,7 +1836,7 @@ +BR2_PACKAGE_JSON_C=y +# BR2_PACKAGE_JSON_FOR_MODERN_CPP is not set +# BR2_PACKAGE_JSON_GLIB is not set -+# BR2_PACKAGE_JSONCPP is not set ++BR2_PACKAGE_JSONCPP=y +# BR2_PACKAGE_LIBBSON is not set +# BR2_PACKAGE_LIBFASTJSON is not set +# BR2_PACKAGE_LIBJSON is not set @@ -1987,7 +1987,7 @@ +# BR2_PACKAGE_LIBGSASL is not set +# BR2_PACKAGE_LIBHTP is not set +# BR2_PACKAGE_LIBHTTPPARSER is not set -+# BR2_PACKAGE_LIBHTTPSERVER is not set ++BR2_PACKAGE_LIBHTTPSERVER=y +# BR2_PACKAGE_LIBIDN is not set +# BR2_PACKAGE_LIBIDN2 is not set +# BR2_PACKAGE_LIBISCSI is not set diff --git a/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0004-virt64_defconfig.patch b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0003-virt64_defconfig.patch similarity index 95% rename from build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0004-virt64_defconfig.patch rename to build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0003-virt64_defconfig.patch index 7c864f6..fb8072d 100644 --- a/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0004-virt64_defconfig.patch +++ b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0003-virt64_defconfig.patch @@ -1,9 +1,9 @@ ---- /home/rossierd/edgemtech/tmp/infrabase/build/tmp/work/buildroot-2024.11-r0/buildroot-2024.11/configs/virt64_defconfig 1970-01-01 01:00:00.000000000 +0100 -+++ ./configs/virt64_defconfig 2024-12-20 11:41:27.053017285 +0100 +--- a/configs/virt64_defconfig ++++ b/configs/virt64_defconfig @@ -0,0 +1,4202 @@ +# +# Automatically generated file; DO NOT EDIT. -+# Buildroot -ge5ce03f6b-dirty Configuration ++# Buildroot -gedd1d5e1 Configuration +# +BR2_HAVE_DOT_CONFIG=y +BR2_HOST_GCC_AT_LEAST_4_9=y @@ -14,7 +14,6 @@ +BR2_HOST_GCC_AT_LEAST_9=y +BR2_HOST_GCC_AT_LEAST_10=y +BR2_HOST_GCC_AT_LEAST_11=y -+BR2_NEEDS_HOST_UTF8_LOCALE=y + +# +# Target options @@ -346,8 +345,8 @@ +# +BR2_ROOTFS_SKELETON_DEFAULT=y +# BR2_ROOTFS_SKELETON_CUSTOM is not set -+BR2_TARGET_GENERIC_HOSTNAME="infrabase" -+BR2_TARGET_GENERIC_ISSUE="EDGEMTech Infrabase" ++BR2_TARGET_GENERIC_HOSTNAME="edge-m1" ++BR2_TARGET_GENERIC_ISSUE="EDGEMTech Factory Capsule" +BR2_TARGET_GENERIC_PASSWD_SHA256=y +# BR2_TARGET_GENERIC_PASSWD_SHA512 is not set +BR2_TARGET_GENERIC_PASSWD_METHOD="sha-256" @@ -356,9 +355,9 @@ +# General purpose +# +# BR2_INIT_BUSYBOX is not set -+# BR2_INIT_SYSV is not set ++BR2_INIT_SYSV=y +# BR2_INIT_OPENRC is not set -+BR2_INIT_SYSTEMD=y ++# BR2_INIT_SYSTEMD is not set + +# +# Special purpose (read help) @@ -366,12 +365,10 @@ +# BR2_INIT_TINI is not set +# BR2_INIT_TINYINIT is not set +# BR2_INIT_NONE is not set -+BR2_INIT_SYSTEMD_POPULATE_TMPFILES=y -+BR2_PACKAGE_SYSTEMD_DEFAULT_TARGET="multi-user.target" -+ -+# -+# /dev management using udev (from systemd) -+# ++# BR2_ROOTFS_DEVICE_CREATION_STATIC is not set ++BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_DEVTMPFS=y ++# BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_MDEV is not set ++# BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_EUDEV is not set +BR2_ROOTFS_DEVICE_TABLE="system/device_table.txt" +# BR2_ROOTFS_DEVICE_TABLE_SUPPORTS_EXTENDED_ATTRIBUTES is not set +BR2_ROOTFS_MERGED_USR=y @@ -421,9 +418,9 @@ +BR2_PACKAGE_BUSYBOX_WATCHDOG_PERIOD="5" +BR2_PACKAGE_SKELETON=y +BR2_PACKAGE_HAS_SKELETON=y -+BR2_PACKAGE_PROVIDES_SKELETON="skeleton-init-systemd" ++BR2_PACKAGE_PROVIDES_SKELETON="skeleton-init-sysv" +BR2_PACKAGE_SKELETON_INIT_COMMON=y -+BR2_PACKAGE_SKELETON_INIT_SYSTEMD=y ++BR2_PACKAGE_SKELETON_INIT_SYSV=y + +# +# Audio and video applications @@ -506,7 +503,10 @@ +# +# BR2_PACKAGE_GST1_RTSP_SERVER is not set +# BR2_PACKAGE_GST1_SHARK is not set -+# BR2_PACKAGE_GST1_VAAPI is not set ++ ++# ++# gst1-vaapi needs udev /dev management and a toolchain w/ threads, dynamic library, C++ ++# + +# +# gst-omx requires a OpenMAX implementation @@ -520,14 +520,22 @@ +# +# kodi needs python3 w/ .py modules, a uClibc or glibc toolchain w/ C++, threads, wchar, dynamic library, gcc >= 9.x, host gcc >= 9.x +# -+BR2_PACKAGE_KODI_PLATFORM_SUPPORTS=y -+BR2_PACKAGE_KODI_PLATFORM_SUPPORTS_GBM=y -+BR2_PACKAGE_KODI_PLATFORM_SUPPORTS_WAYLAND=y ++ ++# ++# kodi needs udev support for gbm ++# ++ ++# ++# kodi needs an OpenGL EGL backend with OpenGL or GLES support ++# +# BR2_PACKAGE_LAME is not set +# BR2_PACKAGE_MADPLAY is not set +# BR2_PACKAGE_MIMIC is not set +# BR2_PACKAGE_MINIMODEM is not set -+# BR2_PACKAGE_MIRACLECAST is not set ++ ++# ++# miraclecast needs systemd and a glibc toolchain w/ threads and wchar ++# +# BR2_PACKAGE_MJPEGTOOLS is not set +# BR2_PACKAGE_MODPLUGTOOLS is not set +# BR2_PACKAGE_MOTION is not set @@ -681,7 +689,10 @@ +# +# sysprof needs a toolchain w/ dynamic library, wchar, threads, C++, gcc >= 7, headers >= 5.12 +# -+# BR2_PACKAGE_TBTOOLS is not set ++ ++# ++# tbtools needs udev /dev management w/ glibc toolchain ++# +# BR2_PACKAGE_TCF_AGENT is not set +BR2_PACKAGE_TCF_AGENT_ARCH="a64" +BR2_PACKAGE_TCF_AGENT_ARCH_SUPPORTS=y @@ -864,7 +875,10 @@ +# +# Graphic applications +# -+BR2_PACKAGE_CAGE=y ++ ++# ++# cage needs udev, EGL and OpenGL ES support ++# + +# +# cog needs wpewebkit and a toolchain w/ threads @@ -874,17 +888,23 @@ +# +# flutter packages need flutter-engine +# -+# BR2_PACKAGE_FLUTTER_PI is not set ++ ++# ++# flutter-pi needs GBM, systemd, and udev ++# +# BR2_PACKAGE_FOOT is not set +# BR2_PACKAGE_FSWEBCAM is not set +# BR2_PACKAGE_GHOSTSCRIPT is not set -+BR2_PACKAGE_GLMARK2_FLAVOR_ANY=y -+BR2_PACKAGE_GLMARK2_FLAVOR_DRM_GLESV2=y -+BR2_PACKAGE_GLMARK2_FLAVOR_WAYLAND_GLESV2=y -+# BR2_PACKAGE_GLMARK2 is not set ++ ++# ++# glmark2 needs an OpenGL or an openGL ES and EGL backend ++# +# BR2_PACKAGE_GLSLSANDBOX_PLAYER is not set +# BR2_PACKAGE_GNUPLOT is not set -+BR2_PACKAGE_IGT_GPU_TOOLS=y ++ ++# ++# igt-gpu-tools needs udev /dev management and toolchain w/ threads, wchar, dynamic library, locale, headers >= 4.11 ++# +# BR2_PACKAGE_IVI_HOMESCREEN is not set +# BR2_PACKAGE_JHEAD is not set +BR2_PACKAGE_KMSCUBE=y @@ -900,7 +920,10 @@ +# +# stellarium needs Qt5 and an OpenGL provider +# -+# BR2_PACKAGE_SWAY is not set ++ ++# ++# sway needs systemd, udev, EGL and OpenGL ES support ++# +# BR2_PACKAGE_SWAYBG is not set +# BR2_PACKAGE_TESSERACT_OCR is not set +# BR2_PACKAGE_TINIFIER is not set @@ -996,38 +1019,10 @@ +# +# tekui needs a Lua interpreter and a toolchain w/ threads, dynamic library +# -+BR2_PACKAGE_WESTON=y -+BR2_PACKAGE_WESTON_DEFAULT_DRM=y -+# BR2_PACKAGE_WESTON_DEFAULT_HEADLESS is not set -+# BR2_PACKAGE_WESTON_DEFAULT_WAYLAND is not set -+ -+# -+# X11 (nested) backend needs X.org -+# -+BR2_PACKAGE_WESTON_DEFAULT_COMPOSITOR="drm" -+BR2_PACKAGE_WESTON_DRM=y -+ -+# -+# RDP compositor needs a toolchain w/ wchar, C++, X.org -+# -+BR2_PACKAGE_WESTON_HEADLESS=y -+# BR2_PACKAGE_WESTON_WAYLAND is not set -+ -+# -+# X11 (nested) compositor needs X.org enabled -+# + +# -+# XWayland support needs libepoxy and X.org enabled ++# weston needs udev and a toolchain w/ locale, threads, dynamic library, headers >= 3.0 +# -+BR2_PACKAGE_WESTON_HAS_SHELL=y -+BR2_PACKAGE_WESTON_SHELL_DESKTOP=y -+BR2_PACKAGE_WESTON_SHELL_FULLSCREEN=y -+BR2_PACKAGE_WESTON_SHELL_IVI=y -+BR2_PACKAGE_WESTON_SHELL_KIOSK=y -+BR2_PACKAGE_WESTON_SCREENSHARE=y -+BR2_PACKAGE_WESTON_SIMPLE_CLIENTS=y -+BR2_PACKAGE_WESTON_DEMO_CLIENTS=y +# BR2_PACKAGE_XORG7 is not set +# BR2_PACKAGE_APITRACE is not set +# BR2_PACKAGE_MUPDF is not set @@ -1063,9 +1058,15 @@ +# BR2_PACKAGE_ALTERA_STAPL is not set +# BR2_PACKAGE_APCUPSD is not set +# BR2_PACKAGE_AVRDUDE is not set -+BR2_PACKAGE_BCACHE_TOOLS=y ++ ++# ++# bcache-tools needs udev /dev management ++# +# BR2_PACKAGE_BFSCRIPTS is not set -+# BR2_PACKAGE_BRICKD is not set ++ ++# ++# brickd needs udev /dev management, a toolchain w/ threads, wchar ++# +# BR2_PACKAGE_BRLTTY is not set +# BR2_PACKAGE_CC_TOOL is not set +# BR2_PACKAGE_CDRKIT is not set @@ -1081,7 +1082,10 @@ +# dahdi-tools needs a toolchain w/ threads and a Linux kernel to be built +# +BR2_PACKAGE_DBUS=y -+# BR2_PACKAGE_DBUS_BROKER is not set ++ ++# ++# dbusbroker needs systemd and a toolchain w/ threads ++# +# BR2_PACKAGE_DBUS_CPP is not set +# BR2_PACKAGE_DBUS_CXX is not set +# BR2_PACKAGE_DBUS_GLIB is not set @@ -1090,7 +1094,10 @@ +# BR2_PACKAGE_DFU_UTIL is not set +# BR2_PACKAGE_DMIDECODE is not set +# BR2_PACKAGE_DMRAID is not set -+# BR2_PACKAGE_DT_UTILS is not set ++ ++# ++# dt-utils needs udev /dev management ++# + +# +# dtbocfg needs a Linux kernel to be built @@ -1103,8 +1110,10 @@ +# +# esp-hosted needs a Linux kernel to be built +# -+# BR2_PACKAGE_ESPFLASH is not set -+BR2_PACKAGE_PROVIDES_UDEV="systemd" ++ ++# ++# espflash needs udev /dev management ++# + +# +# eudev needs eudev /dev management @@ -1143,7 +1152,10 @@ +# BR2_PACKAGE_IRDA_UTILS is not set +BR2_PACKAGE_KBD=y +# BR2_PACKAGE_LCDPROC is not set -+# BR2_PACKAGE_LEDMON is not set ++ ++# ++# ledmon needs udev and a toolchain w/ threads ++# +# BR2_PACKAGE_LIBIEC61850 is not set +# BR2_PACKAGE_LIBMANETTE is not set +# BR2_PACKAGE_LIBUBOOTENV is not set @@ -1273,17 +1285,28 @@ +# BR2_PACKAGE_UBOOT_BOOTCOUNT is not set +# BR2_PACKAGE_UBOOT_TOOLS is not set +# BR2_PACKAGE_UBUS is not set -+BR2_PACKAGE_HAS_UDEV=y -+# BR2_PACKAGE_UDISKS is not set ++ ++# ++# udisks needs udev /dev management ++# +# BR2_PACKAGE_UEFISETTINGS is not set +# BR2_PACKAGE_UHUBCTL is not set +# BR2_PACKAGE_UMTPRD is not set -+# BR2_PACKAGE_UPOWER is not set ++ ++# ++# upower needs udev /dev management ++# +# BR2_PACKAGE_USB_MODESWITCH is not set +# BR2_PACKAGE_USB_MODESWITCH_DATA is not set +# BR2_PACKAGE_USBGUARD is not set -+# BR2_PACKAGE_USBMOUNT is not set -+# BR2_PACKAGE_USBUTILS is not set ++ ++# ++# usbmount requires udev to be enabled ++# ++ ++# ++# usbutils needs udev /dev management and toolchain w/ threads, gcc >= 4.9 ++# +# BR2_PACKAGE_W_SCAN is not set + +# @@ -1581,10 +1604,7 @@ +BR2_PACKAGE_BAYER2RGB_NEON_ARCH_SUPPORTS=y +# BR2_PACKAGE_BAYER2RGB_NEON is not set +# BR2_PACKAGE_BULLET is not set -+BR2_PACKAGE_CAIRO=y -+BR2_PACKAGE_CAIRO_PNG=y -+# BR2_PACKAGE_CAIRO_TEE is not set -+# BR2_PACKAGE_CAIRO_ZLIB is not set ++# BR2_PACKAGE_CAIRO is not set +# BR2_PACKAGE_CAIROMM is not set +# BR2_PACKAGE_CAIROMM1_14 is not set + @@ -1626,8 +1646,7 @@ +# BR2_PACKAGE_JPEG_TURBO_TOOLS is not set +BR2_PACKAGE_HAS_JPEG=y +BR2_PACKAGE_PROVIDES_JPEG="jpeg-turbo" -+BR2_PACKAGE_KMSXX=y -+# BR2_PACKAGE_KMSXX_INSTALL_TESTS is not set ++# BR2_PACKAGE_KMSXX is not set +# BR2_PACKAGE_LCMS2 is not set +# BR2_PACKAGE_LENSFUN is not set +# BR2_PACKAGE_LEPTONICA is not set @@ -1637,15 +1656,14 @@ +# BR2_PACKAGE_LIBDMTX is not set +BR2_PACKAGE_LIBDRM=y +BR2_PACKAGE_LIBDRM_HAS_ATOMIC=y -+BR2_PACKAGE_LIBDRM_ENABLE_ATOMIC=y -+BR2_PACKAGE_LIBDRM_INTEL=y ++# BR2_PACKAGE_LIBDRM_INTEL is not set +# BR2_PACKAGE_LIBDRM_RADEON is not set +# BR2_PACKAGE_LIBDRM_AMDGPU is not set -+BR2_PACKAGE_LIBDRM_NOUVEAU=y ++# BR2_PACKAGE_LIBDRM_NOUVEAU is not set +# BR2_PACKAGE_LIBDRM_ETNAVIV is not set +# BR2_PACKAGE_LIBDRM_FREEDRENO is not set +# BR2_PACKAGE_LIBDRM_VC4 is not set -+BR2_PACKAGE_LIBDRM_INSTALL_TESTS=y ++# BR2_PACKAGE_LIBDRM_INSTALL_TESTS is not set +# BR2_PACKAGE_LIBEPOXY is not set +# BR2_PACKAGE_LIBEXIF is not set + @@ -1663,7 +1681,6 @@ +# +# libglew depends on X.org and needs an OpenGL backend +# -+BR2_PACKAGE_LIBGLFW=y + +# +# libglu needs an OpenGL backend @@ -1695,30 +1712,23 @@ +BR2_PACKAGE_LIBGBM_HAS_FEATURE_DMA_BUF=y +BR2_PACKAGE_HAS_LIBGLES=y +# BR2_PACKAGE_OPENJPEG is not set -+BR2_PACKAGE_PANGO=y ++# BR2_PACKAGE_PANGO is not set +# BR2_PACKAGE_PANGOMM is not set +# BR2_PACKAGE_PANGOMM2_46 is not set +BR2_PACKAGE_PIXMAN=y +# BR2_PACKAGE_POPPLER is not set +# BR2_PACKAGE_STB is not set +# BR2_PACKAGE_TIFF is not set -+BR2_PACKAGE_WAFFLE_SUPPORTS_WAYLAND=y -+BR2_PACKAGE_WAFFLE_SUPPORTS_GBM=y -+# BR2_PACKAGE_WAFFLE is not set -+BR2_PACKAGE_WAYLAND=y -+BR2_PACKAGE_WAYLAND_PROTOCOLS=y -+BR2_PACKAGE_WAYLAND_UTILS=y -+# BR2_PACKAGE_WAYLANDPP is not set ++# BR2_PACKAGE_WAYLAND is not set +BR2_PACKAGE_WEBKITGTK_ARCH_SUPPORTS=y + +# +# webkitgtk needs libgtk3 and a toolchain w/ C++, wchar, threads, dynamic library, gcc >= 10, host gcc >= 4.9 +# +# BR2_PACKAGE_WEBP is not set -+BR2_PACKAGE_WLROOTS=y + +# -+# XWayland support needs X.org enabled ++# wlroots needs udev, EGL and OpenGL ES support +# +# BR2_PACKAGE_WOFF2 is not set +# BR2_PACKAGE_WPEBACKEND_FDO is not set @@ -1737,13 +1747,22 @@ +BR2_PACKAGE_GNU_EFI_ARCH_SUPPORTS=y +# BR2_PACKAGE_GNU_EFI is not set +# BR2_PACKAGE_HACKRF is not set -+# BR2_PACKAGE_HIDAPI is not set ++ ++# ++# hidapi needs udev /dev management and a toolchain w/ NPTL, gcc >= 4.9 ++# +# BR2_PACKAGE_JITTERENTROPY_LIBRARY is not set +# BR2_PACKAGE_LCDAPI is not set +# BR2_PACKAGE_LET_ME_CREATE is not set +# BR2_PACKAGE_LIBAIO is not set -+# BR2_PACKAGE_LIBATASMART is not set -+# BR2_PACKAGE_LIBBLOCKDEV is not set ++ ++# ++# libatasmart requires udev to be enabled ++# ++ ++# ++# libblockdev needs udev /dev management and a toolchain w/ wchar, threads, dynamic library, locale ++# +# BR2_PACKAGE_LIBCEC is not set +BR2_PACKAGE_LIBDISPLAY_INFO=y +# BR2_PACKAGE_LIBFREEFARE is not set @@ -1755,10 +1774,16 @@ +# +# libgpiod2 needs kernel headers >= 5.10 +# -+# BR2_PACKAGE_LIBGUDEV is not set ++ ++# ++# libgudev needs udev /dev handling and a toolchain w/ wchar, threads ++# +# BR2_PACKAGE_LIBHID is not set +# BR2_PACKAGE_LIBIIO is not set -+BR2_PACKAGE_LIBINPUT=y ++ ++# ++# libinput needs udev /dev management ++# +# BR2_PACKAGE_LIBIQRF is not set +# BR2_PACKAGE_LIBLLCP is not set +# BR2_PACKAGE_LIBMBIM is not set @@ -1996,8 +2021,7 @@ +# BR2_PACKAGE_LIBMAXMINDDB is not set +# BR2_PACKAGE_LIBMBUS is not set +# BR2_PACKAGE_LIBMEMCACHED is not set -+BR2_PACKAGE_LIBMICROHTTPD=y -+# BR2_PACKAGE_LIBMICROHTTPD_SSL is not set ++# BR2_PACKAGE_LIBMICROHTTPD is not set +# BR2_PACKAGE_LIBMINIUPNPC is not set +# BR2_PACKAGE_LIBMNL is not set +# BR2_PACKAGE_LIBMODBUS is not set @@ -2063,6 +2087,7 @@ +# BR2_PACKAGE_NETOPEER2 is not set +# BR2_PACKAGE_NGHTTP2 is not set +# BR2_PACKAGE_NORM is not set ++# BR2_PACKAGE_NSS_MYHOSTNAME is not set +# BR2_PACKAGE_NSS_PAM_LDAPD is not set +# BR2_PACKAGE_OATPP is not set +# BR2_PACKAGE_OMNIORB is not set @@ -2404,9 +2429,7 @@ +# BR2_PACKAGE_BANDWIDTHD is not set +# BR2_PACKAGE_BATCTL is not set +# BR2_PACKAGE_BCUSDK is not set -+BR2_PACKAGE_BIND=y -+# BR2_PACKAGE_BIND_SERVER is not set -+# BR2_PACKAGE_BIND_TOOLS is not set ++# BR2_PACKAGE_BIND is not set +# BR2_PACKAGE_BIRD is not set +# BR2_PACKAGE_BLUEZ5_UTILS is not set +# BR2_PACKAGE_BMON is not set @@ -2493,6 +2516,7 @@ +# BR2_PACKAGE_IFPLUGD is not set +# BR2_PACKAGE_IFTOP is not set +# BR2_PACKAGE_IFUPDOWN is not set ++BR2_PACKAGE_IFUPDOWN_SCRIPTS=y +# BR2_PACKAGE_IGD2_FOR_LINUX is not set + +# @@ -2566,8 +2590,10 @@ +# BR2_PACKAGE_NETPLUG is not set +# BR2_PACKAGE_NETSNMP is not set +# BR2_PACKAGE_NETSTAT_NAT is not set -+# BR2_PACKAGE_NETWORK_MANAGER is not set -+# BR2_PACKAGE_NETWORKD_DISPATCHER is not set ++ ++# ++# NetworkManager needs udev /dev management and a glibc or musl toolchain w/ headers >= 4.6, dynamic library, wchar, threads, gcc >= 4.9 ++# +# BR2_PACKAGE_NFACCT is not set +# BR2_PACKAGE_NFTABLES is not set +# BR2_PACKAGE_NGINX is not set @@ -2798,6 +2824,7 @@ +# +# setools needs python3 +# ++BR2_PACKAGE_URANDOM_SCRIPTS=y + +# +# Shell and utilities @@ -2870,6 +2897,7 @@ +# BR2_PACKAGE_AUDIT is not set +# BR2_PACKAGE_BALENA_ENGINE is not set +# BR2_PACKAGE_BUBBLEWRAP is not set ++# BR2_PACKAGE_CGROUPFS_MOUNT is not set + +# +# circus needs Python 3 and a toolchain w/ C++, threads @@ -2909,6 +2937,7 @@ +# BR2_PACKAGE_GKRELLM is not set +# BR2_PACKAGE_HTOP is not set +# BR2_PACKAGE_IBM_SW_TPM2 is not set ++BR2_PACKAGE_INITSCRIPTS=y + +# +# iotop depends on python3 @@ -2929,7 +2958,10 @@ +# libostree needs a uClibc or glibc toolchain w/ threads, dynamic library, wchar, headers >= 5.8 +# +BR2_PACKAGE_LIBVIRT_ARCH_SUPPORTS=y -+# BR2_PACKAGE_LIBVIRT is not set ++ ++# ++# libvirt needs udev /dev management, a toolchain w/ threads, dynamic library, wchar, kernel headers >= 3.12 (4.11 for AArch64) ++# +# BR2_PACKAGE_LXC is not set +BR2_PACKAGE_MAKEDUMPFILE_ARCH_SUPPORTS=y +# BR2_PACKAGE_MAKEDUMPFILE is not set @@ -2943,7 +2975,10 @@ +# mokutil needs a toolchain w/ dynamic library, threads, gcc >= 4.9, headers >= 3.12 +# +# BR2_PACKAGE_MONIT is not set -+# BR2_PACKAGE_MULTIPATH_TOOLS is not set ++ ++# ++# multipath-tools needs udev and a toolchain w/ threads, dynamic library, C++ ++# +# BR2_PACKAGE_NCDU is not set +# BR2_PACKAGE_NERDCTL is not set + @@ -2958,7 +2993,10 @@ +# +# pamtester depends on linux-pam +# -+# BR2_PACKAGE_PETITBOOT is not set ++ ++# ++# petitboot needs a toolchain w/ wchar, dynamic library, threads, udev /dev management ++# +# BR2_PACKAGE_POLKIT is not set +BR2_PACKAGE_PROCPS_NG=y +# BR2_PACKAGE_PROCPS_NG_ORIGINAL_TOP is not set @@ -2980,8 +3018,14 @@ +# BR2_PACKAGE_S6_RC is not set +# BR2_PACKAGE_SCRUB is not set +# BR2_PACKAGE_SCRYPT is not set -+# BR2_PACKAGE_SDBUS_CPP is not set -+# BR2_PACKAGE_SDBUSPLUS is not set ++ ++# ++# sdbus-c++ needs systemd and a toolchain w/ C++, gcc >= 8 ++# ++ ++# ++# sdbusplus needs systemd and a toolchain w/ C++, gcc >= 7 ++# +BR2_PACKAGE_SEATD=y +# BR2_PACKAGE_SEATD_BUILTIN is not set +BR2_PACKAGE_SEATD_DAEMON=y @@ -2994,54 +3038,10 @@ +# +# BR2_PACKAGE_SWUPDATE is not set +# BR2_PACKAGE_SYSKLOGD is not set -+BR2_PACKAGE_SYSLOG_NG=y ++# BR2_PACKAGE_SYSLOG_NG is not set +BR2_PACKAGE_SYSTEMD_ARCH_SUPPORTS=y -+BR2_PACKAGE_SYSTEMD=y -+# BR2_PACKAGE_SYSTEMD_INITRD is not set -+# BR2_PACKAGE_SYSTEMD_KERNELINSTALL is not set -+# BR2_PACKAGE_SYSTEMD_ANALYZE is not set -+# BR2_PACKAGE_SYSTEMD_EFI is not set -+# BR2_PACKAGE_SYSTEMD_JOURNAL_REMOTE is not set -+# BR2_PACKAGE_SYSTEMD_BACKLIGHT is not set -+# BR2_PACKAGE_SYSTEMD_BINFMT is not set -+# BR2_PACKAGE_SYSTEMD_COREDUMP is not set -+BR2_PACKAGE_SYSTEMD_PSTORE=y -+# BR2_PACKAGE_SYSTEMD_FIRSTBOOT is not set -+# BR2_PACKAGE_SYSTEMD_HIBERNATE is not set -+# BR2_PACKAGE_SYSTEMD_HOMED is not set -+BR2_PACKAGE_SYSTEMD_HOSTNAMED=y -+BR2_PACKAGE_SYSTEMD_HWDB=y -+# BR2_PACKAGE_SYSTEMD_IMPORTD is not set -+# BR2_PACKAGE_SYSTEMD_CATALOGDB is not set -+# BR2_PACKAGE_SYSTEMD_LOCALED is not set -+# BR2_PACKAGE_SYSTEMD_LOGIND is not set -+# BR2_PACKAGE_SYSTEMD_MACHINED is not set -+# BR2_PACKAGE_SYSTEMD_NSRESOURCED is not set -+BR2_PACKAGE_SYSTEMD_MYHOSTNAME=y -+BR2_PACKAGE_SYSTEMD_NETWORKD=y -+# BR2_PACKAGE_SYSTEMD_OOMD is not set -+# BR2_PACKAGE_SYSTEMD_POLKIT is not set -+# BR2_PACKAGE_SYSTEMD_PORTABLED is not set -+# BR2_PACKAGE_SYSTEMD_QUOTACHECK is not set -+# BR2_PACKAGE_SYSTEMD_RANDOMSEED is not set -+# BR2_PACKAGE_SYSTEMD_REPART is not set -+BR2_PACKAGE_SYSTEMD_RESOLVED=y -+# BR2_PACKAGE_SYSTEMD_RFKILL is not set -+# BR2_PACKAGE_SYSTEMD_SMACK_SUPPORT is not set -+# BR2_PACKAGE_SYSTEMD_SYSEXT is not set -+# BR2_PACKAGE_SYSTEMD_MOUNTFSD is not set -+# BR2_PACKAGE_SYSTEMD_SYSUPDATE is not set -+# BR2_PACKAGE_SYSTEMD_SYSUSERS is not set -+BR2_PACKAGE_SYSTEMD_TIMEDATED=y -+BR2_PACKAGE_SYSTEMD_TIMESYNCD=y -+# BR2_PACKAGE_SYSTEMD_USERDB is not set -+# BR2_PACKAGE_SYSTEMD_UTMP is not set -+BR2_PACKAGE_SYSTEMD_VCONSOLE=y -+BR2_PACKAGE_SYSTEMD_VCONSOLE_DEFAULT_KEYMAP="us" -+BR2_PACKAGE_SYSTEMD_VMSPAWN_ARCH_SUPPORTS=y -+# BR2_PACKAGE_SYSTEMD_VMSPAWN is not set +BR2_PACKAGE_SYSTEMD_BOOTCHART_ARCH_SUPPORTS=y -+# BR2_PACKAGE_SYSTEMD_BOOTCHART is not set ++BR2_PACKAGE_SYSVINIT=y +# BR2_PACKAGE_TAR is not set +# BR2_PACKAGE_TEALDEER is not set +# BR2_PACKAGE_TPM_TOOLS is not set @@ -3050,7 +3050,6 @@ +# BR2_PACKAGE_TPM2_TOTP is not set +# BR2_PACKAGE_UNSCD is not set +BR2_PACKAGE_UTIL_LINUX=y -+BR2_PACKAGE_UTIL_LINUX_LIBS=y +BR2_PACKAGE_UTIL_LINUX_LIBBLKID=y +# BR2_PACKAGE_UTIL_LINUX_LIBFDISK is not set +BR2_PACKAGE_UTIL_LINUX_LIBMOUNT=y @@ -3328,7 +3327,6 @@ +# BR2_PACKAGE_HOST_SWIG is not set +# BR2_PACKAGE_HOST_SWTPM is not set +# BR2_PACKAGE_HOST_SWUGENERATOR is not set -+BR2_PACKAGE_HOST_SYSTEMD=y +# BR2_PACKAGE_HOST_TIPIDEE is not set +# BR2_PACKAGE_HOST_UBOOT_TOOLS is not set +# BR2_PACKAGE_HOST_UTIL_LINUX is not set diff --git a/build/meta-rootfs/recipes-rootfs/buildroot/files/0002-buildroot-2024.11-r0/0012-auto-getty.mk.patch b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0004-auto-getty.mk.patch similarity index 81% rename from build/meta-rootfs/recipes-rootfs/buildroot/files/0002-buildroot-2024.11-r0/0012-auto-getty.mk.patch rename to build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0004-auto-getty.mk.patch index 2d4537f..eb95536 100644 --- a/build/meta-rootfs/recipes-rootfs/buildroot/files/0002-buildroot-2024.11-r0/0012-auto-getty.mk.patch +++ b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0004-auto-getty.mk.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/edgemtech/infrabase/build/tmp/work/buildroot-2024.11-r0/buildroot-2024.11/package/auto-getty/auto-getty.mk 1970-01-01 01:00:00.000000000 +0100 -+++ ./package/auto-getty/auto-getty.mk 2024-11-13 15:28:29.606258950 +0100 +--- a/package/auto-getty/auto-getty.mk ++++ b/package/auto-getty/auto-getty.mk @@ -0,0 +1,33 @@ +################################################################################ +# diff --git a/build/meta-rootfs/recipes-rootfs/buildroot/files/0002-buildroot-2024.11-r0/0013-Config.in.patch b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0005-Config.in.patch similarity index 71% rename from build/meta-rootfs/recipes-rootfs/buildroot/files/0002-buildroot-2024.11-r0/0013-Config.in.patch rename to build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0005-Config.in.patch index 1b347ad..406ea2e 100644 --- a/build/meta-rootfs/recipes-rootfs/buildroot/files/0002-buildroot-2024.11-r0/0013-Config.in.patch +++ b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0005-Config.in.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/edgemtech/infrabase/build/tmp/work/buildroot-2024.11-r0/buildroot-2024.11/package/auto-getty/Config.in 1970-01-01 01:00:00.000000000 +0100 -+++ ./package/auto-getty/Config.in 2024-11-13 15:28:29.606258950 +0100 +--- a/package/auto-getty/Config.in ++++ b/package/auto-getty/Config.in @@ -0,0 +1,16 @@ +config BR2_PACKAGE_AUTO_GETTY_SUPPORT + bool "auto-getty: Enable auto console support" diff --git a/build/meta-rootfs/recipes-rootfs/buildroot/files/0002-buildroot-2024.11-r0/0014-auto-getty.patch b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0006-auto-getty.patch similarity index 79% rename from build/meta-rootfs/recipes-rootfs/buildroot/files/0002-buildroot-2024.11-r0/0014-auto-getty.patch rename to build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0006-auto-getty.patch index 3c3b442..30b1f06 100644 --- a/build/meta-rootfs/recipes-rootfs/buildroot/files/0002-buildroot-2024.11-r0/0014-auto-getty.patch +++ b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0006-auto-getty.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/edgemtech/infrabase/build/tmp/work/buildroot-2024.11-r0/buildroot-2024.11/package/auto-getty/src/auto-getty 1970-01-01 01:00:00.000000000 +0100 -+++ ./package/auto-getty/src/auto-getty 2024-11-13 15:28:29.606258950 +0100 +--- a/package/auto-getty/src/auto-getty ++++ b/package/auto-getty/src/auto-getty @@ -0,0 +1,36 @@ +#!/bin/sh -e + diff --git a/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0007-autogetty.patch b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0007-autogetty.patch new file mode 100644 index 0000000..696ceb1 --- /dev/null +++ b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0007-autogetty.patch @@ -0,0 +1,5 @@ +--- a/package/auto-getty/src/autogetty ++++ b/package/auto-getty/src/autogetty +@@ -0,0 +1,2 @@ ++# here you can provide what to run instead of /bin/login ++AUTOGETTY_ARGS="-n -l /usr/bin/auto-root-login" diff --git a/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0008-auto-root-login.patch b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0008-auto-root-login.patch new file mode 100644 index 0000000..6e09356 --- /dev/null +++ b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0008-auto-root-login.patch @@ -0,0 +1,6 @@ +--- a/package/auto-getty/src/auto-root-login ++++ b/package/auto-getty/src/auto-root-login +@@ -0,0 +1,3 @@ ++#!/bin/sh ++ ++exec /bin/login -f root diff --git a/build/meta-rootfs/recipes-rootfs/buildroot/files/0002-buildroot-2024.11-r0/0017-S91auto-getty.patch b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0009-S91auto-getty.patch similarity index 69% rename from build/meta-rootfs/recipes-rootfs/buildroot/files/0002-buildroot-2024.11-r0/0017-S91auto-getty.patch rename to build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0009-S91auto-getty.patch index de63d61..f6df33a 100644 --- a/build/meta-rootfs/recipes-rootfs/buildroot/files/0002-buildroot-2024.11-r0/0017-S91auto-getty.patch +++ b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0009-S91auto-getty.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/edgemtech/infrabase/build/tmp/work/buildroot-2024.11-r0/buildroot-2024.11/package/auto-getty/src/S91auto-getty 1970-01-01 01:00:00.000000000 +0100 -+++ ./package/auto-getty/src/S91auto-getty 2024-11-13 15:28:29.606258950 +0100 +--- a/package/auto-getty/src/S91auto-getty ++++ b/package/auto-getty/src/S91auto-getty @@ -0,0 +1,28 @@ +#!/bin/sh + diff --git a/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0010-Config.in.patch b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0010-Config.in.patch new file mode 100644 index 0000000..e6d000f --- /dev/null +++ b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0010-Config.in.patch @@ -0,0 +1,23 @@ +--- a/package/Config.in ++++ b/package/Config.in +@@ -620,6 +620,10 @@ + source "package/sdparm/Config.in" + source "package/sedutil/Config.in" + source "package/setserial/Config.in" ++ if !BR2_PACKAGE_BUSYBOX_HIDE_OTHERS ++ # busybox has fdisk ++ source "package/sfdisk/Config.in" ++ endif + source "package/sg3_utils/Config.in" + source "package/sigrok-cli/Config.in" + source "package/sispmctl/Config.in" +@@ -2756,6 +2760,9 @@ + source "package/apg/Config.in" + source "package/at/Config.in" + source "package/bash-completion/Config.in" ++ ++ source "package/auto-getty/Config.in" ++ + source "package/catatonit/Config.in" + source "package/ccrypt/Config.in" + source "package/crudini/Config.in" diff --git a/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0011-.br2-external.in.init.patch b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0011-.br2-external.in.init.patch new file mode 100644 index 0000000..a1082a9 --- /dev/null +++ b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0011-.br2-external.in.init.patch @@ -0,0 +1,8 @@ +--- a/output/.br2-external.in.init ++++ b/output/.br2-external.in.init +@@ -0,0 +1,5 @@ ++# ++# Automatically generated file; DO NOT EDIT. ++# ++ ++# No br2-external tree defined. diff --git a/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0012-.br2-external.in.jpeg.patch b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0012-.br2-external.in.jpeg.patch new file mode 100644 index 0000000..25f7dac --- /dev/null +++ b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0012-.br2-external.in.jpeg.patch @@ -0,0 +1,8 @@ +--- a/output/.br2-external.in.jpeg ++++ b/output/.br2-external.in.jpeg +@@ -0,0 +1,5 @@ ++# ++# Automatically generated file; DO NOT EDIT. ++# ++ ++# No br2-external tree defined. diff --git a/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0013-.br2-external.in.linux.patch b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0013-.br2-external.in.linux.patch new file mode 100644 index 0000000..5eff260 --- /dev/null +++ b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0013-.br2-external.in.linux.patch @@ -0,0 +1,8 @@ +--- a/output/.br2-external.in.linux ++++ b/output/.br2-external.in.linux +@@ -0,0 +1,5 @@ ++# ++# Automatically generated file; DO NOT EDIT. ++# ++ ++# No br2-external tree defined. diff --git a/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0014-.br2-external.in.menus.patch b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0014-.br2-external.in.menus.patch new file mode 100644 index 0000000..cc9c53a --- /dev/null +++ b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0014-.br2-external.in.menus.patch @@ -0,0 +1,8 @@ +--- a/output/.br2-external.in.menus ++++ b/output/.br2-external.in.menus +@@ -0,0 +1,5 @@ ++# ++# Automatically generated file; DO NOT EDIT. ++# ++ ++# No br2-external tree defined. diff --git a/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0015-.br2-external.in.openssl.patch b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0015-.br2-external.in.openssl.patch new file mode 100644 index 0000000..6631733 --- /dev/null +++ b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0015-.br2-external.in.openssl.patch @@ -0,0 +1,8 @@ +--- a/output/.br2-external.in.openssl ++++ b/output/.br2-external.in.openssl +@@ -0,0 +1,5 @@ ++# ++# Automatically generated file; DO NOT EDIT. ++# ++ ++# No br2-external tree defined. diff --git a/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0016-.br2-external.in.paths.patch b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0016-.br2-external.in.paths.patch new file mode 100644 index 0000000..2ab6c4d --- /dev/null +++ b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0016-.br2-external.in.paths.patch @@ -0,0 +1,8 @@ +--- a/output/.br2-external.in.paths ++++ b/output/.br2-external.in.paths +@@ -0,0 +1,5 @@ ++# ++# Automatically generated file; DO NOT EDIT. ++# ++ ++# No br2-external tree defined. diff --git a/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0017-.br2-external.in.skeleton.patch b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0017-.br2-external.in.skeleton.patch new file mode 100644 index 0000000..4d69b58 --- /dev/null +++ b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0017-.br2-external.in.skeleton.patch @@ -0,0 +1,8 @@ +--- a/output/.br2-external.in.skeleton ++++ b/output/.br2-external.in.skeleton +@@ -0,0 +1,5 @@ ++# ++# Automatically generated file; DO NOT EDIT. ++# ++ ++# No br2-external tree defined. diff --git a/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0018-.br2-external.in.toolchains.patch b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0018-.br2-external.in.toolchains.patch new file mode 100644 index 0000000..44bd384 --- /dev/null +++ b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0018-.br2-external.in.toolchains.patch @@ -0,0 +1,8 @@ +--- a/output/.br2-external.in.toolchains ++++ b/output/.br2-external.in.toolchains +@@ -0,0 +1,5 @@ ++# ++# Automatically generated file; DO NOT EDIT. ++# ++ ++# No br2-external tree defined. diff --git a/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0019-.br2-external.mk.patch b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0019-.br2-external.mk.patch new file mode 100644 index 0000000..e920ee8 --- /dev/null +++ b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0019-.br2-external.mk.patch @@ -0,0 +1,13 @@ +--- a/output/.br2-external.mk ++++ b/output/.br2-external.mk +@@ -0,0 +1,10 @@ ++# ++# Automatically generated file; DO NOT EDIT. ++# ++ ++BR2_EXTERNAL ?= ++export BR2_EXTERNAL_NAMES = ++BR2_EXTERNAL_DIRS = ++BR2_EXTERNAL_MKS = ++ ++# No br2-external tree defined. diff --git a/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0020-.depend.patch b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0020-.depend.patch new file mode 100644 index 0000000..2b9cd24 --- /dev/null +++ b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0020-.depend.patch @@ -0,0 +1,16 @@ +--- a/output/build/buildroot-config/.depend ++++ b/output/build/buildroot-config/.depend +@@ -0,0 +1,13 @@ ++conf.o: conf.c lkc.h expr.h list.h lkc_proto.h ++confdata.o: confdata.c lkc.h expr.h list.h lkc_proto.h ++expr.o: expr.c lkc.h expr.h list.h lkc_proto.h ++gconf.o: gconf.c lkc.h expr.h list.h lkc_proto.h images.c ++images.o: images.c ++kconf_id.o: kconf_id.c ++kxgettext.o: kxgettext.c lkc.h expr.h list.h lkc_proto.h ++mconf.o: mconf.c lkc.h expr.h list.h lkc_proto.h lxdialog/dialog.h ++menu.o: menu.c lkc.h expr.h list.h lkc_proto.h ++nconf.o: nconf.c lkc.h expr.h list.h lkc_proto.h nconf.h ++nconf.gui.o: nconf.gui.c nconf.h lkc.h expr.h list.h lkc_proto.h ++symbol.o: symbol.c lkc.h expr.h list.h lkc_proto.h ++util.o: util.c lkc.h expr.h list.h lkc_proto.h diff --git a/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0021-Config.in.patch b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0021-Config.in.patch new file mode 100644 index 0000000..19ebd9d --- /dev/null +++ b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0021-Config.in.patch @@ -0,0 +1,8 @@ +--- a/package/sfdisk/Config.in ++++ b/package/sfdisk/Config.in +@@ -0,0 +1,5 @@ ++config BR2_PACKAGE_SFDISK ++ bool "sfdisk" ++ default n ++ help ++ Partition table manipulator for Linux. diff --git a/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0022-sfdisk.001.include_sys_syscalls_h.patch.patch b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0022-sfdisk.001.include_sys_syscalls_h.patch.patch new file mode 100644 index 0000000..01869b9 --- /dev/null +++ b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0022-sfdisk.001.include_sys_syscalls_h.patch.patch @@ -0,0 +1,15 @@ +--- a/package/sfdisk/sfdisk.001.include_sys_syscalls_h.patch ++++ b/package/sfdisk/sfdisk.001.include_sys_syscalls_h.patch +@@ -0,0 +1,12 @@ ++--- sfdisk/sfdisk.c.oorig 2006-10-09 16:24:06.000000000 +0200 +++++ sfdisk/sfdisk.c 2006-10-09 16:24:20.000000000 +0200 ++@@ -47,6 +47,9 @@ ++ #include ++ #include ++ #ifdef __linux__ +++#define _LIBC +++#include +++#undef _LIBC ++ #include /* _syscall */ ++ #endif ++ #include "nls.h" diff --git a/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0023-sfdisk.mk.patch b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0023-sfdisk.mk.patch new file mode 100644 index 0000000..9c00bdb --- /dev/null +++ b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0023-sfdisk.mk.patch @@ -0,0 +1,52 @@ +--- a/package/sfdisk/sfdisk.mk ++++ b/package/sfdisk/sfdisk.mk +@@ -0,0 +1,49 @@ ++############################################################# ++# ++# sfdisk support ++# ++############################################################# ++SFDISK_VERSION:= ++SFDISK_SOURCE=sfdisk$(SFDISK_VERSION).tar.bz2 ++SFDISK_CAT:=$(BZCAT) ++SFDISK_SITE:=http://www.uclibc.org/ ++SFDISK_DIR=$(BUILD_DIR)/sfdisk$(SFDISK_VERSION) ++ ++$(DL_DIR)/$(SFDISK_SOURCE): ++ $(WGET) -P $(DL_DIR) $(SFDISK_SITE)/$(SFDISK_SOURCE) ++ ++$(SFDISK_DIR)/.patched: $(DL_DIR)/$(SFDISK_SOURCE) ++ $(SFDISK_CAT) $(DL_DIR)/$(SFDISK_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) - ++ toolchain/patch-kernel.sh $(SFDISK_DIR) package/sfdisk/ sfdisk.\*.patch ++ touch $@ ++ ++ ++$(SFDISK_DIR)/sfdisk: $(SFDISK_DIR)/.patched ++ $(MAKE) \ ++ CROSS=$(TARGET_CROSS) DEBUG=false OPTIMIZATION="$(TARGET_CFLAGS)" \ ++ -C $(SFDISK_DIR) ++ -$(STRIPCMD) $(SFDISK_DIR)/sfdisk ++ touch -c $(SFDISK_DIR)/sfdisk ++ ++$(TARGET_DIR)/sbin/sfdisk: $(SFDISK_DIR)/sfdisk ++ cp $(SFDISK_DIR)/sfdisk $(TARGET_DIR)/sbin/sfdisk ++ touch -c $(TARGET_DIR)/sbin/sfdisk ++ ++sfdisk: uclibc $(TARGET_DIR)/sbin/sfdisk ++ ++sfdisk-source: $(DL_DIR)/$(SFDISK_SOURCE) ++ ++sfdisk-clean: ++ rm -f $(TARGET_DIR)/sbin/sfdisk ++ -$(MAKE) -C $(SFDISK_DIR) clean ++ ++sfdisk-dirclean: ++ rm -rf $(SFDISK_DIR) ++############################################################# ++# ++# Toplevel Makefile options ++# ++############################################################# ++ifeq ($(BR2_PACKAGE_SFDISK),y) ++TARGETS+=sfdisk ++endif diff --git a/build/meta-rootfs/recipes-rootfs/buildroot/files/0002-buildroot-2024.11-r0-patches.inc b/build/meta-rootfs/recipes-rootfs/buildroot/files/0002-buildroot-2024.11-r0-patches.inc deleted file mode 100644 index 96b2533..0000000 --- a/build/meta-rootfs/recipes-rootfs/buildroot/files/0002-buildroot-2024.11-r0-patches.inc +++ /dev/null @@ -1,10 +0,0 @@ -SRC_URI += "\ - file://0015-autogetty.patch \ - file://0017-S91auto-getty.patch \ - file://0014-auto-getty.patch \ - file://0012-auto-getty.mk.patch \ - file://0016-auto-root-login.patch \ - file://0018-Config.in.patch \ - file://0013-Config.in.patch \ - file://0019-rpi4_64_defconfig.patch \ -" diff --git a/build/meta-rootfs/recipes-rootfs/buildroot/files/0002-buildroot-2024.11-r0/0015-autogetty.patch b/build/meta-rootfs/recipes-rootfs/buildroot/files/0002-buildroot-2024.11-r0/0015-autogetty.patch deleted file mode 100644 index 89da875..0000000 --- a/build/meta-rootfs/recipes-rootfs/buildroot/files/0002-buildroot-2024.11-r0/0015-autogetty.patch +++ /dev/null @@ -1,5 +0,0 @@ ---- /home/rossierd/edgemtech/infrabase/build/tmp/work/buildroot-2024.11-r0/buildroot-2024.11/package/auto-getty/src/autogetty 1970-01-01 01:00:00.000000000 +0100 -+++ ./package/auto-getty/src/autogetty 2024-11-13 15:28:29.606258950 +0100 -@@ -0,0 +1,2 @@ -+# here you can provide what to run instead of /bin/login -+AUTOGETTY_ARGS="-n -l /usr/bin/auto-root-login" diff --git a/build/meta-rootfs/recipes-rootfs/buildroot/files/0002-buildroot-2024.11-r0/0016-auto-root-login.patch b/build/meta-rootfs/recipes-rootfs/buildroot/files/0002-buildroot-2024.11-r0/0016-auto-root-login.patch deleted file mode 100644 index d29076b..0000000 --- a/build/meta-rootfs/recipes-rootfs/buildroot/files/0002-buildroot-2024.11-r0/0016-auto-root-login.patch +++ /dev/null @@ -1,6 +0,0 @@ ---- /home/rossierd/edgemtech/infrabase/build/tmp/work/buildroot-2024.11-r0/buildroot-2024.11/package/auto-getty/src/auto-root-login 1970-01-01 01:00:00.000000000 +0100 -+++ ./package/auto-getty/src/auto-root-login 2024-11-13 15:28:29.606258950 +0100 -@@ -0,0 +1,3 @@ -+#!/bin/sh -+ -+exec /bin/login -f root diff --git a/build/meta-rootfs/recipes-rootfs/buildroot/files/0002-buildroot-2024.11-r0/0018-Config.in.patch b/build/meta-rootfs/recipes-rootfs/buildroot/files/0002-buildroot-2024.11-r0/0018-Config.in.patch deleted file mode 100644 index 7c619ce..0000000 --- a/build/meta-rootfs/recipes-rootfs/buildroot/files/0002-buildroot-2024.11-r0/0018-Config.in.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- /home/rossierd/edgemtech/infrabase/build/tmp/work/buildroot-2024.11-r0/buildroot-2024.11/package/Config.in 2024-12-08 11:18:01.000000000 +0100 -+++ ./package/Config.in 2024-12-15 17:13:00.370627268 +0100 -@@ -2756,6 +2756,9 @@ - source "package/apg/Config.in" - source "package/at/Config.in" - source "package/bash-completion/Config.in" -+ -+ source "package/auto-getty/Config.in" -+ - source "package/catatonit/Config.in" - source "package/ccrypt/Config.in" - source "package/crudini/Config.in" diff --git a/build/meta-rootfs/recipes-rootfs/buildroot/files/0003-buildroot-2024.11-r0-patches.inc b/build/meta-rootfs/recipes-rootfs/buildroot/files/0003-buildroot-2024.11-r0-patches.inc deleted file mode 100644 index 015068d..0000000 --- a/build/meta-rootfs/recipes-rootfs/buildroot/files/0003-buildroot-2024.11-r0-patches.inc +++ /dev/null @@ -1,3 +0,0 @@ -SRC_URI += "\ - file://0001-rpi4_64_defconfig.patch \ -" \ No newline at end of file diff --git a/build/meta-rootfs/recipes-rootfs/buildroot/files/0003-buildroot-2024.11-r0/0001-rpi4_64_defconfig.patch b/build/meta-rootfs/recipes-rootfs/buildroot/files/0003-buildroot-2024.11-r0/0001-rpi4_64_defconfig.patch deleted file mode 100644 index d8c35d0..0000000 --- a/build/meta-rootfs/recipes-rootfs/buildroot/files/0003-buildroot-2024.11-r0/0001-rpi4_64_defconfig.patch +++ /dev/null @@ -1,43 +0,0 @@ ---- /home/rossierd/soo/micofe/27/build/tmp/work/buildroot-2024.11-r0/buildroot-2024.11/configs/rpi4_64_defconfig 2026-03-13 09:29:30.423242388 +0100 -+++ ./configs/rpi4_64_defconfig 2026-03-13 09:30:39.195383719 +0100 -@@ -1,6 +1,6 @@ - # - # Automatically generated file; DO NOT EDIT. --# Buildroot -ge5ce03f6b-dirty Configuration -+# Buildroot -g531352d-dirty Configuration - # - BR2_HAVE_DOT_CONFIG=y - BR2_HOST_GCC_AT_LEAST_4_9=y -@@ -1833,7 +1833,7 @@ - BR2_PACKAGE_JSON_C=y - # BR2_PACKAGE_JSON_FOR_MODERN_CPP is not set - # BR2_PACKAGE_JSON_GLIB is not set --# BR2_PACKAGE_JSONCPP is not set -+BR2_PACKAGE_JSONCPP=y - # BR2_PACKAGE_LIBBSON is not set - # BR2_PACKAGE_LIBFASTJSON is not set - # BR2_PACKAGE_LIBJSON is not set -@@ -1984,7 +1984,7 @@ - # BR2_PACKAGE_LIBGSASL is not set - # BR2_PACKAGE_LIBHTP is not set - # BR2_PACKAGE_LIBHTTPPARSER is not set --# BR2_PACKAGE_LIBHTTPSERVER is not set -+BR2_PACKAGE_LIBHTTPSERVER=y - # BR2_PACKAGE_LIBIDN is not set - # BR2_PACKAGE_LIBIDN2 is not set - # BR2_PACKAGE_LIBISCSI is not set -@@ -1993,7 +1993,8 @@ - # BR2_PACKAGE_LIBMAXMINDDB is not set - # BR2_PACKAGE_LIBMBUS is not set - # BR2_PACKAGE_LIBMEMCACHED is not set --# BR2_PACKAGE_LIBMICROHTTPD is not set -+BR2_PACKAGE_LIBMICROHTTPD=y -+# BR2_PACKAGE_LIBMICROHTTPD_SSL is not set - # BR2_PACKAGE_LIBMINIUPNPC is not set - # BR2_PACKAGE_LIBMNL is not set - # BR2_PACKAGE_LIBMODBUS is not set -@@ -4200,3 +4201,4 @@ - # BR2_PACKAGE_PERF is not set - # BR2_BINUTILS_VERSION_2_22 is not set - # BR2_PACKAGE_GPU_VIV_BIN_MX6Q is not set -+# BR2_TARGET_UBOOT_NETWORK is not set diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/common/post_build.sh b/build/meta-rootfs/recipes-rootfs/linux/files/board/common/post_build.sh index 446b130..8bea1a8 100755 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/common/post_build.sh +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/common/post_build.sh @@ -1,5 +1,7 @@ #! /bin/bash +# Copyright (c) 2025-2026 EDGEMTech SA + # Here, you can do something after build of rootfs is done but # before the final images (i.e. rootfs.tar) are generated. # See post_image.sh script for the latter. diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/common/post_image.sh b/build/meta-rootfs/recipes-rootfs/linux/files/board/common/post_image.sh index 468dce7..2baeed7 100755 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/common/post_image.sh +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/common/post_image.sh @@ -1,5 +1,7 @@ #! /bin/bash +# Copyright (c) 2025-2026 EDGEMTech SA + # Here, you can do something after the rootfs images has been # generated. # See post_build.sh script if you want to do something just before diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/default/dropbear b/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/default/dropbear new file mode 100644 index 0000000..b94f333 --- /dev/null +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/default/dropbear @@ -0,0 +1,2 @@ +# Allow blank password logins (development only) +DROPBEAR_ARGS="-B" diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/network/interfaces b/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/network/interfaces index 5ee4469..c2c3f23 100755 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/network/interfaces +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/network/interfaces @@ -2,15 +2,6 @@ auto lo iface lo inet loopback -# Physical eth0 interface +# Ethernet — DHCP auto eth0 -#iface eth0 inet dhcp -iface eth0 inet6 manual -up ip link set eth0 up -down ip link set eth0 down - -# wifi -#auto wlan0 -#allow-hotplug wlan0 - - +iface eth0 inet dhcp diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/profile b/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/profile index e3c52ce..bea7342 100755 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/profile +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/profile @@ -9,6 +9,20 @@ export PATH=\ /usr/local/bin:\ /opt/bin +if [ "$PS1" ]; then + printf "\n" + printf "\033[38;2;240;130;26m ███████╗██████╗ ██████╗ ███████╗ ███╗ ███╗ ██╗\033[0m\n" + printf "\033[38;2;240;130;26m ██╔════╝██╔══██╗██╔════╝ ██╔════╝ ████╗ ████║███║\033[0m\n" + printf "\033[38;2;237;104;20m █████╗ ██║ ██║██║ ███╗█████╗ ██╔████╔██║╚██║\033[0m\n" + printf "\033[38;2;235;91;17m ██╔══╝ ██║ ██║██║ ██║██╔══╝ ██║╚██╔╝██║ ██║\033[0m\n" + printf "\033[38;2;233;78;15m ███████╗██████╔╝╚██████╔╝███████╗ ██║ ╚═╝ ██║ ██║\033[0m\n" + printf "\033[38;2;232;78;15m ╚══════╝╚═════╝ ╚═════╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝\033[0m\n" + printf "\n" + printf "\033[38;2;240;130;26m Welcome to \033[1;38;2;232;78;15mEDGE-M1 Factory Capsule\033[0m\n" + printf "\033[0;37m EDGEMTech SA — %s %s\033[0m\n" "$(uname -s)" "$(uname -r)" + printf "\n" +fi + # If running interactively, then: if [ "$PS1" ]; then diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/soo/remove_logs.sh b/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/soo/remove_logs.sh index 9ddfba7..7b55c9b 100755 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/soo/remove_logs.sh +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/soo/remove_logs.sh @@ -1,5 +1,7 @@ #!/bin/sh +# Copyright (c) 2025-2026 EDGEMTech SA + # Remove the README in Capsules image folder rm -f /mnt/capsules/image/README diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/syslog-ng.conf b/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/syslog-ng.conf index 2dc9a9e..fd12fa8 100644 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/syslog-ng.conf +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/syslog-ng.conf @@ -1,3 +1,5 @@ +# Copyright (c) 2025-2026 EDGEMTech SA + @version: 4.7 # syslog configuration for a smart object (SOO) diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/post_image.sh b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/post_image.sh index 3c54434..15e30f2 100755 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/post_image.sh +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/post_image.sh @@ -1,9 +1,12 @@ #! /bin/bash +# Copyright (c) 2025-2026 EDGEMTech SA + # Here, you can do something after the rootfs images has been # generated. # See post_build.sh script if you want to do something just before # the images are generated. # Note: you should have access to most BR variables here. + cp ${BASE_DIR}/images/rootfs.cpio ${BASE_DIR}/board/rpi4 diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/etc/bluetooth/input.conf b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/etc/bluetooth/input.conf index 3e1d65a..577646c 100644 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/etc/bluetooth/input.conf +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/etc/bluetooth/input.conf @@ -1,7 +1,10 @@ +# Copyright (c) 2025-2026 EDGEMTech SA + # Configuration file for the input service # This section contains options which are not specific to any # particular interface + [General] # Set idle timeout (in minutes) before the connection will diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/etc/bluetooth/main.conf b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/etc/bluetooth/main.conf index 511d98a..785f589 100644 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/etc/bluetooth/main.conf +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/etc/bluetooth/main.conf @@ -1,7 +1,10 @@ +# Copyright (c) 2025-2026 EDGEMTech SA + [General] # Default adapter name # Defaults to 'BlueZ X.YZ' + Name = soo-rpi4-bt # Default device class. Only the major and minor device class bits are @@ -11,6 +14,7 @@ Name = soo-rpi4-bt # How long to stay in discoverable mode before going back to non-discoverable # The value is in seconds. Default is 180, i.e. 3 minutes. # 0 = disable timer, i.e. stay discoverable forever + DiscoverableTimeout = 0 # How long to stay in pairable mode before going back to non-discoverable @@ -93,4 +97,5 @@ DiscoverableTimeout = 0 # AutoEnable defines option to enable all controllers when they are found. # This includes adapters present on start as well as adapters that are plugged # in later on. Defaults to 'false'. + AutoEnable=true diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/etc/bluetooth/network.conf b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/etc/bluetooth/network.conf index 5f11639..d4b5a5c 100644 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/etc/bluetooth/network.conf +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/etc/bluetooth/network.conf @@ -1,3 +1,5 @@ +# Copyright (c) 2025-2026 EDGEMTech SA + # Configuration file for the network service [General] diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/etc/bluetooth/proximity.conf b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/etc/bluetooth/proximity.conf index 417610f..4147dd8 100644 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/etc/bluetooth/proximity.conf +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/etc/bluetooth/proximity.conf @@ -1,9 +1,13 @@ +# Copyright (c) 2025-2026 EDGEMTech SA + # Configuration file for the proximity service # This section contains options which are not specific to any # particular interface + [General] # Configuration to allow disabling Proximity services # Allowed values: LinkLoss,PathLoss,FindMe + Disable=PathLoss diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/root/btmanager.sh b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/root/btmanager.sh index da1e656..fcd8571 100755 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/root/btmanager.sh +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/root/btmanager.sh @@ -1,5 +1,7 @@ #!/bin/bash +# Copyright (c) 2025-2026 EDGEMTech SA + # BT_TTY="/dev/ttyAMA0" diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/root/otherapps.sh b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/root/otherapps.sh index 30370ad..4e0b3ec 100755 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/root/otherapps.sh +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/root/otherapps.sh @@ -1,5 +1,7 @@ #!/bin/bash +# Copyright (c) 2025-2026 EDGEMTech SA + python /root/sootest.py & diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/root/soo_env.sh b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/root/soo_env.sh index 377db18..b94b5cd 100755 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/root/soo_env.sh +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/root/soo_env.sh @@ -1,3 +1,4 @@ +# Copyright (c) 2025-2026 EDGEMTech SA # This script is sourced by initd script diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/root/wifimanager.sh b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/root/wifimanager.sh index 39d8a1a..fada97d 100755 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/root/wifimanager.sh +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/root/wifimanager.sh @@ -1,4 +1,7 @@ #!/bin/sh + +# Copyright (c) 2025-2026 EDGEMTech SA + iw reg set CH iw wlan0 set type ibss iwconfig wlan0 essid "soo-wifi" diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/post_image.sh b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/post_image.sh index 10eb8ba..e38b9e7 100755 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/post_image.sh +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/post_image.sh @@ -1,9 +1,12 @@ #! /bin/bash +# Copyright (c) 2025-2026 EDGEMTech SA + # Here, you can do something after the rootfs images has been # generated. # See post_build.sh script if you want to do something just before # the images are generated. # Note: you should have access to most BR variables here. + cp ${BASE_DIR}/images/rootfs.cpio ${BASE_DIR}/board/rpi4_64 diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/rootfs_overlay/etc/bluetooth/input.conf b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/rootfs_overlay/etc/bluetooth/input.conf index 3e1d65a..577646c 100644 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/rootfs_overlay/etc/bluetooth/input.conf +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/rootfs_overlay/etc/bluetooth/input.conf @@ -1,7 +1,10 @@ +# Copyright (c) 2025-2026 EDGEMTech SA + # Configuration file for the input service # This section contains options which are not specific to any # particular interface + [General] # Set idle timeout (in minutes) before the connection will diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/rootfs_overlay/etc/bluetooth/main.conf b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/rootfs_overlay/etc/bluetooth/main.conf index 511d98a..785f589 100644 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/rootfs_overlay/etc/bluetooth/main.conf +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/rootfs_overlay/etc/bluetooth/main.conf @@ -1,7 +1,10 @@ +# Copyright (c) 2025-2026 EDGEMTech SA + [General] # Default adapter name # Defaults to 'BlueZ X.YZ' + Name = soo-rpi4-bt # Default device class. Only the major and minor device class bits are @@ -11,6 +14,7 @@ Name = soo-rpi4-bt # How long to stay in discoverable mode before going back to non-discoverable # The value is in seconds. Default is 180, i.e. 3 minutes. # 0 = disable timer, i.e. stay discoverable forever + DiscoverableTimeout = 0 # How long to stay in pairable mode before going back to non-discoverable @@ -93,4 +97,5 @@ DiscoverableTimeout = 0 # AutoEnable defines option to enable all controllers when they are found. # This includes adapters present on start as well as adapters that are plugged # in later on. Defaults to 'false'. + AutoEnable=true diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/rootfs_overlay/etc/bluetooth/network.conf b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/rootfs_overlay/etc/bluetooth/network.conf index 5f11639..d4b5a5c 100644 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/rootfs_overlay/etc/bluetooth/network.conf +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/rootfs_overlay/etc/bluetooth/network.conf @@ -1,3 +1,5 @@ +# Copyright (c) 2025-2026 EDGEMTech SA + # Configuration file for the network service [General] diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/rootfs_overlay/etc/bluetooth/proximity.conf b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/rootfs_overlay/etc/bluetooth/proximity.conf index 417610f..4147dd8 100644 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/rootfs_overlay/etc/bluetooth/proximity.conf +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/rootfs_overlay/etc/bluetooth/proximity.conf @@ -1,9 +1,13 @@ +# Copyright (c) 2025-2026 EDGEMTech SA + # Configuration file for the proximity service # This section contains options which are not specific to any # particular interface + [General] # Configuration to allow disabling Proximity services # Allowed values: LinkLoss,PathLoss,FindMe + Disable=PathLoss diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/rootfs_overlay/root/btmanager.sh b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/rootfs_overlay/root/btmanager.sh index a5ed30f..d937cc7 100755 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/rootfs_overlay/root/btmanager.sh +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/rootfs_overlay/root/btmanager.sh @@ -1,5 +1,7 @@ #!/bin/bash +# Copyright (c) 2025-2026 EDGEMTech SA + BT_TTY="/dev/ttyAMA0" diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/rootfs_overlay/root/otherapps.sh b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/rootfs_overlay/root/otherapps.sh index 30370ad..4e0b3ec 100755 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/rootfs_overlay/root/otherapps.sh +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/rootfs_overlay/root/otherapps.sh @@ -1,5 +1,7 @@ #!/bin/bash +# Copyright (c) 2025-2026 EDGEMTech SA + python /root/sootest.py & diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/rootfs_overlay/root/soo_env.sh b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/rootfs_overlay/root/soo_env.sh index 377db18..b94b5cd 100755 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/rootfs_overlay/root/soo_env.sh +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/rootfs_overlay/root/soo_env.sh @@ -1,3 +1,4 @@ +# Copyright (c) 2025-2026 EDGEMTech SA # This script is sourced by initd script diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/rootfs_overlay/root/wifimanager.sh b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/rootfs_overlay/root/wifimanager.sh index 39d8a1a..fada97d 100755 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/rootfs_overlay/root/wifimanager.sh +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/rootfs_overlay/root/wifimanager.sh @@ -1,4 +1,7 @@ #!/bin/sh + +# Copyright (c) 2025-2026 EDGEMTech SA + iw reg set CH iw wlan0 set type ibss iwconfig wlan0 essid "soo-wifi" diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/virt32/post_image.sh b/build/meta-rootfs/recipes-rootfs/linux/files/board/virt32/post_image.sh index 66cf7b5..0773f9b 100755 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/virt32/post_image.sh +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/virt32/post_image.sh @@ -1,10 +1,13 @@ #! /bin/bash +# Copyright (c) 2025-2026 EDGEMTech SA + # Here, you can do something after the rootfs images has been # generated. # See post_build.sh script if you want to do something just before # the images are generated. # Note: you should have access to most BR variables here. + cp ${BASE_DIR}/images/rootfs.cpio ${BASE_DIR}/board/virt32 diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/virt64/post_image.sh b/build/meta-rootfs/recipes-rootfs/linux/files/board/virt64/post_image.sh index 2aaa385..cdce699 100755 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/virt64/post_image.sh +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/virt64/post_image.sh @@ -1,9 +1,12 @@ #! /bin/bash +# Copyright (c) 2025-2026 EDGEMTech SA + # Here, you can do something after the rootfs images has been # generated. # See post_build.sh script if you want to do something just before # the images are generated. # Note: you should have access to most BR variables here. + cp ${BASE_DIR}/images/rootfs.cpio ${BASE_DIR}/board/virt64 diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/virt64/rootfs_overlay/etc/inittab b/build/meta-rootfs/recipes-rootfs/linux/files/board/virt64/rootfs_overlay/etc/inittab index 1e21896..a3aa8ae 100644 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/virt64/rootfs_overlay/etc/inittab +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/virt64/rootfs_overlay/etc/inittab @@ -1,35 +1,32 @@ -# /etc/inittab -# -# Copyright (C) 2001 Erik Andersen -# -# Note: BusyBox init doesn't support runlevels. The runlevels field is -# completely ignored by BusyBox init. If you want runlevels, use -# sysvinit. +# /etc/inittab for sysvinit # # Format for each entry: ::: # -# id == tty to run on, or empty for /dev/console -# runlevels == ignored -# action == one of sysinit, respawn, askfirst, wait, and once +# id == unique 1-4 char identifier +# runlevels == runlevels for which the entry applies +# action == one of initdefault, sysinit, wait, respawn, ctrlaltdel, shutdown, etc. # process == program to run +id:3:initdefault: + # Startup the system -null::sysinit:/bin/mount -t proc proc /proc -null::sysinit:/bin/mount -o remount,rw / -null::sysinit:/bin/mkdir -p /dev/pts -null::sysinit:/bin/mkdir -p /dev/shm -null::sysinit:/bin/mount -a -null::sysinit:/bin/hostname -F /etc/hostname +si0::sysinit:/bin/mount -t proc proc /proc +si1::sysinit:/bin/mount -o remount,rw / +si2::sysinit:/bin/mkdir -p /dev/pts +si3::sysinit:/bin/mkdir -p /dev/shm +si4::sysinit:/bin/mount -a +si5::sysinit:/bin/mkdir -p /run/lock +si6::sysinit:/bin/hostname -F /etc/hostname # now run any rc scripts -::sysinit:/etc/init.d/rcS +rcS::sysinit:/etc/init.d/rcS # Put a getty on the serial port -ttyAMA0::respawn:/sbin/getty -L -l /usr/bin/auto-root-login -n ttyAMA0 0 vt100 # GENERIC_SERIAL +AMA0::respawn:/sbin/getty -L -l /usr/bin/auto-root-login -n ttyAMA0 0 vt100 # GENERIC_SERIAL # Stuff to do for the 3-finger salute -::ctrlaltdel:/sbin/reboot +ca::ctrlaltdel:/sbin/reboot -# Stuff to do before rebooting -::shutdown:/etc/init.d/rcK -::shutdown:/sbin/swapoff -a -::shutdown:/bin/umount -a -r +# Stuff to do before rebooting (runlevels 0=halt, 6=reboot) +sd0:06:wait:/etc/init.d/rcK +sd1:06:wait:/sbin/swapoff -a +sd2:06:wait:/bin/umount -a -r diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/x86-qemu/post_build.sh b/build/meta-rootfs/recipes-rootfs/linux/files/board/x86-qemu/post_build.sh index 720d11f..0765942 100755 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/x86-qemu/post_build.sh +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/x86-qemu/post_build.sh @@ -1,5 +1,7 @@ #! /bin/bash +# Copyright (c) 2025-2026 EDGEMTech SA + # Here, you can do something after build of rootfs is done but # before the final images (i.e. rootfs.tar) are generated. # See post_image.sh script for the latter. diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/x86-qemu/post_image.sh b/build/meta-rootfs/recipes-rootfs/linux/files/board/x86-qemu/post_image.sh index 0a5c46e..f745f0c 100755 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/x86-qemu/post_image.sh +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/x86-qemu/post_image.sh @@ -1,9 +1,12 @@ #! /bin/bash +# Copyright (c) 2025-2026 EDGEMTech SA + # Here, you can do something after the rootfs images has been # generated. # See post_build.sh script if you want to do something just before # the images are generated. # Note: you should have access to most BR variables here. + cp ${BASE_DIR}/images/rootfs.cpio ${BASE_DIR}/board/x86_qemu diff --git a/build/meta-rootfs/recipes-rootfs/linux/rootfs-linux_1.0.bb b/build/meta-rootfs/recipes-rootfs/linux/rootfs-linux_1.0.bb index 5da6c3c..077515d 100644 --- a/build/meta-rootfs/recipes-rootfs/linux/rootfs-linux_1.0.bb +++ b/build/meta-rootfs/recipes-rootfs/linux/rootfs-linux_1.0.bb @@ -1,3 +1,5 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD SUMMARY = "Root filesystem" DESCRIPTION = "Root filesystem contents to be deployed on the target platform" @@ -21,8 +23,12 @@ do_configure[noexec] = "1" do_build[depends] = "${IB_ROOTFS_METHOD}:do_build" do_build[depends] += "linux:do_build" -# Check that the image is present before deploying rootfs -do_deploy[depends] += "filesystem:do_fs_check" +# Check that the image is present before deploying rootfs. The rootfs +# generator (buildroot by default) must also have produced rootfs.cpio +# under board/${IB_PLATFORM}/ — without this dep, do_deploy can race +# ahead of buildroot:do_build on a fresh checkout (no cached cpio) and +# fail in __do_rootfs_mount. +do_deploy[depends] += "filesystem:do_fs_check ${IB_ROOTFS_METHOD}:do_build" do_build[nostamp] = "1" do_build () { @@ -32,13 +38,32 @@ do_build () { addtask do_build do_attach_infrabase[depends] = "${IB_ROOTFS_METHOD}:do_attach_infrabase" - + +# Re-run on every build so edits to the source board files (post_image.sh, +# rootfs_overlay, ...) are propagated into the working copy below. + +do_attach_infrabase[nostamp] = "1" + do_attach_infrabase () { - - # Remove previous link if any - rm -f ${IB_TARGET}/board - ln -fs ${FILE_DIRNAME}/files/board ${IB_TARGET}/board + # Keep a private working copy of the board directory under WORKDIR + # (tmp/work). The rootfs generator writes its productions there during + # the build (rootfs.cpio via post_image.sh, then rootfs.cpio.backup, + # rootfs.cpio.sha256, initrd.cpio, initrd.cpio.gz). Pointing the board + # symlink at this copy keeps those productions out of the git-tracked + # source tree under files/board. + # + # `cp -r .../board/.` refreshes the source config files on top of the + # copy but does NOT remove the dest-only productions, so the + # do_prepare_initrd content-hash guard (rootfs.cpio.sha256 + + # initrd.cpio.gz) keeps working across builds. + mkdir -p ${WORKDIR}/board + cp -r ${FILE_DIRNAME}/files/board/. ${WORKDIR}/board + + # Expose the working copy through the historical board symlink so every + # consumer keeps referencing ${IB_ROOTFS_PATH}/board/... unchanged. + rm -f ${IB_TARGET}/board + ln -fs ${WORKDIR}/board ${IB_TARGET}/board } # Deployment of the rootfs contents @@ -54,6 +79,17 @@ python do_deploy () { bb.plain("Deploy the rootfs into the filesystem") + # Verdin-imx8mp does not deploy its rootfs via a build-time partition + # mount: storage is delivered through the platform's Tezi / HTTP recovery + # flow (IB_STORAGE_MODE = "http"), so the verdin __do_fs_mount would try + # to mount a physical /dev/sda1 that is absent in a build/CI context. + # Mirror rootfs-torizon:do_deploy, which returns early for verdin for the + # same reason. (FC builds never reach here — their bbappend marks + # do_deploy noexec.) + if d.getVar('IB_PLATFORM') == "verdin-imx8mp": + bb.plain("verdin-imx8mp: rootfs delivered via Tezi/HTTP, skipping partition deploy") + return + __do_fs_mount(d) d.setVar('ROOTFS_FILENAME', 'rootfs') @@ -80,7 +116,12 @@ python do_deploy () { cmd = f"ls {IB_TARGET}/fs/." result = subprocess.run(cmd, shell=True, check=True) - cmd = f"cp -rv {IB_TARGET}/fs/. {IB_FILESYSTEM_PATH}/{IB_ROOTFS_PARTITION}" + # Privileged + archive copy: the source IB_TARGET/fs is the rootfs image + # loop-mounted as root (so its files are root-owned, some unreadable to the + # unprivileged builder — a plain `cp` aborts with exit 1), and the ext4 p2 + # rootfs needs ownership/perms/symlinks preserved (setuid bins, /etc/shadow, + # ...). `sudo cp -a` both reads the root-owned tree and reproduces it faithfully. + cmd = f"sudo cp -av {IB_TARGET}/fs/. {IB_FILESYSTEM_PATH}/{IB_ROOTFS_PARTITION}" result = subprocess.run(cmd, shell=True, check=True) @@ -90,9 +131,6 @@ python do_deploy () { __do_rootfs_umount(d) __do_fs_umount(d) - # Avoid creating logs,stamps and run files as root - utils_restore_user_ownership(d) - } addtask do_deploy @@ -101,11 +139,11 @@ do_clean[depends] = "${IB_ROOTFS_METHOD}:do_clean" do_clean[nostamp] = "1" do_clean () { - if ls "${IB_TARGET}/board/${IB_PLATFORM}/rootfs.cpio"* >/dev/null 2>&1; then - rm "${IB_TARGET}/board/${IB_PLATFORM}/rootfs.cpio"* - fi - - rm -f ${IB_TARGET}/board + # Drop the board working copy (holds every build production) and the + # symlink that exposed it under the rootfs path. + + rm -rf ${WORKDIR}/board + rm -f ${IB_TARGET}/board rm -f ${TMPDIR}/stamps/rootfs-linux* } diff --git a/build/meta-rootfs/recipes-rootfs/so3/rootfs-so3_1.0.bb b/build/meta-rootfs/recipes-rootfs/so3/rootfs-so3_1.0.bb index 7cce4bf..867a4bb 100644 --- a/build/meta-rootfs/recipes-rootfs/so3/rootfs-so3_1.0.bb +++ b/build/meta-rootfs/recipes-rootfs/so3/rootfs-so3_1.0.bb @@ -1,3 +1,5 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD SUMMARY = "SO3 root filesystem" DESCRIPTION = "SO3 root filesystem contents to be deployed on the target platform" @@ -9,7 +11,10 @@ inherit rootfs PR = "r0" PV = "1.0" -OVERRIDES += ":so3" +# :append (not +=) so no space is inserted before ":so3" — otherwise the +# preceding CPU token parses as "arm "/"aarch64 " and : overrides +# stop matching. See usr-so3_1.0.bb for the full rationale. +OVERRIDES:append = ":so3" IB_TARGET = "${IB_DIR}/so3/rootfs" diff --git a/build/meta-so3/classes/avz.bbclass b/build/meta-so3/classes/avz.bbclass index f9f592d..1a8f4dc 100644 --- a/build/meta-so3/classes/avz.bbclass +++ b/build/meta-so3/classes/avz.bbclass @@ -1,3 +1,5 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD # Class for building SO3 in infrabase diff --git a/build/meta-so3/classes/so3.bbclass b/build/meta-so3/classes/so3.bbclass index 12d3a88..7cbd146 100644 --- a/build/meta-so3/classes/so3.bbclass +++ b/build/meta-so3/classes/so3.bbclass @@ -1,3 +1,5 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD # Class for building SO3 in infrabase diff --git a/build/meta-so3/conf/layer.conf b/build/meta-so3/conf/layer.conf index 11e001c..1dda486 100644 --- a/build/meta-so3/conf/layer.conf +++ b/build/meta-so3/conf/layer.conf @@ -1,3 +1,6 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + BBPATH .= ":${LAYERDIR}" BBFILES += "${LAYERDIR}/recipes-*/*/*.bb ${LAYERDIR}/recipes-*/*/*.bbappend" diff --git a/build/meta-so3/recipes-so3/avz/avz_6.1.0.bb b/build/meta-so3/recipes-so3/avz/avz_6.1.0.bb deleted file mode 100644 index 84eb37c..0000000 --- a/build/meta-so3/recipes-so3/avz/avz_6.1.0.bb +++ /dev/null @@ -1,55 +0,0 @@ - -SUMMARY = "AVZ Hypervisor" -DESCRIPTION = "AVZ (Agency Virtualizer) hypervisor based on polymorphic SO3 Operating System" -LICENSE = "GPLv2" - -inherit avz - -# Version and revision - -PR = "r0" -PV = "6.1.0" - -OVERRIDES += ":avz" - -# Where the working directory will be placed in infrabase root dir -IB_TARGET = "${IB_AVZ_PATH}" - -SRC_URI = "git://github.com/smartobjectoriented/so3.git;nobranch=1;protocol=https" -SRCREV = "5826b0c0266cd561b82925eea4ad8fdc8bceef79" - -# FILESPATH:prepend = "${THISDIR}/files/0001-${PF}:" -# require files/0001-${PF}-patches.inc - -python do_handle_fetch_git() { - - import os - import subprocess - - # Copy only the SO3 kernel - - gitdir = os.path.join(d.getVar('WORKDIR'), 'git') - dst_dir = d.getVar('S') - - cmd = f"find . -not -path '*/.git/*' -and \( -type f -or -type d -empty \) -exec cp -r --parents -t {dst_dir} {{}} +" - result = subprocess.run(cmd, shell=True, check=True, cwd=os.path.join(gitdir, "so3")) -} - -do_configure[nostamp] = "1" -do_configure () { - cd ${IB_TARGET} - make ${IB_CONFIG} -} - -do_build () { - echo "Building AVZ..." - - cd ${IB_TARGET} - make -} - -do_clean[nostamp] = "1" -do_clean () { - rm -f ${TMPDIR}/stamps/avz* -} -addtask do_clean diff --git a/build/meta-so3/recipes-so3/avz/avz_6.2.0.bb b/build/meta-so3/recipes-so3/avz/avz_6.2.0.bb new file mode 100644 index 0000000..976ea97 --- /dev/null +++ b/build/meta-so3/recipes-so3/avz/avz_6.2.0.bb @@ -0,0 +1,69 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + +SUMMARY = "AVZ Hypervisor" +DESCRIPTION = "AVZ (Agency Virtualizer) hypervisor based on polymorphic SO3 Operating System" +LICENSE = "GPLv2" + +inherit avz + +# Version and revision + +PR = "r0" +PV = "6.2.0" + +OVERRIDES += ":avz" + +# Where the working directory will be placed in infrabase root dir +IB_TARGET = "${IB_AVZ_PATH}" + +# MICOFE is a separate repository and does not embed the SO3/AVZ sources, so +# AVZ is FETCHED from the SO3 repo (unlike the SO3 tree itself, which builds +# in place). Track the latest SO3 (branch 255: build-system→infrabase + SOO +# capsule + new logo). Bump SRCREV to follow upstream SO3 / AVZ changes. +SRC_URI = "git://github.com/smartobjectoriented/so3.git;nobranch=1;protocol=https" +SRCREV = "60f6da75c8969d2710c0e98572f2a43febb6a34b" + +# MICOFE-specific AVZ patches applied on top of the fetched SO3 tree. +# Generate/refresh the set with `bitbake avz -c updiff` (do_diffcompose +# diffs the fetched .pristine snapshot against ${IB_AVZ_PATH} and do_updiff +# regenerates the numbered patchset + this .inc). +FILESPATH:prepend = "${THISDIR}/files/0001-${PF}:" + +require files/0001-${PF}-patches.inc + +python do_handle_fetch_git() { + + import os + import subprocess + + # Copy only the SO3 kernel (AVZ is the polymorphic SO3 built with an avz + # config; its sources live inside the kernel tree). The repo nests the + # kernel under /so3/so3, so copy from gitdir/so3/so3. + + gitdir = os.path.join(d.getVar('WORKDIR'), 'git') + dst_dir = d.getVar('S') + + cmd = f"find . -not -path '*/.git/*' -and \( -type f -or -type d -empty \) -exec cp -r --parents -t {dst_dir} {{}} +" + result = subprocess.run(cmd, shell=True, check=True, cwd=os.path.join(gitdir, "so3", "so3")) +} + +do_configure[nostamp] = "1" +do_configure () { + cd ${IB_TARGET} + make ${IB_CONFIG} +} + +do_build[nostamp] = "1" +do_build () { + echo "Building AVZ..." + + cd ${IB_TARGET} + make +} + +do_clean[nostamp] = "1" +do_clean () { + rm -f ${TMPDIR}/stamps/avz* +} +addtask do_clean diff --git a/build/meta-so3/recipes-so3/avz/files/0001-avz-6.2.0-r0-patches.inc b/build/meta-so3/recipes-so3/avz/files/0001-avz-6.2.0-r0-patches.inc new file mode 100644 index 0000000..f701da1 --- /dev/null +++ b/build/meta-so3/recipes-so3/avz/files/0001-avz-6.2.0-r0-patches.inc @@ -0,0 +1,6 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD +# +# MICOFE patch manifest — auto-regenerated by 'bitbake -c updiff'. +# Empty until the first updiff: a clean SO3 (SRCREV) is fetched and no +# patch is applied. Add MICOFE deltas to ${IB_TARGET}, then run updiff. diff --git a/build/meta-so3/recipes-so3/so3/files/0001-so3-6.2.0-r0-patches.inc b/build/meta-so3/recipes-so3/so3/files/0001-so3-6.2.0-r0-patches.inc new file mode 100644 index 0000000..f701da1 --- /dev/null +++ b/build/meta-so3/recipes-so3/so3/files/0001-so3-6.2.0-r0-patches.inc @@ -0,0 +1,6 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD +# +# MICOFE patch manifest — auto-regenerated by 'bitbake -c updiff'. +# Empty until the first updiff: a clean SO3 (SRCREV) is fetched and no +# patch is applied. Add MICOFE deltas to ${IB_TARGET}, then run updiff. diff --git a/build/meta-so3/recipes-so3/so3/so3_6.1.0.bb b/build/meta-so3/recipes-so3/so3/so3_6.1.0.bb deleted file mode 100644 index 2623aec..0000000 --- a/build/meta-so3/recipes-so3/so3/so3_6.1.0.bb +++ /dev/null @@ -1,40 +0,0 @@ - -SUMMARY = "SO3 kernel" -DESCRIPTION = "Smart Object Oriented Operating System" -LICENSE = "GPLv2" - -inherit so3 - -# Version and revision -PR = "r0" -PV = "6.1.0" - -OVERRIDES += ":so3" - -# Where the working directory will be placed in infrabase root dir -IB_TARGET = "${IB_SO3_PATH}" - -SRC_URI = "git://github.com/smartobjectoriented/so3.git;nobranch=1;protocol=https" -SRCREV = "5826b0c0266cd561b82925eea4ad8fdc8bceef79" - -# FILESPATH:prepend = "${THISDIR}/files/0001-${PF}:" -# require files/0001-${PF}-patches.inc - -do_configure[nostamp] = "1" -do_configure () { - cd ${IB_SO3_PATH}/so3 - make ${IB_CONFIG} -} - -do_build () { - echo "Building SO3..." - - cd ${IB_SO3_PATH}/so3 - make -} - -do_clean[nostamp] = "1" -do_clean () { - rm -f ${TMPDIR}/stamps/so3* -} -addtask do_clean diff --git a/build/meta-so3/recipes-so3/so3/so3_6.2.0.bb b/build/meta-so3/recipes-so3/so3/so3_6.2.0.bb new file mode 100644 index 0000000..40c4b0b --- /dev/null +++ b/build/meta-so3/recipes-so3/so3/so3_6.2.0.bb @@ -0,0 +1,85 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + +SUMMARY = "SO3 kernel" +DESCRIPTION = "Smart Object Oriented Operating System" +LICENSE = "GPLv2" + +inherit so3 + +# Version and revision +PR = "r0" +PV = "6.2.0" + +# :append (not +=) so no space is inserted before ":so3" — otherwise the +# preceding CPU token parses as "arm "/"aarch64 " and : overrides +# stop matching. See usr-so3_1.0.bb for the full rationale. +OVERRIDES:append = ":so3" + +# Where the working directory will be placed in infrabase root dir +IB_TARGET = "${IB_SO3_PATH}" + +# MICOFE is a separate repository and does not embed the SO3 sources, so the +# kernel is FETCHED from the SO3 repo (unlike the SO3 tree itself, which builds +# in place). Track the latest SO3 (branch 255: build-system→infrabase + SOO +# capsule + new logo). Bump SRCREV to follow upstream SO3 changes. +SRC_URI = "git://github.com/smartobjectoriented/so3.git;nobranch=1;protocol=https" +SRCREV = "60f6da75c8969d2710c0e98572f2a43febb6a34b" + +# MICOFE-specific SO3 patches applied on top of the fetched tree. +# Generate/refresh the set with `bitbake so3 -c updiff` (do_diffcompose +# diffs the fetched .pristine snapshot against ${IB_SO3_PATH} and do_updiff +# regenerates the numbered patchset + this .inc). +FILESPATH:prepend = "${THISDIR}/files/0001-${PF}:" + +require files/0001-${PF}-patches.inc + +python do_handle_fetch_git() { + + import os + import subprocess + + # Copy the SO3 sources subtree only. The repo nests its sources under + # /so3 (which itself contains so3/=kernel, usr/, rootfs/, target/), + # so copy from gitdir/so3 — this makes ${IB_SO3_PATH}/so3 the kernel root, + # matching the in-place SO3 build layout. + + gitdir = os.path.join(d.getVar('WORKDIR'), 'git') + dst_dir = d.getVar('S') + + cmd = f"find . -not -path '*/.git/*' -and \( -type f -or -type d -empty \) -exec cp -r --parents -t {dst_dir} {{}} +" + result = subprocess.run(cmd, shell=True, check=True, cwd=os.path.join(gitdir, "so3")) +} + +do_configure[nostamp] = "1" +do_configure () { + cd ${IB_SO3_PATH}/so3 + + # The kernel is built in place, so a stale .config/objects from the + # other architecture (virt64<->virt32, i.e. aarch64<->arm) would + # otherwise survive and produce a wrong-arch kernel. Track the last + # built arch in a marker file and distclean only when it changes — + # so same-arch rebuilds stay incremental. + _arch_marker=".ib_last_arch" + if [ -f "$_arch_marker" ] && [ "$(cat $_arch_marker)" != "${IB_PLAT_CPU}" ]; then + echo "SO3 arch changed ($(cat $_arch_marker) -> ${IB_PLAT_CPU}); running make distclean" + make distclean + fi + + make ${IB_CONFIG} + + echo "${IB_PLAT_CPU}" > "$_arch_marker" +} + +do_build () { + echo "Building SO3..." + + cd ${IB_SO3_PATH}/so3 + make +} + +do_clean[nostamp] = "1" +do_clean () { + rm -f ${TMPDIR}/stamps/so3* +} +addtask do_clean diff --git a/build/meta-toolchain/conf/layer.conf b/build/meta-toolchain/conf/layer.conf new file mode 100644 index 0000000..e44c6ea --- /dev/null +++ b/build/meta-toolchain/conf/layer.conf @@ -0,0 +1,12 @@ +BBPATH .= ":${LAYERDIR}" +BBFILES += "${LAYERDIR}/recipes-*/*/*.bb ${LAYERDIR}/recipes-*/*/*.bbappend" + +# append layer name to list of configured layers +BBFILE_COLLECTIONS += "toolchain" + +LAYERSERIES_COMPAT_toolchain = "infrabase_core" +LAYERDEPENDS_toolchain = "toolchain" + +# and use name as suffix for other properties +BBFILE_PATTERN_toolchain = "^${LAYERDIR}/" +BBFILE_PRIORITY_toolchain = "4" diff --git a/build/meta-toolchain/recipes-toolchain/musl/files/config.mak b/build/meta-toolchain/recipes-toolchain/musl/files/config.mak new file mode 100644 index 0000000..8c9f0ea --- /dev/null +++ b/build/meta-toolchain/recipes-toolchain/musl/files/config.mak @@ -0,0 +1,44 @@ +# +# musl-cross-make configuration for the SO3 user-space toolchain. +# +# This is the common (arch-independent) configuration. The recipe +# (musl-toolchain_*.bb) appends the TARGET and OUTPUT lines, selecting +# the target from the configured platform CPU (local.conf): +# aarch64 -> aarch64-linux-musl +# arm -> arm-linux-musleabihf +# + +# musl-cross-make downloads the gcc/binutils/gmp/mpfr/mpc/musl tarballs during +# the build (do_build). The stock GNU_SITE is ftpmirror.gnu.org, which 302- +# redirects to a RANDOM mirror; some mirrors are incomplete (404) or stall, and +# wget --tries just re-hits the same redirect, so the toolchain build failed +# intermittently in CI (passed on re-run). Fetch GNU components from the +# canonical, complete host instead of a random mirror, and still add retries/ +# timeouts as a safety net. (-O must stay last: the Makefile appends +# after DL_CMD.) +GNU_SITE = https://ftp.gnu.org/gnu +DL_CMD = wget -c --tries=5 --waitretry=10 --timeout=30 -O + +BINUTILS_VER = 2.44 +GCC_VER = 12.4.0 +# MUSL_VER = git-master +# GMP_VER = +# MPC_VER = +# MPFR_VER = +# ISL_VER = +# LINUX_VER = + +# Recommended options for a smaller toolchain / deployable binaries: +COMMON_CONFIG += CFLAGS="-g -Os" CXXFLAGS="-g0 -Os" LDFLAGS="-s" + +# Disable autotools "maintainer mode" when configuring gcc and its in-tree +# deps (gmp/mpfr/mpc/isl). Without this, if the extracted/copied source files +# have inconsistent timestamps (configure.ac newer than configure — which +# happens when the tree is copied without preserving mtimes, e.g. the CI +# container's fresh build), make tries to regenerate configure/Makefile.in and +# fails with "automake-1.17: command not found" / "autoconf: command not found". +# The so3-env CI image has no autotools (and Ubuntu ships automake 1.16, not the +# 1.17 mpfr wants), so the regen can never succeed there. Disabling maintainer +# mode turns those regen rules into no-ops and makes the build environment- and +# timestamp-independent. +GCC_CONFIG += --disable-maintainer-mode diff --git a/build/meta-toolchain/recipes-toolchain/musl/musl-toolchain_1.0.bb b/build/meta-toolchain/recipes-toolchain/musl/musl-toolchain_1.0.bb new file mode 100644 index 0000000..d477f63 --- /dev/null +++ b/build/meta-toolchain/recipes-toolchain/musl/musl-toolchain_1.0.bb @@ -0,0 +1,66 @@ +SUMMARY = "MUSL cross toolchain for SO3 user space" +DESCRIPTION = "Builds the cross toolchain used to compile the SO3 user-space \ +applications, via richfelker/musl-cross-make. Replaces the former \ +toolchains/build-toolchain.sh script. Only the toolchain matching the \ +configured platform CPU (local.conf) is built." + +LICENSE = "GPLv2 & MIT" + +# Release and version +PR = "r0" +PV = "1.0" + +# musl-cross-make pinned commit (was GIT_COMMIT=3635262 in the old +# toolchains/build-toolchain.sh). +SRC_URI = "git://github.com/richfelker/musl-cross-make;protocol=https;nobranch=1" +SRCREV = "3635262e4524c991552789af6f36211a335a77b3" + +# The common config.mak shipped alongside this recipe. +FILESPATH:prepend = "${THISDIR}/files:" +SRC_URI += "file://config.mak" + +# IB_MUSL_TARGET follows the platform CPU (defined in local.conf; +# OVERRIDES carries ${IB_PLAT_CPU}). Building for aarch64 does not build +# the arm variant and vice-versa. + +# Fetched musl-cross-make source/build tree and the final install +# prefix, both under the bitbake-managed build/tmp area +# (IB_MUSL_TOOLCHAIN_DIR is defined in local.conf). +IB_TARGET = "${IB_MUSL_TOOLCHAIN_DIR}/musl-cross-make" +IB_MUSL_OUTPUT = "${IB_MUSL_TOOLCHAIN_DIR}/${IB_MUSL_TARGET}" + +do_configure[nostamp] = "1" +do_configure () { + cd ${IB_TARGET} + + # Common settings + the arch-specific TARGET/OUTPUT selected here. + cp ${WORKDIR}/config.mak config.mak + echo "TARGET = ${IB_MUSL_TARGET}" >> config.mak + echo "OUTPUT = ${IB_MUSL_OUTPUT}" >> config.mak +} + +# do_configure is nostamp (it re-pins TARGET/OUTPUT in config.mak per arch), +# which forces this do_build to re-run on every build that depends on +# musl-toolchain:do_build (e.g. `build.sh -x usr-so3`). Guard against that: +# if the compiler for the current IB_MUSL_TARGET is already installed, skip +# the (very long) binutils/gcc/musl build. A different arch yields a different +# IB_MUSL_OUTPUT path, so it still builds; `do_clean` wipes the output to force +# a rebuild. +do_build () { + if [ -x "${IB_MUSL_OUTPUT}/bin/${IB_MUSL_TARGET}-gcc" ]; then + echo "musl cross toolchain '${IB_MUSL_TARGET}' already built — skipping." + else + echo "Building musl cross toolchain '${IB_MUSL_TARGET}' — this downloads and compiles binutils/gcc/musl, expect a long first build..." + + cd ${IB_TARGET} + make -j${CORES} + make install + fi +} + +do_clean[nostamp] = "1" +do_clean () { + rm -rf ${IB_MUSL_OUTPUT} + rm -f ${TMPDIR}/stamps/musl-toolchain* +} +addtask do_clean diff --git a/build/meta-uboot/classes/uboot.bbclass b/build/meta-uboot/classes/uboot.bbclass index 54644e4..a3f554a 100644 --- a/build/meta-uboot/classes/uboot.bbclass +++ b/build/meta-uboot/classes/uboot.bbclass @@ -1,3 +1,5 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD # Class for building U-boot in infrabase diff --git a/build/meta-uboot/conf/layer.conf b/build/meta-uboot/conf/layer.conf index 6e762e5..7380d62 100644 --- a/build/meta-uboot/conf/layer.conf +++ b/build/meta-uboot/conf/layer.conf @@ -1,3 +1,6 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + BBPATH .= ":${LAYERDIR}" BBFILES += "${LAYERDIR}/recipes-*/*/*.bb ${LAYERDIR}/recipes-*/*/*.bbappend" diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0-patches.inc b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0-patches.inc index 95553a6..b7507bd 100644 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0-patches.inc +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0-patches.inc @@ -1,32 +1,56 @@ -SRC_URI += "\ - file://0001-lowlevel_init.S.patch \ - file://0015-virt32_defconfig.patch \ - file://0021-ti_omap5_common.h.patch \ - file://0027-image-cipher.c.patch \ - file://0003-hardware_am33xx.h.patch \ - file://0010-am335x_evm_defconfig.patch \ - file://0013-rpi4_64_defconfig.patch \ - file://0029-image-fit-sig.c.patch \ - file://0020-ti_armv7_common.h.patch \ - file://0007-image-board.c.patch \ - file://0012-rpi_4_32b_defconfig.patch \ - file://0018-qemu-arm.h.patch \ - file://0025-fdt_region.c.patch \ - file://0002-am335x-osd335x-common.dtsi.patch \ - file://0030-image-host.c.patch \ - file://0011-am57xx_evm_defconfig.patch \ - file://0009-Kconfig.patch \ - file://0023-Makefile.patch \ - file://0017-am335x_evm.h.patch \ - file://0016-virt64_defconfig.patch \ - file://0005-hwinit-common.c.patch \ - file://0019-rpi.h.patch \ - file://0028-image-fit.c.patch \ - file://0004-board.c.patch \ - file://0022-mmc.h.patch \ - file://0024-bootm.c.patch \ - file://0006-bootm.c.patch \ - file://0026-image.c.patch \ - file://0008-setexpr.c.patch \ - file://0014-rpi4_64_rpi_dtb_defconfig.patch \ -" +SRC_URI += "\ + file://0001-lowlevel_init.S.patch \ + file://0002-am335x-osd335x-common.dtsi.patch \ + file://0003-hardware_am33xx.h.patch \ + file://0004-board.c.patch \ + file://0005-hwinit-common.c.patch \ + file://0006-bootm.c.patch \ + file://0007-image-board.c.patch \ + file://0008-e1c_boot.c.patch \ + file://0009-Kconfig.patch \ + file://0010-Makefile.patch \ + file://0011-setexpr.c.patch \ + file://0012-Kconfig.patch \ + file://0013-am335x_evm_defconfig.patch \ + file://0014-am57xx_evm_defconfig.patch \ + file://0015-rpi_4_32b_defconfig.patch \ + file://0016-rpi4_64_defconfig.patch \ + file://0017-rpi4_64_rpi_dtb_defconfig.patch \ + file://0018-virt32_defconfig.patch \ + file://0019-virt64_defconfig.patch \ + file://0020-config.h.patch \ + file://0021-am335x_evm.h.patch \ + file://0022-qemu-arm.h.patch \ + file://0023-rpi.h.patch \ + file://0024-ti_armv7_common.h.patch \ + file://0025-ti_omap5_common.h.patch \ + file://0026-mmc.h.patch \ + file://0027-Makefile.patch \ + file://0028-bootm.c.patch \ + file://0029-fdt_region.c.patch \ + file://0030-image.c.patch \ + file://0031-image-cipher.c.patch \ + file://0032-image-fit.c.patch \ + file://0033-image-fit-sig.c.patch \ + file://0034-image-host.c.patch \ + file://0035-hash.c.patch \ + file://0036-embedded.c.patch \ + file://0037-aes-decrypt.c.patch \ + file://0038-aes-encrypt.c.patch \ + file://0039-crc16.c.patch \ + file://0040-crc32.c.patch \ + file://0041-crc8.c.patch \ + file://0042-ecdsa-libcrypto.c.patch \ + file://0043-fdtdec.c.patch \ + file://0044-fdtdec_common.c.patch \ + file://0045-fdt-libcrypto.c.patch \ + file://0046-hash-checksum.c.patch \ + file://0047-md5.c.patch \ + file://0048-rc4.c.patch \ + file://0049-rsa-mod-exp.c.patch \ + file://0050-rsa-sign.c.patch \ + file://0051-rsa-verify.c.patch \ + file://0052-sha1.c.patch \ + file://0053-sha256.c.patch \ + file://0054-sha512.c.patch \ +" \ No newline at end of file diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0001-lowlevel_init.S.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0001-lowlevel_init.S.patch index f2196b6..f02033c 100644 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0001-lowlevel_init.S.patch +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0001-lowlevel_init.S.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/git/infrabase/build/tmp/work/uboot-2022.04-r0/uboot-2022.04/arch/arm/cpu/armv7/lowlevel_init.S 2025-09-11 16:44:26.426711278 +0200 -+++ ./arch/arm/cpu/armv7/lowlevel_init.S 2025-09-11 16:34:39.293214469 +0200 +--- a/arch/arm/cpu/armv7/lowlevel_init.S ++++ b/arch/arm/cpu/armv7/lowlevel_init.S @@ -22,6 +22,25 @@ .pushsection .text.lowlevel_init, "ax" diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0002-am335x-osd335x-common.dtsi.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0002-am335x-osd335x-common.dtsi.patch index a22d80f..33980b7 100644 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0002-am335x-osd335x-common.dtsi.patch +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0002-am335x-osd335x-common.dtsi.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/git/infrabase/build/tmp/work/uboot-2022.04-r0/uboot-2022.04/arch/arm/dts/am335x-osd335x-common.dtsi 2025-09-11 16:44:26.431474397 +0200 -+++ ./arch/arm/dts/am335x-osd335x-common.dtsi 2025-09-11 16:34:39.337910988 +0200 +--- a/arch/arm/dts/am335x-osd335x-common.dtsi ++++ b/arch/arm/dts/am335x-osd335x-common.dtsi @@ -16,6 +16,10 @@ device_type = "memory"; reg = <0x80000000 0x20000000>; /* 512 MB */ diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0003-hardware_am33xx.h.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0003-hardware_am33xx.h.patch index 52e00c2..f9842d0 100644 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0003-hardware_am33xx.h.patch +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0003-hardware_am33xx.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/git/infrabase/build/tmp/work/uboot-2022.04-r0/uboot-2022.04/arch/arm/include/asm/arch-am33xx/hardware_am33xx.h 2025-09-11 16:44:26.504637797 +0200 -+++ ./arch/arm/include/asm/arch-am33xx/hardware_am33xx.h 2025-09-11 16:34:39.338443005 +0200 +--- a/arch/arm/include/asm/arch-am33xx/hardware_am33xx.h ++++ b/arch/arm/include/asm/arch-am33xx/hardware_am33xx.h @@ -60,6 +60,7 @@ /* RTC base address */ diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0004-board.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0004-board.c.patch index fb2c395..e264444 100644 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0004-board.c.patch +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0004-board.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/git/infrabase/build/tmp/work/uboot-2022.04-r0/uboot-2022.04/arch/arm/mach-omap2/am33xx/board.c 2025-09-11 16:44:26.547693906 +0200 -+++ ./arch/arm/mach-omap2/am33xx/board.c 2025-09-11 16:34:39.358932745 +0200 +--- a/arch/arm/mach-omap2/am33xx/board.c ++++ b/arch/arm/mach-omap2/am33xx/board.c @@ -417,6 +417,8 @@ { } diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0005-hwinit-common.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0005-hwinit-common.c.patch index a8690c7..072332d 100644 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0005-hwinit-common.c.patch +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0005-hwinit-common.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/git/infrabase/build/tmp/work/uboot-2022.04-r0/uboot-2022.04/arch/arm/mach-omap2/hwinit-common.c 2025-09-11 16:44:26.548023867 +0200 -+++ ./arch/arm/mach-omap2/hwinit-common.c 2025-09-11 16:34:39.359723681 +0200 +--- a/arch/arm/mach-omap2/hwinit-common.c ++++ b/arch/arm/mach-omap2/hwinit-common.c @@ -135,6 +135,16 @@ } diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0006-bootm.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0006-bootm.c.patch index e7d26e4..a93fa45 100644 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0006-bootm.c.patch +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0006-bootm.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/git/infrabase/build/tmp/work/uboot-2022.04-r0/uboot-2022.04/boot/bootm.c 2025-09-11 16:44:26.707884622 +0200 -+++ ./boot/bootm.c 2025-09-11 16:34:39.288174907 +0200 +--- a/boot/bootm.c ++++ b/boot/bootm.c @@ -251,6 +251,13 @@ { int ret; diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0007-image-board.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0007-image-board.c.patch index fb3439f..55ff4d1 100644 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0007-image-board.c.patch +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0007-image-board.c.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/git/infrabase/build/tmp/work/uboot-2022.04-r0/uboot-2022.04/boot/image-board.c 2025-09-11 16:44:26.707884622 +0200 -+++ ./boot/image-board.c 2025-09-11 16:34:39.288145557 +0200 +--- a/boot/image-board.c ++++ b/boot/image-board.c @@ -767,6 +767,9 @@ const char *uname; u8 img_type; diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0008-e1c_boot.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0008-e1c_boot.c.patch new file mode 100644 index 0000000..972ca1a --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0008-e1c_boot.c.patch @@ -0,0 +1,215 @@ +--- a/cmd/e1c_boot.c ++++ b/cmd/e1c_boot.c +@@ -0,0 +1,212 @@ ++// SPDX-License-Identifier: GPL-2.0+ ++/* ++ * Copyright (C) 2026 EDGEMTech SA ++ * ++ * e1c-boot: load an AVZ FIT image and an e1c capsule FIT image individually, ++ * place each declared loadable/kernel/fdt/ramdisk at its declared load address, ++ * then transfer control to the AVZ entry point. ++ * ++ * Argument convention to AVZ (aarch64): ++ * x0 = AVZ FIT base (so AVZ can locate its avz_dt loadable inside it) ++ * x1 = e1c capsule FIT base (so AVZ can later load the guest from it) ++ * x2 = 0 ++ * x3 = 0 ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++static int e1c_place_image(const void *fit, int img_off, const char *desc, ++ ulong *load_out, ulong *entry_out) ++{ ++ const void *data; ++ size_t size; ++ ulong load; ++ ++ if (fit_image_get_data_and_size(fit, img_off, &data, &size)) { ++ printf("e1c-boot: %s: missing data\n", desc); ++ return -1; ++ } ++ ++ if (fit_image_get_load(fit, img_off, &load)) { ++ printf("e1c-boot: %s: missing load address\n", desc); ++ return -1; ++ } ++ ++ debug("e1c-boot: %s -> 0x%lx (%zu bytes)\n", desc, load, size); ++ memmove((void *)load, data, size); ++ flush_cache(load, size); ++ ++ if (load_out) ++ *load_out = load; ++ ++ if (entry_out) { ++ ulong entry; ++ ++ if (fit_image_get_entry(fit, img_off, &entry)) ++ entry = load; ++ *entry_out = entry; ++ } ++ return 0; ++} ++ ++static int e1c_place_named(const void *fit, int conf_off, const char *prop, ++ ulong *load_out, ulong *entry_out, bool required) ++{ ++ int img_off; ++ ++ img_off = fit_conf_get_prop_node(fit, conf_off, prop); ++ if (img_off < 0) { ++ if (required) { ++ printf("e1c-boot: config has no '%s' image\n", prop); ++ return -1; ++ } ++ return 0; ++ } ++ return e1c_place_image(fit, img_off, prop, load_out, entry_out); ++} ++ ++static int e1c_place_loadables(const void *fit, int conf_off) ++{ ++ const char *uname; ++ int idx; ++ ++ for (idx = 0; ++ (uname = fdt_stringlist_get(fit, conf_off, FIT_LOADABLE_PROP, ++ idx, NULL)) != NULL; ++ idx++) { ++ int img_off = fit_image_get_node(fit, uname); ++ ++ if (img_off < 0) { ++ printf("e1c-boot: loadable '%s' not found\n", uname); ++ return -1; ++ } ++ if (e1c_place_image(fit, img_off, uname, NULL, NULL)) ++ return -1; ++ } ++ return 0; ++} ++ ++static int e1c_load_fit(ulong fit_addr, const char *conf_name, ++ ulong *kernel_entry, ulong *fdt_load) ++{ ++ const void *fit = (const void *)fit_addr; ++ int conf_off; ++ ++ if (fit_check_format(fit, IMAGE_SIZE_INVAL)) { ++ printf("e1c-boot: invalid FIT at 0x%lx\n", fit_addr); ++ return -1; ++ } ++ ++ conf_off = fit_conf_get_node(fit, conf_name); ++ if (conf_off < 0) { ++ printf("e1c-boot: config '%s' not found at 0x%lx\n", ++ conf_name ? conf_name : "", fit_addr); ++ return -1; ++ } ++ ++ if (e1c_place_named(fit, conf_off, FIT_KERNEL_PROP, NULL, ++ kernel_entry, kernel_entry != NULL)) ++ return -1; ++ ++ if (e1c_place_named(fit, conf_off, FIT_FDT_PROP, fdt_load, ++ NULL, false)) ++ return -1; ++ ++ if (e1c_place_named(fit, conf_off, FIT_RAMDISK_PROP, NULL, ++ NULL, false)) ++ return -1; ++ ++ if (e1c_place_loadables(fit, conf_off)) ++ return -1; ++ ++ return 0; ++} ++ ++static int do_e1c_boot(struct cmd_tbl *cmdtp, int flag, int argc, ++ char *const argv[]) ++{ ++ ulong avz_itb, e1c_itb, avz_entry = 0, capsule_fdt = 0; ++ ++ if (argc != 3) ++ return CMD_RET_USAGE; ++ ++ avz_itb = simple_strtoul(argv[1], NULL, 16); ++ e1c_itb = simple_strtoul(argv[2], NULL, 16); ++ ++ printf("e1c-boot: AVZ ITB @ 0x%lx, e1c ITB @ 0x%lx\n", ++ avz_itb, e1c_itb); ++ ++ if (e1c_load_fit(avz_itb, "avz", &avz_entry, NULL)) ++ return CMD_RET_FAILURE; ++ if (!avz_entry) { ++ printf("e1c-boot: AVZ config has no kernel entry\n"); ++ return CMD_RET_FAILURE; ++ } ++ ++ if (e1c_load_fit(e1c_itb, "capsule", NULL, &capsule_fdt)) ++ return CMD_RET_FAILURE; ++ ++ /* Propagate U-Boot's bootargs env into the guest FDT's /chosen so the ++ * guest kernel sees the cmdline. e1c-boot replaces bootm's standard ++ * fdt_chosen() call — without this, the guest kernel cmdline is empty ++ * and OSTree-aware initramfs (e.g. TorizonOS) can't find its root. */ ++ if (capsule_fdt) { ++ void *fdt = (void *)capsule_fdt; ++ const char *ba = env_get("bootargs"); ++ int ret; ++ ++ printf("e1c-boot: capsule fdt @ 0x%lx, bootargs=[%s]\n", ++ capsule_fdt, ba ? ba : ""); ++ ++ /* The guest DTB is tightly packed by mkimage and has no room ++ * for fdt_chosen() to add bootargs (FDT_ERR_NOSPACE). Expand ++ * in place with 4 KiB headroom — plenty for bootargs + any ++ * extra props AVZ injects later. */ ++ ret = fdt_open_into(fdt, fdt, fdt_totalsize(fdt) + 0x1000); ++ if (ret < 0) { ++ printf("e1c-boot: WARN: fdt_open_into failed (%d)\n", ++ ret); ++ } ++ ++ ret = fdt_chosen(fdt); ++ if (ret < 0) ++ printf("e1c-boot: WARN: fdt_chosen failed (%d)\n", ret); ++ else ++ flush_cache(capsule_fdt, fdt_totalsize(fdt)); ++ } ++ ++ printf("e1c-boot: jumping to AVZ at 0x%lx (capsule ITB @ 0x%lx)\n", ++ avz_entry, e1c_itb); ++ ++ cleanup_before_linux(); ++ ++ armv8_switch_to_el2(avz_itb, e1c_itb, 0, 0, avz_entry, ++ ES_TO_AARCH64); ++ ++ return CMD_RET_FAILURE; ++} ++ ++#ifdef CONFIG_SYS_LONGHELP ++static char e1c_boot_help_text[] = ++ " \n" ++ " - Parse the AVZ FIT and the e1c capsule FIT loaded at the given\n" ++ " addresses, place every kernel/fdt/ramdisk/loadable at its\n" ++ " declared load address, then jump to the AVZ entry point with:\n" ++ " x0 = avz_itb_addr (AVZ scans this FIT for its avz_dt)\n" ++ " x1 = e1c_itb_addr (AVZ uses this FIT to load the guest)"; ++#endif ++ ++ll_entry_declare(struct cmd_tbl, e1c_boot, cmd) = { ++ "e1c-boot", 3, cmd_never_repeatable, do_e1c_boot, ++ "boot AVZ hypervisor with an e1c capsule", ++#ifdef CONFIG_SYS_LONGHELP ++ e1c_boot_help_text ++#endif ++}; diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0008-setexpr.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0008-setexpr.c.patch deleted file mode 100644 index fe39ff1..0000000 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0008-setexpr.c.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- /home/rossierd/soo/git/infrabase/build/tmp/work/uboot-2022.04-r0/uboot-2022.04/cmd/setexpr.c 2025-09-11 16:44:26.716036695 +0200 -+++ ./cmd/setexpr.c 2025-09-11 16:34:39.229143872 +0200 -@@ -11,7 +11,7 @@ - #include - #include - #include --#include -+#include - #include - #include - #include diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0009-Kconfig.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0009-Kconfig.patch index 27a4792..a6ea229 100644 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0009-Kconfig.patch +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0009-Kconfig.patch @@ -1,17 +1,19 @@ ---- /home/rossierd/soo/git/infrabase/build/tmp/work/uboot-2022.04-r0/uboot-2022.04/common/Kconfig 2025-09-11 16:44:26.717830853 +0200 -+++ ./common/Kconfig 2025-09-11 16:34:39.289787151 +0200 -@@ -850,6 +850,14 @@ +--- a/cmd/Kconfig ++++ b/cmd/Kconfig +@@ -213,6 +213,16 @@ + help + Boot an AArch64 Linux Kernel image from memory. - endmenu - -+# EDGEMTech (DT) -+config USE_RPI4_DTB_WITH_FIT -+ bool "Activate this config to be able to use a FIT image without a DTB specified" -+ depends on BCM2711 -+ default false ++config CMD_E1C_BOOT ++ bool "e1c-boot" ++ depends on ARM64 && FIT + help -+ Indicate to U-Boot that it must use the RPi4 SPL DTB and not a DTB from the FIT -+ - source "common/spl/Kconfig" - - config IMAGE_SIGN_INFO ++ Boot the AVZ hypervisor together with an e1c capsule (Linux guest) ++ from two separate FIT images. Each FIT is parsed individually; every ++ declared kernel/fdt/ramdisk/loadable is copied to its load address, ++ then control is transferred to the AVZ entry point with the AVZ FIT ++ base in x0 and the capsule FIT base in x1. ++ + config BOOTM_LINUX + bool "Support booting Linux OS images" + depends on CMD_BOOTM || CMD_BOOTZ || CMD_BOOTI diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0010-Makefile.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0010-Makefile.patch new file mode 100644 index 0000000..7e732c0 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0010-Makefile.patch @@ -0,0 +1,10 @@ +--- a/cmd/Makefile ++++ b/cmd/Makefile +@@ -54,6 +54,7 @@ + obj-$(CONFIG_CMD_ADTIMG) += adtimg.o + obj-$(CONFIG_CMD_ABOOTIMG) += abootimg.o + obj-$(CONFIG_CMD_EXTENSION) += extension_board.o ++obj-$(CONFIG_CMD_E1C_BOOT) += e1c_boot.o + obj-$(CONFIG_CMD_ECHO) += echo.o + obj-$(CONFIG_ENV_IS_IN_EEPROM) += eeprom.o + obj-$(CONFIG_CMD_EEPROM) += eeprom.o diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0011-setexpr.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0011-setexpr.c.patch new file mode 100644 index 0000000..008c278 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0011-setexpr.c.patch @@ -0,0 +1,11 @@ +--- a/cmd/setexpr.c ++++ b/cmd/setexpr.c +@@ -11,7 +11,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + #include diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0012-Kconfig.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0012-Kconfig.patch new file mode 100644 index 0000000..f78de70 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0012-Kconfig.patch @@ -0,0 +1,17 @@ +--- a/common/Kconfig ++++ b/common/Kconfig +@@ -850,6 +850,14 @@ + + endmenu + ++# EDGEMTech (DT) ++config USE_RPI4_DTB_WITH_FIT ++ bool "Activate this config to be able to use a FIT image without a DTB specified" ++ depends on BCM2711 ++ default false ++ help ++ Indicate to U-Boot that it must use the RPi4 SPL DTB and not a DTB from the FIT ++ + source "common/spl/Kconfig" + + config IMAGE_SIGN_INFO diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0010-am335x_evm_defconfig.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0013-am335x_evm_defconfig.patch similarity index 93% rename from build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0010-am335x_evm_defconfig.patch rename to build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0013-am335x_evm_defconfig.patch index 5aa354c..c5ce112 100644 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0010-am335x_evm_defconfig.patch +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0013-am335x_evm_defconfig.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/git/infrabase/build/tmp/work/uboot-2022.04-r0/uboot-2022.04/configs/am335x_evm_defconfig 2025-09-11 16:44:26.727028493 +0200 -+++ ./configs/am335x_evm_defconfig 2025-09-11 16:34:39.224756147 +0200 +--- a/configs/am335x_evm_defconfig ++++ b/configs/am335x_evm_defconfig @@ -2,7 +2,7 @@ CONFIG_ARCH_CPU_INIT=y CONFIG_ARCH_OMAP2PLUS=y diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0011-am57xx_evm_defconfig.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0014-am57xx_evm_defconfig.patch similarity index 91% rename from build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0011-am57xx_evm_defconfig.patch rename to build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0014-am57xx_evm_defconfig.patch index c09bd8f..f3cc232 100644 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0011-am57xx_evm_defconfig.patch +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0014-am57xx_evm_defconfig.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/git/infrabase/build/tmp/work/uboot-2022.04-r0/uboot-2022.04/configs/am57xx_evm_defconfig 2025-09-11 16:44:26.728028519 +0200 -+++ ./configs/am57xx_evm_defconfig 2025-09-11 16:34:39.221140750 +0200 +--- a/configs/am57xx_evm_defconfig ++++ b/configs/am57xx_evm_defconfig @@ -5,12 +5,11 @@ CONFIG_NR_DRAM_BANKS=2 CONFIG_DM_GPIO=y diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0012-rpi_4_32b_defconfig.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0015-rpi_4_32b_defconfig.patch similarity index 99% rename from build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0012-rpi_4_32b_defconfig.patch rename to build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0015-rpi_4_32b_defconfig.patch index c500016..7ed0b60 100644 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0012-rpi_4_32b_defconfig.patch +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0015-rpi_4_32b_defconfig.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/git/infrabase/build/tmp/work/uboot-2022.04-r0/uboot-2022.04/configs/rpi_4_32b_defconfig 2025-09-11 16:44:26.746028984 +0200 -+++ ./configs/rpi_4_32b_defconfig 2025-09-11 16:34:39.224773816 +0200 +--- a/configs/rpi_4_32b_defconfig ++++ b/configs/rpi_4_32b_defconfig @@ -1,66 +1,1541 @@ +# +# Automatically generated file; DO NOT EDIT. diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0013-rpi4_64_defconfig.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0016-rpi4_64_defconfig.patch similarity index 99% rename from build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0013-rpi4_64_defconfig.patch rename to build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0016-rpi4_64_defconfig.patch index ee13be1..49306a8 100644 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0013-rpi4_64_defconfig.patch +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0016-rpi4_64_defconfig.patch @@ -1,6 +1,6 @@ ---- /home/rossierd/soo/git/infrabase/build/tmp/work/uboot-2022.04-r0/uboot-2022.04/configs/rpi4_64_defconfig 1970-01-01 01:00:00.000000000 +0100 -+++ ./configs/rpi4_64_defconfig 2025-09-11 16:34:39.206987204 +0200 -@@ -0,0 +1,1514 @@ +--- a/configs/rpi4_64_defconfig ++++ b/configs/rpi4_64_defconfig +@@ -0,0 +1,1515 @@ +# +# Automatically generated file; DO NOT EDIT. +# U-Boot 2022.04 Configuration @@ -62,8 +62,9 @@ +# CONFIG_SEMIHOSTING is not set +# CONFIG_SYS_L2CACHE_OFF is not set +# CONFIG_ENABLE_ARM_SOC_BOOT0_HOOK is not set -+# CONFIG_USE_ARCH_MEMCPY is not set -+# CONFIG_USE_ARCH_MEMSET is not set ++CONFIG_USE_ARCH_MEMCPY=y ++CONFIG_USE_ARCH_MEMMOVE=y ++CONFIG_USE_ARCH_MEMSET=y +CONFIG_ARM64_SUPPORT_AARCH32=y +# CONFIG_ARCH_AT91 is not set +# CONFIG_ARCH_DAVINCI is not set diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0016-virt64_defconfig.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0016-virt64_defconfig.patch deleted file mode 100644 index 38baa16..0000000 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0016-virt64_defconfig.patch +++ /dev/null @@ -1,1376 +0,0 @@ ---- /home/rossierd/soo/git/infrabase/build/tmp/work/uboot-2022.04-r0/uboot-2022.04/configs/virt64_defconfig 1970-01-01 01:00:00.000000000 +0100 -+++ ./configs/virt64_defconfig 2025-09-11 16:34:39.207286547 +0200 -@@ -0,0 +1,1373 @@ -+# -+# Automatically generated file; DO NOT EDIT. -+# U-Boot 2022.04 Configuration -+# -+ -+# -+# Compiler: aarch64-linux-gnu-gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0 -+# -+CONFIG_CREATE_ARCH_SYMLINK=y -+CONFIG_SYS_CACHE_SHIFT_6=y -+CONFIG_SYS_CACHELINE_SIZE=64 -+CONFIG_LINKER_LIST_ALIGN=8 -+# CONFIG_ARC is not set -+CONFIG_ARM=y -+# CONFIG_M68K is not set -+# CONFIG_MICROBLAZE is not set -+# CONFIG_MIPS is not set -+# CONFIG_NDS32 is not set -+# CONFIG_NIOS2 is not set -+# CONFIG_PPC is not set -+# CONFIG_RISCV is not set -+# CONFIG_SANDBOX is not set -+# CONFIG_SH is not set -+# CONFIG_X86 is not set -+# CONFIG_XTENSA is not set -+CONFIG_SYS_ARCH="arm" -+CONFIG_SYS_CPU="armv8" -+CONFIG_SYS_VENDOR="emulation" -+CONFIG_SYS_BOARD="qemu-arm" -+CONFIG_SYS_CONFIG_NAME="qemu-arm" -+# CONFIG_SKIP_LOWLEVEL_INIT is not set -+# CONFIG_SKIP_LOWLEVEL_INIT_ONLY is not set -+# CONFIG_SYS_ICACHE_OFF is not set -+# CONFIG_SYS_DCACHE_OFF is not set -+ -+# -+# ARM architecture -+# -+CONFIG_ARM64=y -+CONFIG_ARM64_CRC32=y -+# CONFIG_POSITION_INDEPENDENT is not set -+# CONFIG_INIT_SP_RELATIVE is not set -+# CONFIG_GIC_V3_ITS is not set -+CONFIG_STATIC_RELA=y -+CONFIG_DMA_ADDR_T_64BIT=y -+CONFIG_ARM_ASM_UNIFIED=y -+# CONFIG_SYS_ARM_CACHE_CP15 is not set -+# CONFIG_SYS_ARM_MMU is not set -+# CONFIG_SYS_ARM_MPU is not set -+CONFIG_SYS_ARM_ARCH=8 -+CONFIG_SYS_ARM_CACHE_WRITEBACK=y -+# CONFIG_SYS_ARM_CACHE_WRITETHROUGH is not set -+# CONFIG_SYS_ARM_CACHE_WRITEALLOC is not set -+# CONFIG_ARCH_CPU_INIT is not set -+CONFIG_SYS_ARCH_TIMER=y -+CONFIG_ARM_SMCCC=y -+# CONFIG_SEMIHOSTING is not set -+# CONFIG_SYS_L2CACHE_OFF is not set -+# CONFIG_ENABLE_ARM_SOC_BOOT0_HOOK is not set -+# CONFIG_USE_ARCH_MEMCPY is not set -+# CONFIG_USE_ARCH_MEMSET is not set -+CONFIG_ARM64_SUPPORT_AARCH32=y -+# CONFIG_ARCH_AT91 is not set -+# CONFIG_ARCH_DAVINCI is not set -+# CONFIG_ARCH_KIRKWOOD is not set -+# CONFIG_ARCH_MVEBU is not set -+# CONFIG_ARCH_ORION5X is not set -+# CONFIG_TARGET_STV0991 is not set -+# CONFIG_ARCH_BCM283X is not set -+# CONFIG_ARCH_BCM63158 is not set -+# CONFIG_ARCH_BCM68360 is not set -+# CONFIG_ARCH_BCM6858 is not set -+# CONFIG_ARCH_BCMSTB is not set -+# CONFIG_TARGET_VEXPRESS_CA9X4 is not set -+# CONFIG_TARGET_BCMCYGNUS is not set -+# CONFIG_TARGET_BCMNS2 is not set -+# CONFIG_TARGET_BCMNS3 is not set -+# CONFIG_ARCH_EXYNOS is not set -+# CONFIG_ARCH_S5PC1XX is not set -+# CONFIG_ARCH_HIGHBANK is not set -+# CONFIG_ARCH_INTEGRATOR is not set -+# CONFIG_ARCH_IPQ40XX is not set -+# CONFIG_ARCH_KEYSTONE is not set -+# CONFIG_ARCH_K3 is not set -+# CONFIG_ARCH_OMAP2PLUS is not set -+# CONFIG_ARCH_MESON is not set -+# CONFIG_ARCH_MEDIATEK is not set -+# CONFIG_ARCH_LPC32XX is not set -+# CONFIG_ARCH_IMX8 is not set -+# CONFIG_ARCH_IMX8M is not set -+# CONFIG_ARCH_IMX8ULP is not set -+# CONFIG_ARCH_IMXRT is not set -+# CONFIG_ARCH_MX23 is not set -+# CONFIG_ARCH_MX28 is not set -+# CONFIG_ARCH_MX31 is not set -+# CONFIG_ARCH_MX7ULP is not set -+# CONFIG_ARCH_MX7 is not set -+# CONFIG_ARCH_MX6 is not set -+CONFIG_SPL_LDSCRIPT="arch/arm/cpu/armv8/u-boot-spl.lds" -+# CONFIG_ARCH_MX5 is not set -+# CONFIG_ARCH_NEXELL is not set -+# CONFIG_ARCH_APPLE is not set -+# CONFIG_ARCH_OWL is not set -+CONFIG_ARCH_QEMU=y -+# CONFIG_ARCH_RMOBILE is not set -+# CONFIG_ARCH_SNAPDRAGON is not set -+# CONFIG_ARCH_SOCFPGA is not set -+# CONFIG_ARCH_SUNXI is not set -+# CONFIG_ARCH_U8500 is not set -+# CONFIG_ARCH_VERSAL is not set -+# CONFIG_ARCH_VF610 is not set -+# CONFIG_ARCH_ZYNQ is not set -+# CONFIG_ARCH_ZYNQMP_R5 is not set -+# CONFIG_ARCH_ZYNQMP is not set -+# CONFIG_ARCH_TEGRA is not set -+# CONFIG_TARGET_VEXPRESS64_AEMV8A is not set -+# CONFIG_TARGET_VEXPRESS64_BASE_FVP is not set -+# CONFIG_TARGET_VEXPRESS64_JUNO is not set -+# CONFIG_TARGET_TOTAL_COMPUTE is not set -+# CONFIG_TARGET_LS2080A_EMU is not set -+# CONFIG_TARGET_LS1088AQDS is not set -+# CONFIG_TARGET_LS2080AQDS is not set -+# CONFIG_TARGET_LS2080ARDB is not set -+# CONFIG_TARGET_LS2081ARDB is not set -+# CONFIG_TARGET_LX2160ARDB is not set -+# CONFIG_TARGET_LX2160AQDS is not set -+# CONFIG_TARGET_LX2162AQDS is not set -+# CONFIG_TARGET_HIKEY is not set -+# CONFIG_TARGET_HIKEY960 is not set -+# CONFIG_TARGET_POPLAR is not set -+# CONFIG_TARGET_LS1012AQDS is not set -+# CONFIG_TARGET_LS1012ARDB is not set -+# CONFIG_TARGET_LS1012A2G5RDB is not set -+# CONFIG_TARGET_LS1012AFRWY is not set -+# CONFIG_TARGET_LS1012AFRDM is not set -+# CONFIG_TARGET_LS1028AQDS is not set -+# CONFIG_TARGET_LS1028ARDB is not set -+# CONFIG_TARGET_LS1088ARDB is not set -+# CONFIG_TARGET_LS1021AQDS is not set -+# CONFIG_TARGET_LS1021ATWR is not set -+# CONFIG_TARGET_PG_WCOM_SELI8 is not set -+# CONFIG_TARGET_PG_WCOM_EXPU1 is not set -+# CONFIG_TARGET_LS1021ATSN is not set -+# CONFIG_TARGET_LS1021AIOT is not set -+# CONFIG_TARGET_LS1043AQDS is not set -+# CONFIG_TARGET_LS1043ARDB is not set -+# CONFIG_TARGET_LS1046AQDS is not set -+# CONFIG_TARGET_LS1046ARDB is not set -+# CONFIG_TARGET_LS1046AFRWY is not set -+# CONFIG_TARGET_SL28 is not set -+# CONFIG_TARGET_TEN64 is not set -+# CONFIG_TARGET_COLIBRI_PXA270 is not set -+# CONFIG_ARCH_UNIPHIER is not set -+# CONFIG_ARCH_SYNQUACER is not set -+# CONFIG_ARCH_STM32 is not set -+# CONFIG_ARCH_STI is not set -+# CONFIG_ARCH_STM32MP is not set -+# CONFIG_ARCH_ROCKCHIP is not set -+# CONFIG_ARCH_OCTEONTX is not set -+# CONFIG_ARCH_OCTEONTX2 is not set -+# CONFIG_TARGET_THUNDERX_88XX is not set -+# CONFIG_ARCH_ASPEED is not set -+# CONFIG_TARGET_DURIAN is not set -+# CONFIG_TARGET_PRESIDIO_ASIC is not set -+# CONFIG_TARGET_XENGUEST_ARM64 is not set -+# CONFIG_STATIC_MACH_TYPE is not set -+CONFIG_SYS_TEXT_BASE=0x00000000 -+CONFIG_SYS_MALLOC_LEN=0x400000 -+CONFIG_SYS_MALLOC_F_LEN=0x400 -+CONFIG_NR_DRAM_BANKS=1 -+CONFIG_BOARD_SPECIFIC_OPTIONS=y -+CONFIG_ENV_SIZE=0x1f000 -+# CONFIG_DM_GPIO is not set -+CONFIG_DEFAULT_DEVICE_TREE="qemu-arm64" -+CONFIG_MULTI_DTB_FIT_UNCOMPRESS_SZ=0x8000 -+# CONFIG_TARGET_QEMU_ARM_32BIT is not set -+CONFIG_TARGET_QEMU_ARM_64BIT=y -+CONFIG_ERR_PTR_OFFSET=0x0 -+CONFIG_BOOTSTAGE_STASH_ADDR=0 -+CONFIG_IDENT_STRING="" -+CONFIG_SYS_CLK_FREQ=0 -+# CONFIG_CHIP_DIP_SCAN is not set -+# CONFIG_ARMV8_MULTIENTRY is not set -+# CONFIG_ARMV8_SET_SMPEN is not set -+ -+# -+# ARMv8 secure monitor firmware -+# -+# CONFIG_ARMV8_SEC_FIRMWARE_SUPPORT is not set -+# CONFIG_SPL_ARMV8_SEC_FIRMWARE_SUPPORT is not set -+# CONFIG_SPL_RECOVER_DATA_SECTION is not set -+CONFIG_PSCI_RESET=y -+# CONFIG_ARMV8_PSCI is not set -+# CONFIG_ARMV8_EA_EL3_FIRST is not set -+# CONFIG_CMD_DEKBLOB is not set -+# CONFIG_IMX_CAAM_DEK_ENCAP is not set -+# CONFIG_IMX_OPTEE_DEK_ENCAP is not set -+# CONFIG_IMX_SECO_DEK_ENCAP is not set -+# CONFIG_CMD_HDMIDETECT is not set -+CONFIG_IMX_DCD_ADDR=0x00910000 -+ -+# -+# ARM debug -+# -+CONFIG_BUILD_TARGET="" -+# CONFIG_SYS_PCI_64BIT is not set -+# CONFIG_DEBUG_UART is not set -+CONFIG_AHCI=y -+# CONFIG_OF_BOARD_FIXUP is not set -+ -+# -+# General setup -+# -+CONFIG_LOCALVERSION="" -+CONFIG_LOCALVERSION_AUTO=y -+CONFIG_CC_IS_GCC=y -+CONFIG_GCC_VERSION=110400 -+CONFIG_CLANG_VERSION=0 -+CONFIG_CC_OPTIMIZE_FOR_SIZE=y -+# CONFIG_OPTIMIZE_INLINING is not set -+CONFIG_ARCH_SUPPORTS_LTO=y -+# CONFIG_LTO is not set -+CONFIG_CC_HAS_ASM_INLINE=y -+# CONFIG_XEN is not set -+CONFIG_DISTRO_DEFAULTS=y -+CONFIG_ENV_VARS_UBOOT_CONFIG=y -+# CONFIG_SYS_BOOT_GET_CMDLINE is not set -+# CONFIG_SYS_BOOT_GET_KBD is not set -+CONFIG_SYS_MALLOC_F=y -+CONFIG_EXPERT=y -+CONFIG_SYS_MALLOC_CLEAR_ON_INIT=y -+# CONFIG_SYS_MALLOC_DEFAULT_TO_INIT is not set -+# CONFIG_TOOLS_DEBUG is not set -+CONFIG_PHYS_64BIT=y -+# CONFIG_REMAKE_ELF is not set -+# CONFIG_SYS_CUSTOM_LDSCRIPT is not set -+CONFIG_SYS_LOAD_ADDR=0x1000000 -+CONFIG_PLATFORM_ELFENTRY="_start" -+CONFIG_STACK_SIZE=0x1000000 -+CONFIG_SYS_SRAM_BASE=0x0 -+CONFIG_SYS_SRAM_SIZE=0x0 -+# CONFIG_MP is not set -+CONFIG_EXAMPLES=y -+ -+# -+# API -+# -+# CONFIG_API is not set -+ -+# -+# Boot options -+# -+ -+# -+# Boot images -+# -+# CONFIG_ANDROID_BOOT_IMAGE is not set -+CONFIG_FIT=y -+# CONFIG_TIMESTAMP is not set -+CONFIG_FIT_EXTERNAL_OFFSET=0x0 -+CONFIG_FIT_FULL_CHECK=y -+# CONFIG_FIT_SIGNATURE is not set -+# CONFIG_FIT_CIPHER is not set -+CONFIG_FIT_VERBOSE=y -+# CONFIG_FIT_BEST_MATCH is not set -+CONFIG_FIT_PRINT=y -+CONFIG_LEGACY_IMAGE_FORMAT=y -+CONFIG_SUPPORT_RAW_INITRD=y -+# CONFIG_OF_BOARD_SETUP is not set -+# CONFIG_OF_SYSTEM_SETUP is not set -+# CONFIG_OF_STDOUT_VIA_ALIAS is not set -+CONFIG_SYS_EXTRA_OPTIONS="" -+CONFIG_HAVE_SYS_TEXT_BASE=y -+# CONFIG_DYNAMIC_SYS_CLK_FREQ is not set -+# CONFIG_ARCH_FIXUP_FDT_MEMORY is not set -+# CONFIG_CHROMEOS is not set -+# CONFIG_CHROMEOS_VBOOT is not set -+# CONFIG_RAMBOOT_PBL is not set -+ -+# -+# Boot timing -+# -+# CONFIG_BOOTSTAGE is not set -+CONFIG_BOOTSTAGE_STASH_SIZE=0x1000 -+# CONFIG_SHOW_BOOT_PROGRESS is not set -+ -+# -+# Boot media -+# -+# CONFIG_NAND_BOOT is not set -+# CONFIG_ONENAND_BOOT is not set -+# CONFIG_QSPI_BOOT is not set -+# CONFIG_SATA_BOOT is not set -+# CONFIG_SD_BOOT is not set -+# CONFIG_SD_BOOT_QSPI is not set -+# CONFIG_SPI_BOOT is not set -+ -+# -+# Autoboot options -+# -+CONFIG_AUTOBOOT=y -+CONFIG_BOOTDELAY=2 -+# CONFIG_AUTOBOOT_KEYED is not set -+# CONFIG_AUTOBOOT_USE_MENUKEY is not set -+# CONFIG_USE_BOOTARGS is not set -+# CONFIG_BOOTARGS_SUBST is not set -+# CONFIG_USE_BOOTCOMMAND is not set -+# CONFIG_USE_PREBOOT is not set -+CONFIG_DEFAULT_FDT_FILE="" -+ -+# -+# Console -+# -+CONFIG_MENU=y -+# CONFIG_CONSOLE_RECORD is not set -+# CONFIG_DISABLE_CONSOLE is not set -+CONFIG_LOGLEVEL=4 -+CONFIG_SPL_LOGLEVEL=4 -+CONFIG_TPL_LOGLEVEL=4 -+# CONFIG_SILENT_CONSOLE is not set -+# CONFIG_PRE_CONSOLE_BUFFER is not set -+# CONFIG_CONSOLE_MUX is not set -+# CONFIG_SYS_CONSOLE_IS_IN_ENV is not set -+# CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE is not set -+# CONFIG_SYS_CONSOLE_ENV_OVERWRITE is not set -+# CONFIG_SYS_CONSOLE_INFO_QUIET is not set -+# CONFIG_SYS_STDIO_DEREGISTER is not set -+# CONFIG_SPL_SYS_STDIO_DEREGISTER is not set -+# CONFIG_SYS_DEVICE_NULLDEV is not set -+ -+# -+# Logging -+# -+# CONFIG_LOG is not set -+ -+# -+# Init options -+# -+# CONFIG_BOARD_TYPES is not set -+# CONFIG_DISPLAY_CPUINFO is not set -+# CONFIG_DISPLAY_BOARDINFO is not set -+# CONFIG_DISPLAY_BOARDINFO_LATE is not set -+ -+# -+# Start-up hooks -+# -+# CONFIG_ARCH_EARLY_INIT_R is not set -+# CONFIG_ARCH_MISC_INIT is not set -+# CONFIG_BOARD_EARLY_INIT_F is not set -+# CONFIG_BOARD_EARLY_INIT_R is not set -+CONFIG_BOARD_LATE_INIT=y -+# CONFIG_LAST_STAGE_INIT is not set -+# CONFIG_MISC_INIT_F is not set -+# CONFIG_MISC_INIT_R is not set -+# CONFIG_ID_EEPROM is not set -+# CONFIG_PCI_INIT_R is not set -+ -+# -+# Security support -+# -+CONFIG_HASH=y -+# CONFIG_STACKPROTECTOR is not set -+ -+# -+# Update support -+# -+# CONFIG_UPDATE_TFTP is not set -+# CONFIG_ANDROID_AB is not set -+ -+# -+# Blob list -+# -+# CONFIG_BLOBLIST is not set -+ -+# -+# SPL / TPL -+# -+CONFIG_SPL_SYS_STACK_F_CHECK_BYTE=0xaa -+# CONFIG_SPL_SYS_REPORT_STACK_F_USAGE is not set -+# CONFIG_SPL_SHOW_ERRORS is not set -+ -+# -+# PowerPC and LayerScape SPL Boot options -+# -+# CONFIG_SPL_MD5 is not set -+# CONFIG_FDT_SIMPLEFB is not set -+ -+# -+# Command line interface -+# -+CONFIG_CMDLINE=y -+CONFIG_HUSH_PARSER=y -+CONFIG_CMDLINE_EDITING=y -+CONFIG_AUTO_COMPLETE=y -+CONFIG_SYS_LONGHELP=y -+CONFIG_SYS_PROMPT="=> " -+CONFIG_SYS_PROMPT_HUSH_PS2="> " -+CONFIG_SYS_XTRACE=y -+ -+# -+# Commands -+# -+ -+# -+# Info commands -+# -+CONFIG_CMD_BDI=y -+# CONFIG_CMD_CONFIG is not set -+# CONFIG_CMD_CONSOLE is not set -+# CONFIG_CMD_LICENSE is not set -+# CONFIG_CMD_PMC is not set -+ -+# -+# Boot commands -+# -+# CONFIG_CMD_BOOTD is not set -+CONFIG_CMD_BOOTM=y -+CONFIG_BOOTM_EFI=y -+# CONFIG_CMD_BOOTZ is not set -+CONFIG_CMD_BOOTI=y -+CONFIG_BOOTM_LINUX=y -+CONFIG_BOOTM_NETBSD=y -+# CONFIG_BOOTM_OPENRTOS is not set -+# CONFIG_BOOTM_OSE is not set -+CONFIG_BOOTM_PLAN9=y -+CONFIG_BOOTM_RTEMS=y -+CONFIG_BOOTM_VXWORKS=y -+CONFIG_CMD_BOOTEFI=y -+CONFIG_CMD_BOOTEFI_HELLO_COMPILE=y -+# CONFIG_CMD_BOOTEFI_HELLO is not set -+CONFIG_CMD_BOOTEFI_SELFTEST=y -+# CONFIG_CMD_BOOTMENU is not set -+# CONFIG_CMD_ADTIMG is not set -+CONFIG_CMD_ELF=y -+CONFIG_CMD_FDT=y -+CONFIG_CMD_GO=y -+CONFIG_CMD_RUN=y -+CONFIG_CMD_IMI=y -+# CONFIG_CMD_IMLS is not set -+# CONFIG_CMD_XIMG is not set -+# CONFIG_CMD_THOR_DOWNLOAD is not set -+# CONFIG_CMD_ZBOOT is not set -+ -+# -+# Environment commands -+# -+# CONFIG_CMD_ASKENV is not set -+CONFIG_CMD_EXPORTENV=y -+CONFIG_CMD_IMPORTENV=y -+# CONFIG_CMD_EDITENV is not set -+# CONFIG_CMD_GREPENV is not set -+CONFIG_CMD_SAVEENV=y -+# CONFIG_CMD_ERASEENV is not set -+CONFIG_CMD_ENV_EXISTS=y -+# CONFIG_CMD_ENV_CALLBACK is not set -+# CONFIG_CMD_ENV_FLAGS is not set -+# CONFIG_CMD_NVEDIT_EFI is not set -+# CONFIG_CMD_NVEDIT_INFO is not set -+# CONFIG_CMD_NVEDIT_LOAD is not set -+# CONFIG_CMD_NVEDIT_SELECT is not set -+ -+# -+# Memory commands -+# -+# CONFIG_CMD_BINOP is not set -+# CONFIG_CMD_BLOBLIST is not set -+CONFIG_CMD_CRC32=y -+# CONFIG_CRC32_VERIFY is not set -+# CONFIG_CMD_EEPROM is not set -+# CONFIG_LOOPW is not set -+# CONFIG_CMD_MD5SUM is not set -+# CONFIG_CMD_MEMINFO is not set -+CONFIG_CMD_MEMORY=y -+# CONFIG_CMD_MEM_SEARCH is not set -+# CONFIG_CMD_MX_CYCLIC is not set -+CONFIG_CMD_RANDOM=y -+# CONFIG_CMD_MEMTEST is not set -+# CONFIG_CMD_SHA1SUM is not set -+# CONFIG_CMD_STRINGS is not set -+ -+# -+# Compression commands -+# -+# CONFIG_CMD_LZMADEC is not set -+CONFIG_CMD_UNLZ4=y -+# CONFIG_CMD_UNZIP is not set -+# CONFIG_CMD_ZIP is not set -+ -+# -+# Device access commands -+# -+# CONFIG_CMD_ARMFLASH is not set -+# CONFIG_CMD_BIND is not set -+# CONFIG_CMD_CLK is not set -+# CONFIG_CMD_DEMO is not set -+# CONFIG_CMD_DFU is not set -+# CONFIG_CMD_DM is not set -+# CONFIG_CMD_FPGAD is not set -+# CONFIG_CMD_FUSE is not set -+# CONFIG_CMD_GPIO is not set -+# CONFIG_CMD_GPT is not set -+# CONFIG_RANDOM_UUID is not set -+# CONFIG_CMD_IDE is not set -+# CONFIG_CMD_IO is not set -+# CONFIG_CMD_IOTRACE is not set -+# CONFIG_CMD_I2C is not set -+# CONFIG_CMD_LOADB is not set -+# CONFIG_CMD_LOADS is not set -+# CONFIG_CMD_LSBLK is not set -+# CONFIG_CMD_MBR is not set -+# CONFIG_CMD_CLONE is not set -+# CONFIG_CMD_OSD is not set -+CONFIG_CMD_PART=y -+# CONFIG_CMD_PCI is not set -+# CONFIG_CMD_POWEROFF is not set -+# CONFIG_CMD_READ is not set -+# CONFIG_CMD_SATA is not set -+# CONFIG_CMD_SAVES is not set -+CONFIG_CMD_SCSI=y -+# CONFIG_CMD_SDRAM is not set -+# CONFIG_CMD_TSI148 is not set -+# CONFIG_CMD_UNIVERSE is not set -+# CONFIG_CMD_USB_SDP is not set -+CONFIG_CMD_VIRTIO=y -+ -+# -+# Shell scripting commands -+# -+CONFIG_CMD_ECHO=y -+# CONFIG_CMD_ITEST is not set -+CONFIG_CMD_SOURCE=y -+# CONFIG_CMD_SETEXPR is not set -+ -+# -+# Android support commands -+# -+CONFIG_CMD_NET=y -+CONFIG_CMD_BOOTP=y -+CONFIG_CMD_DHCP=y -+CONFIG_BOOTP_BOOTPATH=y -+CONFIG_BOOTP_DNS=y -+# CONFIG_BOOTP_DNS2 is not set -+CONFIG_BOOTP_GATEWAY=y -+CONFIG_BOOTP_HOSTNAME=y -+# CONFIG_BOOTP_PREFER_SERVERIP is not set -+CONFIG_BOOTP_SUBNETMASK=y -+# CONFIG_BOOTP_NTPSERVER is not set -+# CONFIG_CMD_PCAP is not set -+CONFIG_BOOTP_PXE=y -+CONFIG_BOOTP_PXE_CLIENTARCH=0x16 -+CONFIG_BOOTP_VCI_STRING="U-Boot.armv8" -+CONFIG_CMD_TFTPBOOT=y -+# CONFIG_CMD_TFTPPUT is not set -+# CONFIG_CMD_TFTPSRV is not set -+CONFIG_NET_TFTP_VARS=y -+# CONFIG_CMD_RARP is not set -+# CONFIG_CMD_NFS is not set -+CONFIG_CMD_MII=y -+CONFIG_CMD_PING=y -+# CONFIG_CMD_CDP is not set -+# CONFIG_CMD_SNTP is not set -+# CONFIG_CMD_DNS is not set -+# CONFIG_CMD_LINK_LOCAL is not set -+# CONFIG_CMD_ETHSW is not set -+CONFIG_CMD_PXE=y -+# CONFIG_CMD_WOL is not set -+ -+# -+# Misc commands -+# -+# CONFIG_CMD_BSP is not set -+# CONFIG_CMD_BLOCK_CACHE is not set -+# CONFIG_CMD_CACHE is not set -+# CONFIG_CMD_CONITRACE is not set -+# CONFIG_CMD_EFIDEBUG is not set -+# CONFIG_CMD_EXCEPTION is not set -+# CONFIG_CMD_DATE is not set -+# CONFIG_CMD_TIME is not set -+# CONFIG_CMD_GETTIME is not set -+# CONFIG_CMD_RNG is not set -+# CONFIG_CMD_KASLRSEED is not set -+CONFIG_CMD_SLEEP=y -+# CONFIG_CMD_TIMER is not set -+CONFIG_CMD_SYSBOOT=y -+CONFIG_CMD_QFW=y -+# CONFIG_CMD_PSTORE is not set -+# CONFIG_CMD_TERMINAL is not set -+# CONFIG_CMD_UUID is not set -+ -+# -+# TI specific command line interface -+# -+# CONFIG_CMD_DDR3 is not set -+ -+# -+# Power commands -+# -+ -+# -+# Security commands -+# -+# CONFIG_CMD_AES is not set -+# CONFIG_CMD_BLOB is not set -+# CONFIG_CMD_HASH is not set -+# CONFIG_CMD_HVC is not set -+# CONFIG_CMD_SMC is not set -+ -+# -+# Firmware commands -+# -+ -+# -+# Filesystem commands -+# -+# CONFIG_CMD_BTRFS is not set -+CONFIG_CMD_EXT2=y -+CONFIG_CMD_EXT4=y -+# CONFIG_CMD_EXT4_WRITE is not set -+CONFIG_CMD_FAT=y -+# CONFIG_CMD_SQUASHFS is not set -+CONFIG_CMD_FS_GENERIC=y -+# CONFIG_CMD_FS_UUID is not set -+# CONFIG_CMD_JFFS2 is not set -+# CONFIG_CMD_REISER is not set -+# CONFIG_CMD_ZFS is not set -+ -+# -+# Debug commands -+# -+# CONFIG_CMD_DIAG is not set -+# CONFIG_CMD_LOG is not set -+# CONFIG_CMD_UBI is not set -+ -+# -+# Partition Types -+# -+CONFIG_PARTITIONS=y -+# CONFIG_MAC_PARTITION is not set -+CONFIG_DOS_PARTITION=y -+CONFIG_ISO_PARTITION=y -+# CONFIG_AMIGA_PARTITION is not set -+CONFIG_EFI_PARTITION=y -+CONFIG_EFI_PARTITION_ENTRIES_NUMBERS=128 -+CONFIG_EFI_PARTITION_ENTRIES_OFF=0 -+CONFIG_PARTITION_UUIDS=y -+# CONFIG_PARTITION_TYPE_GUID is not set -+CONFIG_SUPPORT_OF_CONTROL=y -+ -+# -+# Device Tree Control -+# -+CONFIG_OF_CONTROL=y -+CONFIG_OF_REAL=y -+# CONFIG_OF_LIVE is not set -+CONFIG_OF_SEPARATE=y -+# CONFIG_OF_EMBED is not set -+CONFIG_OF_BOARD=y -+CONFIG_OF_HAS_PRIOR_STAGE=y -+CONFIG_OF_OMIT_DTB=y -+CONFIG_DEVICE_TREE_INCLUDES="" -+CONFIG_OF_LIST="qemu-arm64" -+# CONFIG_MULTI_DTB_FIT is not set -+# CONFIG_OF_DTB_PROPS_REMOVE is not set -+ -+# -+# Environment -+# -+CONFIG_ENV_SUPPORT=y -+CONFIG_ENV_SOURCE_FILE="" -+CONFIG_SAVEENV=y -+# CONFIG_ENV_OVERWRITE is not set -+CONFIG_ENV_IS_NOWHERE=y -+# CONFIG_ENV_IS_IN_EEPROM is not set -+# CONFIG_ENV_IS_IN_FAT is not set -+# CONFIG_ENV_IS_IN_EXT4 is not set -+# CONFIG_ENV_IS_IN_FLASH is not set -+# CONFIG_ENV_IS_IN_NAND is not set -+# CONFIG_ENV_IS_IN_NVRAM is not set -+# CONFIG_ENV_IS_IN_ONENAND is not set -+# CONFIG_ENV_IS_IN_REMOTE is not set -+# CONFIG_SYS_REDUNDAND_ENVIRONMENT is not set -+# CONFIG_SYS_RELOC_GD_ENV_ADDR is not set -+# CONFIG_USE_DEFAULT_ENV_FILE is not set -+# CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG is not set -+# CONFIG_ENV_IMPORT_FDT is not set -+# CONFIG_ENV_APPEND is not set -+# CONFIG_ENV_WRITEABLE_LIST is not set -+# CONFIG_ENV_ACCESS_IGNORE_FORCE is not set -+# CONFIG_VERSION_VARIABLE is not set -+CONFIG_NET=y -+# CONFIG_PROT_UDP is not set -+# CONFIG_BOOTP_SEND_HOSTNAME is not set -+# CONFIG_NET_RANDOM_ETHADDR is not set -+# CONFIG_NETCONSOLE is not set -+# CONFIG_IP_DEFRAG is not set -+CONFIG_TFTP_BLOCKSIZE=512 -+CONFIG_TFTP_WINDOWSIZE=1 -+# CONFIG_TFTP_TSIZE is not set -+# CONFIG_SERVERIP_FROM_PROXYDHCP is not set -+CONFIG_SERVERIP_FROM_PROXYDHCP_DELAY_MS=100 -+# CONFIG_KEEP_SERVERADDR is not set -+# CONFIG_UDP_CHECKSUM is not set -+# CONFIG_BOOTP_SERVERIP is not set -+ -+# -+# Device Drivers -+# -+ -+# -+# Generic Driver Options -+# -+CONFIG_DM=y -+# CONFIG_DM_WARN is not set -+# CONFIG_DM_DEBUG is not set -+# CONFIG_DM_DEVICE_REMOVE is not set -+# CONFIG_DM_STDIO is not set -+# CONFIG_DM_SEQ_ALIAS is not set -+# CONFIG_DM_DMA is not set -+# CONFIG_REGMAP is not set -+# CONFIG_DEVRES is not set -+# CONFIG_SIMPLE_BUS is not set -+# CONFIG_OF_TRANSLATE is not set -+# CONFIG_TRANSLATION_OFFSET is not set -+CONFIG_DM_DEV_READ_INLINE=y -+# CONFIG_ACPIGEN is not set -+# CONFIG_BOUNCE_BUFFER is not set -+# CONFIG_ADC is not set -+# CONFIG_ADC_EXYNOS is not set -+# CONFIG_ADC_SANDBOX is not set -+# CONFIG_SARADC_MESON is not set -+# CONFIG_SARADC_ROCKCHIP is not set -+# CONFIG_SATA is not set -+# CONFIG_SCSI_AHCI is not set -+ -+# -+# SATA/SCSI device support -+# -+# CONFIG_AHCI_PCI is not set -+# CONFIG_DWC_AHCI is not set -+# CONFIG_DWC_AHSATA is not set -+# CONFIG_MTK_AHCI is not set -+# CONFIG_SUNXI_AHCI is not set -+# CONFIG_AXI is not set -+ -+# -+# Bus devices -+# -+CONFIG_BLK=y -+CONFIG_HAVE_BLOCK_DEVICE=y -+CONFIG_BLOCK_CACHE=y -+# CONFIG_EFI_MEDIA is not set -+# CONFIG_IDE is not set -+# CONFIG_BOOTCOUNT_LIMIT is not set -+ -+# -+# Button Support -+# -+# CONFIG_BUTTON is not set -+ -+# -+# Cache Controller drivers -+# -+# CONFIG_CACHE is not set -+# CONFIG_L2X0_CACHE is not set -+# CONFIG_NCORE_CACHE is not set -+# CONFIG_SIFIVE_CCACHE is not set -+ -+# -+# Clock -+# -+# CONFIG_CLK is not set -+# CONFIG_CLK_CCF is not set -+# CONFIG_CPU is not set -+ -+# -+# Hardware crypto devices -+# -+# CONFIG_DM_HASH is not set -+# CONFIG_FSL_CAAM is not set -+CONFIG_CAAM_64BIT=y -+# CONFIG_SYS_FSL_SEC_BE is not set -+# CONFIG_SYS_FSL_SEC_LE is not set -+# CONFIG_DDR_SPD is not set -+ -+# -+# Demo for driver model -+# -+# CONFIG_DM_DEMO is not set -+ -+# -+# DFU support -+# -+ -+# -+# DMA Support -+# -+# CONFIG_DMA is not set -+# CONFIG_DMA_LPC32XX is not set -+# CONFIG_TI_EDMA3 is not set -+# CONFIG_DMA_LEGACY is not set -+ -+# -+# Fastboot support -+# -+# CONFIG_UDP_FUNCTION_FASTBOOT is not set -+CONFIG_FIRMWARE=y -+# CONFIG_SPL_FIRMWARE is not set -+CONFIG_ARM_PSCI_FW=y -+# CONFIG_ZYNQMP_FIRMWARE is not set -+# CONFIG_SCMI_FIRMWARE is not set -+ -+# -+# FPGA support -+# -+# CONFIG_FPGA_ALTERA is not set -+# CONFIG_FPGA_SOCFPGA is not set -+# CONFIG_FPGA_XILINX is not set -+CONFIG_GPIO=y -+# CONFIG_AT91_GPIO is not set -+# CONFIG_DA8XX_GPIO is not set -+# CONFIG_INTEL_BROADWELL_GPIO is not set -+# CONFIG_IMX_RGPIO2P is not set -+# CONFIG_IPROC_GPIO is not set -+# CONFIG_KIRKWOOD_GPIO is not set -+# CONFIG_LPC32XX_GPIO is not set -+# CONFIG_MCP230XX_GPIO is not set -+# CONFIG_MXC_GPIO is not set -+# CONFIG_MXS_GPIO is not set -+# CONFIG_CMD_PCA953X is not set -+# CONFIG_CMD_TCA642X is not set -+# CONFIG_VYBRID_GPIO is not set -+ -+# -+# Hardware Spinlock Support -+# -+# CONFIG_DM_HWSPINLOCK is not set -+CONFIG_I2C=y -+# CONFIG_DM_I2C is not set -+# CONFIG_SYS_I2C_LEGACY is not set -+# CONFIG_SYS_I2C_FSL is not set -+# CONFIG_SYS_I2C_DW is not set -+# CONFIG_SYS_I2C_IMX_LPI2C is not set -+# CONFIG_SYS_I2C_MICROCHIP is not set -+# CONFIG_SYS_I2C_MXC is not set -+# CONFIG_SYS_I2C_SOFT is not set -+# CONFIG_SYS_I2C_MV is not set -+# CONFIG_SYS_I2C_MVTWSI is not set -+# CONFIG_INPUT is not set -+# CONFIG_DM_KEYBOARD is not set -+# CONFIG_KEYBOARD is not set -+# CONFIG_TEGRA_KEYBOARD is not set -+# CONFIG_TWL4030_INPUT is not set -+ -+# -+# IOMMU device drivers -+# -+# CONFIG_IOMMU is not set -+ -+# -+# LED Support -+# -+# CONFIG_LED is not set -+# CONFIG_LED_STATUS is not set -+ -+# -+# Mailbox Controller Support -+# -+# CONFIG_DM_MAILBOX is not set -+ -+# -+# Memory Controller drivers -+# -+ -+# -+# Multifunction device drivers -+# -+# CONFIG_MISC is not set -+# CONFIG_CROS_EC is not set -+# CONFIG_DS4510 is not set -+# CONFIG_FSL_SEC_MON is not set -+# CONFIG_IRQ is not set -+# CONFIG_NUVOTON_NCT6102D is not set -+# CONFIG_PWRSEQ is not set -+# CONFIG_PCA9551_LED is not set -+# CONFIG_TEST_DRV is not set -+# CONFIG_TWL4030_LED is not set -+# CONFIG_WINBOND_W83627 is not set -+CONFIG_QFW=y -+CONFIG_QFW_MMIO=y -+# CONFIG_FS_LOADER is not set -+# CONFIG_SPL_FS_LOADER is not set -+ -+# -+# MMC Host controller Support -+# -+# CONFIG_MMC is not set -+# CONFIG_MMC_BROKEN_CD is not set -+# CONFIG_DM_MMC is not set -+# CONFIG_FSL_ESDHC is not set -+# CONFIG_FSL_ESDHC_IMX is not set -+ -+# -+# MTD Support -+# -+# CONFIG_MTD is not set -+# CONFIG_DM_MTD is not set -+# CONFIG_MTD_NOR_FLASH is not set -+# CONFIG_FLASH_CFI_DRIVER is not set -+# CONFIG_USE_SYS_MAX_FLASH_BANKS is not set -+# CONFIG_MTD_RAW_NAND is not set -+ -+# -+# SPI Flash Support -+# -+# CONFIG_SPI_FLASH is not set -+ -+# -+# UBI support -+# -+# CONFIG_UBI_SILENCE_MSG is not set -+# CONFIG_MTD_UBI is not set -+ -+# -+# Multiplexer drivers -+# -+# CONFIG_MULTIPLEXER is not set -+# CONFIG_BITBANGMII is not set -+# CONFIG_MV88E6352_SWITCH is not set -+# CONFIG_PHYLIB is not set -+# CONFIG_FSL_PFE is not set -+# CONFIG_BNXT_ETH is not set -+CONFIG_ETH=y -+CONFIG_DM_ETH=y -+# CONFIG_DM_ETH_PHY is not set -+CONFIG_NETDEVICES=y -+# CONFIG_PHY_GIGE is not set -+# CONFIG_ALTERA_TSE is not set -+# CONFIG_BCM_SF2_ETH is not set -+# CONFIG_BCMGENET is not set -+# CONFIG_CALXEDA_XGMAC is not set -+# CONFIG_DWC_ETH_QOS is not set -+CONFIG_E1000=y -+# CONFIG_E1000_SPI_GENERIC is not set -+# CONFIG_E1000_SPI is not set -+# CONFIG_CMD_E1000 is not set -+# CONFIG_EEPRO100 is not set -+# CONFIG_ETH_DESIGNWARE is not set -+# CONFIG_ETH_DESIGNWARE_MESON8B is not set -+# CONFIG_ETHOC is not set -+# CONFIG_FMAN_ENET is not set -+# CONFIG_FTMAC100 is not set -+# CONFIG_FTGMAC100 is not set -+# CONFIG_MCFFEC is not set -+# CONFIG_FSLDMAFEC is not set -+# CONFIG_KS8851_MLL is not set -+# CONFIG_MACB is not set -+# CONFIG_PCH_GBE is not set -+# CONFIG_RGMII is not set -+# CONFIG_MII is not set -+# CONFIG_PCNET is not set -+# CONFIG_QE_UEC is not set -+# CONFIG_RTL8139 is not set -+# CONFIG_RTL8169 is not set -+# CONFIG_SMC911X is not set -+# CONFIG_SUN7I_GMAC is not set -+# CONFIG_SUN4I_EMAC is not set -+# CONFIG_SUN8I_EMAC is not set -+# CONFIG_SH_ETHER is not set -+# CONFIG_DRIVER_TI_CPSW is not set -+# CONFIG_DRIVER_TI_EMAC is not set -+# CONFIG_DRIVER_TI_KEYSTONE_NET is not set -+# CONFIG_TULIP is not set -+# CONFIG_XILINX_AXIEMAC is not set -+# CONFIG_XILINX_EMACLITE is not set -+# CONFIG_ZYNQ_GEM is not set -+# CONFIG_SYS_DPAA_QBMAN is not set -+# CONFIG_TSEC_ENET is not set -+# CONFIG_MEDIATEK_ETH is not set -+# CONFIG_HIGMACV300_ETH is not set -+# CONFIG_NVME is not set -+# CONFIG_NVME_APPLE is not set -+# CONFIG_NVME_PCI is not set -+CONFIG_PCI=y -+# CONFIG_DM_PCI_COMPAT is not set -+CONFIG_PCI_PNP=y -+# CONFIG_PCI_REGION_MULTI_ENTRY is not set -+# CONFIG_PCI_SRIOV is not set -+# CONFIG_PCI_ARID is not set -+CONFIG_PCIE_ECAM_GENERIC=y -+# CONFIG_PCIE_ECAM_SYNQUACER is not set -+# CONFIG_PCI_PHYTIUM is not set -+# CONFIG_PCIE_FSL is not set -+# CONFIG_PCI_MPC85XX is not set -+# CONFIG_PCI_XILINX is not set -+# CONFIG_PCIE_LAYERSCAPE_RC is not set -+# CONFIG_PCIE_LAYERSCAPE_EP is not set -+# CONFIG_PCIE_LAYERSCAPE_GEN4 is not set -+# CONFIG_PCIE_INTEL_FPGA is not set -+# CONFIG_PCIE_IPROC is not set -+# CONFIG_PCI_KEYSTONE is not set -+ -+# -+# PCI Endpoint -+# -+# CONFIG_PCI_ENDPOINT is not set -+# CONFIG_X86_PCH7 is not set -+# CONFIG_X86_PCH9 is not set -+ -+# -+# PHY Subsystem -+# -+# CONFIG_PHY is not set -+# CONFIG_MIPI_DPHY_HELPERS is not set -+ -+# -+# Rockchip PHY driver -+# -+# CONFIG_MVEBU_COMPHY_SUPPORT is not set -+ -+# -+# Pin controllers -+# -+# CONFIG_PINCTRL is not set -+CONFIG_POWER=y -+# CONFIG_POWER_LEGACY is not set -+# CONFIG_SPL_POWER_LEGACY is not set -+# CONFIG_ACPI_PMC is not set -+# CONFIG_SPL_ACPI_PMC is not set -+# CONFIG_TPL_ACPI_PMC is not set -+ -+# -+# Power Domain Support -+# -+# CONFIG_POWER_DOMAIN is not set -+# CONFIG_DM_PMIC is not set -+# CONFIG_POWER_MC34VR500 is not set -+# CONFIG_DM_REGULATOR is not set -+# CONFIG_POWER_MT6323 is not set -+# CONFIG_DM_PWM is not set -+# CONFIG_PWM_IMX is not set -+# CONFIG_PWM_SANDBOX is not set -+# CONFIG_U_QE is not set -+# CONFIG_RAM is not set -+ -+# -+# Reboot Mode Support -+# -+# CONFIG_DM_REBOOT_MODE is not set -+ -+# -+# Remote Processor drivers -+# -+ -+# -+# Reset Controller Support -+# -+# CONFIG_DM_RESET is not set -+# CONFIG_RESET_SCMI is not set -+CONFIG_DM_RNG=y -+# CONFIG_RNG_MSM is not set -+# CONFIG_RNG_IPROC200 is not set -+ -+# -+# Real Time Clock -+# -+# CONFIG_DM_RTC is not set -+# CONFIG_RTC_ENABLE_32KHZ_OUTPUT is not set -+# CONFIG_RTC_PCF8563 is not set -+# CONFIG_RTC_PL031 is not set -+# CONFIG_RTC_S35392A is not set -+# CONFIG_RTC_MC146818 is not set -+# CONFIG_RTC_M41T62 is not set -+CONFIG_SCSI=y -+CONFIG_DM_SCSI=y -+CONFIG_SERIAL=y -+CONFIG_BAUDRATE=115200 -+CONFIG_REQUIRE_SERIAL_CONSOLE=y -+# CONFIG_SPECIFY_CONSOLE_INDEX is not set -+CONFIG_SERIAL_PRESENT=y -+CONFIG_DM_SERIAL=y -+# CONFIG_SERIAL_RX_BUFFER is not set -+# CONFIG_SERIAL_SEARCH_ALL is not set -+# CONFIG_SERIAL_PROBE_ALL is not set -+# CONFIG_ALTERA_JTAG_UART is not set -+# CONFIG_ALTERA_UART is not set -+# CONFIG_ARC_SERIAL is not set -+# CONFIG_ARM_DCC is not set -+# CONFIG_ATMEL_USART is not set -+# CONFIG_BCM6345_SERIAL is not set -+# CONFIG_COREBOOT_SERIAL is not set -+# CONFIG_CORTINA_UART is not set -+# CONFIG_FSL_LINFLEXUART is not set -+# CONFIG_FSL_LPUART is not set -+# CONFIG_MVEBU_A3700_UART is not set -+# CONFIG_MCFUART is not set -+# CONFIG_NULLDEV_SERIAL is not set -+# CONFIG_SYS_NS16550 is not set -+# CONFIG_NS16550_DYNAMIC is not set -+CONFIG_PL01X_SERIAL=y -+# CONFIG_XILINX_UARTLITE is not set -+# CONFIG_MSM_SERIAL is not set -+# CONFIG_MSM_GENI_SERIAL is not set -+# CONFIG_OMAP_SERIAL is not set -+# CONFIG_PXA_SERIAL is not set -+# CONFIG_SIFIVE_SERIAL is not set -+# CONFIG_ZYNQ_SERIAL is not set -+# CONFIG_MTK_SERIAL is not set -+# CONFIG_MT7620_SERIAL is not set -+# CONFIG_SMEM is not set -+ -+# -+# Sound support -+# -+# CONFIG_SOUND is not set -+# CONFIG_SOUND_MAX98357A is not set -+ -+# -+# SOC (System On Chip) specific Drivers -+# -+# CONFIG_SOC_DEVICE is not set -+# CONFIG_SOC_TI is not set -+# CONFIG_SPI is not set -+ -+# -+# SPMI support -+# -+# CONFIG_SPMI is not set -+# CONFIG_SYSINFO is not set -+ -+# -+# System reset device drivers -+# -+CONFIG_SYSRESET=y -+CONFIG_SYSRESET_CMD_RESET=y -+# CONFIG_POWEROFF_GPIO is not set -+# CONFIG_SYSRESET_GPIO is not set -+CONFIG_SYSRESET_PSCI=y -+# CONFIG_SYSRESET_SYSCON is not set -+# CONFIG_SYSRESET_WATCHDOG is not set -+# CONFIG_SYSRESET_RESETCTL is not set -+# CONFIG_SYSRESET_MPC83XX is not set -+# CONFIG_TEE is not set -+# CONFIG_DM_THERMAL is not set -+ -+# -+# Timer Support -+# -+# CONFIG_TIMER is not set -+ -+# -+# TPM support -+# -+# CONFIG_USB is not set -+ -+# -+# UFS Host Controller Support -+# -+# CONFIG_UFS is not set -+# CONFIG_TI_J721E_UFS is not set -+ -+# -+# Graphics support -+# -+# CONFIG_DM_VIDEO is not set -+# CONFIG_SYS_WHITE_ON_BLACK is not set -+# CONFIG_NO_FB_CLEAR is not set -+ -+# -+# TrueType Fonts -+# -+# CONFIG_VIDEO_VESA is not set -+# CONFIG_VIDEO_LCD_ANX9804 is not set -+# CONFIG_VIDEO_LCD_SSD2828 is not set -+# CONFIG_VIDEO_LCD_HITACHI_TX18D42VM is not set -+# CONFIG_VIDEO_MVEBU is not set -+# CONFIG_I2C_EDID is not set -+# CONFIG_DISPLAY is not set -+# CONFIG_ATMEL_HLCD is not set -+# CONFIG_AM335X_LCD is not set -+# CONFIG_VIDEO_TEGRA20 is not set -+# CONFIG_VIDEO_BRIDGE is not set -+# CONFIG_VIDEO is not set -+# CONFIG_LCD is not set -+# CONFIG_VIDEO_SIMPLE is not set -+# CONFIG_VIDEO_DT_SIMPLEFB is not set -+# CONFIG_OSD is not set -+# CONFIG_SPLASH_SCREEN is not set -+# CONFIG_VIDEO_VCXK is not set -+ -+# -+# VirtIO Drivers -+# -+CONFIG_VIRTIO=y -+CONFIG_VIRTIO_MMIO=y -+CONFIG_VIRTIO_PCI=y -+CONFIG_VIRTIO_NET=y -+CONFIG_VIRTIO_BLK=y -+CONFIG_VIRTIO_RNG=y -+ -+# -+# 1-Wire support -+# -+# CONFIG_W1 is not set -+ -+# -+# 1-wire EEPROM support -+# -+# CONFIG_W1_EEPROM is not set -+ -+# -+# Watchdog Timer Support -+# -+# CONFIG_WATCHDOG is not set -+CONFIG_WATCHDOG_TIMEOUT_MSECS=60000 -+# CONFIG_IMX_WATCHDOG is not set -+# CONFIG_ULP_WATCHDOG is not set -+# CONFIG_DESIGNWARE_WATCHDOG is not set -+# CONFIG_WDT is not set -+# CONFIG_PVBLOCK is not set -+# CONFIG_PHYS_TO_BUS is not set -+ -+# -+# File systems -+# -+# CONFIG_FS_BTRFS is not set -+# CONFIG_FS_CBFS is not set -+# CONFIG_SPL_FS_CBFS is not set -+CONFIG_FS_EXT4=y -+# CONFIG_EXT4_WRITE is not set -+CONFIG_FS_FAT=y -+CONFIG_FAT_WRITE=y -+CONFIG_FS_FAT_MAX_CLUSTSIZE=65536 -+# CONFIG_FS_JFFS2 is not set -+# CONFIG_UBIFS_SILENCE_MSG is not set -+# CONFIG_FS_CRAMFS is not set -+# CONFIG_YAFFS2 is not set -+# CONFIG_FS_SQUASHFS is not set -+ -+# -+# Library routines -+# -+# CONFIG_ADDR_MAP is not set -+# CONFIG_PHYSMEM is not set -+# CONFIG_BCH is not set -+# CONFIG_CC_OPTIMIZE_LIBS_FOR_SPEED is not set -+CONFIG_CHARSET=y -+# CONFIG_DYNAMIC_CRC_TABLE is not set -+CONFIG_LIB_UUID=y -+CONFIG_PRINTF=y -+CONFIG_SPRINTF=y -+CONFIG_STRTO=y -+CONFIG_SYS_HZ=1000 -+# CONFIG_PANIC_HANG is not set -+CONFIG_REGEX=y -+CONFIG_LIB_RAND=y -+# CONFIG_LIB_HW_RAND is not set -+CONFIG_SUPPORT_ACPI=y -+# CONFIG_GENERATE_ACPI_TABLE is not set -+# CONFIG_SPL_TINY_MEMSET is not set -+# CONFIG_TPL_TINY_MEMSET is not set -+# CONFIG_BITREVERSE is not set -+# CONFIG_TRACE is not set -+# CONFIG_CIRCBUF is not set -+# CONFIG_CMD_DHRYSTONE is not set -+ -+# -+# Security support -+# -+# CONFIG_AES is not set -+# CONFIG_ECDSA is not set -+# CONFIG_RSA is not set -+# CONFIG_ASYMMETRIC_KEY_TYPE is not set -+# CONFIG_TPM is not set -+ -+# -+# Android Verified Boot -+# -+ -+# -+# Hashing Support -+# -+# CONFIG_BLAKE2 is not set -+CONFIG_SHA1=y -+CONFIG_SHA256=y -+# CONFIG_SHA512 is not set -+# CONFIG_SHA384 is not set -+# CONFIG_SHA_HW_ACCEL is not set -+CONFIG_MD5=y -+CONFIG_CRC32=y -+ -+# -+# Compression Support -+# -+CONFIG_LZ4=y -+# CONFIG_LZMA is not set -+# CONFIG_LZO is not set -+# CONFIG_GZIP is not set -+# CONFIG_ZLIB_UNCOMPRESS is not set -+# CONFIG_BZIP2 is not set -+CONFIG_ZLIB=y -+# CONFIG_ZSTD is not set -+# CONFIG_SPL_LZ4 is not set -+# CONFIG_SPL_LZMA is not set -+# CONFIG_SPL_LZO is not set -+# CONFIG_SPL_GZIP is not set -+# CONFIG_SPL_ZSTD is not set -+# CONFIG_ERRNO_STR is not set -+# CONFIG_HEXDUMP is not set -+# CONFIG_GETOPT is not set -+CONFIG_OF_LIBFDT=y -+CONFIG_OF_LIBFDT_ASSUME_MASK=0 -+# CONFIG_OF_LIBFDT_OVERLAY is not set -+# CONFIG_SPL_OF_LIBFDT is not set -+CONFIG_SPL_OF_LIBFDT_ASSUME_MASK=0xff -+# CONFIG_TPL_OF_LIBFDT is not set -+CONFIG_TPL_OF_LIBFDT_ASSUME_MASK=0xff -+ -+# -+# System tables -+# -+CONFIG_GENERATE_SMBIOS_TABLE=y -+# CONFIG_LIB_RATIONAL is not set -+# CONFIG_SMBIOS_PARSER is not set -+CONFIG_EFI_LOADER=y -+CONFIG_CMD_BOOTEFI_BOOTMGR=y -+CONFIG_EFI_VARIABLE_FILE_STORE=y -+# CONFIG_EFI_VARIABLES_PRESEED is not set -+CONFIG_EFI_VAR_BUF_SIZE=16384 -+# CONFIG_EFI_RUNTIME_UPDATE_CAPSULE is not set -+# CONFIG_EFI_CAPSULE_ON_DISK is not set -+CONFIG_EFI_DEVICE_PATH_TO_TEXT=y -+CONFIG_EFI_DEVICE_PATH_UTIL=y -+CONFIG_EFI_DT_FIXUP=y -+CONFIG_EFI_LOADER_HII=y -+CONFIG_EFI_UNICODE_COLLATION_PROTOCOL2=y -+CONFIG_EFI_UNICODE_CAPITALIZATION=y -+# CONFIG_EFI_LOADER_BOUNCE_BUFFER is not set -+CONFIG_EFI_PLATFORM_LANG_CODES="en-US" -+CONFIG_EFI_HAVE_RUNTIME_RESET=y -+CONFIG_EFI_RNG_PROTOCOL=y -+CONFIG_EFI_LOAD_FILE2_INITRD=y -+# CONFIG_OPTEE_LIB is not set -+# CONFIG_OPTEE_IMAGE is not set -+# CONFIG_BOOTM_OPTEE is not set -+# CONFIG_TEST_FDTDEC is not set -+CONFIG_LIB_ELF=y -+CONFIG_LMB=y -+CONFIG_LMB_USE_MAX_REGIONS=y -+CONFIG_LMB_MAX_REGIONS=8 -+# CONFIG_PHANDLE_CHECK_SEQ is not set -+# CONFIG_UNIT_TEST is not set -+# CONFIG_SPL_UNIT_TEST is not set -+ -+# -+# Tools options -+# -+CONFIG_MKIMAGE_DTC_PATH="dtc" -+CONFIG_TOOLS_CRC32=y -+CONFIG_TOOLS_LIBCRYPTO=y -+CONFIG_TOOLS_FIT=y -+CONFIG_TOOLS_FIT_FULL_CHECK=y -+CONFIG_TOOLS_FIT_PRINT=y -+CONFIG_TOOLS_FIT_RSASSA_PSS=y -+CONFIG_TOOLS_FIT_SIGNATURE=y -+CONFIG_TOOLS_FIT_SIGNATURE_MAX_SIZE=0x10000000 -+CONFIG_TOOLS_FIT_VERBOSE=y -+CONFIG_TOOLS_MD5=y -+CONFIG_TOOLS_OF_LIBFDT=y -+CONFIG_TOOLS_SHA1=y -+CONFIG_TOOLS_SHA256=y -+CONFIG_TOOLS_SHA384=y -+CONFIG_TOOLS_SHA512=y -+# CONFIG_TOOLS_MKEFICAPSULE is not set diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0014-rpi4_64_rpi_dtb_defconfig.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0017-rpi4_64_rpi_dtb_defconfig.patch similarity index 99% rename from build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0014-rpi4_64_rpi_dtb_defconfig.patch rename to build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0017-rpi4_64_rpi_dtb_defconfig.patch index 151488c..0326526 100644 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0014-rpi4_64_rpi_dtb_defconfig.patch +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0017-rpi4_64_rpi_dtb_defconfig.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/git/infrabase/build/tmp/work/uboot-2022.04-r0/uboot-2022.04/configs/rpi4_64_rpi_dtb_defconfig 1970-01-01 01:00:00.000000000 +0100 -+++ ./configs/rpi4_64_rpi_dtb_defconfig 2025-09-11 16:34:39.224804260 +0200 +--- a/configs/rpi4_64_rpi_dtb_defconfig ++++ b/configs/rpi4_64_rpi_dtb_defconfig @@ -0,0 +1,1382 @@ +# +# Automatically generated file; DO NOT EDIT. diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0015-virt32_defconfig.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0018-virt32_defconfig.patch similarity index 99% rename from build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0015-virt32_defconfig.patch rename to build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0018-virt32_defconfig.patch index 3add16a..9937973 100644 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0015-virt32_defconfig.patch +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0018-virt32_defconfig.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/git/infrabase/build/tmp/work/uboot-2022.04-r0/uboot-2022.04/configs/virt32_defconfig 1970-01-01 01:00:00.000000000 +0100 -+++ ./configs/virt32_defconfig 2025-09-11 16:34:39.224728887 +0200 +--- a/configs/virt32_defconfig ++++ b/configs/virt32_defconfig @@ -0,0 +1,1495 @@ +# +# Automatically generated file; DO NOT EDIT. diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0019-virt64_defconfig.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0019-virt64_defconfig.patch new file mode 100644 index 0000000..6d9778e --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0019-virt64_defconfig.patch @@ -0,0 +1,2750 @@ +--- a/configs/virt64_defconfig ++++ b/configs/virt64_defconfig +@@ -0,0 +1,2747 @@ ++# ++# Automatically generated file; DO NOT EDIT. ++# U-Boot 2022.04 Configuration ++# ++ ++# ++# Compiler: aarch64-linux-gnu-gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0 ++# ++CONFIG_CREATE_ARCH_SYMLINK=y ++CONFIG_SYS_CACHE_SHIFT_6=y ++CONFIG_SYS_CACHELINE_SIZE=64 ++CONFIG_LINKER_LIST_ALIGN=8 ++# CONFIG_ARC is not set ++CONFIG_ARM=y ++# CONFIG_M68K is not set ++# CONFIG_MICROBLAZE is not set ++# CONFIG_MIPS is not set ++# CONFIG_NDS32 is not set ++# CONFIG_NIOS2 is not set ++# CONFIG_PPC is not set ++# CONFIG_RISCV is not set ++# CONFIG_SANDBOX is not set ++# CONFIG_SH is not set ++# CONFIG_X86 is not set ++# CONFIG_XTENSA is not set ++CONFIG_SYS_ARCH="arm" ++CONFIG_SYS_CPU="armv8" ++CONFIG_SYS_VENDOR="emulation" ++CONFIG_SYS_BOARD="qemu-arm" ++CONFIG_SYS_CONFIG_NAME="qemu-arm" ++CONFIG_SKIP_LOWLEVEL_INIT=y ++# CONFIG_SKIP_LOWLEVEL_INIT_ONLY is not set ++# CONFIG_SYS_ICACHE_OFF is not set ++# CONFIG_SYS_DCACHE_OFF is not set ++ ++# ++# ARM architecture ++# ++CONFIG_ARM64=y ++CONFIG_ARM64_CRC32=y ++# CONFIG_POSITION_INDEPENDENT is not set ++# CONFIG_INIT_SP_RELATIVE is not set ++# CONFIG_GIC_V3_ITS is not set ++CONFIG_STATIC_RELA=y ++CONFIG_DMA_ADDR_T_64BIT=y ++CONFIG_ARM_ASM_UNIFIED=y ++# CONFIG_SYS_ARM_CACHE_CP15 is not set ++# CONFIG_SYS_ARM_MMU is not set ++# CONFIG_SYS_ARM_MPU is not set ++CONFIG_SYS_ARM_ARCH=8 ++CONFIG_SYS_ARM_CACHE_WRITEBACK=y ++# CONFIG_SYS_ARM_CACHE_WRITETHROUGH is not set ++# CONFIG_SYS_ARM_CACHE_WRITEALLOC is not set ++# CONFIG_ARCH_CPU_INIT is not set ++CONFIG_SYS_ARCH_TIMER=y ++CONFIG_ARM_SMCCC=y ++# CONFIG_SEMIHOSTING is not set ++# CONFIG_SYS_L2CACHE_OFF is not set ++# CONFIG_ENABLE_ARM_SOC_BOOT0_HOOK is not set ++# CONFIG_USE_ARCH_MEMCPY is not set ++# CONFIG_USE_ARCH_MEMSET is not set ++CONFIG_ARM64_SUPPORT_AARCH32=y ++# CONFIG_ARCH_AT91 is not set ++# CONFIG_ARCH_DAVINCI is not set ++# CONFIG_ARCH_KIRKWOOD is not set ++# CONFIG_ARCH_MVEBU is not set ++# CONFIG_ARCH_ORION5X is not set ++# CONFIG_TARGET_STV0991 is not set ++# CONFIG_ARCH_BCM283X is not set ++# CONFIG_ARCH_BCM63158 is not set ++# CONFIG_ARCH_BCM68360 is not set ++# CONFIG_ARCH_BCM6858 is not set ++# CONFIG_ARCH_BCMSTB is not set ++# CONFIG_TARGET_VEXPRESS_CA9X4 is not set ++# CONFIG_TARGET_BCMCYGNUS is not set ++# CONFIG_TARGET_BCMNS2 is not set ++# CONFIG_TARGET_BCMNS3 is not set ++# CONFIG_ARCH_EXYNOS is not set ++# CONFIG_ARCH_S5PC1XX is not set ++# CONFIG_ARCH_HIGHBANK is not set ++# CONFIG_ARCH_INTEGRATOR is not set ++# CONFIG_ARCH_IPQ40XX is not set ++# CONFIG_ARCH_KEYSTONE is not set ++# CONFIG_ARCH_K3 is not set ++# CONFIG_ARCH_OMAP2PLUS is not set ++# CONFIG_ARCH_MESON is not set ++# CONFIG_ARCH_MEDIATEK is not set ++# CONFIG_ARCH_LPC32XX is not set ++# CONFIG_ARCH_IMX8 is not set ++# CONFIG_ARCH_IMX8M is not set ++# CONFIG_ARCH_IMX8ULP is not set ++# CONFIG_ARCH_IMXRT is not set ++# CONFIG_ARCH_MX23 is not set ++# CONFIG_ARCH_MX28 is not set ++# CONFIG_ARCH_MX31 is not set ++# CONFIG_ARCH_MX7ULP is not set ++# CONFIG_ARCH_MX7 is not set ++# CONFIG_ARCH_MX6 is not set ++CONFIG_SPL_LDSCRIPT="arch/arm/cpu/armv8/u-boot-spl.lds" ++# CONFIG_ARCH_MX5 is not set ++# CONFIG_ARCH_NEXELL is not set ++# CONFIG_ARCH_APPLE is not set ++# CONFIG_ARCH_OWL is not set ++CONFIG_ARCH_QEMU=y ++# CONFIG_ARCH_RMOBILE is not set ++# CONFIG_ARCH_SNAPDRAGON is not set ++# CONFIG_ARCH_SOCFPGA is not set ++# CONFIG_ARCH_SUNXI is not set ++# CONFIG_ARCH_U8500 is not set ++# CONFIG_ARCH_VERSAL is not set ++# CONFIG_ARCH_VF610 is not set ++# CONFIG_ARCH_ZYNQ is not set ++# CONFIG_ARCH_ZYNQMP_R5 is not set ++# CONFIG_ARCH_ZYNQMP is not set ++# CONFIG_ARCH_TEGRA is not set ++# CONFIG_TARGET_VEXPRESS64_AEMV8A is not set ++# CONFIG_TARGET_VEXPRESS64_BASE_FVP is not set ++# CONFIG_TARGET_VEXPRESS64_JUNO is not set ++# CONFIG_TARGET_TOTAL_COMPUTE is not set ++# CONFIG_TARGET_LS2080A_EMU is not set ++# CONFIG_TARGET_LS1088AQDS is not set ++# CONFIG_TARGET_LS2080AQDS is not set ++# CONFIG_TARGET_LS2080ARDB is not set ++# CONFIG_TARGET_LS2081ARDB is not set ++# CONFIG_TARGET_LX2160ARDB is not set ++# CONFIG_TARGET_LX2160AQDS is not set ++# CONFIG_TARGET_LX2162AQDS is not set ++# CONFIG_TARGET_HIKEY is not set ++# CONFIG_TARGET_HIKEY960 is not set ++# CONFIG_TARGET_POPLAR is not set ++# CONFIG_TARGET_LS1012AQDS is not set ++# CONFIG_TARGET_LS1012ARDB is not set ++# CONFIG_TARGET_LS1012A2G5RDB is not set ++# CONFIG_TARGET_LS1012AFRWY is not set ++# CONFIG_TARGET_LS1012AFRDM is not set ++# CONFIG_TARGET_LS1028AQDS is not set ++# CONFIG_TARGET_LS1028ARDB is not set ++# CONFIG_TARGET_LS1088ARDB is not set ++# CONFIG_TARGET_LS1021AQDS is not set ++# CONFIG_TARGET_LS1021ATWR is not set ++# CONFIG_TARGET_PG_WCOM_SELI8 is not set ++# CONFIG_TARGET_PG_WCOM_EXPU1 is not set ++# CONFIG_TARGET_LS1021ATSN is not set ++# CONFIG_TARGET_LS1021AIOT is not set ++# CONFIG_TARGET_LS1043AQDS is not set ++# CONFIG_TARGET_LS1043ARDB is not set ++# CONFIG_TARGET_LS1046AQDS is not set ++# CONFIG_TARGET_LS1046ARDB is not set ++# CONFIG_TARGET_LS1046AFRWY is not set ++# CONFIG_TARGET_SL28 is not set ++# CONFIG_TARGET_TEN64 is not set ++# CONFIG_TARGET_COLIBRI_PXA270 is not set ++# CONFIG_ARCH_UNIPHIER is not set ++# CONFIG_ARCH_SYNQUACER is not set ++# CONFIG_ARCH_STM32 is not set ++# CONFIG_ARCH_STI is not set ++# CONFIG_ARCH_STM32MP is not set ++# CONFIG_ARCH_ROCKCHIP is not set ++# CONFIG_ARCH_OCTEONTX is not set ++# CONFIG_ARCH_OCTEONTX2 is not set ++# CONFIG_TARGET_THUNDERX_88XX is not set ++# CONFIG_ARCH_ASPEED is not set ++# CONFIG_TARGET_DURIAN is not set ++# CONFIG_TARGET_PRESIDIO_ASIC is not set ++# CONFIG_TARGET_XENGUEST_ARM64 is not set ++# CONFIG_STATIC_MACH_TYPE is not set ++CONFIG_SYS_TEXT_BASE=0x60000000 ++CONFIG_SYS_MALLOC_LEN=0x400000 ++CONFIG_SYS_MALLOC_F_LEN=0x400 ++CONFIG_NR_DRAM_BANKS=1 ++CONFIG_BOARD_SPECIFIC_OPTIONS=y ++CONFIG_ENV_SIZE=0x1f000 ++# CONFIG_DM_GPIO is not set ++CONFIG_DEFAULT_DEVICE_TREE="qemu-arm64" ++CONFIG_MULTI_DTB_FIT_UNCOMPRESS_SZ=0x8000 ++# CONFIG_TARGET_QEMU_ARM_32BIT is not set ++CONFIG_TARGET_QEMU_ARM_64BIT=y ++CONFIG_ERR_PTR_OFFSET=0x0 ++CONFIG_BOOTSTAGE_STASH_ADDR=0 ++CONFIG_IDENT_STRING="" ++CONFIG_SYS_CLK_FREQ=0 ++# CONFIG_CHIP_DIP_SCAN is not set ++# CONFIG_ARMV8_MULTIENTRY is not set ++# CONFIG_ARMV8_SET_SMPEN is not set ++ ++# ++# ARMv8 secure monitor firmware ++# ++# CONFIG_ARMV8_SEC_FIRMWARE_SUPPORT is not set ++# CONFIG_SPL_ARMV8_SEC_FIRMWARE_SUPPORT is not set ++# CONFIG_SPL_RECOVER_DATA_SECTION is not set ++CONFIG_PSCI_RESET=y ++# CONFIG_ARMV8_PSCI is not set ++# CONFIG_ARMV8_EA_EL3_FIRST is not set ++# CONFIG_CMD_DEKBLOB is not set ++# CONFIG_IMX_CAAM_DEK_ENCAP is not set ++# CONFIG_IMX_OPTEE_DEK_ENCAP is not set ++# CONFIG_IMX_SECO_DEK_ENCAP is not set ++# CONFIG_CMD_HDMIDETECT is not set ++CONFIG_IMX_DCD_ADDR=0x00910000 ++ ++# ++# ARM debug ++# ++CONFIG_BUILD_TARGET="" ++# CONFIG_SYS_PCI_64BIT is not set ++# CONFIG_DEBUG_UART is not set ++CONFIG_AHCI=y ++# CONFIG_OF_BOARD_FIXUP is not set ++ ++# ++# General setup ++# ++CONFIG_LOCALVERSION="" ++CONFIG_LOCALVERSION_AUTO=y ++CONFIG_CC_IS_GCC=y ++CONFIG_GCC_VERSION=110400 ++CONFIG_CLANG_VERSION=0 ++CONFIG_CC_OPTIMIZE_FOR_SIZE=y ++# CONFIG_OPTIMIZE_INLINING is not set ++CONFIG_ARCH_SUPPORTS_LTO=y ++# CONFIG_LTO is not set ++CONFIG_CC_HAS_ASM_INLINE=y ++# CONFIG_XEN is not set ++CONFIG_DISTRO_DEFAULTS=y ++CONFIG_ENV_VARS_UBOOT_CONFIG=y ++# CONFIG_SYS_BOOT_GET_CMDLINE is not set ++# CONFIG_SYS_BOOT_GET_KBD is not set ++CONFIG_SYS_MALLOC_F=y ++CONFIG_EXPERT=y ++CONFIG_SYS_MALLOC_CLEAR_ON_INIT=y ++# CONFIG_SYS_MALLOC_DEFAULT_TO_INIT is not set ++# CONFIG_TOOLS_DEBUG is not set ++CONFIG_PHYS_64BIT=y ++# CONFIG_REMAKE_ELF is not set ++# CONFIG_SYS_CUSTOM_LDSCRIPT is not set ++CONFIG_SYS_LOAD_ADDR=0x1000000 ++CONFIG_PLATFORM_ELFENTRY="_start" ++CONFIG_STACK_SIZE=0x1000000 ++CONFIG_SYS_SRAM_BASE=0x0 ++CONFIG_SYS_SRAM_SIZE=0x0 ++# CONFIG_MP is not set ++CONFIG_EXAMPLES=y ++ ++# ++# API ++# ++# CONFIG_API is not set ++ ++# ++# Boot options ++# ++ ++# ++# Boot images ++# ++# CONFIG_ANDROID_BOOT_IMAGE is not set ++CONFIG_FIT=y ++# CONFIG_TIMESTAMP is not set ++CONFIG_FIT_EXTERNAL_OFFSET=0x0 ++CONFIG_FIT_FULL_CHECK=y ++# CONFIG_FIT_SIGNATURE is not set ++# CONFIG_FIT_CIPHER is not set ++CONFIG_FIT_VERBOSE=y ++# CONFIG_FIT_BEST_MATCH is not set ++CONFIG_FIT_PRINT=y ++CONFIG_LEGACY_IMAGE_FORMAT=y ++CONFIG_SUPPORT_RAW_INITRD=y ++# CONFIG_OF_BOARD_SETUP is not set ++# CONFIG_OF_SYSTEM_SETUP is not set ++# CONFIG_OF_STDOUT_VIA_ALIAS is not set ++CONFIG_SYS_EXTRA_OPTIONS="" ++CONFIG_HAVE_SYS_TEXT_BASE=y ++# CONFIG_DYNAMIC_SYS_CLK_FREQ is not set ++# CONFIG_ARCH_FIXUP_FDT_MEMORY is not set ++# CONFIG_CHROMEOS is not set ++# CONFIG_CHROMEOS_VBOOT is not set ++# CONFIG_RAMBOOT_PBL is not set ++ ++# ++# Boot timing ++# ++# CONFIG_BOOTSTAGE is not set ++CONFIG_BOOTSTAGE_STASH_SIZE=0x1000 ++# CONFIG_SHOW_BOOT_PROGRESS is not set ++ ++# ++# Boot media ++# ++# CONFIG_NAND_BOOT is not set ++# CONFIG_ONENAND_BOOT is not set ++# CONFIG_QSPI_BOOT is not set ++# CONFIG_SATA_BOOT is not set ++# CONFIG_SD_BOOT is not set ++# CONFIG_SD_BOOT_QSPI is not set ++# CONFIG_SPI_BOOT is not set ++ ++# ++# Autoboot options ++# ++CONFIG_AUTOBOOT=y ++CONFIG_BOOTDELAY=2 ++# CONFIG_AUTOBOOT_KEYED is not set ++# CONFIG_AUTOBOOT_USE_MENUKEY is not set ++# CONFIG_USE_BOOTARGS is not set ++# CONFIG_BOOTARGS_SUBST is not set ++# CONFIG_USE_BOOTCOMMAND is not set ++# CONFIG_USE_PREBOOT is not set ++CONFIG_DEFAULT_FDT_FILE="" ++ ++# ++# Console ++# ++CONFIG_MENU=y ++# CONFIG_CONSOLE_RECORD is not set ++# CONFIG_DISABLE_CONSOLE is not set ++CONFIG_LOGLEVEL=4 ++CONFIG_SPL_LOGLEVEL=4 ++CONFIG_TPL_LOGLEVEL=4 ++# CONFIG_SILENT_CONSOLE is not set ++# CONFIG_PRE_CONSOLE_BUFFER is not set ++# CONFIG_CONSOLE_MUX is not set ++# CONFIG_SYS_CONSOLE_IS_IN_ENV is not set ++# CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE is not set ++# CONFIG_SYS_CONSOLE_ENV_OVERWRITE is not set ++# CONFIG_SYS_CONSOLE_INFO_QUIET is not set ++# CONFIG_SYS_STDIO_DEREGISTER is not set ++# CONFIG_SPL_SYS_STDIO_DEREGISTER is not set ++# CONFIG_SYS_DEVICE_NULLDEV is not set ++ ++# ++# Logging ++# ++# CONFIG_LOG is not set ++ ++# ++# Init options ++# ++# CONFIG_BOARD_TYPES is not set ++# CONFIG_DISPLAY_CPUINFO is not set ++# CONFIG_DISPLAY_BOARDINFO is not set ++# CONFIG_DISPLAY_BOARDINFO_LATE is not set ++ ++# ++# Start-up hooks ++# ++# CONFIG_ARCH_EARLY_INIT_R is not set ++# CONFIG_ARCH_MISC_INIT is not set ++# CONFIG_BOARD_EARLY_INIT_F is not set ++# CONFIG_BOARD_EARLY_INIT_R is not set ++CONFIG_BOARD_LATE_INIT=y ++# CONFIG_LAST_STAGE_INIT is not set ++# CONFIG_MISC_INIT_F is not set ++# CONFIG_MISC_INIT_R is not set ++# CONFIG_ID_EEPROM is not set ++# CONFIG_PCI_INIT_R is not set ++ ++# ++# Security support ++# ++CONFIG_HASH=y ++# CONFIG_STACKPROTECTOR is not set ++ ++# ++# Update support ++# ++# CONFIG_UPDATE_TFTP is not set ++# CONFIG_ANDROID_AB is not set ++ ++# ++# Blob list ++# ++# CONFIG_BLOBLIST is not set ++ ++# ++# SPL / TPL ++# ++CONFIG_SPL_SYS_STACK_F_CHECK_BYTE=0xaa ++# CONFIG_SPL_SYS_REPORT_STACK_F_USAGE is not set ++# CONFIG_SPL_SHOW_ERRORS is not set ++ ++# ++# PowerPC and LayerScape SPL Boot options ++# ++# CONFIG_SPL_MD5 is not set ++# CONFIG_FDT_SIMPLEFB is not set ++ ++# ++# Command line interface ++# ++CONFIG_CMDLINE=y ++CONFIG_HUSH_PARSER=y ++CONFIG_CMDLINE_EDITING=y ++CONFIG_AUTO_COMPLETE=y ++CONFIG_SYS_LONGHELP=y ++CONFIG_SYS_PROMPT="=> " ++CONFIG_SYS_PROMPT_HUSH_PS2="> " ++CONFIG_SYS_XTRACE=y ++ ++# ++# Commands ++# ++ ++# ++# Info commands ++# ++CONFIG_CMD_BDI=y ++# CONFIG_CMD_CONFIG is not set ++# CONFIG_CMD_CONSOLE is not set ++# CONFIG_CMD_LICENSE is not set ++# CONFIG_CMD_PMC is not set ++ ++# ++# Boot commands ++# ++# CONFIG_CMD_BOOTD is not set ++CONFIG_CMD_BOOTM=y ++CONFIG_BOOTM_EFI=y ++# CONFIG_CMD_BOOTZ is not set ++CONFIG_CMD_BOOTI=y ++CONFIG_CMD_E1C_BOOT=y ++CONFIG_BOOTM_LINUX=y ++CONFIG_BOOTM_NETBSD=y ++# CONFIG_BOOTM_OPENRTOS is not set ++# CONFIG_BOOTM_OSE is not set ++CONFIG_BOOTM_PLAN9=y ++CONFIG_BOOTM_RTEMS=y ++CONFIG_BOOTM_VXWORKS=y ++CONFIG_CMD_BOOTEFI=y ++CONFIG_CMD_BOOTEFI_HELLO_COMPILE=y ++# CONFIG_CMD_BOOTEFI_HELLO is not set ++CONFIG_CMD_BOOTEFI_SELFTEST=y ++# CONFIG_CMD_BOOTMENU is not set ++# CONFIG_CMD_ADTIMG is not set ++CONFIG_CMD_ELF=y ++CONFIG_CMD_FDT=y ++CONFIG_CMD_GO=y ++CONFIG_CMD_RUN=y ++CONFIG_CMD_IMI=y ++# CONFIG_CMD_IMLS is not set ++# CONFIG_CMD_XIMG is not set ++# CONFIG_CMD_THOR_DOWNLOAD is not set ++# CONFIG_CMD_ZBOOT is not set ++ ++# ++# Environment commands ++# ++# CONFIG_CMD_ASKENV is not set ++CONFIG_CMD_EXPORTENV=y ++CONFIG_CMD_IMPORTENV=y ++# CONFIG_CMD_EDITENV is not set ++# CONFIG_CMD_GREPENV is not set ++CONFIG_CMD_SAVEENV=y ++# CONFIG_CMD_ERASEENV is not set ++CONFIG_CMD_ENV_EXISTS=y ++# CONFIG_CMD_ENV_CALLBACK is not set ++# CONFIG_CMD_ENV_FLAGS is not set ++# CONFIG_CMD_NVEDIT_EFI is not set ++# CONFIG_CMD_NVEDIT_INFO is not set ++# CONFIG_CMD_NVEDIT_LOAD is not set ++# CONFIG_CMD_NVEDIT_SELECT is not set ++ ++# ++# Memory commands ++# ++# CONFIG_CMD_BINOP is not set ++# CONFIG_CMD_BLOBLIST is not set ++CONFIG_CMD_CRC32=y ++# CONFIG_CRC32_VERIFY is not set ++# CONFIG_CMD_EEPROM is not set ++# CONFIG_LOOPW is not set ++# CONFIG_CMD_MD5SUM is not set ++# CONFIG_CMD_MEMINFO is not set ++CONFIG_CMD_MEMORY=y ++# CONFIG_CMD_MEM_SEARCH is not set ++# CONFIG_CMD_MX_CYCLIC is not set ++CONFIG_CMD_RANDOM=y ++# CONFIG_CMD_MEMTEST is not set ++# CONFIG_CMD_SHA1SUM is not set ++# CONFIG_CMD_STRINGS is not set ++ ++# ++# Compression commands ++# ++# CONFIG_CMD_LZMADEC is not set ++CONFIG_CMD_UNLZ4=y ++# CONFIG_CMD_UNZIP is not set ++# CONFIG_CMD_ZIP is not set ++ ++# ++# Device access commands ++# ++# CONFIG_CMD_ARMFLASH is not set ++# CONFIG_CMD_BIND is not set ++# CONFIG_CMD_CLK is not set ++# CONFIG_CMD_DEMO is not set ++# CONFIG_CMD_DFU is not set ++# CONFIG_CMD_DM is not set ++# CONFIG_CMD_FPGAD is not set ++# CONFIG_CMD_FUSE is not set ++# CONFIG_CMD_GPIO is not set ++# CONFIG_CMD_GPT is not set ++# CONFIG_RANDOM_UUID is not set ++# CONFIG_CMD_IDE is not set ++# CONFIG_CMD_IO is not set ++# CONFIG_CMD_IOTRACE is not set ++# CONFIG_CMD_I2C is not set ++# CONFIG_CMD_LOADB is not set ++# CONFIG_CMD_LOADS is not set ++# CONFIG_CMD_LSBLK is not set ++# CONFIG_CMD_MBR is not set ++# CONFIG_CMD_CLONE is not set ++# CONFIG_CMD_OSD is not set ++CONFIG_CMD_PART=y ++# CONFIG_CMD_PCI is not set ++# CONFIG_CMD_POWEROFF is not set ++# CONFIG_CMD_READ is not set ++# CONFIG_CMD_SATA is not set ++# CONFIG_CMD_SAVES is not set ++CONFIG_CMD_SCSI=y ++# CONFIG_CMD_SDRAM is not set ++# CONFIG_CMD_TSI148 is not set ++# CONFIG_CMD_UNIVERSE is not set ++# CONFIG_CMD_USB_SDP is not set ++CONFIG_CMD_VIRTIO=y ++ ++# ++# Shell scripting commands ++# ++CONFIG_CMD_ECHO=y ++# CONFIG_CMD_ITEST is not set ++CONFIG_CMD_SOURCE=y ++# CONFIG_CMD_SETEXPR is not set ++ ++# ++# Android support commands ++# ++CONFIG_CMD_NET=y ++CONFIG_CMD_BOOTP=y ++CONFIG_CMD_DHCP=y ++CONFIG_BOOTP_BOOTPATH=y ++CONFIG_BOOTP_DNS=y ++# CONFIG_BOOTP_DNS2 is not set ++CONFIG_BOOTP_GATEWAY=y ++CONFIG_BOOTP_HOSTNAME=y ++# CONFIG_BOOTP_PREFER_SERVERIP is not set ++CONFIG_BOOTP_SUBNETMASK=y ++# CONFIG_BOOTP_NTPSERVER is not set ++# CONFIG_CMD_PCAP is not set ++CONFIG_BOOTP_PXE=y ++CONFIG_BOOTP_PXE_CLIENTARCH=0x16 ++CONFIG_BOOTP_VCI_STRING="U-Boot.armv8" ++CONFIG_CMD_TFTPBOOT=y ++# CONFIG_CMD_TFTPPUT is not set ++# CONFIG_CMD_TFTPSRV is not set ++CONFIG_NET_TFTP_VARS=y ++# CONFIG_CMD_RARP is not set ++# CONFIG_CMD_NFS is not set ++CONFIG_CMD_MII=y ++CONFIG_CMD_PING=y ++# CONFIG_CMD_CDP is not set ++# CONFIG_CMD_SNTP is not set ++# CONFIG_CMD_DNS is not set ++# CONFIG_CMD_LINK_LOCAL is not set ++# CONFIG_CMD_ETHSW is not set ++CONFIG_CMD_PXE=y ++# CONFIG_CMD_WOL is not set ++ ++# ++# Misc commands ++# ++# CONFIG_CMD_BSP is not set ++# CONFIG_CMD_BLOCK_CACHE is not set ++# CONFIG_CMD_CACHE is not set ++# CONFIG_CMD_CONITRACE is not set ++# CONFIG_CMD_EFIDEBUG is not set ++# CONFIG_CMD_EXCEPTION is not set ++# CONFIG_CMD_DATE is not set ++# CONFIG_CMD_TIME is not set ++# CONFIG_CMD_GETTIME is not set ++# CONFIG_CMD_RNG is not set ++# CONFIG_CMD_KASLRSEED is not set ++CONFIG_CMD_SLEEP=y ++# CONFIG_CMD_TIMER is not set ++CONFIG_CMD_SYSBOOT=y ++CONFIG_CMD_QFW=y ++# CONFIG_CMD_PSTORE is not set ++# CONFIG_CMD_TERMINAL is not set ++# CONFIG_CMD_UUID is not set ++ ++# ++# TI specific command line interface ++# ++# CONFIG_CMD_DDR3 is not set ++ ++# ++# Power commands ++# ++ ++# ++# Security commands ++# ++# CONFIG_CMD_AES is not set ++# CONFIG_CMD_BLOB is not set ++# CONFIG_CMD_HASH is not set ++# CONFIG_CMD_HVC is not set ++# CONFIG_CMD_SMC is not set ++ ++# ++# Firmware commands ++# ++ ++# ++# Filesystem commands ++# ++# CONFIG_CMD_BTRFS is not set ++CONFIG_CMD_EXT2=y ++CONFIG_CMD_EXT4=y ++# CONFIG_CMD_EXT4_WRITE is not set ++CONFIG_CMD_FAT=y ++# CONFIG_CMD_SQUASHFS is not set ++CONFIG_CMD_FS_GENERIC=y ++# CONFIG_CMD_FS_UUID is not set ++# CONFIG_CMD_JFFS2 is not set ++# CONFIG_CMD_REISER is not set ++# CONFIG_CMD_ZFS is not set ++ ++# ++# Debug commands ++# ++# CONFIG_CMD_DIAG is not set ++# CONFIG_CMD_LOG is not set ++# CONFIG_CMD_UBI is not set ++ ++# ++# Partition Types ++# ++CONFIG_PARTITIONS=y ++# CONFIG_MAC_PARTITION is not set ++CONFIG_DOS_PARTITION=y ++CONFIG_ISO_PARTITION=y ++# CONFIG_AMIGA_PARTITION is not set ++CONFIG_EFI_PARTITION=y ++CONFIG_EFI_PARTITION_ENTRIES_NUMBERS=128 ++CONFIG_EFI_PARTITION_ENTRIES_OFF=0 ++CONFIG_PARTITION_UUIDS=y ++# CONFIG_PARTITION_TYPE_GUID is not set ++CONFIG_SUPPORT_OF_CONTROL=y ++ ++# ++# Device Tree Control ++# ++CONFIG_OF_CONTROL=y ++CONFIG_OF_REAL=y ++# CONFIG_OF_LIVE is not set ++CONFIG_OF_SEPARATE=y ++# CONFIG_OF_EMBED is not set ++CONFIG_OF_BOARD=y ++CONFIG_OF_HAS_PRIOR_STAGE=y ++CONFIG_OF_OMIT_DTB=y ++CONFIG_DEVICE_TREE_INCLUDES="" ++CONFIG_OF_LIST="qemu-arm64" ++# CONFIG_MULTI_DTB_FIT is not set ++# CONFIG_OF_DTB_PROPS_REMOVE is not set ++ ++# ++# Environment ++# ++CONFIG_ENV_SUPPORT=y ++CONFIG_ENV_SOURCE_FILE="" ++CONFIG_SAVEENV=y ++# CONFIG_ENV_OVERWRITE is not set ++CONFIG_ENV_IS_NOWHERE=y ++# CONFIG_ENV_IS_IN_EEPROM is not set ++# CONFIG_ENV_IS_IN_FAT is not set ++# CONFIG_ENV_IS_IN_EXT4 is not set ++# CONFIG_ENV_IS_IN_FLASH is not set ++# CONFIG_ENV_IS_IN_NAND is not set ++# CONFIG_ENV_IS_IN_NVRAM is not set ++# CONFIG_ENV_IS_IN_ONENAND is not set ++# CONFIG_ENV_IS_IN_REMOTE is not set ++# CONFIG_SYS_REDUNDAND_ENVIRONMENT is not set ++# CONFIG_SYS_RELOC_GD_ENV_ADDR is not set ++# CONFIG_USE_DEFAULT_ENV_FILE is not set ++# CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG is not set ++# CONFIG_ENV_IMPORT_FDT is not set ++# CONFIG_ENV_APPEND is not set ++# CONFIG_ENV_WRITEABLE_LIST is not set ++# CONFIG_ENV_ACCESS_IGNORE_FORCE is not set ++# CONFIG_VERSION_VARIABLE is not set ++CONFIG_NET=y ++# CONFIG_PROT_UDP is not set ++# CONFIG_BOOTP_SEND_HOSTNAME is not set ++# CONFIG_NET_RANDOM_ETHADDR is not set ++# CONFIG_NETCONSOLE is not set ++# CONFIG_IP_DEFRAG is not set ++CONFIG_TFTP_BLOCKSIZE=512 ++CONFIG_TFTP_WINDOWSIZE=1 ++# CONFIG_TFTP_TSIZE is not set ++# CONFIG_SERVERIP_FROM_PROXYDHCP is not set ++CONFIG_SERVERIP_FROM_PROXYDHCP_DELAY_MS=100 ++# CONFIG_KEEP_SERVERADDR is not set ++# CONFIG_UDP_CHECKSUM is not set ++# CONFIG_BOOTP_SERVERIP is not set ++ ++# ++# Device Drivers ++# ++ ++# ++# Generic Driver Options ++# ++CONFIG_DM=y ++# CONFIG_DM_WARN is not set ++# CONFIG_DM_DEBUG is not set ++# CONFIG_DM_DEVICE_REMOVE is not set ++# CONFIG_DM_STDIO is not set ++# CONFIG_DM_SEQ_ALIAS is not set ++# CONFIG_DM_DMA is not set ++# CONFIG_REGMAP is not set ++# CONFIG_DEVRES is not set ++# CONFIG_SIMPLE_BUS is not set ++# CONFIG_OF_TRANSLATE is not set ++# CONFIG_TRANSLATION_OFFSET is not set ++CONFIG_DM_DEV_READ_INLINE=y ++# CONFIG_ACPIGEN is not set ++# CONFIG_BOUNCE_BUFFER is not set ++# CONFIG_ADC is not set ++# CONFIG_ADC_EXYNOS is not set ++# CONFIG_ADC_SANDBOX is not set ++# CONFIG_SARADC_MESON is not set ++# CONFIG_SARADC_ROCKCHIP is not set ++# CONFIG_SATA is not set ++# CONFIG_SCSI_AHCI is not set ++ ++# ++# SATA/SCSI device support ++# ++# CONFIG_AHCI_PCI is not set ++# CONFIG_DWC_AHCI is not set ++# CONFIG_DWC_AHSATA is not set ++# CONFIG_MTK_AHCI is not set ++# CONFIG_SUNXI_AHCI is not set ++# CONFIG_AXI is not set ++ ++# ++# Bus devices ++# ++CONFIG_BLK=y ++CONFIG_HAVE_BLOCK_DEVICE=y ++CONFIG_BLOCK_CACHE=y ++# CONFIG_EFI_MEDIA is not set ++# CONFIG_IDE is not set ++# CONFIG_BOOTCOUNT_LIMIT is not set ++ ++# ++# Button Support ++# ++# CONFIG_BUTTON is not set ++ ++# ++# Cache Controller drivers ++# ++# CONFIG_CACHE is not set ++# CONFIG_L2X0_CACHE is not set ++# CONFIG_NCORE_CACHE is not set ++# CONFIG_SIFIVE_CCACHE is not set ++ ++# ++# Clock ++# ++# CONFIG_CLK is not set ++# CONFIG_CLK_CCF is not set ++# CONFIG_CPU is not set ++ ++# ++# Hardware crypto devices ++# ++# CONFIG_DM_HASH is not set ++# CONFIG_FSL_CAAM is not set ++CONFIG_CAAM_64BIT=y ++# CONFIG_SYS_FSL_SEC_BE is not set ++# CONFIG_SYS_FSL_SEC_LE is not set ++# CONFIG_DDR_SPD is not set ++ ++# ++# Demo for driver model ++# ++# CONFIG_DM_DEMO is not set ++ ++# ++# DFU support ++# ++ ++# ++# DMA Support ++# ++# CONFIG_DMA is not set ++# CONFIG_DMA_LPC32XX is not set ++# CONFIG_TI_EDMA3 is not set ++# CONFIG_DMA_LEGACY is not set ++ ++# ++# Fastboot support ++# ++# CONFIG_UDP_FUNCTION_FASTBOOT is not set ++CONFIG_FIRMWARE=y ++# CONFIG_SPL_FIRMWARE is not set ++CONFIG_ARM_PSCI_FW=y ++# CONFIG_ZYNQMP_FIRMWARE is not set ++# CONFIG_SCMI_FIRMWARE is not set ++ ++# ++# FPGA support ++# ++# CONFIG_FPGA_ALTERA is not set ++# CONFIG_FPGA_SOCFPGA is not set ++# CONFIG_FPGA_XILINX is not set ++CONFIG_GPIO=y ++# CONFIG_AT91_GPIO is not set ++# CONFIG_DA8XX_GPIO is not set ++# CONFIG_INTEL_BROADWELL_GPIO is not set ++# CONFIG_IMX_RGPIO2P is not set ++# CONFIG_IPROC_GPIO is not set ++# CONFIG_KIRKWOOD_GPIO is not set ++# CONFIG_LPC32XX_GPIO is not set ++# CONFIG_MCP230XX_GPIO is not set ++# CONFIG_MXC_GPIO is not set ++# CONFIG_MXS_GPIO is not set ++# CONFIG_CMD_PCA953X is not set ++# CONFIG_CMD_TCA642X is not set ++# CONFIG_VYBRID_GPIO is not set ++ ++# ++# Hardware Spinlock Support ++# ++# CONFIG_DM_HWSPINLOCK is not set ++CONFIG_I2C=y ++# CONFIG_DM_I2C is not set ++# CONFIG_SYS_I2C_LEGACY is not set ++# CONFIG_SYS_I2C_FSL is not set ++# CONFIG_SYS_I2C_DW is not set ++# CONFIG_SYS_I2C_IMX_LPI2C is not set ++# CONFIG_SYS_I2C_MICROCHIP is not set ++# CONFIG_SYS_I2C_MXC is not set ++# CONFIG_SYS_I2C_SOFT is not set ++# CONFIG_SYS_I2C_MV is not set ++# CONFIG_SYS_I2C_MVTWSI is not set ++# CONFIG_INPUT is not set ++# CONFIG_DM_KEYBOARD is not set ++# CONFIG_KEYBOARD is not set ++# CONFIG_TEGRA_KEYBOARD is not set ++# CONFIG_TWL4030_INPUT is not set ++ ++# ++# IOMMU device drivers ++# ++# CONFIG_IOMMU is not set ++ ++# ++# LED Support ++# ++# CONFIG_LED is not set ++# CONFIG_LED_STATUS is not set ++ ++# ++# Mailbox Controller Support ++# ++# CONFIG_DM_MAILBOX is not set ++ ++# ++# Memory Controller drivers ++# ++ ++# ++# Multifunction device drivers ++# ++# CONFIG_MISC is not set ++# CONFIG_CROS_EC is not set ++# CONFIG_DS4510 is not set ++# CONFIG_FSL_SEC_MON is not set ++# CONFIG_IRQ is not set ++# CONFIG_NUVOTON_NCT6102D is not set ++# CONFIG_PWRSEQ is not set ++# CONFIG_PCA9551_LED is not set ++# CONFIG_TEST_DRV is not set ++# CONFIG_TWL4030_LED is not set ++# CONFIG_WINBOND_W83627 is not set ++CONFIG_QFW=y ++CONFIG_QFW_MMIO=y ++# CONFIG_FS_LOADER is not set ++# CONFIG_SPL_FS_LOADER is not set ++ ++# ++# MMC Host controller Support ++# ++# CONFIG_MMC is not set ++# CONFIG_MMC_BROKEN_CD is not set ++# CONFIG_DM_MMC is not set ++# CONFIG_FSL_ESDHC is not set ++# CONFIG_FSL_ESDHC_IMX is not set ++ ++# ++# MTD Support ++# ++# CONFIG_MTD is not set ++# CONFIG_DM_MTD is not set ++# CONFIG_MTD_NOR_FLASH is not set ++# CONFIG_FLASH_CFI_DRIVER is not set ++# CONFIG_USE_SYS_MAX_FLASH_BANKS is not set ++# CONFIG_MTD_RAW_NAND is not set ++ ++# ++# SPI Flash Support ++# ++# CONFIG_SPI_FLASH is not set ++ ++# ++# UBI support ++# ++# CONFIG_UBI_SILENCE_MSG is not set ++# CONFIG_MTD_UBI is not set ++ ++# ++# Multiplexer drivers ++# ++# CONFIG_MULTIPLEXER is not set ++# CONFIG_BITBANGMII is not set ++# CONFIG_MV88E6352_SWITCH is not set ++# CONFIG_PHYLIB is not set ++# CONFIG_FSL_PFE is not set ++# CONFIG_BNXT_ETH is not set ++CONFIG_ETH=y ++CONFIG_DM_ETH=y ++# CONFIG_DM_ETH_PHY is not set ++CONFIG_NETDEVICES=y ++# CONFIG_PHY_GIGE is not set ++# CONFIG_ALTERA_TSE is not set ++# CONFIG_BCM_SF2_ETH is not set ++# CONFIG_BCMGENET is not set ++# CONFIG_CALXEDA_XGMAC is not set ++# CONFIG_DWC_ETH_QOS is not set ++CONFIG_E1000=y ++# CONFIG_E1000_SPI_GENERIC is not set ++# CONFIG_E1000_SPI is not set ++# CONFIG_CMD_E1000 is not set ++# CONFIG_EEPRO100 is not set ++# CONFIG_ETH_DESIGNWARE is not set ++# CONFIG_ETH_DESIGNWARE_MESON8B is not set ++# CONFIG_ETHOC is not set ++# CONFIG_FMAN_ENET is not set ++# CONFIG_FTMAC100 is not set ++# CONFIG_FTGMAC100 is not set ++# CONFIG_MCFFEC is not set ++# CONFIG_FSLDMAFEC is not set ++# CONFIG_KS8851_MLL is not set ++# CONFIG_MACB is not set ++# CONFIG_PCH_GBE is not set ++# CONFIG_RGMII is not set ++# CONFIG_MII is not set ++# CONFIG_PCNET is not set ++# CONFIG_QE_UEC is not set ++# CONFIG_RTL8139 is not set ++# CONFIG_RTL8169 is not set ++# CONFIG_SMC911X is not set ++# CONFIG_SUN7I_GMAC is not set ++# CONFIG_SUN4I_EMAC is not set ++# CONFIG_SUN8I_EMAC is not set ++# CONFIG_SH_ETHER is not set ++# CONFIG_DRIVER_TI_CPSW is not set ++# CONFIG_DRIVER_TI_EMAC is not set ++# CONFIG_DRIVER_TI_KEYSTONE_NET is not set ++# CONFIG_TULIP is not set ++# CONFIG_XILINX_AXIEMAC is not set ++# CONFIG_XILINX_EMACLITE is not set ++# CONFIG_ZYNQ_GEM is not set ++# CONFIG_SYS_DPAA_QBMAN is not set ++# CONFIG_TSEC_ENET is not set ++# CONFIG_MEDIATEK_ETH is not set ++# CONFIG_HIGMACV300_ETH is not set ++# CONFIG_NVME is not set ++# CONFIG_NVME_APPLE is not set ++# CONFIG_NVME_PCI is not set ++CONFIG_PCI=y ++# CONFIG_DM_PCI_COMPAT is not set ++CONFIG_PCI_PNP=y ++# CONFIG_PCI_REGION_MULTI_ENTRY is not set ++# CONFIG_PCI_SRIOV is not set ++# CONFIG_PCI_ARID is not set ++CONFIG_PCIE_ECAM_GENERIC=y ++# CONFIG_PCIE_ECAM_SYNQUACER is not set ++# CONFIG_PCI_PHYTIUM is not set ++# CONFIG_PCIE_FSL is not set ++# CONFIG_PCI_MPC85XX is not set ++# CONFIG_PCI_XILINX is not set ++# CONFIG_PCIE_LAYERSCAPE_RC is not set ++# CONFIG_PCIE_LAYERSCAPE_EP is not set ++# CONFIG_PCIE_LAYERSCAPE_GEN4 is not set ++# CONFIG_PCIE_INTEL_FPGA is not set ++# CONFIG_PCIE_IPROC is not set ++# CONFIG_PCI_KEYSTONE is not set ++ ++# ++# PCI Endpoint ++# ++# CONFIG_PCI_ENDPOINT is not set ++# CONFIG_X86_PCH7 is not set ++# CONFIG_X86_PCH9 is not set ++ ++# ++# PHY Subsystem ++# ++# CONFIG_PHY is not set ++# CONFIG_MIPI_DPHY_HELPERS is not set ++ ++# ++# Rockchip PHY driver ++# ++# CONFIG_MVEBU_COMPHY_SUPPORT is not set ++ ++# ++# Pin controllers ++# ++# CONFIG_PINCTRL is not set ++CONFIG_POWER=y ++# CONFIG_POWER_LEGACY is not set ++# CONFIG_SPL_POWER_LEGACY is not set ++# CONFIG_ACPI_PMC is not set ++# CONFIG_SPL_ACPI_PMC is not set ++# CONFIG_TPL_ACPI_PMC is not set ++ ++# ++# Power Domain Support ++# ++# CONFIG_POWER_DOMAIN is not set ++# CONFIG_DM_PMIC is not set ++# CONFIG_POWER_MC34VR500 is not set ++# CONFIG_DM_REGULATOR is not set ++# CONFIG_POWER_MT6323 is not set ++# CONFIG_DM_PWM is not set ++# CONFIG_PWM_IMX is not set ++# CONFIG_PWM_SANDBOX is not set ++# CONFIG_U_QE is not set ++# CONFIG_RAM is not set ++ ++# ++# Reboot Mode Support ++# ++# CONFIG_DM_REBOOT_MODE is not set ++ ++# ++# Remote Processor drivers ++# ++ ++# ++# Reset Controller Support ++# ++# CONFIG_DM_RESET is not set ++# CONFIG_RESET_SCMI is not set ++CONFIG_DM_RNG=y ++# CONFIG_RNG_MSM is not set ++# CONFIG_RNG_IPROC200 is not set ++ ++# ++# Real Time Clock ++# ++# CONFIG_DM_RTC is not set ++# CONFIG_RTC_ENABLE_32KHZ_OUTPUT is not set ++# CONFIG_RTC_PCF8563 is not set ++# CONFIG_RTC_PL031 is not set ++# CONFIG_RTC_S35392A is not set ++# CONFIG_RTC_MC146818 is not set ++# CONFIG_RTC_M41T62 is not set ++CONFIG_SCSI=y ++CONFIG_DM_SCSI=y ++CONFIG_SERIAL=y ++CONFIG_BAUDRATE=115200 ++CONFIG_REQUIRE_SERIAL_CONSOLE=y ++# CONFIG_SPECIFY_CONSOLE_INDEX is not set ++CONFIG_SERIAL_PRESENT=y ++CONFIG_DM_SERIAL=y ++# CONFIG_SERIAL_RX_BUFFER is not set ++# CONFIG_SERIAL_SEARCH_ALL is not set ++# CONFIG_SERIAL_PROBE_ALL is not set ++# CONFIG_ALTERA_JTAG_UART is not set ++# CONFIG_ALTERA_UART is not set ++# CONFIG_ARC_SERIAL is not set ++# CONFIG_ARM_DCC is not set ++# CONFIG_ATMEL_USART is not set ++# CONFIG_BCM6345_SERIAL is not set ++# CONFIG_COREBOOT_SERIAL is not set ++# CONFIG_CORTINA_UART is not set ++# CONFIG_FSL_LINFLEXUART is not set ++# CONFIG_FSL_LPUART is not set ++# CONFIG_MVEBU_A3700_UART is not set ++# CONFIG_MCFUART is not set ++# CONFIG_NULLDEV_SERIAL is not set ++# CONFIG_SYS_NS16550 is not set ++# CONFIG_NS16550_DYNAMIC is not set ++CONFIG_PL01X_SERIAL=y ++# CONFIG_XILINX_UARTLITE is not set ++# CONFIG_MSM_SERIAL is not set ++# CONFIG_MSM_GENI_SERIAL is not set ++# CONFIG_OMAP_SERIAL is not set ++# CONFIG_PXA_SERIAL is not set ++# CONFIG_SIFIVE_SERIAL is not set ++# CONFIG_ZYNQ_SERIAL is not set ++# CONFIG_MTK_SERIAL is not set ++# CONFIG_MT7620_SERIAL is not set ++# CONFIG_SMEM is not set ++ ++# ++# Sound support ++# ++# CONFIG_SOUND is not set ++# CONFIG_SOUND_MAX98357A is not set ++ ++# ++# SOC (System On Chip) specific Drivers ++# ++# CONFIG_SOC_DEVICE is not set ++# CONFIG_SOC_TI is not set ++# CONFIG_SPI is not set ++ ++# ++# SPMI support ++# ++# CONFIG_SPMI is not set ++# CONFIG_SYSINFO is not set ++ ++# ++# System reset device drivers ++# ++CONFIG_SYSRESET=y ++CONFIG_SYSRESET_CMD_RESET=y ++# CONFIG_POWEROFF_GPIO is not set ++# CONFIG_SYSRESET_GPIO is not set ++CONFIG_SYSRESET_PSCI=y ++# CONFIG_SYSRESET_SYSCON is not set ++# CONFIG_SYSRESET_WATCHDOG is not set ++# CONFIG_SYSRESET_RESETCTL is not set ++# CONFIG_SYSRESET_MPC83XX is not set ++# CONFIG_TEE is not set ++# CONFIG_DM_THERMAL is not set ++ ++# ++# Timer Support ++# ++# CONFIG_TIMER is not set ++ ++# ++# TPM support ++# ++# CONFIG_USB is not set ++ ++# ++# UFS Host Controller Support ++# ++# CONFIG_UFS is not set ++# CONFIG_TI_J721E_UFS is not set ++ ++# ++# Graphics support ++# ++# CONFIG_DM_VIDEO is not set ++# CONFIG_SYS_WHITE_ON_BLACK is not set ++# CONFIG_NO_FB_CLEAR is not set ++ ++# ++# TrueType Fonts ++# ++# CONFIG_VIDEO_VESA is not set ++# CONFIG_VIDEO_LCD_ANX9804 is not set ++# CONFIG_VIDEO_LCD_SSD2828 is not set ++# CONFIG_VIDEO_LCD_HITACHI_TX18D42VM is not set ++# CONFIG_VIDEO_MVEBU is not set ++# CONFIG_I2C_EDID is not set ++# CONFIG_DISPLAY is not set ++# CONFIG_ATMEL_HLCD is not set ++# CONFIG_AM335X_LCD is not set ++# CONFIG_VIDEO_TEGRA20 is not set ++# CONFIG_VIDEO_BRIDGE is not set ++# CONFIG_VIDEO is not set ++# CONFIG_LCD is not set ++# CONFIG_VIDEO_SIMPLE is not set ++# CONFIG_VIDEO_DT_SIMPLEFB is not set ++# CONFIG_OSD is not set ++# CONFIG_SPLASH_SCREEN is not set ++# CONFIG_VIDEO_VCXK is not set ++ ++# ++# VirtIO Drivers ++# ++CONFIG_VIRTIO=y ++CONFIG_VIRTIO_MMIO=y ++CONFIG_VIRTIO_PCI=y ++CONFIG_VIRTIO_NET=y ++CONFIG_VIRTIO_BLK=y ++CONFIG_VIRTIO_RNG=y ++ ++# ++# 1-Wire support ++# ++# CONFIG_W1 is not set ++ ++# ++# 1-wire EEPROM support ++# ++# CONFIG_W1_EEPROM is not set ++ ++# ++# Watchdog Timer Support ++# ++# CONFIG_WATCHDOG is not set ++CONFIG_WATCHDOG_TIMEOUT_MSECS=60000 ++# CONFIG_IMX_WATCHDOG is not set ++# CONFIG_ULP_WATCHDOG is not set ++# CONFIG_DESIGNWARE_WATCHDOG is not set ++# CONFIG_WDT is not set ++# CONFIG_PVBLOCK is not set ++# CONFIG_PHYS_TO_BUS is not set ++ ++# ++# File systems ++# ++# CONFIG_FS_BTRFS is not set ++# CONFIG_FS_CBFS is not set ++# CONFIG_SPL_FS_CBFS is not set ++CONFIG_FS_EXT4=y ++# CONFIG_EXT4_WRITE is not set ++CONFIG_FS_FAT=y ++CONFIG_FAT_WRITE=y ++CONFIG_FS_FAT_MAX_CLUSTSIZE=65536 ++# CONFIG_FS_JFFS2 is not set ++# CONFIG_UBIFS_SILENCE_MSG is not set ++# CONFIG_FS_CRAMFS is not set ++# CONFIG_YAFFS2 is not set ++# CONFIG_FS_SQUASHFS is not set ++ ++# ++# Library routines ++# ++# CONFIG_ADDR_MAP is not set ++# CONFIG_PHYSMEM is not set ++# CONFIG_BCH is not set ++# CONFIG_CC_OPTIMIZE_LIBS_FOR_SPEED is not set ++CONFIG_CHARSET=y ++# CONFIG_DYNAMIC_CRC_TABLE is not set ++CONFIG_LIB_UUID=y ++CONFIG_PRINTF=y ++CONFIG_SPRINTF=y ++CONFIG_STRTO=y ++CONFIG_SYS_HZ=1000 ++# CONFIG_PANIC_HANG is not set ++CONFIG_REGEX=y ++CONFIG_LIB_RAND=y ++# CONFIG_LIB_HW_RAND is not set ++CONFIG_SUPPORT_ACPI=y ++# CONFIG_GENERATE_ACPI_TABLE is not set ++# CONFIG_SPL_TINY_MEMSET is not set ++# CONFIG_TPL_TINY_MEMSET is not set ++# CONFIG_BITREVERSE is not set ++# CONFIG_TRACE is not set ++# CONFIG_CIRCBUF is not set ++# CONFIG_CMD_DHRYSTONE is not set ++ ++# ++# Security support ++# ++# CONFIG_AES is not set ++# CONFIG_ECDSA is not set ++# CONFIG_RSA is not set ++# CONFIG_ASYMMETRIC_KEY_TYPE is not set ++# CONFIG_TPM is not set ++ ++# ++# Android Verified Boot ++# ++ ++# ++# Hashing Support ++# ++# CONFIG_BLAKE2 is not set ++CONFIG_SHA1=y ++CONFIG_SHA256=y ++# CONFIG_SHA512 is not set ++# CONFIG_SHA384 is not set ++# CONFIG_SHA_HW_ACCEL is not set ++CONFIG_MD5=y ++CONFIG_CRC32=y ++ ++# ++# Compression Support ++# ++CONFIG_LZ4=y ++# CONFIG_LZMA is not set ++# CONFIG_LZO is not set ++# CONFIG_GZIP is not set ++# CONFIG_ZLIB_UNCOMPRESS is not set ++# CONFIG_BZIP2 is not set ++CONFIG_ZLIB=y ++# CONFIG_ZSTD is not set ++# CONFIG_SPL_LZ4 is not set ++# CONFIG_SPL_LZMA is not set ++# CONFIG_SPL_LZO is not set ++# CONFIG_SPL_GZIP is not set ++# CONFIG_SPL_ZSTD is not set ++# CONFIG_ERRNO_STR is not set ++# CONFIG_HEXDUMP is not set ++# CONFIG_GETOPT is not set ++CONFIG_OF_LIBFDT=y ++CONFIG_OF_LIBFDT_ASSUME_MASK=0 ++# CONFIG_OF_LIBFDT_OVERLAY is not set ++# CONFIG_SPL_OF_LIBFDT is not set ++CONFIG_SPL_OF_LIBFDT_ASSUME_MASK=0xff ++# CONFIG_TPL_OF_LIBFDT is not set ++CONFIG_TPL_OF_LIBFDT_ASSUME_MASK=0xff ++ ++# ++# System tables ++# ++CONFIG_GENERATE_SMBIOS_TABLE=y ++# CONFIG_LIB_RATIONAL is not set ++# CONFIG_SMBIOS_PARSER is not set ++CONFIG_EFI_LOADER=y ++CONFIG_CMD_BOOTEFI_BOOTMGR=y ++CONFIG_EFI_VARIABLE_FILE_STORE=y ++# CONFIG_EFI_VARIABLES_PRESEED is not set ++CONFIG_EFI_VAR_BUF_SIZE=16384 ++# CONFIG_EFI_RUNTIME_UPDATE_CAPSULE is not set ++# CONFIG_EFI_CAPSULE_ON_DISK is not set ++CONFIG_EFI_DEVICE_PATH_TO_TEXT=y ++CONFIG_EFI_DEVICE_PATH_UTIL=y ++CONFIG_EFI_DT_FIXUP=y ++CONFIG_EFI_LOADER_HII=y ++CONFIG_EFI_UNICODE_COLLATION_PROTOCOL2=y ++CONFIG_EFI_UNICODE_CAPITALIZATION=y ++# CONFIG_EFI_LOADER_BOUNCE_BUFFER is not set ++CONFIG_EFI_PLATFORM_LANG_CODES="en-US" ++CONFIG_EFI_HAVE_RUNTIME_RESET=y ++CONFIG_EFI_RNG_PROTOCOL=y ++CONFIG_EFI_LOAD_FILE2_INITRD=y ++# CONFIG_OPTEE_LIB is not set ++# CONFIG_OPTEE_IMAGE is not set ++# CONFIG_BOOTM_OPTEE is not set ++# CONFIG_TEST_FDTDEC is not set ++CONFIG_LIB_ELF=y ++CONFIG_LMB=y ++CONFIG_LMB_USE_MAX_REGIONS=y ++CONFIG_LMB_MAX_REGIONS=8 ++# CONFIG_PHANDLE_CHECK_SEQ is not set ++# CONFIG_UNIT_TEST is not set ++# CONFIG_SPL_UNIT_TEST is not set ++ ++# ++# Tools options ++# ++CONFIG_MKIMAGE_DTC_PATH="dtc" ++CONFIG_TOOLS_CRC32=y ++CONFIG_TOOLS_LIBCRYPTO=y ++CONFIG_TOOLS_FIT=y ++CONFIG_TOOLS_FIT_FULL_CHECK=y ++CONFIG_TOOLS_FIT_PRINT=y ++CONFIG_TOOLS_FIT_RSASSA_PSS=y ++CONFIG_TOOLS_FIT_SIGNATURE=y ++CONFIG_TOOLS_FIT_SIGNATURE_MAX_SIZE=0x10000000 ++CONFIG_TOOLS_FIT_VERBOSE=y ++CONFIG_TOOLS_MD5=y ++CONFIG_TOOLS_OF_LIBFDT=y ++CONFIG_TOOLS_SHA1=y ++CONFIG_TOOLS_SHA256=y ++CONFIG_TOOLS_SHA384=y ++CONFIG_TOOLS_SHA512=y ++# CONFIG_TOOLS_MKEFICAPSULE is not set ++# ++# Automatically generated file; DO NOT EDIT. ++# U-Boot 2022.04 Configuration ++# ++ ++# ++# Compiler: aarch64-linux-gnu-gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0 ++# ++CONFIG_CREATE_ARCH_SYMLINK=y ++CONFIG_SYS_CACHE_SHIFT_6=y ++CONFIG_SYS_CACHELINE_SIZE=64 ++CONFIG_LINKER_LIST_ALIGN=8 ++# CONFIG_ARC is not set ++CONFIG_ARM=y ++# CONFIG_M68K is not set ++# CONFIG_MICROBLAZE is not set ++# CONFIG_MIPS is not set ++# CONFIG_NDS32 is not set ++# CONFIG_NIOS2 is not set ++# CONFIG_PPC is not set ++# CONFIG_RISCV is not set ++# CONFIG_SANDBOX is not set ++# CONFIG_SH is not set ++# CONFIG_X86 is not set ++# CONFIG_XTENSA is not set ++CONFIG_SYS_ARCH="arm" ++CONFIG_SYS_CPU="armv8" ++CONFIG_SYS_VENDOR="emulation" ++CONFIG_SYS_BOARD="qemu-arm" ++CONFIG_SYS_CONFIG_NAME="qemu-arm" ++CONFIG_SKIP_LOWLEVEL_INIT=y ++# CONFIG_SKIP_LOWLEVEL_INIT_ONLY is not set ++# CONFIG_SYS_ICACHE_OFF is not set ++# CONFIG_SYS_DCACHE_OFF is not set ++ ++# ++# ARM architecture ++# ++CONFIG_ARM64=y ++CONFIG_ARM64_CRC32=y ++# CONFIG_POSITION_INDEPENDENT is not set ++# CONFIG_INIT_SP_RELATIVE is not set ++# CONFIG_GIC_V3_ITS is not set ++CONFIG_STATIC_RELA=y ++CONFIG_DMA_ADDR_T_64BIT=y ++CONFIG_ARM_ASM_UNIFIED=y ++# CONFIG_SYS_ARM_CACHE_CP15 is not set ++# CONFIG_SYS_ARM_MMU is not set ++# CONFIG_SYS_ARM_MPU is not set ++CONFIG_SYS_ARM_ARCH=8 ++CONFIG_SYS_ARM_CACHE_WRITEBACK=y ++# CONFIG_SYS_ARM_CACHE_WRITETHROUGH is not set ++# CONFIG_SYS_ARM_CACHE_WRITEALLOC is not set ++# CONFIG_ARCH_CPU_INIT is not set ++CONFIG_SYS_ARCH_TIMER=y ++CONFIG_ARM_SMCCC=y ++# CONFIG_SEMIHOSTING is not set ++# CONFIG_SYS_L2CACHE_OFF is not set ++# CONFIG_ENABLE_ARM_SOC_BOOT0_HOOK is not set ++# CONFIG_USE_ARCH_MEMCPY is not set ++# CONFIG_USE_ARCH_MEMSET is not set ++CONFIG_ARM64_SUPPORT_AARCH32=y ++# CONFIG_ARCH_AT91 is not set ++# CONFIG_ARCH_DAVINCI is not set ++# CONFIG_ARCH_KIRKWOOD is not set ++# CONFIG_ARCH_MVEBU is not set ++# CONFIG_ARCH_ORION5X is not set ++# CONFIG_TARGET_STV0991 is not set ++# CONFIG_ARCH_BCM283X is not set ++# CONFIG_ARCH_BCM63158 is not set ++# CONFIG_ARCH_BCM68360 is not set ++# CONFIG_ARCH_BCM6858 is not set ++# CONFIG_ARCH_BCMSTB is not set ++# CONFIG_TARGET_VEXPRESS_CA9X4 is not set ++# CONFIG_TARGET_BCMCYGNUS is not set ++# CONFIG_TARGET_BCMNS2 is not set ++# CONFIG_TARGET_BCMNS3 is not set ++# CONFIG_ARCH_EXYNOS is not set ++# CONFIG_ARCH_S5PC1XX is not set ++# CONFIG_ARCH_HIGHBANK is not set ++# CONFIG_ARCH_INTEGRATOR is not set ++# CONFIG_ARCH_IPQ40XX is not set ++# CONFIG_ARCH_KEYSTONE is not set ++# CONFIG_ARCH_K3 is not set ++# CONFIG_ARCH_OMAP2PLUS is not set ++# CONFIG_ARCH_MESON is not set ++# CONFIG_ARCH_MEDIATEK is not set ++# CONFIG_ARCH_LPC32XX is not set ++# CONFIG_ARCH_IMX8 is not set ++# CONFIG_ARCH_IMX8M is not set ++# CONFIG_ARCH_IMX8ULP is not set ++# CONFIG_ARCH_IMXRT is not set ++# CONFIG_ARCH_MX23 is not set ++# CONFIG_ARCH_MX28 is not set ++# CONFIG_ARCH_MX31 is not set ++# CONFIG_ARCH_MX7ULP is not set ++# CONFIG_ARCH_MX7 is not set ++# CONFIG_ARCH_MX6 is not set ++CONFIG_SPL_LDSCRIPT="arch/arm/cpu/armv8/u-boot-spl.lds" ++# CONFIG_ARCH_MX5 is not set ++# CONFIG_ARCH_NEXELL is not set ++# CONFIG_ARCH_APPLE is not set ++# CONFIG_ARCH_OWL is not set ++CONFIG_ARCH_QEMU=y ++# CONFIG_ARCH_RMOBILE is not set ++# CONFIG_ARCH_SNAPDRAGON is not set ++# CONFIG_ARCH_SOCFPGA is not set ++# CONFIG_ARCH_SUNXI is not set ++# CONFIG_ARCH_U8500 is not set ++# CONFIG_ARCH_VERSAL is not set ++# CONFIG_ARCH_VF610 is not set ++# CONFIG_ARCH_ZYNQ is not set ++# CONFIG_ARCH_ZYNQMP_R5 is not set ++# CONFIG_ARCH_ZYNQMP is not set ++# CONFIG_ARCH_TEGRA is not set ++# CONFIG_TARGET_VEXPRESS64_AEMV8A is not set ++# CONFIG_TARGET_VEXPRESS64_BASE_FVP is not set ++# CONFIG_TARGET_VEXPRESS64_JUNO is not set ++# CONFIG_TARGET_TOTAL_COMPUTE is not set ++# CONFIG_TARGET_LS2080A_EMU is not set ++# CONFIG_TARGET_LS1088AQDS is not set ++# CONFIG_TARGET_LS2080AQDS is not set ++# CONFIG_TARGET_LS2080ARDB is not set ++# CONFIG_TARGET_LS2081ARDB is not set ++# CONFIG_TARGET_LX2160ARDB is not set ++# CONFIG_TARGET_LX2160AQDS is not set ++# CONFIG_TARGET_LX2162AQDS is not set ++# CONFIG_TARGET_HIKEY is not set ++# CONFIG_TARGET_HIKEY960 is not set ++# CONFIG_TARGET_POPLAR is not set ++# CONFIG_TARGET_LS1012AQDS is not set ++# CONFIG_TARGET_LS1012ARDB is not set ++# CONFIG_TARGET_LS1012A2G5RDB is not set ++# CONFIG_TARGET_LS1012AFRWY is not set ++# CONFIG_TARGET_LS1012AFRDM is not set ++# CONFIG_TARGET_LS1028AQDS is not set ++# CONFIG_TARGET_LS1028ARDB is not set ++# CONFIG_TARGET_LS1088ARDB is not set ++# CONFIG_TARGET_LS1021AQDS is not set ++# CONFIG_TARGET_LS1021ATWR is not set ++# CONFIG_TARGET_PG_WCOM_SELI8 is not set ++# CONFIG_TARGET_PG_WCOM_EXPU1 is not set ++# CONFIG_TARGET_LS1021ATSN is not set ++# CONFIG_TARGET_LS1021AIOT is not set ++# CONFIG_TARGET_LS1043AQDS is not set ++# CONFIG_TARGET_LS1043ARDB is not set ++# CONFIG_TARGET_LS1046AQDS is not set ++# CONFIG_TARGET_LS1046ARDB is not set ++# CONFIG_TARGET_LS1046AFRWY is not set ++# CONFIG_TARGET_SL28 is not set ++# CONFIG_TARGET_TEN64 is not set ++# CONFIG_TARGET_COLIBRI_PXA270 is not set ++# CONFIG_ARCH_UNIPHIER is not set ++# CONFIG_ARCH_SYNQUACER is not set ++# CONFIG_ARCH_STM32 is not set ++# CONFIG_ARCH_STI is not set ++# CONFIG_ARCH_STM32MP is not set ++# CONFIG_ARCH_ROCKCHIP is not set ++# CONFIG_ARCH_OCTEONTX is not set ++# CONFIG_ARCH_OCTEONTX2 is not set ++# CONFIG_TARGET_THUNDERX_88XX is not set ++# CONFIG_ARCH_ASPEED is not set ++# CONFIG_TARGET_DURIAN is not set ++# CONFIG_TARGET_PRESIDIO_ASIC is not set ++# CONFIG_TARGET_XENGUEST_ARM64 is not set ++# CONFIG_STATIC_MACH_TYPE is not set ++CONFIG_SYS_TEXT_BASE=0x60000000 ++CONFIG_SYS_MALLOC_LEN=0x400000 ++CONFIG_SYS_MALLOC_F_LEN=0x400 ++CONFIG_NR_DRAM_BANKS=1 ++CONFIG_BOARD_SPECIFIC_OPTIONS=y ++CONFIG_ENV_SIZE=0x1f000 ++# CONFIG_DM_GPIO is not set ++CONFIG_DEFAULT_DEVICE_TREE="qemu-arm64" ++CONFIG_MULTI_DTB_FIT_UNCOMPRESS_SZ=0x8000 ++# CONFIG_TARGET_QEMU_ARM_32BIT is not set ++CONFIG_TARGET_QEMU_ARM_64BIT=y ++CONFIG_ERR_PTR_OFFSET=0x0 ++CONFIG_BOOTSTAGE_STASH_ADDR=0 ++CONFIG_IDENT_STRING="" ++CONFIG_SYS_CLK_FREQ=0 ++# CONFIG_CHIP_DIP_SCAN is not set ++# CONFIG_ARMV8_MULTIENTRY is not set ++# CONFIG_ARMV8_SET_SMPEN is not set ++ ++# ++# ARMv8 secure monitor firmware ++# ++# CONFIG_ARMV8_SEC_FIRMWARE_SUPPORT is not set ++# CONFIG_SPL_ARMV8_SEC_FIRMWARE_SUPPORT is not set ++# CONFIG_SPL_RECOVER_DATA_SECTION is not set ++CONFIG_PSCI_RESET=y ++# CONFIG_ARMV8_PSCI is not set ++# CONFIG_ARMV8_EA_EL3_FIRST is not set ++# CONFIG_CMD_DEKBLOB is not set ++# CONFIG_IMX_CAAM_DEK_ENCAP is not set ++# CONFIG_IMX_OPTEE_DEK_ENCAP is not set ++# CONFIG_IMX_SECO_DEK_ENCAP is not set ++# CONFIG_CMD_HDMIDETECT is not set ++CONFIG_IMX_DCD_ADDR=0x00910000 ++ ++# ++# ARM debug ++# ++CONFIG_BUILD_TARGET="" ++# CONFIG_SYS_PCI_64BIT is not set ++# CONFIG_DEBUG_UART is not set ++CONFIG_AHCI=y ++# CONFIG_OF_BOARD_FIXUP is not set ++ ++# ++# General setup ++# ++CONFIG_LOCALVERSION="" ++CONFIG_LOCALVERSION_AUTO=y ++CONFIG_CC_IS_GCC=y ++CONFIG_GCC_VERSION=110400 ++CONFIG_CLANG_VERSION=0 ++CONFIG_CC_OPTIMIZE_FOR_SIZE=y ++# CONFIG_OPTIMIZE_INLINING is not set ++CONFIG_ARCH_SUPPORTS_LTO=y ++# CONFIG_LTO is not set ++CONFIG_CC_HAS_ASM_INLINE=y ++# CONFIG_XEN is not set ++CONFIG_DISTRO_DEFAULTS=y ++CONFIG_ENV_VARS_UBOOT_CONFIG=y ++# CONFIG_SYS_BOOT_GET_CMDLINE is not set ++# CONFIG_SYS_BOOT_GET_KBD is not set ++CONFIG_SYS_MALLOC_F=y ++CONFIG_EXPERT=y ++CONFIG_SYS_MALLOC_CLEAR_ON_INIT=y ++# CONFIG_SYS_MALLOC_DEFAULT_TO_INIT is not set ++# CONFIG_TOOLS_DEBUG is not set ++CONFIG_PHYS_64BIT=y ++# CONFIG_REMAKE_ELF is not set ++# CONFIG_SYS_CUSTOM_LDSCRIPT is not set ++CONFIG_SYS_LOAD_ADDR=0x1000000 ++CONFIG_PLATFORM_ELFENTRY="_start" ++CONFIG_STACK_SIZE=0x1000000 ++CONFIG_SYS_SRAM_BASE=0x0 ++CONFIG_SYS_SRAM_SIZE=0x0 ++# CONFIG_MP is not set ++CONFIG_EXAMPLES=y ++ ++# ++# API ++# ++# CONFIG_API is not set ++ ++# ++# Boot options ++# ++ ++# ++# Boot images ++# ++# CONFIG_ANDROID_BOOT_IMAGE is not set ++CONFIG_FIT=y ++# CONFIG_TIMESTAMP is not set ++CONFIG_FIT_EXTERNAL_OFFSET=0x0 ++CONFIG_FIT_FULL_CHECK=y ++# CONFIG_FIT_SIGNATURE is not set ++# CONFIG_FIT_CIPHER is not set ++CONFIG_FIT_VERBOSE=y ++# CONFIG_FIT_BEST_MATCH is not set ++CONFIG_FIT_PRINT=y ++CONFIG_LEGACY_IMAGE_FORMAT=y ++CONFIG_SUPPORT_RAW_INITRD=y ++# CONFIG_OF_BOARD_SETUP is not set ++# CONFIG_OF_SYSTEM_SETUP is not set ++# CONFIG_OF_STDOUT_VIA_ALIAS is not set ++CONFIG_SYS_EXTRA_OPTIONS="" ++CONFIG_HAVE_SYS_TEXT_BASE=y ++# CONFIG_DYNAMIC_SYS_CLK_FREQ is not set ++# CONFIG_ARCH_FIXUP_FDT_MEMORY is not set ++# CONFIG_CHROMEOS is not set ++# CONFIG_CHROMEOS_VBOOT is not set ++# CONFIG_RAMBOOT_PBL is not set ++ ++# ++# Boot timing ++# ++# CONFIG_BOOTSTAGE is not set ++CONFIG_BOOTSTAGE_STASH_SIZE=0x1000 ++# CONFIG_SHOW_BOOT_PROGRESS is not set ++ ++# ++# Boot media ++# ++# CONFIG_NAND_BOOT is not set ++# CONFIG_ONENAND_BOOT is not set ++# CONFIG_QSPI_BOOT is not set ++# CONFIG_SATA_BOOT is not set ++# CONFIG_SD_BOOT is not set ++# CONFIG_SD_BOOT_QSPI is not set ++# CONFIG_SPI_BOOT is not set ++ ++# ++# Autoboot options ++# ++CONFIG_AUTOBOOT=y ++CONFIG_BOOTDELAY=2 ++# CONFIG_AUTOBOOT_KEYED is not set ++# CONFIG_AUTOBOOT_USE_MENUKEY is not set ++# CONFIG_USE_BOOTARGS is not set ++# CONFIG_BOOTARGS_SUBST is not set ++# CONFIG_USE_BOOTCOMMAND is not set ++# CONFIG_USE_PREBOOT is not set ++CONFIG_DEFAULT_FDT_FILE="" ++ ++# ++# Console ++# ++CONFIG_MENU=y ++# CONFIG_CONSOLE_RECORD is not set ++# CONFIG_DISABLE_CONSOLE is not set ++CONFIG_LOGLEVEL=4 ++CONFIG_SPL_LOGLEVEL=4 ++CONFIG_TPL_LOGLEVEL=4 ++# CONFIG_SILENT_CONSOLE is not set ++# CONFIG_PRE_CONSOLE_BUFFER is not set ++# CONFIG_CONSOLE_MUX is not set ++# CONFIG_SYS_CONSOLE_IS_IN_ENV is not set ++# CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE is not set ++# CONFIG_SYS_CONSOLE_ENV_OVERWRITE is not set ++# CONFIG_SYS_CONSOLE_INFO_QUIET is not set ++# CONFIG_SYS_STDIO_DEREGISTER is not set ++# CONFIG_SPL_SYS_STDIO_DEREGISTER is not set ++# CONFIG_SYS_DEVICE_NULLDEV is not set ++ ++# ++# Logging ++# ++# CONFIG_LOG is not set ++ ++# ++# Init options ++# ++# CONFIG_BOARD_TYPES is not set ++# CONFIG_DISPLAY_CPUINFO is not set ++# CONFIG_DISPLAY_BOARDINFO is not set ++# CONFIG_DISPLAY_BOARDINFO_LATE is not set ++ ++# ++# Start-up hooks ++# ++# CONFIG_ARCH_EARLY_INIT_R is not set ++# CONFIG_ARCH_MISC_INIT is not set ++# CONFIG_BOARD_EARLY_INIT_F is not set ++# CONFIG_BOARD_EARLY_INIT_R is not set ++CONFIG_BOARD_LATE_INIT=y ++# CONFIG_LAST_STAGE_INIT is not set ++# CONFIG_MISC_INIT_F is not set ++# CONFIG_MISC_INIT_R is not set ++# CONFIG_ID_EEPROM is not set ++# CONFIG_PCI_INIT_R is not set ++ ++# ++# Security support ++# ++CONFIG_HASH=y ++# CONFIG_STACKPROTECTOR is not set ++ ++# ++# Update support ++# ++# CONFIG_UPDATE_TFTP is not set ++# CONFIG_ANDROID_AB is not set ++ ++# ++# Blob list ++# ++# CONFIG_BLOBLIST is not set ++ ++# ++# SPL / TPL ++# ++CONFIG_SPL_SYS_STACK_F_CHECK_BYTE=0xaa ++# CONFIG_SPL_SYS_REPORT_STACK_F_USAGE is not set ++# CONFIG_SPL_SHOW_ERRORS is not set ++ ++# ++# PowerPC and LayerScape SPL Boot options ++# ++# CONFIG_SPL_MD5 is not set ++# CONFIG_FDT_SIMPLEFB is not set ++ ++# ++# Command line interface ++# ++CONFIG_CMDLINE=y ++CONFIG_HUSH_PARSER=y ++CONFIG_CMDLINE_EDITING=y ++CONFIG_AUTO_COMPLETE=y ++CONFIG_SYS_LONGHELP=y ++CONFIG_SYS_PROMPT="=> " ++CONFIG_SYS_PROMPT_HUSH_PS2="> " ++CONFIG_SYS_XTRACE=y ++ ++# ++# Commands ++# ++ ++# ++# Info commands ++# ++CONFIG_CMD_BDI=y ++# CONFIG_CMD_CONFIG is not set ++# CONFIG_CMD_CONSOLE is not set ++# CONFIG_CMD_LICENSE is not set ++# CONFIG_CMD_PMC is not set ++ ++# ++# Boot commands ++# ++# CONFIG_CMD_BOOTD is not set ++CONFIG_CMD_BOOTM=y ++CONFIG_BOOTM_EFI=y ++# CONFIG_CMD_BOOTZ is not set ++CONFIG_CMD_BOOTI=y ++CONFIG_BOOTM_LINUX=y ++CONFIG_BOOTM_NETBSD=y ++# CONFIG_BOOTM_OPENRTOS is not set ++# CONFIG_BOOTM_OSE is not set ++CONFIG_BOOTM_PLAN9=y ++CONFIG_BOOTM_RTEMS=y ++CONFIG_BOOTM_VXWORKS=y ++CONFIG_CMD_BOOTEFI=y ++CONFIG_CMD_BOOTEFI_HELLO_COMPILE=y ++# CONFIG_CMD_BOOTEFI_HELLO is not set ++CONFIG_CMD_BOOTEFI_SELFTEST=y ++# CONFIG_CMD_BOOTMENU is not set ++# CONFIG_CMD_ADTIMG is not set ++CONFIG_CMD_ELF=y ++CONFIG_CMD_FDT=y ++CONFIG_CMD_GO=y ++CONFIG_CMD_RUN=y ++CONFIG_CMD_IMI=y ++# CONFIG_CMD_IMLS is not set ++# CONFIG_CMD_XIMG is not set ++# CONFIG_CMD_THOR_DOWNLOAD is not set ++# CONFIG_CMD_ZBOOT is not set ++ ++# ++# Environment commands ++# ++# CONFIG_CMD_ASKENV is not set ++CONFIG_CMD_EXPORTENV=y ++CONFIG_CMD_IMPORTENV=y ++# CONFIG_CMD_EDITENV is not set ++# CONFIG_CMD_GREPENV is not set ++CONFIG_CMD_SAVEENV=y ++# CONFIG_CMD_ERASEENV is not set ++CONFIG_CMD_ENV_EXISTS=y ++# CONFIG_CMD_ENV_CALLBACK is not set ++# CONFIG_CMD_ENV_FLAGS is not set ++# CONFIG_CMD_NVEDIT_EFI is not set ++# CONFIG_CMD_NVEDIT_INFO is not set ++# CONFIG_CMD_NVEDIT_LOAD is not set ++# CONFIG_CMD_NVEDIT_SELECT is not set ++ ++# ++# Memory commands ++# ++# CONFIG_CMD_BINOP is not set ++# CONFIG_CMD_BLOBLIST is not set ++CONFIG_CMD_CRC32=y ++# CONFIG_CRC32_VERIFY is not set ++# CONFIG_CMD_EEPROM is not set ++# CONFIG_LOOPW is not set ++# CONFIG_CMD_MD5SUM is not set ++# CONFIG_CMD_MEMINFO is not set ++CONFIG_CMD_MEMORY=y ++# CONFIG_CMD_MEM_SEARCH is not set ++# CONFIG_CMD_MX_CYCLIC is not set ++CONFIG_CMD_RANDOM=y ++# CONFIG_CMD_MEMTEST is not set ++# CONFIG_CMD_SHA1SUM is not set ++# CONFIG_CMD_STRINGS is not set ++ ++# ++# Compression commands ++# ++# CONFIG_CMD_LZMADEC is not set ++CONFIG_CMD_UNLZ4=y ++# CONFIG_CMD_UNZIP is not set ++# CONFIG_CMD_ZIP is not set ++ ++# ++# Device access commands ++# ++# CONFIG_CMD_ARMFLASH is not set ++# CONFIG_CMD_BIND is not set ++# CONFIG_CMD_CLK is not set ++# CONFIG_CMD_DEMO is not set ++# CONFIG_CMD_DFU is not set ++# CONFIG_CMD_DM is not set ++# CONFIG_CMD_FPGAD is not set ++# CONFIG_CMD_FUSE is not set ++# CONFIG_CMD_GPIO is not set ++# CONFIG_CMD_GPT is not set ++# CONFIG_RANDOM_UUID is not set ++# CONFIG_CMD_IDE is not set ++# CONFIG_CMD_IO is not set ++# CONFIG_CMD_IOTRACE is not set ++# CONFIG_CMD_I2C is not set ++# CONFIG_CMD_LOADB is not set ++# CONFIG_CMD_LOADS is not set ++# CONFIG_CMD_LSBLK is not set ++# CONFIG_CMD_MBR is not set ++# CONFIG_CMD_CLONE is not set ++# CONFIG_CMD_OSD is not set ++CONFIG_CMD_PART=y ++# CONFIG_CMD_PCI is not set ++# CONFIG_CMD_POWEROFF is not set ++# CONFIG_CMD_READ is not set ++# CONFIG_CMD_SATA is not set ++# CONFIG_CMD_SAVES is not set ++CONFIG_CMD_SCSI=y ++# CONFIG_CMD_SDRAM is not set ++# CONFIG_CMD_TSI148 is not set ++# CONFIG_CMD_UNIVERSE is not set ++# CONFIG_CMD_USB_SDP is not set ++CONFIG_CMD_VIRTIO=y ++ ++# ++# Shell scripting commands ++# ++CONFIG_CMD_ECHO=y ++# CONFIG_CMD_ITEST is not set ++CONFIG_CMD_SOURCE=y ++# CONFIG_CMD_SETEXPR is not set ++ ++# ++# Android support commands ++# ++CONFIG_CMD_NET=y ++CONFIG_CMD_BOOTP=y ++CONFIG_CMD_DHCP=y ++CONFIG_BOOTP_BOOTPATH=y ++CONFIG_BOOTP_DNS=y ++# CONFIG_BOOTP_DNS2 is not set ++CONFIG_BOOTP_GATEWAY=y ++CONFIG_BOOTP_HOSTNAME=y ++# CONFIG_BOOTP_PREFER_SERVERIP is not set ++CONFIG_BOOTP_SUBNETMASK=y ++# CONFIG_BOOTP_NTPSERVER is not set ++# CONFIG_CMD_PCAP is not set ++CONFIG_BOOTP_PXE=y ++CONFIG_BOOTP_PXE_CLIENTARCH=0x16 ++CONFIG_BOOTP_VCI_STRING="U-Boot.armv8" ++CONFIG_CMD_TFTPBOOT=y ++# CONFIG_CMD_TFTPPUT is not set ++# CONFIG_CMD_TFTPSRV is not set ++CONFIG_NET_TFTP_VARS=y ++# CONFIG_CMD_RARP is not set ++# CONFIG_CMD_NFS is not set ++CONFIG_CMD_MII=y ++CONFIG_CMD_PING=y ++# CONFIG_CMD_CDP is not set ++# CONFIG_CMD_SNTP is not set ++# CONFIG_CMD_DNS is not set ++# CONFIG_CMD_LINK_LOCAL is not set ++# CONFIG_CMD_ETHSW is not set ++CONFIG_CMD_PXE=y ++# CONFIG_CMD_WOL is not set ++ ++# ++# Misc commands ++# ++# CONFIG_CMD_BSP is not set ++# CONFIG_CMD_BLOCK_CACHE is not set ++# CONFIG_CMD_CACHE is not set ++# CONFIG_CMD_CONITRACE is not set ++# CONFIG_CMD_EFIDEBUG is not set ++# CONFIG_CMD_EXCEPTION is not set ++# CONFIG_CMD_DATE is not set ++# CONFIG_CMD_TIME is not set ++# CONFIG_CMD_GETTIME is not set ++# CONFIG_CMD_RNG is not set ++# CONFIG_CMD_KASLRSEED is not set ++CONFIG_CMD_SLEEP=y ++# CONFIG_CMD_TIMER is not set ++CONFIG_CMD_SYSBOOT=y ++CONFIG_CMD_QFW=y ++# CONFIG_CMD_PSTORE is not set ++# CONFIG_CMD_TERMINAL is not set ++# CONFIG_CMD_UUID is not set ++ ++# ++# TI specific command line interface ++# ++# CONFIG_CMD_DDR3 is not set ++ ++# ++# Power commands ++# ++ ++# ++# Security commands ++# ++# CONFIG_CMD_AES is not set ++# CONFIG_CMD_BLOB is not set ++# CONFIG_CMD_HASH is not set ++# CONFIG_CMD_HVC is not set ++# CONFIG_CMD_SMC is not set ++ ++# ++# Firmware commands ++# ++ ++# ++# Filesystem commands ++# ++# CONFIG_CMD_BTRFS is not set ++CONFIG_CMD_EXT2=y ++CONFIG_CMD_EXT4=y ++# CONFIG_CMD_EXT4_WRITE is not set ++CONFIG_CMD_FAT=y ++# CONFIG_CMD_SQUASHFS is not set ++CONFIG_CMD_FS_GENERIC=y ++# CONFIG_CMD_FS_UUID is not set ++# CONFIG_CMD_JFFS2 is not set ++# CONFIG_CMD_REISER is not set ++# CONFIG_CMD_ZFS is not set ++ ++# ++# Debug commands ++# ++# CONFIG_CMD_DIAG is not set ++# CONFIG_CMD_LOG is not set ++# CONFIG_CMD_UBI is not set ++ ++# ++# Partition Types ++# ++CONFIG_PARTITIONS=y ++# CONFIG_MAC_PARTITION is not set ++CONFIG_DOS_PARTITION=y ++CONFIG_ISO_PARTITION=y ++# CONFIG_AMIGA_PARTITION is not set ++CONFIG_EFI_PARTITION=y ++CONFIG_EFI_PARTITION_ENTRIES_NUMBERS=128 ++CONFIG_EFI_PARTITION_ENTRIES_OFF=0 ++CONFIG_PARTITION_UUIDS=y ++# CONFIG_PARTITION_TYPE_GUID is not set ++CONFIG_SUPPORT_OF_CONTROL=y ++ ++# ++# Device Tree Control ++# ++CONFIG_OF_CONTROL=y ++CONFIG_OF_REAL=y ++# CONFIG_OF_LIVE is not set ++CONFIG_OF_SEPARATE=y ++# CONFIG_OF_EMBED is not set ++CONFIG_OF_BOARD=y ++CONFIG_OF_HAS_PRIOR_STAGE=y ++CONFIG_OF_OMIT_DTB=y ++CONFIG_DEVICE_TREE_INCLUDES="" ++CONFIG_OF_LIST="qemu-arm64" ++# CONFIG_MULTI_DTB_FIT is not set ++# CONFIG_OF_DTB_PROPS_REMOVE is not set ++ ++# ++# Environment ++# ++CONFIG_ENV_SUPPORT=y ++CONFIG_ENV_SOURCE_FILE="" ++CONFIG_SAVEENV=y ++# CONFIG_ENV_OVERWRITE is not set ++CONFIG_ENV_IS_NOWHERE=y ++# CONFIG_ENV_IS_IN_EEPROM is not set ++# CONFIG_ENV_IS_IN_FAT is not set ++# CONFIG_ENV_IS_IN_EXT4 is not set ++# CONFIG_ENV_IS_IN_FLASH is not set ++# CONFIG_ENV_IS_IN_NAND is not set ++# CONFIG_ENV_IS_IN_NVRAM is not set ++# CONFIG_ENV_IS_IN_ONENAND is not set ++# CONFIG_ENV_IS_IN_REMOTE is not set ++# CONFIG_SYS_REDUNDAND_ENVIRONMENT is not set ++# CONFIG_SYS_RELOC_GD_ENV_ADDR is not set ++# CONFIG_USE_DEFAULT_ENV_FILE is not set ++# CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG is not set ++# CONFIG_ENV_IMPORT_FDT is not set ++# CONFIG_ENV_APPEND is not set ++# CONFIG_ENV_WRITEABLE_LIST is not set ++# CONFIG_ENV_ACCESS_IGNORE_FORCE is not set ++# CONFIG_VERSION_VARIABLE is not set ++CONFIG_NET=y ++# CONFIG_PROT_UDP is not set ++# CONFIG_BOOTP_SEND_HOSTNAME is not set ++# CONFIG_NET_RANDOM_ETHADDR is not set ++# CONFIG_NETCONSOLE is not set ++# CONFIG_IP_DEFRAG is not set ++CONFIG_TFTP_BLOCKSIZE=512 ++CONFIG_TFTP_WINDOWSIZE=1 ++# CONFIG_TFTP_TSIZE is not set ++# CONFIG_SERVERIP_FROM_PROXYDHCP is not set ++CONFIG_SERVERIP_FROM_PROXYDHCP_DELAY_MS=100 ++# CONFIG_KEEP_SERVERADDR is not set ++# CONFIG_UDP_CHECKSUM is not set ++# CONFIG_BOOTP_SERVERIP is not set ++ ++# ++# Device Drivers ++# ++ ++# ++# Generic Driver Options ++# ++CONFIG_DM=y ++# CONFIG_DM_WARN is not set ++# CONFIG_DM_DEBUG is not set ++# CONFIG_DM_DEVICE_REMOVE is not set ++# CONFIG_DM_STDIO is not set ++# CONFIG_DM_SEQ_ALIAS is not set ++# CONFIG_DM_DMA is not set ++# CONFIG_REGMAP is not set ++# CONFIG_DEVRES is not set ++# CONFIG_SIMPLE_BUS is not set ++# CONFIG_OF_TRANSLATE is not set ++# CONFIG_TRANSLATION_OFFSET is not set ++CONFIG_DM_DEV_READ_INLINE=y ++# CONFIG_ACPIGEN is not set ++# CONFIG_BOUNCE_BUFFER is not set ++# CONFIG_ADC is not set ++# CONFIG_ADC_EXYNOS is not set ++# CONFIG_ADC_SANDBOX is not set ++# CONFIG_SARADC_MESON is not set ++# CONFIG_SARADC_ROCKCHIP is not set ++# CONFIG_SATA is not set ++# CONFIG_SCSI_AHCI is not set ++ ++# ++# SATA/SCSI device support ++# ++# CONFIG_AHCI_PCI is not set ++# CONFIG_DWC_AHCI is not set ++# CONFIG_DWC_AHSATA is not set ++# CONFIG_MTK_AHCI is not set ++# CONFIG_SUNXI_AHCI is not set ++# CONFIG_AXI is not set ++ ++# ++# Bus devices ++# ++CONFIG_BLK=y ++CONFIG_HAVE_BLOCK_DEVICE=y ++CONFIG_BLOCK_CACHE=y ++# CONFIG_EFI_MEDIA is not set ++# CONFIG_IDE is not set ++# CONFIG_BOOTCOUNT_LIMIT is not set ++ ++# ++# Button Support ++# ++# CONFIG_BUTTON is not set ++ ++# ++# Cache Controller drivers ++# ++# CONFIG_CACHE is not set ++# CONFIG_L2X0_CACHE is not set ++# CONFIG_NCORE_CACHE is not set ++# CONFIG_SIFIVE_CCACHE is not set ++ ++# ++# Clock ++# ++# CONFIG_CLK is not set ++# CONFIG_CLK_CCF is not set ++# CONFIG_CPU is not set ++ ++# ++# Hardware crypto devices ++# ++# CONFIG_DM_HASH is not set ++# CONFIG_FSL_CAAM is not set ++CONFIG_CAAM_64BIT=y ++# CONFIG_SYS_FSL_SEC_BE is not set ++# CONFIG_SYS_FSL_SEC_LE is not set ++# CONFIG_DDR_SPD is not set ++ ++# ++# Demo for driver model ++# ++# CONFIG_DM_DEMO is not set ++ ++# ++# DFU support ++# ++ ++# ++# DMA Support ++# ++# CONFIG_DMA is not set ++# CONFIG_DMA_LPC32XX is not set ++# CONFIG_TI_EDMA3 is not set ++# CONFIG_DMA_LEGACY is not set ++ ++# ++# Fastboot support ++# ++# CONFIG_UDP_FUNCTION_FASTBOOT is not set ++CONFIG_FIRMWARE=y ++# CONFIG_SPL_FIRMWARE is not set ++CONFIG_ARM_PSCI_FW=y ++# CONFIG_ZYNQMP_FIRMWARE is not set ++# CONFIG_SCMI_FIRMWARE is not set ++ ++# ++# FPGA support ++# ++# CONFIG_FPGA_ALTERA is not set ++# CONFIG_FPGA_SOCFPGA is not set ++# CONFIG_FPGA_XILINX is not set ++CONFIG_GPIO=y ++# CONFIG_AT91_GPIO is not set ++# CONFIG_DA8XX_GPIO is not set ++# CONFIG_INTEL_BROADWELL_GPIO is not set ++# CONFIG_IMX_RGPIO2P is not set ++# CONFIG_IPROC_GPIO is not set ++# CONFIG_KIRKWOOD_GPIO is not set ++# CONFIG_LPC32XX_GPIO is not set ++# CONFIG_MCP230XX_GPIO is not set ++# CONFIG_MXC_GPIO is not set ++# CONFIG_MXS_GPIO is not set ++# CONFIG_CMD_PCA953X is not set ++# CONFIG_CMD_TCA642X is not set ++# CONFIG_VYBRID_GPIO is not set ++ ++# ++# Hardware Spinlock Support ++# ++# CONFIG_DM_HWSPINLOCK is not set ++CONFIG_I2C=y ++# CONFIG_DM_I2C is not set ++# CONFIG_SYS_I2C_LEGACY is not set ++# CONFIG_SYS_I2C_FSL is not set ++# CONFIG_SYS_I2C_DW is not set ++# CONFIG_SYS_I2C_IMX_LPI2C is not set ++# CONFIG_SYS_I2C_MICROCHIP is not set ++# CONFIG_SYS_I2C_MXC is not set ++# CONFIG_SYS_I2C_SOFT is not set ++# CONFIG_SYS_I2C_MV is not set ++# CONFIG_SYS_I2C_MVTWSI is not set ++# CONFIG_INPUT is not set ++# CONFIG_DM_KEYBOARD is not set ++# CONFIG_KEYBOARD is not set ++# CONFIG_TEGRA_KEYBOARD is not set ++# CONFIG_TWL4030_INPUT is not set ++ ++# ++# IOMMU device drivers ++# ++# CONFIG_IOMMU is not set ++ ++# ++# LED Support ++# ++# CONFIG_LED is not set ++# CONFIG_LED_STATUS is not set ++ ++# ++# Mailbox Controller Support ++# ++# CONFIG_DM_MAILBOX is not set ++ ++# ++# Memory Controller drivers ++# ++ ++# ++# Multifunction device drivers ++# ++# CONFIG_MISC is not set ++# CONFIG_CROS_EC is not set ++# CONFIG_DS4510 is not set ++# CONFIG_FSL_SEC_MON is not set ++# CONFIG_IRQ is not set ++# CONFIG_NUVOTON_NCT6102D is not set ++# CONFIG_PWRSEQ is not set ++# CONFIG_PCA9551_LED is not set ++# CONFIG_TEST_DRV is not set ++# CONFIG_TWL4030_LED is not set ++# CONFIG_WINBOND_W83627 is not set ++CONFIG_QFW=y ++CONFIG_QFW_MMIO=y ++# CONFIG_FS_LOADER is not set ++# CONFIG_SPL_FS_LOADER is not set ++ ++# ++# MMC Host controller Support ++# ++# CONFIG_MMC is not set ++# CONFIG_MMC_BROKEN_CD is not set ++# CONFIG_DM_MMC is not set ++# CONFIG_FSL_ESDHC is not set ++# CONFIG_FSL_ESDHC_IMX is not set ++ ++# ++# MTD Support ++# ++# CONFIG_MTD is not set ++# CONFIG_DM_MTD is not set ++# CONFIG_MTD_NOR_FLASH is not set ++# CONFIG_FLASH_CFI_DRIVER is not set ++# CONFIG_USE_SYS_MAX_FLASH_BANKS is not set ++# CONFIG_MTD_RAW_NAND is not set ++ ++# ++# SPI Flash Support ++# ++# CONFIG_SPI_FLASH is not set ++ ++# ++# UBI support ++# ++# CONFIG_UBI_SILENCE_MSG is not set ++# CONFIG_MTD_UBI is not set ++ ++# ++# Multiplexer drivers ++# ++# CONFIG_MULTIPLEXER is not set ++# CONFIG_BITBANGMII is not set ++# CONFIG_MV88E6352_SWITCH is not set ++# CONFIG_PHYLIB is not set ++# CONFIG_FSL_PFE is not set ++# CONFIG_BNXT_ETH is not set ++CONFIG_ETH=y ++CONFIG_DM_ETH=y ++# CONFIG_DM_ETH_PHY is not set ++CONFIG_NETDEVICES=y ++# CONFIG_PHY_GIGE is not set ++# CONFIG_ALTERA_TSE is not set ++# CONFIG_BCM_SF2_ETH is not set ++# CONFIG_BCMGENET is not set ++# CONFIG_CALXEDA_XGMAC is not set ++# CONFIG_DWC_ETH_QOS is not set ++CONFIG_E1000=y ++# CONFIG_E1000_SPI_GENERIC is not set ++# CONFIG_E1000_SPI is not set ++# CONFIG_CMD_E1000 is not set ++# CONFIG_EEPRO100 is not set ++# CONFIG_ETH_DESIGNWARE is not set ++# CONFIG_ETH_DESIGNWARE_MESON8B is not set ++# CONFIG_ETHOC is not set ++# CONFIG_FMAN_ENET is not set ++# CONFIG_FTMAC100 is not set ++# CONFIG_FTGMAC100 is not set ++# CONFIG_MCFFEC is not set ++# CONFIG_FSLDMAFEC is not set ++# CONFIG_KS8851_MLL is not set ++# CONFIG_MACB is not set ++# CONFIG_PCH_GBE is not set ++# CONFIG_RGMII is not set ++# CONFIG_MII is not set ++# CONFIG_PCNET is not set ++# CONFIG_QE_UEC is not set ++# CONFIG_RTL8139 is not set ++# CONFIG_RTL8169 is not set ++# CONFIG_SMC911X is not set ++# CONFIG_SUN7I_GMAC is not set ++# CONFIG_SUN4I_EMAC is not set ++# CONFIG_SUN8I_EMAC is not set ++# CONFIG_SH_ETHER is not set ++# CONFIG_DRIVER_TI_CPSW is not set ++# CONFIG_DRIVER_TI_EMAC is not set ++# CONFIG_DRIVER_TI_KEYSTONE_NET is not set ++# CONFIG_TULIP is not set ++# CONFIG_XILINX_AXIEMAC is not set ++# CONFIG_XILINX_EMACLITE is not set ++# CONFIG_ZYNQ_GEM is not set ++# CONFIG_SYS_DPAA_QBMAN is not set ++# CONFIG_TSEC_ENET is not set ++# CONFIG_MEDIATEK_ETH is not set ++# CONFIG_HIGMACV300_ETH is not set ++# CONFIG_NVME is not set ++# CONFIG_NVME_APPLE is not set ++# CONFIG_NVME_PCI is not set ++CONFIG_PCI=y ++# CONFIG_DM_PCI_COMPAT is not set ++CONFIG_PCI_PNP=y ++# CONFIG_PCI_REGION_MULTI_ENTRY is not set ++# CONFIG_PCI_SRIOV is not set ++# CONFIG_PCI_ARID is not set ++CONFIG_PCIE_ECAM_GENERIC=y ++# CONFIG_PCIE_ECAM_SYNQUACER is not set ++# CONFIG_PCI_PHYTIUM is not set ++# CONFIG_PCIE_FSL is not set ++# CONFIG_PCI_MPC85XX is not set ++# CONFIG_PCI_XILINX is not set ++# CONFIG_PCIE_LAYERSCAPE_RC is not set ++# CONFIG_PCIE_LAYERSCAPE_EP is not set ++# CONFIG_PCIE_LAYERSCAPE_GEN4 is not set ++# CONFIG_PCIE_INTEL_FPGA is not set ++# CONFIG_PCIE_IPROC is not set ++# CONFIG_PCI_KEYSTONE is not set ++ ++# ++# PCI Endpoint ++# ++# CONFIG_PCI_ENDPOINT is not set ++# CONFIG_X86_PCH7 is not set ++# CONFIG_X86_PCH9 is not set ++ ++# ++# PHY Subsystem ++# ++# CONFIG_PHY is not set ++# CONFIG_MIPI_DPHY_HELPERS is not set ++ ++# ++# Rockchip PHY driver ++# ++# CONFIG_MVEBU_COMPHY_SUPPORT is not set ++ ++# ++# Pin controllers ++# ++# CONFIG_PINCTRL is not set ++CONFIG_POWER=y ++# CONFIG_POWER_LEGACY is not set ++# CONFIG_SPL_POWER_LEGACY is not set ++# CONFIG_ACPI_PMC is not set ++# CONFIG_SPL_ACPI_PMC is not set ++# CONFIG_TPL_ACPI_PMC is not set ++ ++# ++# Power Domain Support ++# ++# CONFIG_POWER_DOMAIN is not set ++# CONFIG_DM_PMIC is not set ++# CONFIG_POWER_MC34VR500 is not set ++# CONFIG_DM_REGULATOR is not set ++# CONFIG_POWER_MT6323 is not set ++# CONFIG_DM_PWM is not set ++# CONFIG_PWM_IMX is not set ++# CONFIG_PWM_SANDBOX is not set ++# CONFIG_U_QE is not set ++# CONFIG_RAM is not set ++ ++# ++# Reboot Mode Support ++# ++# CONFIG_DM_REBOOT_MODE is not set ++ ++# ++# Remote Processor drivers ++# ++ ++# ++# Reset Controller Support ++# ++# CONFIG_DM_RESET is not set ++# CONFIG_RESET_SCMI is not set ++CONFIG_DM_RNG=y ++# CONFIG_RNG_MSM is not set ++# CONFIG_RNG_IPROC200 is not set ++ ++# ++# Real Time Clock ++# ++# CONFIG_DM_RTC is not set ++# CONFIG_RTC_ENABLE_32KHZ_OUTPUT is not set ++# CONFIG_RTC_PCF8563 is not set ++# CONFIG_RTC_PL031 is not set ++# CONFIG_RTC_S35392A is not set ++# CONFIG_RTC_MC146818 is not set ++# CONFIG_RTC_M41T62 is not set ++CONFIG_SCSI=y ++CONFIG_DM_SCSI=y ++CONFIG_SERIAL=y ++CONFIG_BAUDRATE=115200 ++CONFIG_REQUIRE_SERIAL_CONSOLE=y ++# CONFIG_SPECIFY_CONSOLE_INDEX is not set ++CONFIG_SERIAL_PRESENT=y ++CONFIG_DM_SERIAL=y ++# CONFIG_SERIAL_RX_BUFFER is not set ++# CONFIG_SERIAL_SEARCH_ALL is not set ++# CONFIG_SERIAL_PROBE_ALL is not set ++# CONFIG_ALTERA_JTAG_UART is not set ++# CONFIG_ALTERA_UART is not set ++# CONFIG_ARC_SERIAL is not set ++# CONFIG_ARM_DCC is not set ++# CONFIG_ATMEL_USART is not set ++# CONFIG_BCM6345_SERIAL is not set ++# CONFIG_COREBOOT_SERIAL is not set ++# CONFIG_CORTINA_UART is not set ++# CONFIG_FSL_LINFLEXUART is not set ++# CONFIG_FSL_LPUART is not set ++# CONFIG_MVEBU_A3700_UART is not set ++# CONFIG_MCFUART is not set ++# CONFIG_NULLDEV_SERIAL is not set ++# CONFIG_SYS_NS16550 is not set ++# CONFIG_NS16550_DYNAMIC is not set ++CONFIG_PL01X_SERIAL=y ++# CONFIG_XILINX_UARTLITE is not set ++# CONFIG_MSM_SERIAL is not set ++# CONFIG_MSM_GENI_SERIAL is not set ++# CONFIG_OMAP_SERIAL is not set ++# CONFIG_PXA_SERIAL is not set ++# CONFIG_SIFIVE_SERIAL is not set ++# CONFIG_ZYNQ_SERIAL is not set ++# CONFIG_MTK_SERIAL is not set ++# CONFIG_MT7620_SERIAL is not set ++# CONFIG_SMEM is not set ++ ++# ++# Sound support ++# ++# CONFIG_SOUND is not set ++# CONFIG_SOUND_MAX98357A is not set ++ ++# ++# SOC (System On Chip) specific Drivers ++# ++# CONFIG_SOC_DEVICE is not set ++# CONFIG_SOC_TI is not set ++# CONFIG_SPI is not set ++ ++# ++# SPMI support ++# ++# CONFIG_SPMI is not set ++# CONFIG_SYSINFO is not set ++ ++# ++# System reset device drivers ++# ++CONFIG_SYSRESET=y ++CONFIG_SYSRESET_CMD_RESET=y ++# CONFIG_POWEROFF_GPIO is not set ++# CONFIG_SYSRESET_GPIO is not set ++CONFIG_SYSRESET_PSCI=y ++# CONFIG_SYSRESET_SYSCON is not set ++# CONFIG_SYSRESET_WATCHDOG is not set ++# CONFIG_SYSRESET_RESETCTL is not set ++# CONFIG_SYSRESET_MPC83XX is not set ++# CONFIG_TEE is not set ++# CONFIG_DM_THERMAL is not set ++ ++# ++# Timer Support ++# ++# CONFIG_TIMER is not set ++ ++# ++# TPM support ++# ++# CONFIG_USB is not set ++ ++# ++# UFS Host Controller Support ++# ++# CONFIG_UFS is not set ++# CONFIG_TI_J721E_UFS is not set ++ ++# ++# Graphics support ++# ++# CONFIG_DM_VIDEO is not set ++# CONFIG_SYS_WHITE_ON_BLACK is not set ++# CONFIG_NO_FB_CLEAR is not set ++ ++# ++# TrueType Fonts ++# ++# CONFIG_VIDEO_VESA is not set ++# CONFIG_VIDEO_LCD_ANX9804 is not set ++# CONFIG_VIDEO_LCD_SSD2828 is not set ++# CONFIG_VIDEO_LCD_HITACHI_TX18D42VM is not set ++# CONFIG_VIDEO_MVEBU is not set ++# CONFIG_I2C_EDID is not set ++# CONFIG_DISPLAY is not set ++# CONFIG_ATMEL_HLCD is not set ++# CONFIG_AM335X_LCD is not set ++# CONFIG_VIDEO_TEGRA20 is not set ++# CONFIG_VIDEO_BRIDGE is not set ++# CONFIG_VIDEO is not set ++# CONFIG_LCD is not set ++# CONFIG_VIDEO_SIMPLE is not set ++# CONFIG_VIDEO_DT_SIMPLEFB is not set ++# CONFIG_OSD is not set ++# CONFIG_SPLASH_SCREEN is not set ++# CONFIG_VIDEO_VCXK is not set ++ ++# ++# VirtIO Drivers ++# ++CONFIG_VIRTIO=y ++CONFIG_VIRTIO_MMIO=y ++CONFIG_VIRTIO_PCI=y ++CONFIG_VIRTIO_NET=y ++CONFIG_VIRTIO_BLK=y ++CONFIG_VIRTIO_RNG=y ++ ++# ++# 1-Wire support ++# ++# CONFIG_W1 is not set ++ ++# ++# 1-wire EEPROM support ++# ++# CONFIG_W1_EEPROM is not set ++ ++# ++# Watchdog Timer Support ++# ++# CONFIG_WATCHDOG is not set ++CONFIG_WATCHDOG_TIMEOUT_MSECS=60000 ++# CONFIG_IMX_WATCHDOG is not set ++# CONFIG_ULP_WATCHDOG is not set ++# CONFIG_DESIGNWARE_WATCHDOG is not set ++# CONFIG_WDT is not set ++# CONFIG_PVBLOCK is not set ++# CONFIG_PHYS_TO_BUS is not set ++ ++# ++# File systems ++# ++# CONFIG_FS_BTRFS is not set ++# CONFIG_FS_CBFS is not set ++# CONFIG_SPL_FS_CBFS is not set ++CONFIG_FS_EXT4=y ++# CONFIG_EXT4_WRITE is not set ++CONFIG_FS_FAT=y ++CONFIG_FAT_WRITE=y ++CONFIG_FS_FAT_MAX_CLUSTSIZE=65536 ++# CONFIG_FS_JFFS2 is not set ++# CONFIG_UBIFS_SILENCE_MSG is not set ++# CONFIG_FS_CRAMFS is not set ++# CONFIG_YAFFS2 is not set ++# CONFIG_FS_SQUASHFS is not set ++ ++# ++# Library routines ++# ++# CONFIG_ADDR_MAP is not set ++# CONFIG_PHYSMEM is not set ++# CONFIG_BCH is not set ++# CONFIG_CC_OPTIMIZE_LIBS_FOR_SPEED is not set ++CONFIG_CHARSET=y ++# CONFIG_DYNAMIC_CRC_TABLE is not set ++CONFIG_LIB_UUID=y ++CONFIG_PRINTF=y ++CONFIG_SPRINTF=y ++CONFIG_STRTO=y ++CONFIG_SYS_HZ=1000 ++# CONFIG_PANIC_HANG is not set ++CONFIG_REGEX=y ++CONFIG_LIB_RAND=y ++# CONFIG_LIB_HW_RAND is not set ++CONFIG_SUPPORT_ACPI=y ++# CONFIG_GENERATE_ACPI_TABLE is not set ++# CONFIG_SPL_TINY_MEMSET is not set ++# CONFIG_TPL_TINY_MEMSET is not set ++# CONFIG_BITREVERSE is not set ++# CONFIG_TRACE is not set ++# CONFIG_CIRCBUF is not set ++# CONFIG_CMD_DHRYSTONE is not set ++ ++# ++# Security support ++# ++# CONFIG_AES is not set ++# CONFIG_ECDSA is not set ++# CONFIG_RSA is not set ++# CONFIG_ASYMMETRIC_KEY_TYPE is not set ++# CONFIG_TPM is not set ++ ++# ++# Android Verified Boot ++# ++ ++# ++# Hashing Support ++# ++# CONFIG_BLAKE2 is not set ++CONFIG_SHA1=y ++CONFIG_SHA256=y ++# CONFIG_SHA512 is not set ++# CONFIG_SHA384 is not set ++# CONFIG_SHA_HW_ACCEL is not set ++CONFIG_MD5=y ++CONFIG_CRC32=y ++ ++# ++# Compression Support ++# ++CONFIG_LZ4=y ++# CONFIG_LZMA is not set ++# CONFIG_LZO is not set ++# CONFIG_GZIP is not set ++# CONFIG_ZLIB_UNCOMPRESS is not set ++# CONFIG_BZIP2 is not set ++CONFIG_ZLIB=y ++# CONFIG_ZSTD is not set ++# CONFIG_SPL_LZ4 is not set ++# CONFIG_SPL_LZMA is not set ++# CONFIG_SPL_LZO is not set ++# CONFIG_SPL_GZIP is not set ++# CONFIG_SPL_ZSTD is not set ++# CONFIG_ERRNO_STR is not set ++# CONFIG_HEXDUMP is not set ++# CONFIG_GETOPT is not set ++CONFIG_OF_LIBFDT=y ++CONFIG_OF_LIBFDT_ASSUME_MASK=0 ++# CONFIG_OF_LIBFDT_OVERLAY is not set ++# CONFIG_SPL_OF_LIBFDT is not set ++CONFIG_SPL_OF_LIBFDT_ASSUME_MASK=0xff ++# CONFIG_TPL_OF_LIBFDT is not set ++CONFIG_TPL_OF_LIBFDT_ASSUME_MASK=0xff ++ ++# ++# System tables ++# ++CONFIG_GENERATE_SMBIOS_TABLE=y ++# CONFIG_LIB_RATIONAL is not set ++# CONFIG_SMBIOS_PARSER is not set ++CONFIG_EFI_LOADER=y ++CONFIG_CMD_BOOTEFI_BOOTMGR=y ++CONFIG_EFI_VARIABLE_FILE_STORE=y ++# CONFIG_EFI_VARIABLES_PRESEED is not set ++CONFIG_EFI_VAR_BUF_SIZE=16384 ++# CONFIG_EFI_RUNTIME_UPDATE_CAPSULE is not set ++# CONFIG_EFI_CAPSULE_ON_DISK is not set ++CONFIG_EFI_DEVICE_PATH_TO_TEXT=y ++CONFIG_EFI_DEVICE_PATH_UTIL=y ++CONFIG_EFI_DT_FIXUP=y ++CONFIG_EFI_LOADER_HII=y ++CONFIG_EFI_UNICODE_COLLATION_PROTOCOL2=y ++CONFIG_EFI_UNICODE_CAPITALIZATION=y ++# CONFIG_EFI_LOADER_BOUNCE_BUFFER is not set ++CONFIG_EFI_PLATFORM_LANG_CODES="en-US" ++CONFIG_EFI_HAVE_RUNTIME_RESET=y ++CONFIG_EFI_RNG_PROTOCOL=y ++CONFIG_EFI_LOAD_FILE2_INITRD=y ++# CONFIG_OPTEE_LIB is not set ++# CONFIG_OPTEE_IMAGE is not set ++# CONFIG_BOOTM_OPTEE is not set ++# CONFIG_TEST_FDTDEC is not set ++CONFIG_LIB_ELF=y ++CONFIG_LMB=y ++CONFIG_LMB_USE_MAX_REGIONS=y ++CONFIG_LMB_MAX_REGIONS=8 ++# CONFIG_PHANDLE_CHECK_SEQ is not set ++# CONFIG_UNIT_TEST is not set ++# CONFIG_SPL_UNIT_TEST is not set ++ ++# ++# Tools options ++# ++CONFIG_MKIMAGE_DTC_PATH="dtc" ++CONFIG_TOOLS_CRC32=y ++CONFIG_TOOLS_LIBCRYPTO=y ++CONFIG_TOOLS_FIT=y ++CONFIG_TOOLS_FIT_FULL_CHECK=y ++CONFIG_TOOLS_FIT_PRINT=y ++CONFIG_TOOLS_FIT_RSASSA_PSS=y ++CONFIG_TOOLS_FIT_SIGNATURE=y ++CONFIG_TOOLS_FIT_SIGNATURE_MAX_SIZE=0x10000000 ++CONFIG_TOOLS_FIT_VERBOSE=y ++CONFIG_TOOLS_MD5=y ++CONFIG_TOOLS_OF_LIBFDT=y ++CONFIG_TOOLS_SHA1=y ++CONFIG_TOOLS_SHA256=y ++CONFIG_TOOLS_SHA384=y ++CONFIG_TOOLS_SHA512=y ++# CONFIG_TOOLS_MKEFICAPSULE is not set diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0020-config.h.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0020-config.h.patch new file mode 100644 index 0000000..12c9e61 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0020-config.h.patch @@ -0,0 +1,10 @@ +--- a/include/config.h ++++ b/include/config.h +@@ -0,0 +1,7 @@ ++/* Automatically generated - do not edit */ ++#define CONFIG_BOARDDIR board/emulation/qemu-arm ++#include ++#include ++#include ++#include ++#include diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0017-am335x_evm.h.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0021-am335x_evm.h.patch similarity index 96% rename from build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0017-am335x_evm.h.patch rename to build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0021-am335x_evm.h.patch index 2d54818..a92c196 100644 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0017-am335x_evm.h.patch +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0021-am335x_evm.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/git/infrabase/build/tmp/work/uboot-2022.04-r0/uboot-2022.04/include/configs/am335x_evm.h 2025-09-11 16:44:26.930033739 +0200 -+++ ./include/configs/am335x_evm.h 2025-09-07 09:29:44.733656375 +0200 +--- a/include/configs/am335x_evm.h ++++ b/include/configs/am335x_evm.h @@ -44,6 +44,20 @@ #define NANDARGS "" #endif diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0018-qemu-arm.h.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0022-qemu-arm.h.patch similarity index 67% rename from build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0018-qemu-arm.h.patch rename to build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0022-qemu-arm.h.patch index 906b41e..b051e04 100644 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0018-qemu-arm.h.patch +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0022-qemu-arm.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/git/infrabase/build/tmp/work/uboot-2022.04-r0/uboot-2022.04/include/configs/qemu-arm.h 2025-09-11 16:44:26.946034153 +0200 -+++ ./include/configs/qemu-arm.h 2025-09-07 09:29:44.733688605 +0200 +--- a/include/configs/qemu-arm.h ++++ b/include/configs/qemu-arm.h @@ -45,6 +45,8 @@ # define BOOT_TARGET_DHCP(func) #endif diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0019-rpi.h.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0023-rpi.h.patch similarity index 82% rename from build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0019-rpi.h.patch rename to build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0023-rpi.h.patch index 0a3f320..86d6806 100644 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0019-rpi.h.patch +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0023-rpi.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/git/infrabase/build/tmp/work/uboot-2022.04-r0/uboot-2022.04/include/configs/rpi.h 2025-09-11 16:44:26.946034153 +0200 -+++ ./include/configs/rpi.h 2025-09-07 09:29:44.733675083 +0200 +--- a/include/configs/rpi.h ++++ b/include/configs/rpi.h @@ -36,9 +36,12 @@ CONFIG_SYS_SDRAM_SIZE - \ GENERATED_GBL_DATA_SIZE) diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0024-bootm.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0024-bootm.c.patch deleted file mode 100644 index 030f596..0000000 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0024-bootm.c.patch +++ /dev/null @@ -1,4 +0,0 @@ ---- /home/rossierd/soo/git/infrabase/build/tmp/work/uboot-2022.04-r0/uboot-2022.04/tools/boot/bootm.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./tools/boot/bootm.c 2025-09-11 16:34:43.027924515 +0200 -@@ -0,0 +1 @@ -+#include <../boot/bootm.c> diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0020-ti_armv7_common.h.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0024-ti_armv7_common.h.patch similarity index 99% rename from build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0020-ti_armv7_common.h.patch rename to build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0024-ti_armv7_common.h.patch index 3b0a6f9..186b18a 100644 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0020-ti_armv7_common.h.patch +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0024-ti_armv7_common.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/git/infrabase/build/tmp/work/uboot-2022.04-r0/uboot-2022.04/include/configs/ti_armv7_common.h 2025-09-11 16:44:26.950034257 +0200 -+++ ./include/configs/ti_armv7_common.h 2025-09-07 09:29:44.733709799 +0200 +--- a/include/configs/ti_armv7_common.h ++++ b/include/configs/ti_armv7_common.h @@ -96,6 +96,702 @@ /* Boot Argument Buffer Size */ #define CONFIG_SYS_BARGSIZE CONFIG_SYS_CBSIZE diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0025-fdt_region.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0025-fdt_region.c.patch deleted file mode 100644 index 7e44c8a..0000000 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0025-fdt_region.c.patch +++ /dev/null @@ -1,4 +0,0 @@ ---- /home/rossierd/soo/git/infrabase/build/tmp/work/uboot-2022.04-r0/uboot-2022.04/tools/boot/fdt_region.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./tools/boot/fdt_region.c 2025-09-11 16:34:43.027343942 +0200 -@@ -0,0 +1 @@ -+#include <../boot/fdt_region.c> diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0021-ti_omap5_common.h.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0025-ti_omap5_common.h.patch similarity index 78% rename from build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0021-ti_omap5_common.h.patch rename to build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0025-ti_omap5_common.h.patch index dba1a70..592cdb4 100644 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0021-ti_omap5_common.h.patch +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0025-ti_omap5_common.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/git/infrabase/build/tmp/work/uboot-2022.04-r0/uboot-2022.04/include/configs/ti_omap5_common.h 2025-09-11 16:44:26.950034257 +0200 -+++ ./include/configs/ti_omap5_common.h 2025-09-07 09:29:44.733637144 +0200 +--- a/include/configs/ti_omap5_common.h ++++ b/include/configs/ti_omap5_common.h @@ -256,13 +256,14 @@ "if test $fdtfile = undefined; then " \ "echo WARNING: Could not determine device tree to use; fi; \0" diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0026-image.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0026-image.c.patch deleted file mode 100644 index 386d9b7..0000000 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0026-image.c.patch +++ /dev/null @@ -1,4 +0,0 @@ ---- /home/rossierd/soo/git/infrabase/build/tmp/work/uboot-2022.04-r0/uboot-2022.04/tools/boot/image.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./tools/boot/image.c 2025-09-11 16:34:43.029149890 +0200 -@@ -0,0 +1 @@ -+#include <../boot/image.c> diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0022-mmc.h.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0026-mmc.h.patch similarity index 94% rename from build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0022-mmc.h.patch rename to build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0026-mmc.h.patch index 017193c..9b60060 100644 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0022-mmc.h.patch +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0026-mmc.h.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/git/infrabase/build/tmp/work/uboot-2022.04-r0/uboot-2022.04/include/environment/ti/mmc.h 2025-09-11 16:44:26.967483707 +0200 -+++ ./include/environment/ti/mmc.h 2025-09-11 16:34:39.427910196 +0200 +--- a/include/environment/ti/mmc.h ++++ b/include/environment/ti/mmc.h @@ -11,20 +11,73 @@ #define DEFAULT_MMC_TI_ARGS \ "mmcdev=0\0" \ diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0023-Makefile.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0027-Makefile.patch similarity index 56% rename from build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0023-Makefile.patch rename to build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0027-Makefile.patch index be95375..e4f72d0 100644 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0023-Makefile.patch +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0027-Makefile.patch @@ -1,5 +1,5 @@ ---- /home/rossierd/soo/git/infrabase/build/tmp/work/uboot-2022.04-r0/uboot-2022.04/Makefile 2025-09-11 16:44:26.419020533 +0200 -+++ ./Makefile 2025-09-11 16:34:39.187252108 +0200 +--- a/Makefile ++++ b/Makefile @@ -268,6 +268,8 @@ ######################################################################### diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0027-image-cipher.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0027-image-cipher.c.patch deleted file mode 100644 index f7df2e6..0000000 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0027-image-cipher.c.patch +++ /dev/null @@ -1,4 +0,0 @@ ---- /home/rossierd/soo/git/infrabase/build/tmp/work/uboot-2022.04-r0/uboot-2022.04/tools/boot/image-cipher.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./tools/boot/image-cipher.c 2025-09-11 16:34:43.027343942 +0200 -@@ -0,0 +1 @@ -+#include <../boot/image-cipher.c> diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0028-bootm.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0028-bootm.c.patch new file mode 100644 index 0000000..5ff63b6 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0028-bootm.c.patch @@ -0,0 +1,4 @@ +--- a/tools/boot/bootm.c ++++ b/tools/boot/bootm.c +@@ -0,0 +1 @@ ++#include <../boot/bootm.c> diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0028-image-fit.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0028-image-fit.c.patch deleted file mode 100644 index 8a4e350..0000000 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0028-image-fit.c.patch +++ /dev/null @@ -1,4 +0,0 @@ ---- /home/rossierd/soo/git/infrabase/build/tmp/work/uboot-2022.04-r0/uboot-2022.04/tools/boot/image-fit.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./tools/boot/image-fit.c 2025-09-11 16:34:43.026796376 +0200 -@@ -0,0 +1 @@ -+#include <../boot/image-fit.c> diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0029-fdt_region.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0029-fdt_region.c.patch new file mode 100644 index 0000000..6bd4068 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0029-fdt_region.c.patch @@ -0,0 +1,4 @@ +--- a/tools/boot/fdt_region.c ++++ b/tools/boot/fdt_region.c +@@ -0,0 +1 @@ ++#include <../boot/fdt_region.c> diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0029-image-fit-sig.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0029-image-fit-sig.c.patch deleted file mode 100644 index b4025fb..0000000 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0029-image-fit-sig.c.patch +++ /dev/null @@ -1,4 +0,0 @@ ---- /home/rossierd/soo/git/infrabase/build/tmp/work/uboot-2022.04-r0/uboot-2022.04/tools/boot/image-fit-sig.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./tools/boot/image-fit-sig.c 2025-09-11 16:34:43.027233486 +0200 -@@ -0,0 +1 @@ -+#include <../boot/image-fit-sig.c> diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0030-image-host.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0030-image-host.c.patch deleted file mode 100644 index 4ceca71..0000000 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0030-image-host.c.patch +++ /dev/null @@ -1,4 +0,0 @@ ---- /home/rossierd/soo/git/infrabase/build/tmp/work/uboot-2022.04-r0/uboot-2022.04/tools/boot/image-host.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./tools/boot/image-host.c 2025-09-11 16:34:43.029561478 +0200 -@@ -0,0 +1 @@ -+#include <../boot/image-host.c> diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0030-image.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0030-image.c.patch new file mode 100644 index 0000000..461c4aa --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0030-image.c.patch @@ -0,0 +1,4 @@ +--- a/tools/boot/image.c ++++ b/tools/boot/image.c +@@ -0,0 +1 @@ ++#include <../boot/image.c> diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0031-image-cipher.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0031-image-cipher.c.patch new file mode 100644 index 0000000..21bddf9 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0031-image-cipher.c.patch @@ -0,0 +1,4 @@ +--- a/tools/boot/image-cipher.c ++++ b/tools/boot/image-cipher.c +@@ -0,0 +1 @@ ++#include <../boot/image-cipher.c> diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0032-image-fit.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0032-image-fit.c.patch new file mode 100644 index 0000000..a54ce4f --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0032-image-fit.c.patch @@ -0,0 +1,4 @@ +--- a/tools/boot/image-fit.c ++++ b/tools/boot/image-fit.c +@@ -0,0 +1 @@ ++#include <../boot/image-fit.c> diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0033-image-fit-sig.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0033-image-fit-sig.c.patch new file mode 100644 index 0000000..8f87683 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0033-image-fit-sig.c.patch @@ -0,0 +1,4 @@ +--- a/tools/boot/image-fit-sig.c ++++ b/tools/boot/image-fit-sig.c +@@ -0,0 +1 @@ ++#include <../boot/image-fit-sig.c> diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0034-image-host.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0034-image-host.c.patch new file mode 100644 index 0000000..5639778 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0034-image-host.c.patch @@ -0,0 +1,4 @@ +--- a/tools/boot/image-host.c ++++ b/tools/boot/image-host.c +@@ -0,0 +1 @@ ++#include <../boot/image-host.c> diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0035-hash.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0035-hash.c.patch new file mode 100644 index 0000000..96d751a --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0035-hash.c.patch @@ -0,0 +1,4 @@ +--- a/tools/common/hash.c ++++ b/tools/common/hash.c +@@ -0,0 +1 @@ ++#include <../common/hash.c> diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0036-embedded.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0036-embedded.c.patch new file mode 100644 index 0000000..d096abf --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0036-embedded.c.patch @@ -0,0 +1,4 @@ +--- a/tools/env/embedded.c ++++ b/tools/env/embedded.c +@@ -0,0 +1 @@ ++#include <../env/embedded.c> diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0037-aes-decrypt.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0037-aes-decrypt.c.patch new file mode 100644 index 0000000..51e7f91 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0037-aes-decrypt.c.patch @@ -0,0 +1,4 @@ +--- a/tools/lib/aes/aes-decrypt.c ++++ b/tools/lib/aes/aes-decrypt.c +@@ -0,0 +1 @@ ++#include <../lib/aes/aes-decrypt.c> diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0038-aes-encrypt.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0038-aes-encrypt.c.patch new file mode 100644 index 0000000..b69eba8 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0038-aes-encrypt.c.patch @@ -0,0 +1,4 @@ +--- a/tools/lib/aes/aes-encrypt.c ++++ b/tools/lib/aes/aes-encrypt.c +@@ -0,0 +1 @@ ++#include <../lib/aes/aes-encrypt.c> diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0039-crc16.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0039-crc16.c.patch new file mode 100644 index 0000000..946bedd --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0039-crc16.c.patch @@ -0,0 +1,4 @@ +--- a/tools/lib/crc16.c ++++ b/tools/lib/crc16.c +@@ -0,0 +1 @@ ++#include <../lib/crc16.c> diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0040-crc32.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0040-crc32.c.patch new file mode 100644 index 0000000..050651c --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0040-crc32.c.patch @@ -0,0 +1,4 @@ +--- a/tools/lib/crc32.c ++++ b/tools/lib/crc32.c +@@ -0,0 +1 @@ ++#include <../lib/crc32.c> diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0041-crc8.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0041-crc8.c.patch new file mode 100644 index 0000000..7d2e90d --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0041-crc8.c.patch @@ -0,0 +1,4 @@ +--- a/tools/lib/crc8.c ++++ b/tools/lib/crc8.c +@@ -0,0 +1 @@ ++#include <../lib/crc8.c> diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0042-ecdsa-libcrypto.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0042-ecdsa-libcrypto.c.patch new file mode 100644 index 0000000..8b2cbe5 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0042-ecdsa-libcrypto.c.patch @@ -0,0 +1,4 @@ +--- a/tools/lib/ecdsa/ecdsa-libcrypto.c ++++ b/tools/lib/ecdsa/ecdsa-libcrypto.c +@@ -0,0 +1 @@ ++#include <../lib/ecdsa/ecdsa-libcrypto.c> diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0043-fdtdec.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0043-fdtdec.c.patch new file mode 100644 index 0000000..b20282d --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0043-fdtdec.c.patch @@ -0,0 +1,4 @@ +--- a/tools/lib/fdtdec.c ++++ b/tools/lib/fdtdec.c +@@ -0,0 +1 @@ ++#include <../lib/fdtdec.c> diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0044-fdtdec_common.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0044-fdtdec_common.c.patch new file mode 100644 index 0000000..456ba4c --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0044-fdtdec_common.c.patch @@ -0,0 +1,4 @@ +--- a/tools/lib/fdtdec_common.c ++++ b/tools/lib/fdtdec_common.c +@@ -0,0 +1 @@ ++#include <../lib/fdtdec_common.c> diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0045-fdt-libcrypto.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0045-fdt-libcrypto.c.patch new file mode 100644 index 0000000..d359d16 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0045-fdt-libcrypto.c.patch @@ -0,0 +1,4 @@ +--- a/tools/lib/fdt-libcrypto.c ++++ b/tools/lib/fdt-libcrypto.c +@@ -0,0 +1 @@ ++#include <../lib/fdt-libcrypto.c> diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0046-hash-checksum.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0046-hash-checksum.c.patch new file mode 100644 index 0000000..a9e1230 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0046-hash-checksum.c.patch @@ -0,0 +1,4 @@ +--- a/tools/lib/hash-checksum.c ++++ b/tools/lib/hash-checksum.c +@@ -0,0 +1 @@ ++#include <../lib/hash-checksum.c> diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0047-md5.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0047-md5.c.patch new file mode 100644 index 0000000..4c1af13 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0047-md5.c.patch @@ -0,0 +1,4 @@ +--- a/tools/lib/md5.c ++++ b/tools/lib/md5.c +@@ -0,0 +1 @@ ++#include <../lib/md5.c> diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0048-rc4.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0048-rc4.c.patch new file mode 100644 index 0000000..9b4a735 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0048-rc4.c.patch @@ -0,0 +1,4 @@ +--- a/tools/lib/rc4.c ++++ b/tools/lib/rc4.c +@@ -0,0 +1 @@ ++#include <../lib/rc4.c> diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0049-rsa-mod-exp.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0049-rsa-mod-exp.c.patch new file mode 100644 index 0000000..ed65584 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0049-rsa-mod-exp.c.patch @@ -0,0 +1,4 @@ +--- a/tools/lib/rsa/rsa-mod-exp.c ++++ b/tools/lib/rsa/rsa-mod-exp.c +@@ -0,0 +1 @@ ++#include <../lib/rsa/rsa-mod-exp.c> diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0050-rsa-sign.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0050-rsa-sign.c.patch new file mode 100644 index 0000000..b121713 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0050-rsa-sign.c.patch @@ -0,0 +1,4 @@ +--- a/tools/lib/rsa/rsa-sign.c ++++ b/tools/lib/rsa/rsa-sign.c +@@ -0,0 +1 @@ ++#include <../lib/rsa/rsa-sign.c> diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0051-rsa-verify.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0051-rsa-verify.c.patch new file mode 100644 index 0000000..79c6734 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0051-rsa-verify.c.patch @@ -0,0 +1,4 @@ +--- a/tools/lib/rsa/rsa-verify.c ++++ b/tools/lib/rsa/rsa-verify.c +@@ -0,0 +1 @@ ++#include <../lib/rsa/rsa-verify.c> diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0052-sha1.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0052-sha1.c.patch new file mode 100644 index 0000000..e21ff7c --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0052-sha1.c.patch @@ -0,0 +1,4 @@ +--- a/tools/lib/sha1.c ++++ b/tools/lib/sha1.c +@@ -0,0 +1 @@ ++#include <../lib/sha1.c> diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0053-sha256.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0053-sha256.c.patch new file mode 100644 index 0000000..d055f2d --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0053-sha256.c.patch @@ -0,0 +1,4 @@ +--- a/tools/lib/sha256.c ++++ b/tools/lib/sha256.c +@@ -0,0 +1 @@ ++#include <../lib/sha256.c> diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0054-sha512.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0054-sha512.c.patch new file mode 100644 index 0000000..0d7e156 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0054-sha512.c.patch @@ -0,0 +1,4 @@ +--- a/tools/lib/sha512.c ++++ b/tools/lib/sha512.c +@@ -0,0 +1 @@ ++#include <../lib/sha512.c> diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0-patches.inc b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0-patches.inc new file mode 100644 index 0000000..a8f2301 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0-patches.inc @@ -0,0 +1,47 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + +SRC_URI += "\ + file://0025-verdin-imx8mm_defconfig.patch \ + file://0024-toradex-smarc-imx8mp_defconfig.patch \ + file://0020-lpddr4_timing.c.patch \ + file://0005-soc.c.patch \ + file://0016-Makefile.patch \ + file://0014-lpddr4_timing.h.patch \ + file://0022-apalis_imx6_defconfig.patch \ + file://0009-tdx-cfg-block.h.patch \ + file://0026-verdin-imx8mp_defconfig.patch \ + file://0012-Kconfig.patch \ + file://0021-verdin-imx8mm.c.patch \ + file://0030-imx8mp-verdin.dtsi.patch \ + file://0006-apalis_imx6.c.patch \ + file://0017-smarc-imx8mp.c.patch \ + file://0013-lpddr4_timing.c.patch \ + file://0032-verdin-imx8mm.h.patch \ + file://0010-tdx-common.c.patch \ + file://0031-toradex-smarc-imx8mp.h.patch \ + file://0029-imx8mm-verdin.dtsi.patch \ + file://0002-imx8mp-toradex-smarc-dev-u-boot.dtsi.patch \ + file://0027-index.rst.patch \ + file://0004-Kconfig.patch \ + file://0023-colibri_imx6_defconfig.patch \ + file://0007-colibri_imx6.c.patch \ + file://0008-tdx-cfg-block.c.patch \ + file://0001-imx8mp-toradex-smarc-dev.dts.patch \ + file://0015-MAINTAINERS.patch \ + file://0019-spl.c.patch \ + file://0028-smarc-imx8mp.rst.patch \ + file://0003-imx8mp-toradex-smarc.dtsi.patch \ + file://0011-imximage.cfg.patch \ + file://0018-smarc-imx8mp.env.patch \ + file://0033-image-board.c.patch \ + file://0034-verdin-imx8mp.h.patch \ + file://0035-verdin-imx8mp_defconfig.patch \ + file://0036-imx8mp-u-boot.dtsi.patch \ + file://0037-verdin-imx8mp.c.patch \ + file://0038-soc.c.patch \ + file://0070-Kconfig.patch \ + file://0071-Makefile.patch \ + file://0072-verdin-imx8mp_defconfig.patch \ + file://0073-e1c_boot.c.patch \ +" \ No newline at end of file diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0001-imx8mp-toradex-smarc-dev.dts.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0001-imx8mp-toradex-smarc-dev.dts.patch new file mode 100644 index 0000000..e7dcddf --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0001-imx8mp-toradex-smarc-dev.dts.patch @@ -0,0 +1,254 @@ +--- /home/rossierd/edgemtech/products/edgem1/build/tmp/work/uboot-2024.07-r0/uboot-2024.07/arch/arm/dts/imx8mp-toradex-smarc-dev.dts 1970-01-01 01:00:00.000000000 +0100 ++++ ./arch/arm/dts/imx8mp-toradex-smarc-dev.dts 2025-11-21 14:54:55.135231501 +0100 +@@ -0,0 +1,251 @@ ++// SPDX-License-Identifier: GPL-2.0-or-later OR MIT ++/* Copyright (C) 2024 Toradex */ ++ ++/dts-v1/; ++ ++#include "imx8mp-toradex-smarc.dtsi" ++ ++/ { ++ model = "Toradex SMARC iMX8M Plus on Toradex SMARC Development Board"; ++ compatible = "toradex,smarc-imx8mp-dev", ++ "toradex,smarc-imx8mp", ++ "fsl,imx8mp"; ++ ++ reg_carrier_1p8v: regulator-carrier-1p8v { ++ compatible = "regulator-fixed"; ++ regulator-max-microvolt = <1800000>; ++ regulator-min-microvolt = <1800000>; ++ regulator-name = "On-carrier 1V8"; ++ }; ++ ++ sound { ++ compatible = "simple-audio-card"; ++ simple-audio-card,bitclock-master = <&codec_dai>; ++ simple-audio-card,format = "i2s"; ++ simple-audio-card,frame-master = <&codec_dai>; ++ simple-audio-card,mclk-fs = <256>; ++ simple-audio-card,name = "tdx-smarc-wm8904"; ++ simple-audio-card,routing = ++ "Headphone Jack", "HPOUTL", ++ "Headphone Jack", "HPOUTR", ++ "IN2L", "Line In Jack", ++ "IN2R", "Line In Jack", ++ "Microphone Jack", "MICBIAS", ++ "IN1L", "Microphone Jack"; ++ simple-audio-card,widgets = ++ "Microphone", "Microphone Jack", ++ "Headphone", "Headphone Jack", ++ "Line", "Line In Jack"; ++ ++ codec_dai: simple-audio-card,codec { ++ clocks = <&audio_blk_ctrl IMX8MP_CLK_AUDIOMIX_SAI1_MCLK1>; ++ sound-dai = <&wm8904_1a>; ++ }; ++ ++ simple-audio-card,cpu { ++ sound-dai = <&sai1>; ++ }; ++ }; ++}; ++ ++/* SMARC SPI0 */ ++&ecspi1 { ++ status = "okay"; ++}; ++ ++/* SMARC GBE0 */ ++&eqos { ++ status = "okay"; ++}; ++ ++/* SMARC GBE1 */ ++&fec { ++ status = "okay"; ++}; ++ ++/* SMARC CAN1 */ ++&flexcan1 { ++ status = "okay"; ++}; ++ ++/* SMARC CAN0 */ ++&flexcan2 { ++ status = "okay"; ++}; ++ ++&gpio1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_gpio7>, ++ <&pinctrl_gpio8>, ++ <&pinctrl_gpio9>, ++ <&pinctrl_gpio10>, ++ <&pinctrl_gpio11>, ++ <&pinctrl_gpio12>, ++ <&pinctrl_gpio13>; ++}; ++ ++&gpio3 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_lvds_dsi_sel>; ++}; ++ ++&gpio4 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_gpio4>, <&pinctrl_gpio6>; ++}; ++ ++/* SMARC I2C_LCD */ ++&i2c2 { ++ status = "okay"; ++ ++ i2c-mux@70 { ++ compatible = "nxp,pca9543"; ++ reg = <0x70>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ /* I2C on DSI Connector Pins 4/6 */ ++ i2c_dsi_0: i2c@0 { ++ reg = <0>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ }; ++ ++ /* I2C on DSI Connector Pins 52/54 */ ++ i2c_dsi_1: i2c@1 { ++ reg = <1>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ }; ++ }; ++}; ++ ++/* SMARC I2C_CAM0 */ ++&i2c3 { ++ status = "okay"; ++}; ++ ++/* SMARC I2C_GP */ ++&i2c4 { ++ /* Audio Codec */ ++ wm8904_1a: audio-codec@1a { ++ compatible = "wlf,wm8904"; ++ reg = <0x1a>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_sai1>, <&pinctrl_sai1_mclk>; ++ #sound-dai-cells = <0>; ++ clocks = <&audio_blk_ctrl IMX8MP_CLK_AUDIOMIX_SAI1_MCLK1>; ++ clock-names = "mclk"; ++ AVDD-supply = <®_carrier_1p8v>; ++ CPVDD-supply = <®_carrier_1p8v>; ++ DBVDD-supply = <®_carrier_1p8v>; ++ DCVDD-supply = <®_carrier_1p8v>; ++ MICVDD-supply = <®_carrier_1p8v>; ++ }; ++ ++ /* On-Carrier Temperature Sensor */ ++ temperature-sensor@4f { ++ compatible = "ti,tmp1075"; ++ reg = <0x4f>; ++ }; ++ ++ /* On-Carrier EEPROM */ ++ eeprom@57 { ++ compatible = "st,24c02"; ++ reg = <0x57>; ++ pagesize = <16>; ++ }; ++}; ++ ++/* SMARC I2C_CAM1 */ ++&i2c5 { ++ status = "okay"; ++}; ++ ++/* SMARC I2C_PM */ ++&i2c6 { ++ clock-frequency = <100000>; ++ status = "okay"; ++ ++ /* Fan controller */ ++ fan@18 { ++ compatible = "ti,amc6821"; ++ reg = <0x18>; ++ }; ++ ++ /* Current measurement into module VDD */ ++ hwmon@40 { ++ compatible = "ti,ina226"; ++ reg = <0x40>; ++ shunt-resistor = <5000>; ++ }; ++}; ++ ++/* SMARC I2S0 */ ++&sai1 { ++ assigned-clocks = <&clk IMX8MP_CLK_SAI1>; ++ assigned-clock-parents = <&clk IMX8MP_AUDIO_PLL1_OUT>; ++ assigned-clock-rates = <24576000>; ++ fsl,sai-mclk-direction-output; ++ status = "okay"; ++}; ++ ++/* SMARC PCIE_A, M2 Key B */ ++&pcie { ++ status = "okay"; ++}; ++ ++&pcie_phy { ++ status = "okay"; ++}; ++ ++/* SMARC LCD1_BKLT_PWM */ ++&pwm1 { ++ status = "okay"; ++}; ++ ++/* SMARC LCD0_BKLT_PWM */ ++&pwm2 { ++ status = "okay"; ++}; ++ ++/* SMARC SER0, RS485. Optional M.2 KEY E */ ++&uart1 { ++ linux,rs485-enabled-at-boot-time; ++ rs485-rts-active-low; ++ rs485-rx-during-tx; ++ status = "okay"; ++}; ++ ++/* SMARC SER2 */ ++&uart2 { ++ status = "okay"; ++}; ++ ++/* SMARC SER1, used as the Linux Console */ ++&uart4 { ++ status = "okay"; ++}; ++ ++/* SMARC USB0 */ ++&usb3_0 { ++ status = "okay"; ++}; ++ ++/* SMARC USB1..4 */ ++&usb3_1 { ++ status = "okay"; ++}; ++ ++&usb3_phy0 { ++ status = "okay"; ++}; ++ ++&usb3_phy1 { ++ status = "okay"; ++}; ++ ++/* SMARC SDIO */ ++&usdhc2 { ++ status = "okay"; ++}; diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0002-imx8mp-toradex-smarc-dev-u-boot.dtsi.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0002-imx8mp-toradex-smarc-dev-u-boot.dtsi.patch new file mode 100644 index 0000000..f696cc5 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0002-imx8mp-toradex-smarc-dev-u-boot.dtsi.patch @@ -0,0 +1,83 @@ +--- /home/rossierd/edgemtech/products/edgem1/build/tmp/work/uboot-2024.07-r0/uboot-2024.07/arch/arm/dts/imx8mp-toradex-smarc-dev-u-boot.dtsi 1970-01-01 01:00:00.000000000 +0100 ++++ ./arch/arm/dts/imx8mp-toradex-smarc-dev-u-boot.dtsi 2025-11-21 14:54:55.135216347 +0100 +@@ -0,0 +1,80 @@ ++// SPDX-License-Identifier: GPL-2.0-or-later OR MIT ++/* Copyright (C) 2024 Toradex */ ++ ++#include "imx8mp-u-boot.dtsi" ++ ++/ { ++ sysinfo { ++ compatible = "toradex,sysinfo"; ++ }; ++}; ++ ++&gpio2 { ++ bt_uart_gpio { ++ gpio-hog; ++ gpios = <9 GPIO_ACTIVE_HIGH>; ++ input; ++ line-name = "BT_UART_RXD_GPIO"; ++ }; ++}; ++ ++&gpio3 { ++ wifi_en_gpio { ++ gpio-hog; ++ gpios = <14 GPIO_ACTIVE_HIGH>; ++ output-high; ++ line-name = "CTRL_EN_WIFI"; ++ }; ++}; ++ ++&gpio1 { ++ bootph-pre-ram; ++}; ++ ++&gpio5 { ++ bootph-pre-ram; ++}; ++ ++&i2c1 { ++ bootph-pre-ram; ++}; ++ ++&pca9450 { ++ bootph-pre-ram; ++ ++ regulators { ++ bootph-pre-ram; ++ }; ++}; ++ ++&pinctrl_i2c1 { ++ bootph-pre-ram; ++}; ++ ++&pinctrl_i2c1_gpio { ++ bootph-pre-ram; ++}; ++ ++&pinctrl_pmic { ++ bootph-pre-ram; ++}; ++ ++&pinctrl_uart4 { ++ bootph-pre-ram; ++}; ++ ++&uart3 { ++ status = "disabled"; ++}; ++ ++&uart4 { ++ bootph-pre-ram; ++}; ++ ++&usdhc1 { ++ status = "disabled"; ++}; ++ ++&usdhc3 { ++ bootph-pre-ram; ++}; diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0003-imx8mp-toradex-smarc.dtsi.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0003-imx8mp-toradex-smarc.dtsi.patch new file mode 100644 index 0000000..d27cadc --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0003-imx8mp-toradex-smarc.dtsi.patch @@ -0,0 +1,1277 @@ +--- /home/rossierd/edgemtech/products/edgem1/build/tmp/work/uboot-2024.07-r0/uboot-2024.07/arch/arm/dts/imx8mp-toradex-smarc.dtsi 1970-01-01 01:00:00.000000000 +0100 ++++ ./arch/arm/dts/imx8mp-toradex-smarc.dtsi 2025-11-21 14:54:55.135247992 +0100 +@@ -0,0 +1,1274 @@ ++// SPDX-License-Identifier: GPL-2.0-or-later OR MIT ++/* Copyright (C) 2024 Toradex */ ++ ++#include ++#include ++#include "imx8mp.dtsi" ++ ++/ { ++ aliases { ++ can0 = &flexcan2; ++ can1 = &flexcan1; ++ ethernet0 = &eqos; ++ ethernet1 = &fec; ++ mmc0 = &usdhc3; ++ mmc1 = &usdhc2; ++ mmc2 = &usdhc1; ++ rtc0 = &rtc_i2c; ++ rtc1 = &snvs_rtc; ++ serial0 = &uart1; ++ serial1 = &uart4; ++ serial2 = &uart2; ++ serial3 = &uart3; ++ }; ++ ++ chosen { ++ stdout-path = &uart4; ++ }; ++ ++ connector { ++ compatible = "gpio-usb-b-connector", "usb-b-connector"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_usb0_id>; ++ id-gpios = <&gpio5 2 GPIO_ACTIVE_HIGH>; ++ label = "USB0"; ++ self-powered; ++ type = "micro"; ++ vbus-supply = <®_usb0_vbus>; ++ ++ port { ++ usb_dr_connector: endpoint { ++ remote-endpoint = <&usb3_0_dwc>; ++ }; ++ }; ++ }; ++ ++ gpio-keys { ++ compatible = "gpio-keys"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_sleep>; ++ ++ key-sleep { ++ debounce-interval = <10>; ++ gpios = <&gpio3 1 GPIO_ACTIVE_LOW>; ++ label = "SMARC_SLEEP#"; ++ wakeup-source; ++ linux,code = ; ++ }; ++ }; ++ ++ reg_usb0_vbus: regulator-usb0-vbus { ++ compatible = "regulator-fixed"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_usb0_en_oc>; ++ gpios = <&gpio1 12 GPIO_ACTIVE_HIGH>; ++ enable-active-high; ++ regulator-name = "USB0_EN_OC#"; ++ }; ++ ++ reg_usb1_vbus: regulator-usb1-vbus { ++ compatible = "regulator-fixed"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_usb1_en_oc>; ++ gpios = <&gpio1 14 GPIO_ACTIVE_HIGH>; ++ enable-active-high; ++ regulator-name = "USB2_EN_OC#"; ++ }; ++ ++ reg_usdhc2_vmmc: regulator-usdhc2-vmmc { ++ compatible = "regulator-fixed"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_usdhc2_pwr_en>; ++ enable-active-high; ++ gpio = <&gpio2 19 GPIO_ACTIVE_HIGH>; ++ off-on-delay-us = <100000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-min-microvolt = <3300000>; ++ regulator-name = "3V3_SD"; ++ startup-delay-us = <20000>; ++ }; ++ ++ reg_usdhc2_vqmmc: regulator-usdhc2-vqmmc { ++ compatible = "regulator-gpio"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_usdhc2_vsel>; ++ gpios = <&gpio1 4 GPIO_ACTIVE_HIGH>; ++ regulator-max-microvolt = <3300000>; ++ regulator-min-microvolt = <1800000>; ++ states = <1800000 0x1>, ++ <3300000 0x0>; ++ regulator-name = "PMIC_USDHC_VSELECT"; ++ vin-supply = <®_sd_3v3_1v8>; ++ }; ++ ++ reg_wifi_en: regulator-wifi-en { ++ compatible = "regulator-fixed"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_wifi_pwr_en>; ++ gpio = <&gpio3 14 GPIO_ACTIVE_HIGH>; ++ enable-active-high; ++ regulator-max-microvolt = <3300000>; ++ regulator-min-microvolt = <3300000>; ++ regulator-name = "CTRL_EN_WIFI"; ++ startup-delay-us = <2000>; ++ }; ++}; ++ ++&A53_0 { ++ cpu-supply = <®_vdd_arm>; ++}; ++ ++&A53_1 { ++ cpu-supply = <®_vdd_arm>; ++}; ++ ++&A53_2 { ++ cpu-supply = <®_vdd_arm>; ++}; ++ ++&A53_3 { ++ cpu-supply = <®_vdd_arm>; ++}; ++ ++&dsp_reserved { ++ status = "disabled"; ++}; ++ ++/* SMARC SPI0 */ ++&ecspi1 { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_ecspi1>; ++ cs-gpios = <&gpio5 9 GPIO_ACTIVE_LOW>, <&gpio4 28 GPIO_ACTIVE_LOW>; ++}; ++ ++/* SMARC SPI1 */ ++&ecspi2 { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_ecspi2>, <&pinctrl_tpm_cs>; ++ cs-gpios = <&gpio5 13 GPIO_ACTIVE_LOW>, ++ <&gpio4 3 GPIO_ACTIVE_LOW>, ++ <&gpio3 6 GPIO_ACTIVE_LOW>; ++ status = "okay"; ++ ++ tpm@2 { ++ compatible = "infineon,slb9670", "tcg,tpm_tis-spi"; ++ reg = <2>; ++ spi-max-frequency = <18500000>; ++ }; ++}; ++ ++/* SMARC GBE0 */ ++&eqos { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_eqos>, ++ <&pinctrl_eth_mdio>, ++ <&pinctrl_eqos_1588_event>; ++ phy-handle = <&eqos_phy>; ++ phy-mode = "rgmii-id"; ++ snps,force_thresh_dma_mode; ++ snps,mtl-rx-config = <&mtl_rx_setup>; ++ snps,mtl-tx-config = <&mtl_tx_setup>; ++ ++ mdio: mdio { ++ compatible = "snps,dwmac-mdio"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ }; ++ ++ mtl_rx_setup: rx-queues-config { ++ snps,rx-queues-to-use = <5>; ++ ++ queue0 { ++ snps,dcb-algorithm; ++ snps,priority = <0x1>; ++ snps,map-to-dma-channel = <0>; ++ }; ++ ++ queue1 { ++ snps,dcb-algorithm; ++ snps,priority = <0x2>; ++ snps,map-to-dma-channel = <1>; ++ }; ++ ++ queue2 { ++ snps,dcb-algorithm; ++ snps,priority = <0x4>; ++ snps,map-to-dma-channel = <2>; ++ }; ++ ++ queue3 { ++ snps,dcb-algorithm; ++ snps,priority = <0x8>; ++ snps,map-to-dma-channel = <3>; ++ }; ++ ++ queue4 { ++ snps,dcb-algorithm; ++ snps,priority = <0xf0>; ++ snps,map-to-dma-channel = <4>; ++ }; ++ }; ++ ++ mtl_tx_setup: tx-queues-config { ++ snps,tx-queues-to-use = <5>; ++ ++ queue0 { ++ snps,dcb-algorithm; ++ snps,priority = <0x1>; ++ }; ++ ++ queue1 { ++ snps,dcb-algorithm; ++ snps,priority = <0x2>; ++ }; ++ ++ queue2 { ++ snps,dcb-algorithm; ++ snps,priority = <0x4>; ++ }; ++ ++ queue3 { ++ snps,dcb-algorithm; ++ snps,priority = <0x8>; ++ }; ++ ++ queue4 { ++ snps,dcb-algorithm; ++ snps,priority = <0xf0>; ++ }; ++ }; ++}; ++ ++/* SMARC GBE1 */ ++&fec { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_fec>, <&pinctrl_fec_1588_event>; ++ phy-handle = <&fec_phy>; ++ phy-mode = "rgmii-id"; ++ fsl,magic-packet; ++}; ++ ++/* SMARC CAN1 */ ++&flexcan1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_flexcan1>; ++}; ++ ++/* SMARC CAN0 */ ++&flexcan2 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_flexcan2>; ++}; ++ ++&gpio1 { ++ gpio-line-names = "SMARC_GPIO7", /* 0 */ ++ "SMARC_GPIO8", ++ "", ++ "PMIC_INT#", ++ "PMIC_USDHC_VSELECT", ++ "SMARC_GPIO9", ++ "SMARC_GPIO10", ++ "SMARC_GPIO11", ++ "SMARC_GPIO12", ++ "", ++ "SMARC_GPIO5", /* 10 */ ++ "", ++ "SMARC_USB0_EN_OC#", ++ "SMARC_GPIO13", ++ "SMARC_USB2_EN_OC#"; ++}; ++ ++&gpio2 { ++ gpio-line-names = "", /* 0 */ ++ "", ++ "", ++ "", ++ "", ++ "", ++ "", ++ "", ++ "", ++ "", ++ "", /* 10 */ ++ "", ++ "SMARC_SDIO_CD#", ++ "", ++ "", ++ "", ++ "", ++ "", ++ "", ++ "SMARC_SDIO_PWR_EN", ++ "SMARC_SDIO_WP"; /* 20 */ ++}; ++ ++&gpio3 { ++ gpio-line-names = "ETH_0_INT#", /* 0 */ ++ "SLEEP#", ++ "", ++ "", ++ "", ++ "", ++ "TPM_CS#", ++ "LVDS_DSI_SEL", ++ "MCU_INT#", ++ "GPIO_EX_INT#", ++ "", /* 10 */ ++ "", ++ "", ++ "", ++ "", ++ "", ++ "SMARC_SMB_ALERT#", ++ "", ++ "", ++ "", ++ "SMARC_I2C_PM_DAT", /* 20 */ ++ "", ++ "", ++ "", ++ "", ++ "", ++ "", ++ "", ++ "SMARC_I2C_PM_CK"; ++ ++ lvds_dsi_mux_hog: lvds-dsi-mux-hog { ++ gpio-hog; ++ gpios = <7 GPIO_ACTIVE_HIGH>; ++ line-name = "LVDS_DSI_SEL"; ++ /* LVDS_DSI_SEL as DSI */ ++ output-low; ++ }; ++}; ++ ++&gpio4 { ++ gpio-line-names = "SMARC_PCIE_WAKE#", /* 0 */ ++ "", ++ "", ++ "SMARC_SPI1_CS1#", ++ "", ++ "", ++ "", ++ "", ++ "", ++ "", ++ "", /* 10 */ ++ "", ++ "", ++ "", ++ "", ++ "", ++ "", ++ "", ++ "SMARC_GPIO4", ++ "SMARC_PCIE_A_RST#", ++ "", /* 20 */ ++ "", ++ "", ++ "", ++ "", ++ "", ++ "", ++ "", ++ "SMARC_SPI0_CS1#", ++ "SMARC_GPIO6"; ++}; ++ ++&gpio5 { ++ gpio-line-names = "", /* 0 */ ++ "", ++ "SMARC_USB0_OTG_ID", ++ "SMARC_I2C_CAM1_CK", ++ "SMARC_I2C_CAM1_DAT", ++ "", ++ "", ++ "", ++ "", ++ "SMARC_SPI0_CS0#", ++ "", /* 10 */ ++ "", ++ "", ++ "SMARC_SPI1_CS0#", ++ "CTRL_I2C_SCL", ++ "CTRL_I2C_SDA", ++ "SMARC_I2C_LCD_CK", ++ "SMARC_I2C_LCD_DAT", ++ "SMARC_I2C_CAM0_CK", ++ "SMARC_I2C_CAM0_DAT", ++ "SMARC_I2C_GP_CK", /* 20 */ ++ "SMARC_I2C_GP_DAT"; ++}; ++ ++/* On-module I2C */ ++&i2c1 { ++ pinctrl-names = "default", "gpio"; ++ pinctrl-0 = <&pinctrl_i2c1>; ++ pinctrl-1 = <&pinctrl_i2c1_gpio>; ++ clock-frequency = <400000>; ++ scl-gpios = <&gpio5 14 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>; ++ sda-gpios = <&gpio5 15 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>; ++ single-master; ++ status = "okay"; ++ ++ som_gpio_expander: gpio-expander@21 { ++ compatible = "nxp,pcal6408"; ++ reg = <0x21>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_pcal6408>; ++ #interrupt-cells = <2>; ++ interrupt-controller; ++ interrupt-parent = <&gpio3>; ++ interrupts = <9 IRQ_TYPE_LEVEL_LOW>; ++ #gpio-cells = <2>; ++ gpio-controller; ++ gpio-line-names = ++ "SMARC_GPIO0", ++ "SMARC_GPIO1", ++ "SMARC_GPIO2", ++ "SMARC_GPIO3", ++ "SMARC_LCD0_VDD_EN", ++ "SMARC_LCD0_BKLT_EN", ++ "SMARC_LCD1_VDD_EN", ++ "SMARC_LCD1_BKLT_EN"; ++ }; ++ ++ pca9450: pmic@25 { ++ compatible = "nxp,pca9450c"; ++ reg = <0x25>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_pmic>; ++ interrupt-parent = <&gpio1>; ++ interrupts = <3 IRQ_TYPE_LEVEL_LOW>; ++ ++ regulators { ++ BUCK1 { ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-max-microvolt = <1000000>; ++ regulator-min-microvolt = <805000>; ++ regulator-name = "+VDD_SOC (PMIC BUCK1)"; ++ regulator-ramp-delay = <3125>; ++ }; ++ ++ reg_vdd_arm: BUCK2 { ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-max-microvolt = <1000000>; ++ regulator-min-microvolt = <805000>; ++ regulator-name = "+VDD_ARM (PMIC BUCK2)"; ++ regulator-ramp-delay = <3125>; ++ nxp,dvs-run-voltage = <950000>; ++ nxp,dvs-standby-voltage = <850000>; ++ }; ++ ++ reg_3v3: BUCK4 { ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-max-microvolt = <3300000>; ++ regulator-min-microvolt = <3300000>; ++ regulator-name = "+V3.3 (PMIC BUCK4)"; ++ }; ++ ++ reg_1v8: BUCK5 { ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-max-microvolt = <1800000>; ++ regulator-min-microvolt = <1800000>; ++ regulator-name = "+V1.8 (PMIC BUCK5)"; ++ }; ++ ++ BUCK6 { ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-max-microvolt = <1155000>; ++ regulator-min-microvolt = <1045000>; ++ regulator-name = "+VDD_DDR (PMIC BUCK6)"; ++ }; ++ ++ LDO1 { ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-max-microvolt = <1950000>; ++ regulator-min-microvolt = <1710000>; ++ regulator-name = "+V1.8_SNVS (PMIC LDO1)"; ++ }; ++ ++ LDO3 { ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-max-microvolt = <1800000>; ++ regulator-min-microvolt = <1800000>; ++ regulator-name = "+V1.8A (PMIC LDO3)"; ++ }; ++ ++ LDO4 { ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-max-microvolt = <3300000>; ++ regulator-min-microvolt = <3300000>; ++ regulator-name = "+V3.3_ADC (PMIC LDO4)"; ++ }; ++ ++ reg_sd_3v3_1v8: LDO5 { ++ regulator-max-microvolt = <3300000>; ++ regulator-min-microvolt = <1800000>; ++ regulator-name = "+V3.3_1.8_SD (PMIC LDO5)"; ++ }; ++ }; ++ }; ++ ++ rtc_i2c: rtc@32 { ++ compatible = "epson,rx8130"; ++ reg = <0x32>; ++ }; ++ ++ temperature-sensor@48 { ++ compatible = "ti,tmp1075"; ++ reg = <0x48>; ++ }; ++ ++ eeprom@50 { ++ compatible = "st,24c02"; ++ reg = <0x50>; ++ pagesize = <16>; ++ }; ++}; ++ ++ ++/* SMARC I2C_LCD */ ++&i2c2 { ++ pinctrl-names = "default", "gpio"; ++ pinctrl-0 = <&pinctrl_i2c2>; ++ pinctrl-1 = <&pinctrl_i2c2_gpio>; ++ clock-frequency = <100000>; ++ scl-gpios = <&gpio5 16 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>; ++ sda-gpios = <&gpio5 17 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>; ++ single-master; ++}; ++ ++/* SMARC I2C_CAM0 */ ++&i2c3 { ++ pinctrl-names = "default", "gpio"; ++ pinctrl-0 = <&pinctrl_i2c3>; ++ pinctrl-1 = <&pinctrl_i2c3_gpio>; ++ clock-frequency = <400000>; ++ scl-gpios = <&gpio5 18 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>; ++ sda-gpios = <&gpio5 19 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>; ++ single-master; ++}; ++ ++/* SMARC I2C_GP */ ++&i2c4 { ++ pinctrl-names = "default", "gpio"; ++ pinctrl-0 = <&pinctrl_i2c4>; ++ pinctrl-1 = <&pinctrl_i2c4_gpio>; ++ clock-frequency = <400000>; ++ scl-gpios = <&gpio5 20 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>; ++ sda-gpios = <&gpio5 21 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>; ++ single-master; ++ status = "okay"; ++ ++ eeprom@50 { ++ compatible = "st,24c32"; ++ reg = <0x50>; ++ pagesize = <32>; ++ }; ++}; ++ ++/* SMARC I2C_CAM1 */ ++&i2c5 { ++ pinctrl-names = "default", "gpio"; ++ pinctrl-0 = <&pinctrl_i2c5>; ++ pinctrl-1 = <&pinctrl_i2c5_gpio>; ++ clock-frequency = <400000>; ++ scl-gpios = <&gpio5 3 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>; ++ sda-gpios = <&gpio5 4 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>; ++ single-master; ++}; ++ ++/* SMARC I2C_PM */ ++&i2c6 { ++ pinctrl-names = "default", "gpio"; ++ pinctrl-0 = <&pinctrl_i2c6>; ++ pinctrl-1 = <&pinctrl_i2c6_gpio>; ++ clock-frequency = <400000>; ++ scl-gpios = <&gpio3 28 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>; ++ sda-gpios = <&gpio3 20 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>; ++ single-master; ++}; ++ ++&mdio { ++ eqos_phy: ethernet-phy@1 { ++ reg = <1>; ++ interrupt-parent = <&gpio3>; ++ interrupts = <0 IRQ_TYPE_LEVEL_LOW>; ++ ti,rx-internal-delay = ; ++ ti,tx-internal-delay = ; ++ }; ++ ++ fec_phy: ethernet-phy@2 { ++ reg = <2>; ++ interrupt-parent = <&gpio3>; ++ interrupts = <0 IRQ_TYPE_LEVEL_LOW>; ++ ti,rx-internal-delay = ; ++ ti,tx-internal-delay = ; ++ }; ++}; ++ ++/* SMARC PCIE_A */ ++&pcie { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_pcie>; ++ host-wake-gpios = <&gpio4 0 GPIO_ACTIVE_LOW>; ++ reset-gpio = <&gpio4 19 GPIO_ACTIVE_LOW>; ++}; ++ ++&pcie_phy { ++ clocks = <&hsio_blk_ctrl>; ++ clock-names = "ref"; ++ fsl,clkreq-unsupported; ++ fsl,refclk-pad-mode = ; ++}; ++ ++/* SMARC LCD1_BKLT_PWM */ ++&pwm1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_lcd1_bklt_pwm1>; ++}; ++ ++/* SMARC LCD0_BKLT_PWM */ ++&pwm2 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_lcd0_bklt_pwm2>; ++}; ++ ++/* SMARC GPIO5 as PWM */ ++&pwm3 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_gpio5_pwm>; ++}; ++ ++&snvs_pwrkey { ++ status = "okay"; ++}; ++ ++/* SMARC SER0 */ ++&uart1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_uart1>; ++ uart-has-rtscts; ++}; ++ ++/* SMARC SER2 */ ++&uart2 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_uart2>; ++ uart-has-rtscts; ++}; ++ ++/* On-module Bluetooth, optional SMARC SER3 */ ++&uart3 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_bt_uart>; ++ uart-has-rtscts; ++ status = "okay"; ++ ++ som_bt: bluetooth { ++ compatible = "mrvl,88w8997"; ++ max-speed = <921600>; ++ }; ++}; ++ ++/* SMARC SER1, used as the Linux Console */ ++&uart4 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_uart4>; ++}; ++ ++/* SMARC USB0 */ ++&usb3_0 { ++ fsl,disable-port-power-control; ++}; ++ ++/* SMARC USB1..4 */ ++&usb3_1 { ++ fsl,disable-port-power-control; ++}; ++ ++&usb_dwc3_0 { ++ adp-disable; ++ dr_mode = "otg"; ++ hnp-disable; ++ maximum-speed = "high-speed"; ++ srp-disable; ++ usb-role-switch; ++ ++ port { ++ usb3_0_dwc: endpoint { ++ remote-endpoint = <&usb_dr_connector>; ++ }; ++ }; ++}; ++ ++&usb_dwc3_1 { ++ dr_mode = "host"; ++}; ++ ++&usb3_phy1 { ++ vbus-supply = <®_usb1_vbus>; ++}; ++ ++/* On-module Wi-Fi */ ++&usdhc1 { ++ pinctrl-names = "default", "state_100mhz", "state_200mhz"; ++ pinctrl-0 = <&pinctrl_usdhc1>; ++ pinctrl-1 = <&pinctrl_usdhc1_100mhz>; ++ pinctrl-2 = <&pinctrl_usdhc1_200mhz>; ++ keep-power-in-suspend; ++ non-removable; ++ vmmc-supply = <®_wifi_en>; ++ status = "okay"; ++}; ++ ++/* SMARC SDIO */ ++&usdhc2 { ++ pinctrl-names = "default", "state_100mhz", "state_200mhz", "sleep"; ++ pinctrl-0 = <&pinctrl_usdhc2>, ++ <&pinctrl_usdhc2_cd>, ++ <&pinctrl_usdhc2_wp>; ++ pinctrl-1 = <&pinctrl_usdhc2_100mhz>, ++ <&pinctrl_usdhc2_cd>, ++ <&pinctrl_usdhc2_wp>; ++ pinctrl-2 = <&pinctrl_usdhc2_200mhz>, ++ <&pinctrl_usdhc2_cd>, ++ <&pinctrl_usdhc2_wp>; ++ pinctrl-3 = <&pinctrl_usdhc2_sleep>, ++ <&pinctrl_usdhc2_cd_sleep>, ++ <&pinctrl_usdhc2_wp>; ++ assigned-clocks = <&clk IMX8MP_CLK_USDHC2>; ++ assigned-clock-rates = <400000000>; ++ cd-gpios = <&gpio2 12 GPIO_ACTIVE_LOW>; ++ vmmc-supply = <®_usdhc2_vmmc>; ++ vqmmc-supply = <®_usdhc2_vqmmc>; ++ wp-gpios = <&gpio2 20 GPIO_ACTIVE_HIGH>; ++}; ++ ++/* On-module eMMC */ ++&usdhc3 { ++ pinctrl-names = "default", "state_100mhz", "state_200mhz"; ++ pinctrl-0 = <&pinctrl_usdhc3>; ++ pinctrl-1 = <&pinctrl_usdhc3_100mhz>; ++ pinctrl-2 = <&pinctrl_usdhc3_200mhz>; ++ assigned-clocks = <&clk IMX8MP_CLK_USDHC3_ROOT>; ++ assigned-clock-rates = <400000000>; ++ bus-width = <8>; ++ non-removable; ++ status = "okay"; ++}; ++ ++&wdog1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_wdog>; ++ fsl,ext-reset-output; ++ status = "okay"; ++}; ++ ++&iomuxc { ++ /* On-module Bluetooth */ ++ pinctrl_bt_uart: btuartgrp { ++ fsl,pins = , /* WiFi_UART_TXD */ ++ , /* WiFi_UART_RXD */ ++ , /* WiFi_UART_RTS */ ++ ; /* WiFi_UART_CTS */ ++ }; ++ ++ /* SMARC CAM_MCK */ ++ pinctrl_csi_mclk: csimclkgrp { ++ fsl,pins = ; /* SMARC S6 - CAM_MCK */ ++ }; ++ ++ /* SMARC SPI0 */ ++ pinctrl_ecspi1: ecspi1grp { ++ fsl,pins = , /* SMARC P45 - SPI0_DIN */ ++ , /* SMARC P46 - SPI0_DO */ ++ , /* SMARC P44 - SPI0_CK */ ++ , /* SMARC P43 - SPI0_CS0# */ ++ ; /* SMARC P31 - SPI0_CS1# */ ++ }; ++ ++ /* SMARC SPI1 */ ++ pinctrl_ecspi2: ecspi2grp { ++ fsl,pins = , /* SMARC P56 - SPI1_DIN */ ++ , /* SMARC P57 - SPI1_DO */ ++ , /* SMARC P58 - SPI1_CK */ ++ , /* SMARC P54 - SPI1_CS0# */ ++ ; /* SMARC P55 - SPI1_CS1# */ ++ }; ++ ++ /* ETH_0 RGMII (On-module PHY) */ ++ pinctrl_eqos: eqosgrp { ++ fsl,pins = , /* ETH0_RGMII_RXD0 */ ++ , /* ETH0_RGMII_RXD1 */ ++ , /* ETH0_RGMII_RXD2 */ ++ , /* ETH0_RGMII_RXD3 */ ++ , /* ETH0_RGMII_RXC */ ++ , /* ETH0_RGMII_RX_CTL */ ++ , /* ETH0_RGMII_TXD0 */ ++ , /* ETH0_RGMII_TXD1 */ ++ , /* ETH0_RGMII_TXD2 */ ++ , /* ETH0_RGMII_TXD3 */ ++ , /* ETH0_RGMII_TX_CTL */ ++ ; /* ETH0_RGMII_TXC */ ++ }; ++ ++ /* SMARC GBE0_SDP */ ++ pinctrl_eqos_1588_event: eqos1588eventgrp { ++ fsl,pins = ; /* SMARC P6 - GBE0_SDP */ ++ }; ++ ++ /* ETH_0_MDIO and ETH_0_INT# shared between ETH_PHY0 and ETH_PHY1 */ ++ pinctrl_eth_mdio: ethmdiogrp { ++ fsl,pins = , /* ETH_0_MDC */ ++ , /* ETH_0_MDIO */ ++ ; /* ETH_0_INT# */ ++ }; ++ ++ /* ETH_1 RGMII (On-module PHY) */ ++ pinctrl_fec: fecgrp { ++ fsl,pins = , /* ETH1_RGMII_RXD0 */ ++ , /* ETH1_RGMII_RXD1 */ ++ , /* ETH1_RGMII_RXD2 */ ++ , /* ETH1_RGMII_RXD3 */ ++ , /* ETH1_RGMII_RXC */ ++ , /* ETH1_RGMII_RX_CTL */ ++ , /* ETH1_RGMII_TXD0 */ ++ , /* ETH1_RGMII_TXD1 */ ++ , /* ETH1_RGMII_TXD2 */ ++ , /* ETH1_RGMII_TXD3 */ ++ , /* ETH1_RGMII_TX_CTL */ ++ ; /* ETH1_RGMII_TXC */ ++ }; ++ ++ /* SMARC GBE1_SDP */ ++ pinctrl_fec_1588_event: fec1588eventgrp { ++ fsl,pins = ; /* SMARC P5 - GBE1_SDP */ ++ }; ++ ++ /* SMARC CAN1 */ ++ pinctrl_flexcan1: flexcan1grp { ++ fsl,pins = , /* SMARC P146 - CAN1_RX */ ++ ; /* SMARC P145 - CAN1_TX */ ++ }; ++ ++ /* SMARC CAN0 */ ++ pinctrl_flexcan2: flexcan2grp { ++ fsl,pins = , /* SMARC P144 - CAN0_RX */ ++ ; /* SMARC P143 - CAN0_TX */ ++ }; ++ ++ /* SMARC GPIO4 */ ++ pinctrl_gpio4: gpio4grp { ++ fsl,pins = ; /* SMARC P112 - GPIO4 */ ++ }; ++ ++ /* SMARC GPIO5 */ ++ pinctrl_gpio5: gpio5grp { ++ fsl,pins = ; /* SMARC P113 - GPIO5 */ ++ }; ++ ++ /* SMARC GPIO5 as PWM */ ++ pinctrl_gpio5_pwm: gpio5pwmgrp { ++ fsl,pins = ; /* SMARC P113 - PWM_OUT */ ++ }; ++ ++ /* SMARC GPIO6 */ ++ pinctrl_gpio6: gpio6grp { ++ fsl,pins = ; /* SMARC P114 - GPIO6 */ ++ }; ++ ++ /* SMARC GPIO7 */ ++ pinctrl_gpio7: gpio7grp { ++ fsl,pins = ; /* SMARC P115 - GPIO7 */ ++ }; ++ ++ /* SMARC GPIO8 */ ++ pinctrl_gpio8: gpio8grp { ++ fsl,pins = ; /* SMARC P116 - GPIO8 */ ++ }; ++ ++ /* SMARC GPIO9 */ ++ pinctrl_gpio9: gpio9grp { ++ fsl,pins = ; /* SMARC P117 - GPIO9 */ ++ }; ++ ++ /* SMARC GPIO10 */ ++ pinctrl_gpio10: gpio10grp { ++ fsl,pins = ; /* SMARC P118 - GPIO10 */ ++ }; ++ ++ /* SMARC GPIO11 */ ++ pinctrl_gpio11: gpio11grp { ++ fsl,pins = ; /* SMARC P119 - GPIO11 */ ++ }; ++ ++ /* SMARC GPIO12 */ ++ pinctrl_gpio12: gpio12grp { ++ fsl,pins = ; /* SMARC S142 - GPIO12 */ ++ }; ++ ++ /* SMARC GPIO13 */ ++ pinctrl_gpio13: gpio13grp { ++ fsl,pins = ; /* SMARC S123 - GPIO13 */ ++ }; ++ ++ /* SMARC HDMI */ ++ pinctrl_hdmi: hdmigrp { ++ fsl,pins = , /* SMARC P105 - HDMI_CTRL_CK */ ++ , /* SMARC P106 - HDMI_CTRL_DAT */ ++ ; /* SMARC P104 - HDMI_HPD */ ++ }; ++ ++ /* On-module I2C */ ++ pinctrl_i2c1: i2c1grp { ++ fsl,pins = , /* CTRL_I2C_SCL */ ++ ; /* CTRL_I2C_SDA */ ++ }; ++ ++ /* On-module I2C as GPIOs */ ++ pinctrl_i2c1_gpio: i2c1gpiogrp { ++ fsl,pins = , /* CTRL_I2C_SCL */ ++ ; /* CTRL_I2C_SDA */ ++ }; ++ ++ /* SMARC I2C_LCD */ ++ pinctrl_i2c2: i2c2grp { ++ fsl,pins = , /* SMARC S139 - I2C_LCD_CK */ ++ ; /* SMARC S140 - I2C_LCD_DAT */ ++ }; ++ ++ /* SMARC I2C_LCD as GPIOs */ ++ pinctrl_i2c2_gpio: i2c2gpiogrp { ++ fsl,pins = , /* SMARC S139 - I2C_LCD_CK */ ++ ; /* SMARC S140 - I2C_LCD_DAT */ ++ }; ++ ++ /* SMARC I2C_CAM0 */ ++ pinctrl_i2c3: i2c3grp { ++ fsl,pins = , /* SMARC S5 - I2C_CAM0_CK */ ++ ; /* SMARC S7 - I2C_CAM0_DAT */ ++ }; ++ ++ /* SMARC I2C_CAM0 as GPIOs */ ++ pinctrl_i2c3_gpio: i2c3gpiogrp { ++ fsl,pins = , /* SMARC S5 - I2C_CAM0_CK */ ++ ; /* SMARC S7 - I2C_CAM0_DAT */ ++ }; ++ ++ /* SMARC I2C_GP */ ++ pinctrl_i2c4: i2c4grp { ++ fsl,pins = , /* SMARC S48 - I2C_GP_CK */ ++ ; /* SMARC S49 - I2C_GP_DAT */ ++ }; ++ ++ /* SMARC I2C_GP as GPIOs */ ++ pinctrl_i2c4_gpio: i2c4gpiogrp { ++ fsl,pins = , /* SMARC S48 - I2C_GP_CK */ ++ ; /* SMARC S49 - I2C_GP_DAT */ ++ }; ++ ++ /* SMARC I2C_CAM1 */ ++ pinctrl_i2c5: i2c5grp { ++ fsl,pins = , /* SMARC S2 - I2C_CAM1_DAT */ ++ ; /* SMARC S1 - I2C_CAM1_CK */ ++ }; ++ ++ /* SMARC I2C_CAM1 as GPIOs */ ++ pinctrl_i2c5_gpio: i2c5gpiogrp { ++ fsl,pins = , /* SMARC S2 - I2C_CAM1_DAT */ ++ ; /* SMARC S1 - I2C_CAM1_CK */ ++ }; ++ ++ /* SMARC I2C_PM */ ++ pinctrl_i2c6: i2c6grp { ++ fsl,pins = , /* SMARC P121 - I2C_PM_CK */ ++ ; /* SMARC P122 - I2C_PM_DAT */ ++ }; ++ ++ /* SMARC I2C_PM as GPIOs */ ++ pinctrl_i2c6_gpio: i2c6gpiogrp { ++ fsl,pins = , /* SMARC P121 - I2C_PM_CK */ ++ ; /* SMARC P122 - I2C_PM_DAT */ ++ }; ++ ++ pinctrl_lvds_dsi_sel: lvdsdsiselgrp { ++ fsl,pins = ; /* LVDS_DSI_SEL */ ++ }; ++ ++ pinctrl_mcu_int: mcuintgrp { ++ fsl,pins = ; /* MCU_INT# */ ++ }; ++ ++ /* SMARC LCD1_BKLT_PWM */ ++ pinctrl_lcd1_bklt_pwm1: pwm1grp { ++ fsl,pins = ; /* SMARC S122 - LCD1_BKLT_PWM */ ++ }; ++ ++ /* SMARC LCD0_BKLT_PWM */ ++ pinctrl_lcd0_bklt_pwm2: pwm2grp { ++ fsl,pins = ; /* SMARC S141 - LCD0_BKLT_PWM */ ++ }; ++ ++ /* PCAL6408 Interrupt */ ++ pinctrl_pcal6408: pcal6408intgrp { ++ fsl,pins = ; /* GPIO_EX_INT# */ ++ }; ++ ++ /* SMARC PCIE_A */ ++ pinctrl_pcie: pciegrp { ++ fsl,pins = , /* SMARC S146 - PCIE_WAKE# */ ++ ; /* SMARC P75 - PCIE_A_RST# */ ++ }; ++ ++ /* PMIC Interrupt */ ++ pinctrl_pmic: pmicintgrp { ++ fsl,pins = ; /* PMIC_INT# */ ++ }; ++ ++ /* SMARC I2S0 */ ++ pinctrl_sai1: sai1grp { ++ fsl,pins = , /* SMARC S42 - I2S0_CK */ ++ , /* SMARC S39 - I2S0_LRCLK */ ++ , /* SMARC S41 - I2S0_SDIN */ ++ ; /* SMARC S40 - I2S0_SDOUT */ ++ }; ++ ++ /* SMARC AUDIO_MCK */ ++ pinctrl_sai1_mclk: sai1mclkgrp { ++ fsl,pins = ; /* SMARC S38 - AUDIO_MCK */ ++ }; ++ ++ /* SMARC I2S2 */ ++ pinctrl_sai3: sai3grp { ++ fsl,pins = , /* SMARC S52 - I2S2_SDIN */ ++ , /* SMARC S53 - I2S2_CK */ ++ , /* SMARC S51 - I2S2_SDOUT */ ++ ; /* SMARC S50 - I2S2_LRCLK */ ++ }; ++ ++ /* SMARC SLEEP# */ ++ pinctrl_sleep: sleepgrp { ++ fsl,pins = ; /* SMARC S149 - SLEEP# */ ++ }; ++ ++ /* SMARC SMB_ALERT# */ ++ pinctrl_smb_alert: smbalertgrp { ++ fsl,pins = ; /* SMARC P1 - SMB_ALERT# */ ++ }; ++ ++ /* TPM_CS# */ ++ pinctrl_tpm_cs: tpmcsgrp { ++ fsl,pins = ; /* TPM_CS# */ ++ }; ++ ++ /* WIFI_BT_WKUP_HOST/TPM_INT# */ ++ pinctrl_tpm_irq_wifi_bt_wkup: tpmirq-wifibtwkupgrp { ++ fsl,pins = ; /* WIFI_BT_WKUP_HOST/TPM_INT# */ ++ }; ++ ++ /* SMARC SER0 */ ++ pinctrl_uart1: uart1grp { ++ fsl,pins = , /* SMARC P132 - SER2_CTS */ ++ , /* SMARC P131 - SER2_RTS */ ++ , /* SMARC P130 - SER2_RX */ ++ ; /* SMARC P139 - SER2_TX */ ++ }; ++ ++ /* SMARC SER2 */ ++ pinctrl_uart2: uart2grp { ++ fsl,pins = , /* SMARC P139 - SER2_CTS */ ++ , /* SMARC P138 - SER2_RTS */ ++ , /* SMARC P137 - SER2_RX */ ++ ; /* SMARC P136 - SER2_TX */ ++ }; ++ ++ /* SMARC SER3 */ ++ pinctrl_uart3: uart3grp { ++ fsl,pins = , /* SMARC P141 - SER3_RX */ ++ ; /* SMARC P140 - SER3_TX */ ++ }; ++ ++ /* SMARC SER1 */ ++ pinctrl_uart4: uart4grp { ++ fsl,pins = , /* SMARC P135 - SER1_RX */ ++ ; /* SMARC P134 - SER1_TX */ ++ }; ++ ++ /* SMARC USB0_OTG_ID */ ++ pinctrl_usb0_id: usb0idgrp { ++ fsl,pins = ; /* SMARC P64 - USB0_OTG_ID */ ++ }; ++ ++ /* SMARC USB0_EN_OC# */ ++ pinctrl_usb0_en_oc: usb0enocgrp { ++ fsl,pins = ; /* SMARC P62 - USB0_EN_OC# */ ++ }; ++ ++ /* On module USB Hub VBUS, or SMARC USB2_EN_OC# depending on assembling */ ++ pinctrl_usb1_en_oc: usb1enocgrp { ++ fsl,pins = ; /* SMARC P71 - USB2_EN_OC# */ ++ }; ++ ++ /* On-module Wi-Fi */ ++ pinctrl_usdhc1: usdhc1grp { ++ fsl,pins = , /* WiFi_SDIO_CLK */ ++ , /* WiFi_SDIO_CMD */ ++ , /* WiFi_SDIO_DATA0 */ ++ , /* WiFi_SDIO_DATA1 */ ++ , /* WiFi_SDIO_DATA2 */ ++ ; /* WiFi_SDIO_DATA3 */ ++ }; ++ ++ /* On-module Wi-Fi */ ++ pinctrl_usdhc1_100mhz: usdhc1-100mhzgrp { ++ fsl,pins = , /* WiFi_SDIO_CLK */ ++ , /* WiFi_SDIO_CMD */ ++ , /* WiFi_SDIO_DATA0 */ ++ , /* WiFi_SDIO_DATA1 */ ++ , /* WiFi_SDIO_DATA2 */ ++ ; /* WiFi_SDIO_DATA3 */ ++ }; ++ ++ /* On-module Wi-Fi */ ++ pinctrl_usdhc1_200mhz: usdhc1-200mhzgrp { ++ fsl,pins = , /* WiFi_SDIO_CLK */ ++ , /* WiFi_SDIO_CMD */ ++ , /* WiFi_SDIO_DATA0 */ ++ , /* WiFi_SDIO_DATA1 */ ++ , /* WiFi_SDIO_DATA2 */ ++ ; /* WiFi_SDIO_DATA3 */ ++ }; ++ ++ /* SMARC SDIO */ ++ pinctrl_usdhc2: usdhc2grp { ++ fsl,pins = , /* SMARC P36 - SDIO_CK */ ++ , /* SMARC P34 - SDIO_CMD */ ++ , /* SMARC P39 - SDIO_DO */ ++ , /* SMARC P40 - SDIO_D1 */ ++ , /* SMARC P41 - SDIO_D2 */ ++ ; /* SMARC P42 - SDIO_D3 */ ++ }; ++ ++ /* SMARC SDIO 100MHz */ ++ pinctrl_usdhc2_100mhz: usdhc2-100mhzgrp { ++ fsl,pins = , /* SMARC P36 - SDIO_CK */ ++ , /* SMARC P34 - SDIO_CMD */ ++ , /* SMARC P39 - SDIO_DO */ ++ , /* SMARC P40 - SDIO_D1 */ ++ , /* SMARC P41 - SDIO_D2 */ ++ ; /* SMARC P42 - SDIO_D3 */ ++ }; ++ ++ /* SMARC SDIO 200MHz */ ++ pinctrl_usdhc2_200mhz: usdhc2-200mhzgrp { ++ fsl,pins = , /* SMARC P36 - SDIO_CK */ ++ , /* SMARC P34 - SDIO_CMD */ ++ , /* SMARC P39 - SDIO_DO */ ++ , /* SMARC P40 - SDIO_D1 */ ++ , /* SMARC P41 - SDIO_D2 */ ++ ; /* SMARC P42 - SDIO_D3 */ ++ }; ++ ++ /* SMARC SDIO_CD# */ ++ pinctrl_usdhc2_cd: usdhc2cdgrp { ++ fsl,pins = ; /* SMARC P35 - SDIO_CD# */ ++ }; ++ ++ /* SMARC SDIO_CD# */ ++ pinctrl_usdhc2_cd_sleep: usdhc2cdslpgrp { ++ fsl,pins = ; /* SMARC P35 - SDIO_CD# */ ++ }; ++ ++ /* SMARC SDIO_PWR_EN */ ++ pinctrl_usdhc2_pwr_en: usdhc2pwrengrp { ++ fsl,pins = ; /* SMARC P37 - SDIO_PWR_EN */ ++ }; ++ ++ /* SMARC SDIO Sleep - Avoid backfeeding with removed card power */ ++ pinctrl_usdhc2_sleep: usdhc2slpgrp { ++ fsl,pins = , /* SMARC P36 - SDIO_CK */ ++ , /* SMARC P34 - SDIO_CMD */ ++ , /* SMARC P39 - SDIO_DO */ ++ , /* SMARC P39 - SDIO_D1 */ ++ , /* SMARC P39 - SDIO_D2 */ ++ ; /* SMARC P39 - SDIO_D3 */ ++ }; ++ ++ pinctrl_usdhc2_vsel: usdhc2vselgrp { ++ fsl,pins = ; /* PMIC_USDHC_VSELECT */ ++ }; ++ ++ /* SMARC SDIO_WP */ ++ pinctrl_usdhc2_wp: usdhc2wpgrp { ++ fsl,pins = ; /* SMARC P33 - SDIO_WP */ ++ }; ++ ++ /* On-module eMMC */ ++ pinctrl_usdhc3: usdhc3grp { ++ fsl,pins = , /* eMMC_STROBE */ ++ , /* eMMC_DATA5 */ ++ , /* eMMC_DATA6 */ ++ , /* eMMC_DATA7 */ ++ , /* eMMC_DATA0 */ ++ , /* eMMC_DATA1 */ ++ , /* eMMC_DATA2 */ ++ , /* eMMC_DATA3 */ ++ , /* eMMC_DATA4 */ ++ , /* eMMC_CLK */ ++ ; /* eMMC_CMD */ ++ }; ++ ++ /* On-module eMMC */ ++ pinctrl_usdhc3_100mhz: usdhc3-100mhzgrp { ++ fsl,pins = , /* eMMC_STROBE */ ++ , /* eMMC_DATA5 */ ++ , /* eMMC_DATA6 */ ++ , /* eMMC_DATA7 */ ++ , /* eMMC_DATA0 */ ++ , /* eMMC_DATA1 */ ++ , /* eMMC_DATA2 */ ++ , /* eMMC_DATA3 */ ++ , /* eMMC_DATA4 */ ++ , /* eMMC_CLK */ ++ ; /* eMMC_CMD */ ++ }; ++ ++ /* On-module eMMC */ ++ pinctrl_usdhc3_200mhz: usdhc3-200mhzgrp { ++ fsl,pins = , /* eMMC_STROBE */ ++ , /* eMMC_DATA5 */ ++ , /* eMMC_DATA6 */ ++ , /* eMMC_DATA7 */ ++ , /* eMMC_DATA0 */ ++ , /* eMMC_DATA1 */ ++ , /* eMMC_DATA2 */ ++ , /* eMMC_DATA3 */ ++ , /* eMMC_DATA4 */ ++ , /* eMMC_CLK */ ++ ; /* eMMC_CMD */ ++ }; ++ ++ /* On-module Wi-Fi power enable */ ++ pinctrl_wifi_pwr_en: wifipwrengrp { ++ fsl,pins = ; /* CTRL_EN_WIFI */ ++ }; ++ ++ /* SoC Watchdog */ ++ pinctrl_wdog: wdoggrp { ++ fsl,pins = ; /* CTRL_SOC_WDOG */ ++ }; ++}; diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0004-Kconfig.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0004-Kconfig.patch new file mode 100644 index 0000000..28e14cd --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0004-Kconfig.patch @@ -0,0 +1,23 @@ +--- /home/rossierd/edgemtech/products/edgem1/build/tmp/work/uboot-2024.07-r0/uboot-2024.07/arch/arm/mach-imx/imx8m/Kconfig 2025-11-21 14:56:51.328620960 +0100 ++++ ./arch/arm/mach-imx/imx8m/Kconfig 2025-11-21 14:54:55.153969190 +0100 +@@ -257,6 +257,12 @@ + select IMX8MQ + select IMX8M_LPDDR4 + ++config TARGET_TORADEX_SMARC_IMX8MP ++ bool "Support Toradex SMARC iMX8M Plus module" ++ select IMX8MP ++ select SUPPORT_SPL ++ select IMX8M_LPDDR4 ++ + config TARGET_VERDIN_IMX8MM + bool "Support Toradex Verdin iMX8M Mini module" + select IMX8MM +@@ -373,6 +379,7 @@ + source "board/ronetix/imx8mq-cm/Kconfig" + source "board/technexion/pico-imx8mq/Kconfig" + source "board/variscite/imx8mn_var_som/Kconfig" ++source "board/toradex/smarc-imx8mp/Kconfig" + source "board/toradex/verdin-imx8mm/Kconfig" + source "board/toradex/verdin-imx8mp/Kconfig" + diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0005-soc.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0005-soc.c.patch new file mode 100644 index 0000000..238e20a --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0005-soc.c.patch @@ -0,0 +1,10 @@ +--- /home/rossierd/edgemtech/products/edgem1/build/tmp/work/uboot-2024.07-r0/uboot-2024.07/arch/arm/mach-imx/imx8m/soc.c 2025-11-21 14:56:51.329079605 +0100 ++++ ./arch/arm/mach-imx/imx8m/soc.c 2025-11-21 14:54:55.153940138 +0100 +@@ -955,6 +955,7 @@ + "/soc@0/video-codec@38300000", + "/soc@0/video-codec@38310000", + "/soc@0/blk-ctrl@38330000", ++ "/soc@0/blk-ctl@38330000", + }; + + if (is_imx8mq()) diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0006-apalis_imx6.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0006-apalis_imx6.c.patch new file mode 100644 index 0000000..2ad47ac --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0006-apalis_imx6.c.patch @@ -0,0 +1,61 @@ +--- /home/rossierd/edgemtech/products/edgem1/build/tmp/work/uboot-2024.07-r0/uboot-2024.07/board/toradex/apalis_imx6/apalis_imx6.c 2025-11-21 14:56:51.517012477 +0100 ++++ ./board/toradex/apalis_imx6/apalis_imx6.c 2025-11-21 14:54:55.266029383 +0100 +@@ -36,6 +36,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -77,6 +78,8 @@ + + #define APALIS_IMX6_SATA_INIT_RETRIES 10 + ++#define I2C_PWR 1 ++ + int dram_init(void) + { + /* use the DDR controllers configured size */ +@@ -689,6 +692,32 @@ + return 0; + } + ++static bool is_som_variant_1_2(void) ++{ ++ struct udevice *bus; ++ struct udevice *i2c_dev; ++ int ret; ++ ++ ret = uclass_get_device_by_seq(UCLASS_I2C, I2C_PWR, &bus); ++ if (ret) { ++ printf("Failed to get I2C_PWR\n"); ++ return false; ++ } ++ ++ /* V1.2 uses the TLA2024 at 0x49 instead of the STMPE811 at 0x41 */ ++ ret = dm_i2c_probe(bus, 0x49, 0, &i2c_dev); ++ ++ return (bool)!ret; ++} ++ ++static void select_dt_from_module_version(void) ++{ ++ if (is_som_variant_1_2()) ++ env_set("variant", "-v1.2"); ++ else ++ env_set("variant", ""); ++} ++ + #ifdef CONFIG_BOARD_LATE_INIT + int board_late_init(void) + { +@@ -696,6 +725,8 @@ + char env_str[256]; + u32 rev; + ++ select_dt_from_module_version(); ++ + rev = get_board_revision(); + snprintf(env_str, ARRAY_SIZE(env_str), "%.4x", rev); + env_set("board_rev", env_str); diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0007-colibri_imx6.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0007-colibri_imx6.c.patch new file mode 100644 index 0000000..1f6b34d --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0007-colibri_imx6.c.patch @@ -0,0 +1,61 @@ +--- /home/rossierd/edgemtech/products/edgem1/build/tmp/work/uboot-2024.07-r0/uboot-2024.07/board/toradex/colibri_imx6/colibri_imx6.c 2025-11-21 14:56:51.517697200 +0100 ++++ ./board/toradex/colibri_imx6/colibri_imx6.c 2025-11-21 14:54:55.266404523 +0100 +@@ -33,6 +33,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -71,6 +72,8 @@ + + #define OUTPUT_RGB (PAD_CTL_SPEED_MED|PAD_CTL_DSE_60ohm|PAD_CTL_SRE_FAST) + ++#define I2C_PWR 1 ++ + int dram_init(void) + { + /* use the DDR controllers configured size */ +@@ -609,6 +612,32 @@ + return 0; + } + ++static bool is_som_variant_1_2(void) ++{ ++ struct udevice *bus; ++ struct udevice *i2c_dev; ++ int ret; ++ ++ ret = uclass_get_device_by_seq(UCLASS_I2C, I2C_PWR, &bus); ++ if (ret) { ++ printf("Failed to get I2C_PWR\n"); ++ return false; ++ } ++ ++ /* V1.2 uses the TLA2024 at 0x49 instead of the STMPE811 at 0x41 */ ++ ret = dm_i2c_probe(bus, 0x49, 0, &i2c_dev); ++ ++ return (bool)!ret; ++} ++ ++static void select_dt_from_module_version(void) ++{ ++ if (is_som_variant_1_2()) ++ env_set("variant", "-v1.2"); ++ else ++ env_set("variant", ""); ++} ++ + #ifdef CONFIG_BOARD_LATE_INIT + int board_late_init(void) + { +@@ -616,6 +645,8 @@ + char env_str[256]; + u32 rev; + ++ select_dt_from_module_version(); ++ + rev = get_board_revision(); + snprintf(env_str, ARRAY_SIZE(env_str), "%.4x", rev); + env_set("board_rev", env_str); diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0008-tdx-cfg-block.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0008-tdx-cfg-block.c.patch new file mode 100644 index 0000000..e650d34 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0008-tdx-cfg-block.c.patch @@ -0,0 +1,258 @@ +--- /home/rossierd/edgemtech/products/edgem1/build/tmp/work/uboot-2024.07-r0/uboot-2024.07/board/toradex/common/tdx-cfg-block.c 2025-11-21 14:56:51.518386446 +0100 ++++ ./board/toradex/common/tdx-cfg-block.c 2025-11-21 14:54:55.266886714 +0100 +@@ -70,94 +70,102 @@ + #define TARGET_IS_ENABLED(x) IS_ENABLED(CONFIG_TARGET_ ## x) + + const struct toradex_som toradex_modules[] = { +- [0] = { "UNKNOWN MODULE", 0 }, +- [1] = { "Colibri PXA270 312MHz", 0 }, +- [2] = { "Colibri PXA270 520MHz", 0 }, +- [3] = { "Colibri PXA320 806MHz", 0 }, +- [4] = { "Colibri PXA300 208MHz", 0 }, +- [5] = { "Colibri PXA310 624MHz", 0 }, +- [6] = { "Colibri PXA320IT 806MHz", 0 }, +- [7] = { "Colibri PXA300 208MHz XT", 0 }, +- [8] = { "Colibri PXA270 312MHz", 0 }, +- [9] = { "Colibri PXA270 520MHz", 0 }, +- [10] = { "Colibri VF50 128MB", TARGET_IS_ENABLED(COLIBRI_VF) }, +- [11] = { "Colibri VF61 256MB", TARGET_IS_ENABLED(COLIBRI_VF) }, +- [12] = { "Colibri VF61 256MB IT", TARGET_IS_ENABLED(COLIBRI_VF) }, +- [13] = { "Colibri VF50 128MB IT", TARGET_IS_ENABLED(COLIBRI_VF) }, +- [14] = { "Colibri iMX6S 256MB", TARGET_IS_ENABLED(COLIBRI_IMX6) }, +- [15] = { "Colibri iMX6DL 512MB", TARGET_IS_ENABLED(COLIBRI_IMX6) }, +- [16] = { "Colibri iMX6S 256MB IT", TARGET_IS_ENABLED(COLIBRI_IMX6) }, +- [17] = { "Colibri iMX6DL 512MB IT", TARGET_IS_ENABLED(COLIBRI_IMX6) }, +- [18] = { "UNKNOWN MODULE", 0 }, +- [19] = { "UNKNOWN MODULE", 0 }, +- [20] = { "Colibri T20 256MB", TARGET_IS_ENABLED(COLIBRI_T20) }, +- [21] = { "Colibri T20 512MB", TARGET_IS_ENABLED(COLIBRI_T20) }, +- [22] = { "Colibri T20 512MB IT", TARGET_IS_ENABLED(COLIBRI_T20) }, +- [23] = { "Colibri T30 1GB", TARGET_IS_ENABLED(COLIBRI_T30) }, +- [24] = { "Colibri T20 256MB IT", TARGET_IS_ENABLED(COLIBRI_T20) }, +- [25] = { "Apalis T30 2GB", TARGET_IS_ENABLED(APALIS_T30) }, +- [26] = { "Apalis T30 1GB", TARGET_IS_ENABLED(APALIS_T30) }, +- [27] = { "Apalis iMX6Q 1GB", TARGET_IS_ENABLED(APALIS_IMX6) }, +- [28] = { "Apalis iMX6Q 2GB IT", TARGET_IS_ENABLED(APALIS_IMX6) }, +- [29] = { "Apalis iMX6D 512MB", TARGET_IS_ENABLED(APALIS_IMX6) }, +- [30] = { "Colibri T30 1GB IT", TARGET_IS_ENABLED(COLIBRI_T30) }, +- [31] = { "Apalis T30 1GB IT", TARGET_IS_ENABLED(APALIS_T30) }, +- [32] = { "Colibri iMX7S 256MB", TARGET_IS_ENABLED(COLIBRI_IMX7) }, +- [33] = { "Colibri iMX7D 512MB", TARGET_IS_ENABLED(COLIBRI_IMX7) }, +- [34] = { "Apalis TK1 2GB", TARGET_IS_ENABLED(APALIS_TK1) }, +- [35] = { "Apalis iMX6D 1GB IT", TARGET_IS_ENABLED(APALIS_IMX6) }, +- [36] = { "Colibri iMX6ULL 256MB", TARGET_IS_ENABLED(COLIBRI_IMX6ULL) }, +- [37] = { "Apalis iMX8QM 4GB WB IT", TARGET_IS_ENABLED(APALIS_IMX8) }, +- [38] = { "Colibri iMX8QXP 2GB WB IT", TARGET_IS_ENABLED(COLIBRI_IMX8X) }, +- [39] = { "Colibri iMX7D 1GB", TARGET_IS_ENABLED(COLIBRI_IMX7) }, +- [40] = { "Colibri iMX6ULL 512MB WB IT", TARGET_IS_ENABLED(COLIBRI_IMX6ULL) }, +- [41] = { "Colibri iMX7D 512MB EPDC", TARGET_IS_ENABLED(COLIBRI_IMX7) }, +- [42] = { "Apalis TK1 4GB", TARGET_IS_ENABLED(APALIS_TK1) }, +- [43] = { "Colibri T20 512MB IT SETEK", TARGET_IS_ENABLED(COLIBRI_T20) }, +- [44] = { "Colibri iMX6ULL 512MB IT", TARGET_IS_ENABLED(COLIBRI_IMX6ULL) }, +- [45] = { "Colibri iMX6ULL 512MB WB", TARGET_IS_ENABLED(COLIBRI_IMX6ULL) }, +- [46] = { "Apalis iMX8QXP 2GB WB IT", 0 }, +- [47] = { "Apalis iMX8QM 4GB IT", TARGET_IS_ENABLED(APALIS_IMX8) }, +- [48] = { "Apalis iMX8QP 2GB WB", TARGET_IS_ENABLED(APALIS_IMX8) }, +- [49] = { "Apalis iMX8QP 2GB", TARGET_IS_ENABLED(APALIS_IMX8) }, +- [50] = { "Colibri iMX8QXP 2GB IT", TARGET_IS_ENABLED(COLIBRI_IMX8X) }, +- [51] = { "Colibri iMX8DX 1GB WB", TARGET_IS_ENABLED(COLIBRI_IMX8X) }, +- [52] = { "Colibri iMX8DX 1GB", TARGET_IS_ENABLED(COLIBRI_IMX8X) }, +- [53] = { "Apalis iMX8QXP 2GB ECC IT", 0 }, +- [54] = { "Apalis iMX8DXP 1GB", TARGET_IS_ENABLED(APALIS_IMX8) }, +- [55] = { "Verdin iMX8M Mini Quad 2GB WB IT", TARGET_IS_ENABLED(VERDIN_IMX8MM) }, +- [56] = { "Verdin iMX8M Nano Quad 1GB WB", 0 }, +- [57] = { "Verdin iMX8M Mini DualLite 1GB", TARGET_IS_ENABLED(VERDIN_IMX8MM) }, +- [58] = { "Verdin iMX8M Plus Quad 4GB WB IT", TARGET_IS_ENABLED(VERDIN_IMX8MP) }, +- [59] = { "Verdin iMX8M Mini Quad 2GB IT", TARGET_IS_ENABLED(VERDIN_IMX8MM) }, +- [60] = { "Verdin iMX8M Mini DualLite 1GB WB IT", TARGET_IS_ENABLED(VERDIN_IMX8MM) }, +- [61] = { "Verdin iMX8M Plus Quad 2GB", TARGET_IS_ENABLED(VERDIN_IMX8MP) }, +- [62] = { "Colibri iMX6ULL 1GB IT", TARGET_IS_ENABLED(COLIBRI_IMX6ULL) }, +- [63] = { "Verdin iMX8M Plus Quad 4GB IT", TARGET_IS_ENABLED(VERDIN_IMX8MP) }, +- [64] = { "Verdin iMX8M Plus Quad 2GB WB IT", TARGET_IS_ENABLED(VERDIN_IMX8MP) }, +- [65] = { "Verdin iMX8M Plus QuadLite 1GB IT", TARGET_IS_ENABLED(VERDIN_IMX8MP) }, +- [66] = { "Verdin iMX8M Plus Quad 8GB WB", TARGET_IS_ENABLED(VERDIN_IMX8MP) }, +- [67] = { "Apalis iMX8QM 8GB WB IT", TARGET_IS_ENABLED(APALIS_IMX8) }, +- [68] = { "Verdin iMX8M Mini Quad 2GB WB IT", TARGET_IS_ENABLED(VERDIN_IMX8MM) }, +- [69] = { "Verdin AM62 Quad 1GB WB IT", TARGET_IS_ENABLED(VERDIN_AM62_A53) }, +- [70] = { "Verdin iMX8M Plus Quad 8GB WB IT", TARGET_IS_ENABLED(VERDIN_IMX8MP) }, +- [71] = { "Verdin AM62 Solo 512MB", TARGET_IS_ENABLED(VERDIN_AM62_A53) }, +- [72] = { "Verdin AM62 Solo 512MB WB IT", TARGET_IS_ENABLED(VERDIN_AM62_A53) }, +- [73] = { "Verdin AM62 Dual 1GB ET", TARGET_IS_ENABLED(VERDIN_AM62_A53) }, +- [74] = { "Verdin AM62 Dual 1GB IT", TARGET_IS_ENABLED(VERDIN_AM62_A53) }, +- [75] = { "Verdin AM62 Dual 1GB WB IT", TARGET_IS_ENABLED(VERDIN_AM62_A53) }, +- [76] = { "Verdin AM62 Quad 2GB WB IT", TARGET_IS_ENABLED(VERDIN_AM62_A53) }, +- [77] = { "Colibri iMX6S 256MB", TARGET_IS_ENABLED(COLIBRI_IMX6) }, +- [78] = { "Colibri iMX6S 256MB IT", TARGET_IS_ENABLED(COLIBRI_IMX6) }, +- [79] = { "Colibri iMX6DL 512MB", TARGET_IS_ENABLED(COLIBRI_IMX6) }, +- [80] = { "Colibri iMX6DL 512MB IT", TARGET_IS_ENABLED(COLIBRI_IMX6) }, +- [81] = { "Colibri iMX7D 512MB", TARGET_IS_ENABLED(COLIBRI_IMX7) }, +- [82] = { "Apalis iMX6D 512MB", TARGET_IS_ENABLED(APALIS_IMX6) }, +- [83] = { "Apalis iMX6Q 1GB", TARGET_IS_ENABLED(APALIS_IMX6) }, +- [84] = { "Apalis iMX6D 1GB IT", TARGET_IS_ENABLED(APALIS_IMX6) }, +- [85] = { "Apalis iMX6Q 2GB IT", TARGET_IS_ENABLED(APALIS_IMX6) }, +- [86] = { "Verdin iMX8M Mini DualLite 2GB IT", TARGET_IS_ENABLED(VERDIN_IMX8MM) }, +- [87] = { "Verdin iMX8M Mini Quad 2GB IT", TARGET_IS_ENABLED(VERDIN_IMX8MM) }, ++ { 0, "UNKNOWN MODULE", 0 }, ++ { COLIBRI_PXA270_V1_312MHZ, "Colibri PXA270 312MHz", 0 }, ++ { COLIBRI_PXA270_V1_520MHZ, "Colibri PXA270 520MHz", 0 }, ++ { COLIBRI_PXA320, "Colibri PXA320 806MHz", 0 }, ++ { COLIBRI_PXA300, "Colibri PXA300 208MHz", 0 }, ++ { COLIBRI_PXA310, "Colibri PXA310 624MHz", 0 }, ++ { COLIBRI_PXA320_IT, "Colibri PXA320IT 806MHz", 0 }, ++ { COLIBRI_PXA300_XT, "Colibri PXA300 208MHz XT", 0 }, ++ { COLIBRI_PXA270_312MHZ, "Colibri PXA270 312MHz", 0 }, ++ { COLIBRI_PXA270_520MHZ, "Colibri PXA270 520MHz", 0 }, ++ { COLIBRI_VF50, "Colibri VF50 128MB", TARGET_IS_ENABLED(COLIBRI_VF) }, ++ { COLIBRI_VF61, "Colibri VF61 256MB", TARGET_IS_ENABLED(COLIBRI_VF) }, ++ { COLIBRI_VF61_IT, "Colibri VF61 256MB IT", TARGET_IS_ENABLED(COLIBRI_VF) }, ++ { COLIBRI_VF50_IT, "Colibri VF50 128MB IT", TARGET_IS_ENABLED(COLIBRI_VF) }, ++ { COLIBRI_IMX6S, "Colibri iMX6S 256MB", TARGET_IS_ENABLED(COLIBRI_IMX6) }, ++ { COLIBRI_IMX6DL, "Colibri iMX6DL 512MB", TARGET_IS_ENABLED(COLIBRI_IMX6) }, ++ { COLIBRI_IMX6S_IT, "Colibri iMX6S 256MB IT", TARGET_IS_ENABLED(COLIBRI_IMX6) }, ++ { COLIBRI_IMX6DL_IT, "Colibri iMX6DL 512MB IT", TARGET_IS_ENABLED(COLIBRI_IMX6) }, ++ { COLIBRI_T20_256MB, "Colibri T20 256MB", TARGET_IS_ENABLED(COLIBRI_T20) }, ++ { COLIBRI_T20_512MB, "Colibri T20 512MB", TARGET_IS_ENABLED(COLIBRI_T20) }, ++ { COLIBRI_T20_512MB_IT, "Colibri T20 512MB IT", TARGET_IS_ENABLED(COLIBRI_T20) }, ++ { COLIBRI_T30, "Colibri T30 1GB", TARGET_IS_ENABLED(COLIBRI_T30) }, ++ { COLIBRI_T20_256MB_IT, "Colibri T20 256MB IT", TARGET_IS_ENABLED(COLIBRI_T20) }, ++ { APALIS_T30_2GB, "Apalis T30 2GB", TARGET_IS_ENABLED(APALIS_T30) }, ++ { APALIS_T30_1GB, "Apalis T30 1GB", TARGET_IS_ENABLED(APALIS_T30) }, ++ { APALIS_IMX6Q, "Apalis iMX6Q 1GB", TARGET_IS_ENABLED(APALIS_IMX6) }, ++ { APALIS_IMX6Q_IT, "Apalis iMX6Q 2GB IT", TARGET_IS_ENABLED(APALIS_IMX6) }, ++ { APALIS_IMX6D, "Apalis iMX6D 512MB", TARGET_IS_ENABLED(APALIS_IMX6) }, ++ { COLIBRI_T30_IT, "Colibri T30 1GB IT", TARGET_IS_ENABLED(COLIBRI_T30) }, ++ { APALIS_T30_IT, "Apalis T30 1GB IT", TARGET_IS_ENABLED(APALIS_T30) }, ++ { COLIBRI_IMX7S, "Colibri iMX7S 256MB", TARGET_IS_ENABLED(COLIBRI_IMX7) }, ++ { COLIBRI_IMX7D, "Colibri iMX7D 512MB", TARGET_IS_ENABLED(COLIBRI_IMX7) }, ++ { APALIS_TK1_2GB, "Apalis TK1 2GB", TARGET_IS_ENABLED(APALIS_TK1) }, ++ { APALIS_IMX6D_IT, "Apalis iMX6D 1GB IT", TARGET_IS_ENABLED(APALIS_IMX6) }, ++ { COLIBRI_IMX6ULL, "Colibri iMX6ULL 256MB", TARGET_IS_ENABLED(COLIBRI_IMX6ULL) }, ++ { APALIS_IMX8QM_WIFI_BT_IT, "Apalis iMX8QM 4GB WB IT", TARGET_IS_ENABLED(APALIS_IMX8) }, ++ { COLIBRI_IMX8QXP_WIFI_BT_IT, "Colibri iMX8QXP 2GB WB IT", TARGET_IS_ENABLED(COLIBRI_IMX8X) }, ++ { COLIBRI_IMX7D_EMMC, "Colibri iMX7D 1GB", TARGET_IS_ENABLED(COLIBRI_IMX7) }, ++ { COLIBRI_IMX6ULL_WIFI_BT_IT, "Colibri iMX6ULL 512MB WB IT", TARGET_IS_ENABLED(COLIBRI_IMX6ULL) }, ++ { COLIBRI_IMX7D_EPDC, "Colibri iMX7D 512MB EPDC", TARGET_IS_ENABLED(COLIBRI_IMX7) }, ++ { APALIS_TK1_4GB, "Apalis TK1 4GB", TARGET_IS_ENABLED(APALIS_TK1) }, ++ { COLIBRI_T20_512MB_IT_SETEK, "Colibri T20 512MB IT SETEK", TARGET_IS_ENABLED(COLIBRI_T20) }, ++ { COLIBRI_IMX6ULL_IT, "Colibri iMX6ULL 512MB IT", TARGET_IS_ENABLED(COLIBRI_IMX6ULL) }, ++ { COLIBRI_IMX6ULL_WIFI_BT, "Colibri iMX6ULL 512MB WB", TARGET_IS_ENABLED(COLIBRI_IMX6ULL) }, ++ { APALIS_IMX8QXP_WIFI_BT_IT, "Apalis iMX8QXP 2GB WB IT", 0 }, ++ { APALIS_IMX8QM_IT, "Apalis iMX8QM 4GB IT", TARGET_IS_ENABLED(APALIS_IMX8) }, ++ { APALIS_IMX8QP_WIFI_BT, "Apalis iMX8QP 2GB WB", TARGET_IS_ENABLED(APALIS_IMX8) }, ++ { APALIS_IMX8QP, "Apalis iMX8QP 2GB", TARGET_IS_ENABLED(APALIS_IMX8) }, ++ { COLIBRI_IMX8QXP_IT, "Colibri iMX8QXP 2GB IT", TARGET_IS_ENABLED(COLIBRI_IMX8X) }, ++ { COLIBRI_IMX8DX_WIFI_BT, "Colibri iMX8DX 1GB WB", TARGET_IS_ENABLED(COLIBRI_IMX8X) }, ++ { COLIBRI_IMX8DX, "Colibri iMX8DX 1GB", TARGET_IS_ENABLED(COLIBRI_IMX8X) }, ++ { APALIS_IMX8QXP, "Apalis iMX8QXP 2GB ECC IT", 0 }, ++ { APALIS_IMX8DXP, "Apalis iMX8DXP 1GB", TARGET_IS_ENABLED(APALIS_IMX8) }, ++ { VERDIN_IMX8MMQ_WIFI_BT_IT, "Verdin iMX8M Mini Quad 2GB WB IT", TARGET_IS_ENABLED(VERDIN_IMX8MM) }, ++ { VERDIN_IMX8MNQ_WIFI_BT, "Verdin iMX8M Nano Quad 1GB WB", 0 }, ++ { VERDIN_IMX8MMDL, "Verdin iMX8M Mini DualLite 1GB", TARGET_IS_ENABLED(VERDIN_IMX8MM) }, ++ { VERDIN_IMX8MPQ_WIFI_BT_IT, "Verdin iMX8M Plus Quad 4GB WB IT", TARGET_IS_ENABLED(VERDIN_IMX8MP) }, ++ { VERDIN_IMX8MMQ_IT, "Verdin iMX8M Mini Quad 2GB IT", TARGET_IS_ENABLED(VERDIN_IMX8MM) }, ++ { VERDIN_IMX8MMDL_WIFI_BT_IT, "Verdin iMX8M Mini DualLite 1GB WB IT", TARGET_IS_ENABLED(VERDIN_IMX8MM) }, ++ { VERDIN_IMX8MPQ, "Verdin iMX8M Plus Quad 2GB", TARGET_IS_ENABLED(VERDIN_IMX8MP) }, ++ { COLIBRI_IMX6ULL_IT_EMMC, "Colibri iMX6ULL 1GB IT", TARGET_IS_ENABLED(COLIBRI_IMX6ULL) }, ++ { VERDIN_IMX8MPQ_IT, "Verdin iMX8M Plus Quad 4GB IT", TARGET_IS_ENABLED(VERDIN_IMX8MP) }, ++ { VERDIN_IMX8MPQ_2GB_WIFI_BT_IT, "Verdin iMX8M Plus Quad 2GB WB IT", TARGET_IS_ENABLED(VERDIN_IMX8MP) }, ++ { VERDIN_IMX8MPQL_IT, "Verdin iMX8M Plus QuadLite 1GB IT", TARGET_IS_ENABLED(VERDIN_IMX8MP) }, ++ { VERDIN_IMX8MPQ_8GB_WIFI_BT, "Verdin iMX8M Plus Quad 8GB WB", TARGET_IS_ENABLED(VERDIN_IMX8MP) }, ++ { APALIS_IMX8QM_8GB_WIFI_BT_IT, "Apalis iMX8QM 8GB WB IT", TARGET_IS_ENABLED(APALIS_IMX8) }, ++ { VERDIN_IMX8MMQ_WIFI_BT_IT_NO_CAN, "Verdin iMX8M Mini Quad 2GB WB IT", TARGET_IS_ENABLED(VERDIN_IMX8MM) }, ++ { VERDIN_AM62Q_WIFI_BT_IT, "Verdin AM62 Quad 1GB WB IT", TARGET_IS_ENABLED(VERDIN_AM62_A53) }, ++ { VERDIN_IMX8MPQ_8GB_WIFI_BT_IT, "Verdin iMX8M Plus Quad 8GB WB IT", TARGET_IS_ENABLED(VERDIN_IMX8MP) }, ++ { VERDIN_AM62S_512MB, "Verdin AM62 Solo 512MB", TARGET_IS_ENABLED(VERDIN_AM62_A53) }, ++ { VERDIN_AM62S_512MB_WIFI_BT_IT, "Verdin AM62 Solo 512MB WB IT", TARGET_IS_ENABLED(VERDIN_AM62_A53) }, ++ { VERDIN_AM62D_1G_ET, "Verdin AM62 Dual 1GB ET", TARGET_IS_ENABLED(VERDIN_AM62_A53) }, ++ { VERDIN_AM62D_1G_IT, "Verdin AM62 Dual 1GB IT", TARGET_IS_ENABLED(VERDIN_AM62_A53) }, ++ { VERDIN_AM62D_1G_WIFI_BT_IT, "Verdin AM62 Dual 1GB WB IT", TARGET_IS_ENABLED(VERDIN_AM62_A53) }, ++ { VERDIN_AM62Q_2G_WIFI_BT_IT, "Verdin AM62 Quad 2GB WB IT", TARGET_IS_ENABLED(VERDIN_AM62_A53) }, ++ { COLIBRI_IMX6S_NOWINCE, "Colibri iMX6S 256MB", TARGET_IS_ENABLED(COLIBRI_IMX6) }, ++ { COLIBRI_IMX6S_IT_NOWINCE, "Colibri iMX6S 256MB IT", TARGET_IS_ENABLED(COLIBRI_IMX6) }, ++ { COLIBRI_IMX6DL_NOWINCE, "Colibri iMX6DL 512MB", TARGET_IS_ENABLED(COLIBRI_IMX6) }, ++ { COLIBRI_IMX6DL_IT_NOWINCE, "Colibri iMX6DL 512MB IT", TARGET_IS_ENABLED(COLIBRI_IMX6) }, ++ { COLIBRI_IMX7D_NOWINCE, "Colibri iMX7D 512MB", TARGET_IS_ENABLED(COLIBRI_IMX7) }, ++ { APALIS_IMX6D_NOWINCE, "Apalis iMX6D 512MB", TARGET_IS_ENABLED(APALIS_IMX6) }, ++ { APALIS_IMX6Q_NOWINCE, "Apalis iMX6Q 1GB", TARGET_IS_ENABLED(APALIS_IMX6) }, ++ { APALIS_IMX6D_IT_NOWINCE, "Apalis iMX6D 1GB IT", TARGET_IS_ENABLED(APALIS_IMX6) }, ++ { APALIS_IMX6Q_IT_NOWINCE, "Apalis iMX6Q 2GB IT", TARGET_IS_ENABLED(APALIS_IMX6) }, ++ { VERDIN_IMX8MMDL_2G_IT, "Verdin iMX8M Mini DualLite 2GB IT", TARGET_IS_ENABLED(VERDIN_IMX8MM) }, ++ { VERDIN_IMX8MMQ_2G_IT_NO_CAN, "Verdin iMX8M Mini Quad 2GB IT", TARGET_IS_ENABLED(VERDIN_IMX8MM) }, ++ { AQUILA_AM69O_32G_WIFI_BT_IT, "Aquila AM69 Octa 32GB WB IT", TARGET_IS_ENABLED(AQUILA_AM69_A72) }, ++ { VERDIN_IMX95H_16G_WIFI_BT_IT, "Verdin iMX95 Hexa 16GB WB IT", TARGET_IS_ENABLED(VERDIN_IMX95) }, ++ { VERDIN_IMX8MMQ_4G_WIFI_BT_ET, "Verdin iMX8M Mini Quad 4GB WB ET", TARGET_IS_ENABLED(VERDIN_IMX8MM) }, ++ { APALIS_IMX8QM_WIFI_BT_IT_1300MHZ, "Apalis iMX8QM 4GB WB IT", TARGET_IS_ENABLED(APALIS_IMX8) }, ++ { APALIS_IMX8QM_IT_1300MHZ, "Apalis iMX8QM 4GB IT", TARGET_IS_ENABLED(APALIS_IMX8) }, ++ { APALIS_IMX8QP_WIFI_BT_1300MHZ, "Apalis iMX8QP 2GB WB", TARGET_IS_ENABLED(APALIS_IMX8) }, ++ { APALIS_IMX8QP_1300MHZ, "Apalis iMX8QP 2GB", TARGET_IS_ENABLED(APALIS_IMX8) }, ++ { APALIS_IMX8QM_8GB_WIFI_BT_IT_1300MHZ, "Apalis iMX8QM 8GB WB IT", TARGET_IS_ENABLED(APALIS_IMX8) }, ++ { SMARC_IMX95_HEXA_8GB_WB_IT, "SMARC iMX95 Hexa 8GB WB IT", 0 }, ++ { SMARC_IMX8MPQ_4GB_WB_IT, "SMARC iMX8M Plus Quad 4GB WB IT", TARGET_IS_ENABLED(TORADEX_SMARC_IMX8MP) }, + }; + + struct pid4list { +@@ -185,6 +193,20 @@ + [1] = 0x8c06cbUL, + }; + ++int get_toradex_modules_idx(int pid4) ++{ ++ int i, index = 0; ++ ++ for (i = 1; i < ARRAY_SIZE(toradex_modules); i++) { ++ if (pid4 == toradex_modules[i].pid4) { ++ index = i; ++ break; ++ } ++ } ++ ++ return index; ++} ++ + const char * const get_toradex_carrier_boards(int pid4) + { + int i, index = 0; +@@ -358,7 +380,7 @@ + + int read_tdx_cfg_block(void) + { +- int ret = 0; ++ int idx, ret = 0; + u8 *config_block = NULL; + struct toradex_tag *tag; + size_t size = TDX_CFG_BLOCK_MAX_SIZE; +@@ -427,7 +449,8 @@ + } + + /* Cap product id to avoid issues with a yet unknown one */ +- if (tdx_hw_tag.prodid >= ARRAY_SIZE(toradex_modules)) ++ idx = get_toradex_modules_idx(tdx_hw_tag.prodid); ++ if (!toradex_modules[idx].pid4) + tdx_hw_tag.prodid = 0; + + out: +@@ -453,19 +476,21 @@ + int len = 0; + int ret = 0; + unsigned int prodid; +- int i; ++ int i, idx; + + printf("Enabled modules:\n"); + for (i = 0; i < ARRAY_SIZE(toradex_modules); i++) { + if (toradex_modules[i].is_enabled) +- printf(" %04d %s\n", i, toradex_modules[i].name); ++ printf(" %04d %s\n", toradex_modules[i].pid4, ++ toradex_modules[i].name); + } + + sprintf(message, "Enter the module ID: "); + len = cli_readline(message); + + prodid = dectoul(console_buffer, NULL); +- if (prodid >= ARRAY_SIZE(toradex_modules) || !toradex_modules[prodid].is_enabled) { ++ idx = get_toradex_modules_idx(prodid); ++ if (!toradex_modules[idx].pid4 || !toradex_modules[idx].is_enabled) { + printf("Parsing module id failed\n"); + return -1; + } diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0009-tdx-cfg-block.h.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0009-tdx-cfg-block.h.patch new file mode 100644 index 0000000..5f4ae06 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0009-tdx-cfg-block.h.patch @@ -0,0 +1,35 @@ +--- /home/rossierd/edgemtech/products/edgem1/build/tmp/work/uboot-2024.07-r0/uboot-2024.07/board/toradex/common/tdx-cfg-block.h 2025-11-21 14:56:51.518386446 +0100 ++++ ./board/toradex/common/tdx-cfg-block.h 2025-11-21 14:54:55.266914032 +0100 +@@ -21,6 +21,7 @@ + } __attribute__((__packed__)); + + struct toradex_som { ++ int pid4; + const char *name; + int is_enabled; + }; +@@ -113,6 +114,16 @@ + APALIS_IMX6Q_IT_NOWINCE, /* 85 */ + VERDIN_IMX8MMDL_2G_IT, + VERDIN_IMX8MMQ_2G_IT_NO_CAN, ++ AQUILA_AM69O_32G_WIFI_BT_IT, ++ VERDIN_IMX95H_16G_WIFI_BT_IT, ++ VERDIN_IMX8MMQ_4G_WIFI_BT_ET, /* 90 */ ++ APALIS_IMX8QM_WIFI_BT_IT_1300MHZ, ++ APALIS_IMX8QM_IT_1300MHZ, ++ APALIS_IMX8QP_WIFI_BT_1300MHZ, ++ APALIS_IMX8QP_1300MHZ, ++ APALIS_IMX8QM_8GB_WIFI_BT_IT_1300MHZ, /* 95 */ ++ SMARC_IMX95_HEXA_8GB_WB_IT, ++ SMARC_IMX8MPQ_4GB_WB_IT, + }; + + enum { +@@ -136,6 +147,7 @@ + + int read_tdx_cfg_block(void); + int read_tdx_cfg_block_carrier(void); ++int get_toradex_modules_idx(int pid4); + const char * const get_toradex_carrier_boards(int pid4); + const char * const get_toradex_display_adapters(int pid4); + int try_migrate_tdx_cfg_block_carrier(void); diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0010-tdx-common.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0010-tdx-common.c.patch new file mode 100644 index 0000000..afb0e19 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0010-tdx-common.c.patch @@ -0,0 +1,20 @@ +--- /home/rossierd/edgemtech/products/edgem1/build/tmp/work/uboot-2024.07-r0/uboot-2024.07/board/toradex/common/tdx-common.c 2025-11-21 14:56:51.518386446 +0100 ++++ ./board/toradex/common/tdx-common.c 2025-11-21 14:54:55.266838468 +0100 +@@ -191,13 +191,16 @@ + static int tdx_get_str(struct udevice *dev, int id, size_t size, char *val) + { + int ret = -ENOTSUPP; ++ int idx; + + switch (id) { + case SYSINFO_ID_BOARD_MODEL: ++ idx = get_toradex_modules_idx(tdx_hw_tag.prodid); ++ + snprintf(val, size, + "Toradex %04d %s %s", + tdx_hw_tag.prodid, +- toradex_modules[tdx_hw_tag.prodid].name, ++ toradex_modules[idx].name, + tdx_board_rev_str); + + ret = 0; diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0011-imximage.cfg.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0011-imximage.cfg.patch new file mode 100644 index 0000000..f655fd3 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0011-imximage.cfg.patch @@ -0,0 +1,9 @@ +--- /home/rossierd/edgemtech/products/edgem1/build/tmp/work/uboot-2024.07-r0/uboot-2024.07/board/toradex/smarc-imx8mp/imximage.cfg 1970-01-01 01:00:00.000000000 +0100 ++++ ./board/toradex/smarc-imx8mp/imximage.cfg 2025-11-21 14:54:55.267341960 +0100 +@@ -0,0 +1,6 @@ ++/* SPDX-License-Identifier: GPL-2.0-or-later */ ++/* Copyright (C) 2024 Toradex */ ++ ++ROM_VERSION v2 ++BOOT_FROM emmc_fastboot ++LOADER u-boot-spl-ddr.bin 0x920000 diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0012-Kconfig.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0012-Kconfig.patch new file mode 100644 index 0000000..8378e73 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0012-Kconfig.patch @@ -0,0 +1,42 @@ +--- /home/rossierd/edgemtech/products/edgem1/build/tmp/work/uboot-2024.07-r0/uboot-2024.07/board/toradex/smarc-imx8mp/Kconfig 1970-01-01 01:00:00.000000000 +0100 ++++ ./board/toradex/smarc-imx8mp/Kconfig 2025-11-21 14:54:55.267305134 +0100 +@@ -0,0 +1,39 @@ ++if TARGET_TORADEX_SMARC_IMX8MP ++ ++config IMX_CONFIG ++ default "board/toradex/smarc-imx8mp/imximage.cfg" ++ ++config SYS_BOARD ++ default "smarc-imx8mp" ++ ++config SYS_CONFIG_NAME ++ default "toradex-smarc-imx8mp" ++ ++config SYS_VENDOR ++ default "toradex" ++ ++config TDX_CFG_BLOCK ++ default y ++ ++config TDX_CFG_BLOCK_2ND_ETHADDR ++ default y ++ ++config TDX_CFG_BLOCK_DEV ++ default "0" ++ ++# Toradex config block in eMMC, at the end of 1st "boot sector" ++config TDX_CFG_BLOCK_OFFSET ++ default "-512" ++ ++config TDX_CFG_BLOCK_PART ++ default "1" ++ ++config TDX_HAVE_EEPROM_EXTRA ++ default y ++ ++config TDX_HAVE_MMC ++ default y ++ ++source "board/toradex/common/Kconfig" ++ ++endif diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0013-lpddr4_timing.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0013-lpddr4_timing.c.patch new file mode 100644 index 0000000..d6c4376 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0013-lpddr4_timing.c.patch @@ -0,0 +1,1906 @@ +--- /home/rossierd/edgemtech/products/edgem1/build/tmp/work/uboot-2024.07-r0/uboot-2024.07/board/toradex/smarc-imx8mp/lpddr4_timing.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./board/toradex/smarc-imx8mp/lpddr4_timing.c 2025-11-21 14:54:55.267354512 +0100 +@@ -0,0 +1,1903 @@ ++// SPDX-License-Identifier: GPL-2.0-or-later ++/* Copyright (C) 2024 Toradex */ ++ ++#include ++#include ++ ++#include "lpddr4_timing.h" ++ ++struct dram_cfg_param ddr_ddrc_cfg_single_rank_patch[] = { ++ { 0x3d400000, 0xa1080020}, ++ { 0x3d400200, 0x1f}, ++ { 0x3d40021c, 0xf07} ++}; ++ ++struct dram_cfg_param ddr_fsp0_cfg_single_rank_patch[] = { ++ { 0x54012, 0x110}, ++ { 0x5402c, 0x1} ++}; ++ ++struct dram_cfg_param ddr_fsp1_cfg_single_rank_patch[] = { ++ { 0x54012, 0x110}, ++ { 0x5402c, 0x1} ++}; ++ ++struct dram_cfg_param ddr_fsp2_cfg_single_rank_patch[] = { ++ { 0x54012, 0x110}, ++ { 0x5402c, 0x1} ++}; ++ ++struct dram_cfg_param ddr_fsp0_2d_cfg_single_rank_patch[] = { ++ { 0x54012, 0x110}, ++ { 0x5402c, 0x1} ++}; ++ ++struct dram_cfg_param ddr_ddrc_cfg[] = { ++ /** Initialize DDRC registers **/ ++ { 0x3d400304, 0x1 }, ++ { 0x3d400030, 0x1 }, ++ { 0x3d400000, 0xa3080020 }, ++ { 0x3d400020, 0x1303 }, ++ { 0x3d400024, 0x1e84800 }, ++ { 0x3d400064, 0x7a017c }, ++ { 0x3d400070, 0x7027f90 }, ++ { 0x3d400074, 0x790 }, ++ { 0x3d4000d0, 0xc00307a3 }, ++ { 0x3d4000d4, 0xc50000 }, ++ { 0x3d4000dc, 0xf4003f }, ++ { 0x3d4000e0, 0x330000 }, ++ { 0x3d4000e8, 0x660048 }, ++ { 0x3d4000ec, 0x160048 }, ++ { 0x3d400100, 0x2028222a }, ++ { 0x3d400104, 0x8083f }, ++ { 0x3d40010c, 0xe0e000 }, ++ { 0x3d400110, 0x12040a12 }, ++ { 0x3d400114, 0x2050f0f }, ++ { 0x3d400118, 0x1010009 }, ++ { 0x3d40011c, 0x502 }, ++ { 0x3d400130, 0x20800 }, ++ { 0x3d400134, 0xe100002 }, ++ { 0x3d400138, 0x184 }, ++ { 0x3d400144, 0xc80064 }, ++ { 0x3d400180, 0x3e8001e }, ++ { 0x3d400184, 0x3207a12 }, ++ { 0x3d400188, 0x0 }, ++ { 0x3d400190, 0x49f820e }, ++ { 0x3d400194, 0x80303 }, ++ { 0x3d4001b4, 0x1f0e }, ++ { 0x3d4001a0, 0xe0400018 }, ++ { 0x3d4001a4, 0xdf00e4 }, ++ { 0x3d4001a8, 0x80000000 }, ++ { 0x3d4001b0, 0x11 }, ++ { 0x3d4001c0, 0x1 }, ++ { 0x3d4001c4, 0x1 }, ++ { 0x3d4000f4, 0x799 }, ++ { 0x3d400108, 0x9121b1c }, ++ { 0x3d400200, 0x17 }, ++ { 0x3d400208, 0x0 }, ++ { 0x3d40020c, 0x0 }, ++ { 0x3d400210, 0x1f1f }, ++ { 0x3d400204, 0x80808 }, ++ { 0x3d400214, 0x7070707 }, ++ { 0x3d400218, 0x7070707 }, ++ { 0x3d40021c, 0xf08 }, ++ { 0x3d400250, 0x1705 }, ++ { 0x3d400254, 0x2c }, ++ { 0x3d40025c, 0x4000030 }, ++ { 0x3d400264, 0x900093e7 }, ++ { 0x3d40026c, 0x2005574 }, ++ { 0x3d400400, 0x111 }, ++ { 0x3d400404, 0x72ff }, ++ { 0x3d400408, 0x72ff }, ++ { 0x3d400494, 0x2100e07 }, ++ { 0x3d400498, 0x620096 }, ++ { 0x3d40049c, 0x1100e07 }, ++ { 0x3d4004a0, 0xc8012c }, ++ { 0x3d402020, 0x1001 }, ++ { 0x3d402024, 0x30d400 }, ++ { 0x3d402050, 0x20d000 }, ++ { 0x3d402064, 0xc0026 }, ++ { 0x3d4020dc, 0x840000 }, ++ { 0x3d4020e0, 0x330000 }, ++ { 0x3d4020e8, 0x660048 }, ++ { 0x3d4020ec, 0x160048 }, ++ { 0x3d402100, 0xa040305 }, ++ { 0x3d402104, 0x30407 }, ++ { 0x3d402108, 0x203060b }, ++ { 0x3d40210c, 0x505000 }, ++ { 0x3d402110, 0x2040202 }, ++ { 0x3d402114, 0x2030202 }, ++ { 0x3d402118, 0x1010004 }, ++ { 0x3d40211c, 0x302 }, ++ { 0x3d402130, 0x20300 }, ++ { 0x3d402134, 0xa100002 }, ++ { 0x3d402138, 0x27 }, ++ { 0x3d402144, 0x14000a }, ++ { 0x3d402180, 0x640004 }, ++ { 0x3d402190, 0x3818200 }, ++ { 0x3d402194, 0x80303 }, ++ { 0x3d4021b4, 0x100 }, ++ { 0x3d4020f4, 0x599 }, ++ { 0x3d403020, 0x1001 }, ++ { 0x3d403024, 0xc3500 }, ++ { 0x3d403050, 0x20d000 }, ++ { 0x3d403064, 0x3000a }, ++ { 0x3d4030dc, 0x840000 }, ++ { 0x3d4030e0, 0x330000 }, ++ { 0x3d4030e8, 0x660048 }, ++ { 0x3d4030ec, 0x160048 }, ++ { 0x3d403100, 0xa010102 }, ++ { 0x3d403104, 0x30404 }, ++ { 0x3d403108, 0x203060b }, ++ { 0x3d40310c, 0x505000 }, ++ { 0x3d403110, 0x2040202 }, ++ { 0x3d403114, 0x2030202 }, ++ { 0x3d403118, 0x1010004 }, ++ { 0x3d40311c, 0x302 }, ++ { 0x3d403130, 0x20300 }, ++ { 0x3d403134, 0xa100002 }, ++ { 0x3d403138, 0xa }, ++ { 0x3d403144, 0x50003 }, ++ { 0x3d403180, 0x190004 }, ++ { 0x3d403190, 0x3818200 }, ++ { 0x3d403194, 0x80303 }, ++ { 0x3d4031b4, 0x100 }, ++ { 0x3d4030f4, 0x599 }, ++ { 0x3d400028, 0x0 }, ++}; ++ ++/* PHY Initialize Configuration */ ++struct dram_cfg_param ddr_ddrphy_cfg[] = { ++ { 0x100a0, 0x1 }, ++ { 0x100a1, 0x6 }, ++ { 0x100a2, 0x4 }, ++ { 0x100a3, 0x3 }, ++ { 0x100a4, 0x2 }, ++ { 0x100a5, 0x7 }, ++ { 0x100a6, 0x5 }, ++ { 0x100a7, 0x0 }, ++ { 0x110a0, 0x0 }, ++ { 0x110a1, 0x1 }, ++ { 0x110a2, 0x3 }, ++ { 0x110a3, 0x4 }, ++ { 0x110a4, 0x5 }, ++ { 0x110a5, 0x2 }, ++ { 0x110a6, 0x6 }, ++ { 0x110a7, 0x7 }, ++ { 0x120a0, 0x0 }, ++ { 0x120a1, 0x1 }, ++ { 0x120a2, 0x3 }, ++ { 0x120a3, 0x2 }, ++ { 0x120a4, 0x5 }, ++ { 0x120a5, 0x4 }, ++ { 0x120a6, 0x6 }, ++ { 0x120a7, 0x7 }, ++ { 0x130a0, 0x0 }, ++ { 0x130a1, 0x1 }, ++ { 0x130a2, 0x4 }, ++ { 0x130a3, 0x3 }, ++ { 0x130a4, 0x2 }, ++ { 0x130a5, 0x6 }, ++ { 0x130a6, 0x5 }, ++ { 0x130a7, 0x7 }, ++ { 0x1005f, 0x1ff }, ++ { 0x1015f, 0x1ff }, ++ { 0x1105f, 0x1ff }, ++ { 0x1115f, 0x1ff }, ++ { 0x1205f, 0x1ff }, ++ { 0x1215f, 0x1ff }, ++ { 0x1305f, 0x1ff }, ++ { 0x1315f, 0x1ff }, ++ { 0x11005f, 0x1ff }, ++ { 0x11015f, 0x1ff }, ++ { 0x11105f, 0x1ff }, ++ { 0x11115f, 0x1ff }, ++ { 0x11205f, 0x1ff }, ++ { 0x11215f, 0x1ff }, ++ { 0x11305f, 0x1ff }, ++ { 0x11315f, 0x1ff }, ++ { 0x21005f, 0x1ff }, ++ { 0x21015f, 0x1ff }, ++ { 0x21105f, 0x1ff }, ++ { 0x21115f, 0x1ff }, ++ { 0x21205f, 0x1ff }, ++ { 0x21215f, 0x1ff }, ++ { 0x21305f, 0x1ff }, ++ { 0x21315f, 0x1ff }, ++ { 0x55, 0x1ff }, ++ { 0x1055, 0x1ff }, ++ { 0x2055, 0x1ff }, ++ { 0x3055, 0x1ff }, ++ { 0x4055, 0x1ff }, ++ { 0x5055, 0x1ff }, ++ { 0x6055, 0x1ff }, ++ { 0x7055, 0x1ff }, ++ { 0x8055, 0x1ff }, ++ { 0x9055, 0x1ff }, ++ { 0x200c5, 0x18 }, ++ { 0x1200c5, 0x7 }, ++ { 0x2200c5, 0x7 }, ++ { 0x2002e, 0x2 }, ++ { 0x12002e, 0x2 }, ++ { 0x22002e, 0x2 }, ++ { 0x90204, 0x0 }, ++ { 0x190204, 0x0 }, ++ { 0x290204, 0x0 }, ++ { 0x20024, 0x1e3 }, ++ { 0x2003a, 0x2 }, ++ { 0x120024, 0x1e3 }, ++ { 0x2003a, 0x2 }, ++ { 0x220024, 0x1e3 }, ++ { 0x2003a, 0x2 }, ++ { 0x20056, 0x3 }, ++ { 0x120056, 0x3 }, ++ { 0x220056, 0x3 }, ++ { 0x1004d, 0xe00 }, ++ { 0x1014d, 0xe00 }, ++ { 0x1104d, 0xe00 }, ++ { 0x1114d, 0xe00 }, ++ { 0x1204d, 0xe00 }, ++ { 0x1214d, 0xe00 }, ++ { 0x1304d, 0xe00 }, ++ { 0x1314d, 0xe00 }, ++ { 0x11004d, 0xe00 }, ++ { 0x11014d, 0xe00 }, ++ { 0x11104d, 0xe00 }, ++ { 0x11114d, 0xe00 }, ++ { 0x11204d, 0xe00 }, ++ { 0x11214d, 0xe00 }, ++ { 0x11304d, 0xe00 }, ++ { 0x11314d, 0xe00 }, ++ { 0x21004d, 0xe00 }, ++ { 0x21014d, 0xe00 }, ++ { 0x21104d, 0xe00 }, ++ { 0x21114d, 0xe00 }, ++ { 0x21204d, 0xe00 }, ++ { 0x21214d, 0xe00 }, ++ { 0x21304d, 0xe00 }, ++ { 0x21314d, 0xe00 }, ++ { 0x10049, 0xeba }, ++ { 0x10149, 0xeba }, ++ { 0x11049, 0xeba }, ++ { 0x11149, 0xeba }, ++ { 0x12049, 0xeba }, ++ { 0x12149, 0xeba }, ++ { 0x13049, 0xeba }, ++ { 0x13149, 0xeba }, ++ { 0x110049, 0xeba }, ++ { 0x110149, 0xeba }, ++ { 0x111049, 0xeba }, ++ { 0x111149, 0xeba }, ++ { 0x112049, 0xeba }, ++ { 0x112149, 0xeba }, ++ { 0x113049, 0xeba }, ++ { 0x113149, 0xeba }, ++ { 0x210049, 0xeba }, ++ { 0x210149, 0xeba }, ++ { 0x211049, 0xeba }, ++ { 0x211149, 0xeba }, ++ { 0x212049, 0xeba }, ++ { 0x212149, 0xeba }, ++ { 0x213049, 0xeba }, ++ { 0x213149, 0xeba }, ++ { 0x43, 0x63 }, ++ { 0x1043, 0x63 }, ++ { 0x2043, 0x63 }, ++ { 0x3043, 0x63 }, ++ { 0x4043, 0x63 }, ++ { 0x5043, 0x63 }, ++ { 0x6043, 0x63 }, ++ { 0x7043, 0x63 }, ++ { 0x8043, 0x63 }, ++ { 0x9043, 0x63 }, ++ { 0x20018, 0x3 }, ++ { 0x20075, 0x4 }, ++ { 0x20050, 0x0 }, ++ { 0x20008, 0x3e8 }, ++ { 0x120008, 0x64 }, ++ { 0x220008, 0x19 }, ++ { 0x20088, 0x9 }, ++ { 0x200b2, 0x104 }, ++ { 0x10043, 0x5a1 }, ++ { 0x10143, 0x5a1 }, ++ { 0x11043, 0x5a1 }, ++ { 0x11143, 0x5a1 }, ++ { 0x12043, 0x5a1 }, ++ { 0x12143, 0x5a1 }, ++ { 0x13043, 0x5a1 }, ++ { 0x13143, 0x5a1 }, ++ { 0x1200b2, 0x104 }, ++ { 0x110043, 0x5a1 }, ++ { 0x110143, 0x5a1 }, ++ { 0x111043, 0x5a1 }, ++ { 0x111143, 0x5a1 }, ++ { 0x112043, 0x5a1 }, ++ { 0x112143, 0x5a1 }, ++ { 0x113043, 0x5a1 }, ++ { 0x113143, 0x5a1 }, ++ { 0x2200b2, 0x104 }, ++ { 0x210043, 0x5a1 }, ++ { 0x210143, 0x5a1 }, ++ { 0x211043, 0x5a1 }, ++ { 0x211143, 0x5a1 }, ++ { 0x212043, 0x5a1 }, ++ { 0x212143, 0x5a1 }, ++ { 0x213043, 0x5a1 }, ++ { 0x213143, 0x5a1 }, ++ { 0x200fa, 0x1 }, ++ { 0x1200fa, 0x1 }, ++ { 0x2200fa, 0x1 }, ++ { 0x20019, 0x1 }, ++ { 0x120019, 0x1 }, ++ { 0x220019, 0x1 }, ++ { 0x200f0, 0x660 }, ++ { 0x200f1, 0x0 }, ++ { 0x200f2, 0x4444 }, ++ { 0x200f3, 0x8888 }, ++ { 0x200f4, 0x5665 }, ++ { 0x200f5, 0x0 }, ++ { 0x200f6, 0x0 }, ++ { 0x200f7, 0xf000 }, ++ { 0x20025, 0x0 }, ++ { 0x2002d, 0x0 }, ++ { 0x12002d, 0x0 }, ++ { 0x22002d, 0x0 }, ++ { 0x2007d, 0x212 }, ++ { 0x12007d, 0x212 }, ++ { 0x22007d, 0x212 }, ++ { 0x2007c, 0x61 }, ++ { 0x12007c, 0x61 }, ++ { 0x22007c, 0x61 }, ++ { 0x1004a, 0x500 }, ++ { 0x1104a, 0x500 }, ++ { 0x1204a, 0x500 }, ++ { 0x1304a, 0x500 }, ++ { 0x2002c, 0x0 }, ++}; ++ ++/* ddr phy trained csr */ ++struct dram_cfg_param ddr_ddrphy_trained_csr[] = { ++ { 0x200b2, 0x0 }, ++ { 0x1200b2, 0x0 }, ++ { 0x2200b2, 0x0 }, ++ { 0x200cb, 0x0 }, ++ { 0x10043, 0x0 }, ++ { 0x110043, 0x0 }, ++ { 0x210043, 0x0 }, ++ { 0x10143, 0x0 }, ++ { 0x110143, 0x0 }, ++ { 0x210143, 0x0 }, ++ { 0x11043, 0x0 }, ++ { 0x111043, 0x0 }, ++ { 0x211043, 0x0 }, ++ { 0x11143, 0x0 }, ++ { 0x111143, 0x0 }, ++ { 0x211143, 0x0 }, ++ { 0x12043, 0x0 }, ++ { 0x112043, 0x0 }, ++ { 0x212043, 0x0 }, ++ { 0x12143, 0x0 }, ++ { 0x112143, 0x0 }, ++ { 0x212143, 0x0 }, ++ { 0x13043, 0x0 }, ++ { 0x113043, 0x0 }, ++ { 0x213043, 0x0 }, ++ { 0x13143, 0x0 }, ++ { 0x113143, 0x0 }, ++ { 0x213143, 0x0 }, ++ { 0x80, 0x0 }, ++ { 0x100080, 0x0 }, ++ { 0x200080, 0x0 }, ++ { 0x1080, 0x0 }, ++ { 0x101080, 0x0 }, ++ { 0x201080, 0x0 }, ++ { 0x2080, 0x0 }, ++ { 0x102080, 0x0 }, ++ { 0x202080, 0x0 }, ++ { 0x3080, 0x0 }, ++ { 0x103080, 0x0 }, ++ { 0x203080, 0x0 }, ++ { 0x4080, 0x0 }, ++ { 0x104080, 0x0 }, ++ { 0x204080, 0x0 }, ++ { 0x5080, 0x0 }, ++ { 0x105080, 0x0 }, ++ { 0x205080, 0x0 }, ++ { 0x6080, 0x0 }, ++ { 0x106080, 0x0 }, ++ { 0x206080, 0x0 }, ++ { 0x7080, 0x0 }, ++ { 0x107080, 0x0 }, ++ { 0x207080, 0x0 }, ++ { 0x8080, 0x0 }, ++ { 0x108080, 0x0 }, ++ { 0x208080, 0x0 }, ++ { 0x9080, 0x0 }, ++ { 0x109080, 0x0 }, ++ { 0x209080, 0x0 }, ++ { 0x10080, 0x0 }, ++ { 0x110080, 0x0 }, ++ { 0x210080, 0x0 }, ++ { 0x10180, 0x0 }, ++ { 0x110180, 0x0 }, ++ { 0x210180, 0x0 }, ++ { 0x11080, 0x0 }, ++ { 0x111080, 0x0 }, ++ { 0x211080, 0x0 }, ++ { 0x11180, 0x0 }, ++ { 0x111180, 0x0 }, ++ { 0x211180, 0x0 }, ++ { 0x12080, 0x0 }, ++ { 0x112080, 0x0 }, ++ { 0x212080, 0x0 }, ++ { 0x12180, 0x0 }, ++ { 0x112180, 0x0 }, ++ { 0x212180, 0x0 }, ++ { 0x13080, 0x0 }, ++ { 0x113080, 0x0 }, ++ { 0x213080, 0x0 }, ++ { 0x13180, 0x0 }, ++ { 0x113180, 0x0 }, ++ { 0x213180, 0x0 }, ++ { 0x10081, 0x0 }, ++ { 0x110081, 0x0 }, ++ { 0x210081, 0x0 }, ++ { 0x10181, 0x0 }, ++ { 0x110181, 0x0 }, ++ { 0x210181, 0x0 }, ++ { 0x11081, 0x0 }, ++ { 0x111081, 0x0 }, ++ { 0x211081, 0x0 }, ++ { 0x11181, 0x0 }, ++ { 0x111181, 0x0 }, ++ { 0x211181, 0x0 }, ++ { 0x12081, 0x0 }, ++ { 0x112081, 0x0 }, ++ { 0x212081, 0x0 }, ++ { 0x12181, 0x0 }, ++ { 0x112181, 0x0 }, ++ { 0x212181, 0x0 }, ++ { 0x13081, 0x0 }, ++ { 0x113081, 0x0 }, ++ { 0x213081, 0x0 }, ++ { 0x13181, 0x0 }, ++ { 0x113181, 0x0 }, ++ { 0x213181, 0x0 }, ++ { 0x100d0, 0x0 }, ++ { 0x1100d0, 0x0 }, ++ { 0x2100d0, 0x0 }, ++ { 0x101d0, 0x0 }, ++ { 0x1101d0, 0x0 }, ++ { 0x2101d0, 0x0 }, ++ { 0x110d0, 0x0 }, ++ { 0x1110d0, 0x0 }, ++ { 0x2110d0, 0x0 }, ++ { 0x111d0, 0x0 }, ++ { 0x1111d0, 0x0 }, ++ { 0x2111d0, 0x0 }, ++ { 0x120d0, 0x0 }, ++ { 0x1120d0, 0x0 }, ++ { 0x2120d0, 0x0 }, ++ { 0x121d0, 0x0 }, ++ { 0x1121d0, 0x0 }, ++ { 0x2121d0, 0x0 }, ++ { 0x130d0, 0x0 }, ++ { 0x1130d0, 0x0 }, ++ { 0x2130d0, 0x0 }, ++ { 0x131d0, 0x0 }, ++ { 0x1131d0, 0x0 }, ++ { 0x2131d0, 0x0 }, ++ { 0x100d1, 0x0 }, ++ { 0x1100d1, 0x0 }, ++ { 0x2100d1, 0x0 }, ++ { 0x101d1, 0x0 }, ++ { 0x1101d1, 0x0 }, ++ { 0x2101d1, 0x0 }, ++ { 0x110d1, 0x0 }, ++ { 0x1110d1, 0x0 }, ++ { 0x2110d1, 0x0 }, ++ { 0x111d1, 0x0 }, ++ { 0x1111d1, 0x0 }, ++ { 0x2111d1, 0x0 }, ++ { 0x120d1, 0x0 }, ++ { 0x1120d1, 0x0 }, ++ { 0x2120d1, 0x0 }, ++ { 0x121d1, 0x0 }, ++ { 0x1121d1, 0x0 }, ++ { 0x2121d1, 0x0 }, ++ { 0x130d1, 0x0 }, ++ { 0x1130d1, 0x0 }, ++ { 0x2130d1, 0x0 }, ++ { 0x131d1, 0x0 }, ++ { 0x1131d1, 0x0 }, ++ { 0x2131d1, 0x0 }, ++ { 0x10068, 0x0 }, ++ { 0x10168, 0x0 }, ++ { 0x10268, 0x0 }, ++ { 0x10368, 0x0 }, ++ { 0x10468, 0x0 }, ++ { 0x10568, 0x0 }, ++ { 0x10668, 0x0 }, ++ { 0x10768, 0x0 }, ++ { 0x10868, 0x0 }, ++ { 0x11068, 0x0 }, ++ { 0x11168, 0x0 }, ++ { 0x11268, 0x0 }, ++ { 0x11368, 0x0 }, ++ { 0x11468, 0x0 }, ++ { 0x11568, 0x0 }, ++ { 0x11668, 0x0 }, ++ { 0x11768, 0x0 }, ++ { 0x11868, 0x0 }, ++ { 0x12068, 0x0 }, ++ { 0x12168, 0x0 }, ++ { 0x12268, 0x0 }, ++ { 0x12368, 0x0 }, ++ { 0x12468, 0x0 }, ++ { 0x12568, 0x0 }, ++ { 0x12668, 0x0 }, ++ { 0x12768, 0x0 }, ++ { 0x12868, 0x0 }, ++ { 0x13068, 0x0 }, ++ { 0x13168, 0x0 }, ++ { 0x13268, 0x0 }, ++ { 0x13368, 0x0 }, ++ { 0x13468, 0x0 }, ++ { 0x13568, 0x0 }, ++ { 0x13668, 0x0 }, ++ { 0x13768, 0x0 }, ++ { 0x13868, 0x0 }, ++ { 0x10069, 0x0 }, ++ { 0x10169, 0x0 }, ++ { 0x10269, 0x0 }, ++ { 0x10369, 0x0 }, ++ { 0x10469, 0x0 }, ++ { 0x10569, 0x0 }, ++ { 0x10669, 0x0 }, ++ { 0x10769, 0x0 }, ++ { 0x10869, 0x0 }, ++ { 0x11069, 0x0 }, ++ { 0x11169, 0x0 }, ++ { 0x11269, 0x0 }, ++ { 0x11369, 0x0 }, ++ { 0x11469, 0x0 }, ++ { 0x11569, 0x0 }, ++ { 0x11669, 0x0 }, ++ { 0x11769, 0x0 }, ++ { 0x11869, 0x0 }, ++ { 0x12069, 0x0 }, ++ { 0x12169, 0x0 }, ++ { 0x12269, 0x0 }, ++ { 0x12369, 0x0 }, ++ { 0x12469, 0x0 }, ++ { 0x12569, 0x0 }, ++ { 0x12669, 0x0 }, ++ { 0x12769, 0x0 }, ++ { 0x12869, 0x0 }, ++ { 0x13069, 0x0 }, ++ { 0x13169, 0x0 }, ++ { 0x13269, 0x0 }, ++ { 0x13369, 0x0 }, ++ { 0x13469, 0x0 }, ++ { 0x13569, 0x0 }, ++ { 0x13669, 0x0 }, ++ { 0x13769, 0x0 }, ++ { 0x13869, 0x0 }, ++ { 0x1008c, 0x0 }, ++ { 0x11008c, 0x0 }, ++ { 0x21008c, 0x0 }, ++ { 0x1018c, 0x0 }, ++ { 0x11018c, 0x0 }, ++ { 0x21018c, 0x0 }, ++ { 0x1108c, 0x0 }, ++ { 0x11108c, 0x0 }, ++ { 0x21108c, 0x0 }, ++ { 0x1118c, 0x0 }, ++ { 0x11118c, 0x0 }, ++ { 0x21118c, 0x0 }, ++ { 0x1208c, 0x0 }, ++ { 0x11208c, 0x0 }, ++ { 0x21208c, 0x0 }, ++ { 0x1218c, 0x0 }, ++ { 0x11218c, 0x0 }, ++ { 0x21218c, 0x0 }, ++ { 0x1308c, 0x0 }, ++ { 0x11308c, 0x0 }, ++ { 0x21308c, 0x0 }, ++ { 0x1318c, 0x0 }, ++ { 0x11318c, 0x0 }, ++ { 0x21318c, 0x0 }, ++ { 0x1008d, 0x0 }, ++ { 0x11008d, 0x0 }, ++ { 0x21008d, 0x0 }, ++ { 0x1018d, 0x0 }, ++ { 0x11018d, 0x0 }, ++ { 0x21018d, 0x0 }, ++ { 0x1108d, 0x0 }, ++ { 0x11108d, 0x0 }, ++ { 0x21108d, 0x0 }, ++ { 0x1118d, 0x0 }, ++ { 0x11118d, 0x0 }, ++ { 0x21118d, 0x0 }, ++ { 0x1208d, 0x0 }, ++ { 0x11208d, 0x0 }, ++ { 0x21208d, 0x0 }, ++ { 0x1218d, 0x0 }, ++ { 0x11218d, 0x0 }, ++ { 0x21218d, 0x0 }, ++ { 0x1308d, 0x0 }, ++ { 0x11308d, 0x0 }, ++ { 0x21308d, 0x0 }, ++ { 0x1318d, 0x0 }, ++ { 0x11318d, 0x0 }, ++ { 0x21318d, 0x0 }, ++ { 0x100c0, 0x0 }, ++ { 0x1100c0, 0x0 }, ++ { 0x2100c0, 0x0 }, ++ { 0x101c0, 0x0 }, ++ { 0x1101c0, 0x0 }, ++ { 0x2101c0, 0x0 }, ++ { 0x102c0, 0x0 }, ++ { 0x1102c0, 0x0 }, ++ { 0x2102c0, 0x0 }, ++ { 0x103c0, 0x0 }, ++ { 0x1103c0, 0x0 }, ++ { 0x2103c0, 0x0 }, ++ { 0x104c0, 0x0 }, ++ { 0x1104c0, 0x0 }, ++ { 0x2104c0, 0x0 }, ++ { 0x105c0, 0x0 }, ++ { 0x1105c0, 0x0 }, ++ { 0x2105c0, 0x0 }, ++ { 0x106c0, 0x0 }, ++ { 0x1106c0, 0x0 }, ++ { 0x2106c0, 0x0 }, ++ { 0x107c0, 0x0 }, ++ { 0x1107c0, 0x0 }, ++ { 0x2107c0, 0x0 }, ++ { 0x108c0, 0x0 }, ++ { 0x1108c0, 0x0 }, ++ { 0x2108c0, 0x0 }, ++ { 0x110c0, 0x0 }, ++ { 0x1110c0, 0x0 }, ++ { 0x2110c0, 0x0 }, ++ { 0x111c0, 0x0 }, ++ { 0x1111c0, 0x0 }, ++ { 0x2111c0, 0x0 }, ++ { 0x112c0, 0x0 }, ++ { 0x1112c0, 0x0 }, ++ { 0x2112c0, 0x0 }, ++ { 0x113c0, 0x0 }, ++ { 0x1113c0, 0x0 }, ++ { 0x2113c0, 0x0 }, ++ { 0x114c0, 0x0 }, ++ { 0x1114c0, 0x0 }, ++ { 0x2114c0, 0x0 }, ++ { 0x115c0, 0x0 }, ++ { 0x1115c0, 0x0 }, ++ { 0x2115c0, 0x0 }, ++ { 0x116c0, 0x0 }, ++ { 0x1116c0, 0x0 }, ++ { 0x2116c0, 0x0 }, ++ { 0x117c0, 0x0 }, ++ { 0x1117c0, 0x0 }, ++ { 0x2117c0, 0x0 }, ++ { 0x118c0, 0x0 }, ++ { 0x1118c0, 0x0 }, ++ { 0x2118c0, 0x0 }, ++ { 0x120c0, 0x0 }, ++ { 0x1120c0, 0x0 }, ++ { 0x2120c0, 0x0 }, ++ { 0x121c0, 0x0 }, ++ { 0x1121c0, 0x0 }, ++ { 0x2121c0, 0x0 }, ++ { 0x122c0, 0x0 }, ++ { 0x1122c0, 0x0 }, ++ { 0x2122c0, 0x0 }, ++ { 0x123c0, 0x0 }, ++ { 0x1123c0, 0x0 }, ++ { 0x2123c0, 0x0 }, ++ { 0x124c0, 0x0 }, ++ { 0x1124c0, 0x0 }, ++ { 0x2124c0, 0x0 }, ++ { 0x125c0, 0x0 }, ++ { 0x1125c0, 0x0 }, ++ { 0x2125c0, 0x0 }, ++ { 0x126c0, 0x0 }, ++ { 0x1126c0, 0x0 }, ++ { 0x2126c0, 0x0 }, ++ { 0x127c0, 0x0 }, ++ { 0x1127c0, 0x0 }, ++ { 0x2127c0, 0x0 }, ++ { 0x128c0, 0x0 }, ++ { 0x1128c0, 0x0 }, ++ { 0x2128c0, 0x0 }, ++ { 0x130c0, 0x0 }, ++ { 0x1130c0, 0x0 }, ++ { 0x2130c0, 0x0 }, ++ { 0x131c0, 0x0 }, ++ { 0x1131c0, 0x0 }, ++ { 0x2131c0, 0x0 }, ++ { 0x132c0, 0x0 }, ++ { 0x1132c0, 0x0 }, ++ { 0x2132c0, 0x0 }, ++ { 0x133c0, 0x0 }, ++ { 0x1133c0, 0x0 }, ++ { 0x2133c0, 0x0 }, ++ { 0x134c0, 0x0 }, ++ { 0x1134c0, 0x0 }, ++ { 0x2134c0, 0x0 }, ++ { 0x135c0, 0x0 }, ++ { 0x1135c0, 0x0 }, ++ { 0x2135c0, 0x0 }, ++ { 0x136c0, 0x0 }, ++ { 0x1136c0, 0x0 }, ++ { 0x2136c0, 0x0 }, ++ { 0x137c0, 0x0 }, ++ { 0x1137c0, 0x0 }, ++ { 0x2137c0, 0x0 }, ++ { 0x138c0, 0x0 }, ++ { 0x1138c0, 0x0 }, ++ { 0x2138c0, 0x0 }, ++ { 0x100c1, 0x0 }, ++ { 0x1100c1, 0x0 }, ++ { 0x2100c1, 0x0 }, ++ { 0x101c1, 0x0 }, ++ { 0x1101c1, 0x0 }, ++ { 0x2101c1, 0x0 }, ++ { 0x102c1, 0x0 }, ++ { 0x1102c1, 0x0 }, ++ { 0x2102c1, 0x0 }, ++ { 0x103c1, 0x0 }, ++ { 0x1103c1, 0x0 }, ++ { 0x2103c1, 0x0 }, ++ { 0x104c1, 0x0 }, ++ { 0x1104c1, 0x0 }, ++ { 0x2104c1, 0x0 }, ++ { 0x105c1, 0x0 }, ++ { 0x1105c1, 0x0 }, ++ { 0x2105c1, 0x0 }, ++ { 0x106c1, 0x0 }, ++ { 0x1106c1, 0x0 }, ++ { 0x2106c1, 0x0 }, ++ { 0x107c1, 0x0 }, ++ { 0x1107c1, 0x0 }, ++ { 0x2107c1, 0x0 }, ++ { 0x108c1, 0x0 }, ++ { 0x1108c1, 0x0 }, ++ { 0x2108c1, 0x0 }, ++ { 0x110c1, 0x0 }, ++ { 0x1110c1, 0x0 }, ++ { 0x2110c1, 0x0 }, ++ { 0x111c1, 0x0 }, ++ { 0x1111c1, 0x0 }, ++ { 0x2111c1, 0x0 }, ++ { 0x112c1, 0x0 }, ++ { 0x1112c1, 0x0 }, ++ { 0x2112c1, 0x0 }, ++ { 0x113c1, 0x0 }, ++ { 0x1113c1, 0x0 }, ++ { 0x2113c1, 0x0 }, ++ { 0x114c1, 0x0 }, ++ { 0x1114c1, 0x0 }, ++ { 0x2114c1, 0x0 }, ++ { 0x115c1, 0x0 }, ++ { 0x1115c1, 0x0 }, ++ { 0x2115c1, 0x0 }, ++ { 0x116c1, 0x0 }, ++ { 0x1116c1, 0x0 }, ++ { 0x2116c1, 0x0 }, ++ { 0x117c1, 0x0 }, ++ { 0x1117c1, 0x0 }, ++ { 0x2117c1, 0x0 }, ++ { 0x118c1, 0x0 }, ++ { 0x1118c1, 0x0 }, ++ { 0x2118c1, 0x0 }, ++ { 0x120c1, 0x0 }, ++ { 0x1120c1, 0x0 }, ++ { 0x2120c1, 0x0 }, ++ { 0x121c1, 0x0 }, ++ { 0x1121c1, 0x0 }, ++ { 0x2121c1, 0x0 }, ++ { 0x122c1, 0x0 }, ++ { 0x1122c1, 0x0 }, ++ { 0x2122c1, 0x0 }, ++ { 0x123c1, 0x0 }, ++ { 0x1123c1, 0x0 }, ++ { 0x2123c1, 0x0 }, ++ { 0x124c1, 0x0 }, ++ { 0x1124c1, 0x0 }, ++ { 0x2124c1, 0x0 }, ++ { 0x125c1, 0x0 }, ++ { 0x1125c1, 0x0 }, ++ { 0x2125c1, 0x0 }, ++ { 0x126c1, 0x0 }, ++ { 0x1126c1, 0x0 }, ++ { 0x2126c1, 0x0 }, ++ { 0x127c1, 0x0 }, ++ { 0x1127c1, 0x0 }, ++ { 0x2127c1, 0x0 }, ++ { 0x128c1, 0x0 }, ++ { 0x1128c1, 0x0 }, ++ { 0x2128c1, 0x0 }, ++ { 0x130c1, 0x0 }, ++ { 0x1130c1, 0x0 }, ++ { 0x2130c1, 0x0 }, ++ { 0x131c1, 0x0 }, ++ { 0x1131c1, 0x0 }, ++ { 0x2131c1, 0x0 }, ++ { 0x132c1, 0x0 }, ++ { 0x1132c1, 0x0 }, ++ { 0x2132c1, 0x0 }, ++ { 0x133c1, 0x0 }, ++ { 0x1133c1, 0x0 }, ++ { 0x2133c1, 0x0 }, ++ { 0x134c1, 0x0 }, ++ { 0x1134c1, 0x0 }, ++ { 0x2134c1, 0x0 }, ++ { 0x135c1, 0x0 }, ++ { 0x1135c1, 0x0 }, ++ { 0x2135c1, 0x0 }, ++ { 0x136c1, 0x0 }, ++ { 0x1136c1, 0x0 }, ++ { 0x2136c1, 0x0 }, ++ { 0x137c1, 0x0 }, ++ { 0x1137c1, 0x0 }, ++ { 0x2137c1, 0x0 }, ++ { 0x138c1, 0x0 }, ++ { 0x1138c1, 0x0 }, ++ { 0x2138c1, 0x0 }, ++ { 0x10020, 0x0 }, ++ { 0x110020, 0x0 }, ++ { 0x210020, 0x0 }, ++ { 0x11020, 0x0 }, ++ { 0x111020, 0x0 }, ++ { 0x211020, 0x0 }, ++ { 0x12020, 0x0 }, ++ { 0x112020, 0x0 }, ++ { 0x212020, 0x0 }, ++ { 0x13020, 0x0 }, ++ { 0x113020, 0x0 }, ++ { 0x213020, 0x0 }, ++ { 0x20072, 0x0 }, ++ { 0x20073, 0x0 }, ++ { 0x20074, 0x0 }, ++ { 0x100aa, 0x0 }, ++ { 0x110aa, 0x0 }, ++ { 0x120aa, 0x0 }, ++ { 0x130aa, 0x0 }, ++ { 0x20010, 0x0 }, ++ { 0x120010, 0x0 }, ++ { 0x220010, 0x0 }, ++ { 0x20011, 0x0 }, ++ { 0x120011, 0x0 }, ++ { 0x220011, 0x0 }, ++ { 0x100ae, 0x0 }, ++ { 0x1100ae, 0x0 }, ++ { 0x2100ae, 0x0 }, ++ { 0x100af, 0x0 }, ++ { 0x1100af, 0x0 }, ++ { 0x2100af, 0x0 }, ++ { 0x110ae, 0x0 }, ++ { 0x1110ae, 0x0 }, ++ { 0x2110ae, 0x0 }, ++ { 0x110af, 0x0 }, ++ { 0x1110af, 0x0 }, ++ { 0x2110af, 0x0 }, ++ { 0x120ae, 0x0 }, ++ { 0x1120ae, 0x0 }, ++ { 0x2120ae, 0x0 }, ++ { 0x120af, 0x0 }, ++ { 0x1120af, 0x0 }, ++ { 0x2120af, 0x0 }, ++ { 0x130ae, 0x0 }, ++ { 0x1130ae, 0x0 }, ++ { 0x2130ae, 0x0 }, ++ { 0x130af, 0x0 }, ++ { 0x1130af, 0x0 }, ++ { 0x2130af, 0x0 }, ++ { 0x20020, 0x0 }, ++ { 0x120020, 0x0 }, ++ { 0x220020, 0x0 }, ++ { 0x100a0, 0x0 }, ++ { 0x100a1, 0x0 }, ++ { 0x100a2, 0x0 }, ++ { 0x100a3, 0x0 }, ++ { 0x100a4, 0x0 }, ++ { 0x100a5, 0x0 }, ++ { 0x100a6, 0x0 }, ++ { 0x100a7, 0x0 }, ++ { 0x110a0, 0x0 }, ++ { 0x110a1, 0x0 }, ++ { 0x110a2, 0x0 }, ++ { 0x110a3, 0x0 }, ++ { 0x110a4, 0x0 }, ++ { 0x110a5, 0x0 }, ++ { 0x110a6, 0x0 }, ++ { 0x110a7, 0x0 }, ++ { 0x120a0, 0x0 }, ++ { 0x120a1, 0x0 }, ++ { 0x120a2, 0x0 }, ++ { 0x120a3, 0x0 }, ++ { 0x120a4, 0x0 }, ++ { 0x120a5, 0x0 }, ++ { 0x120a6, 0x0 }, ++ { 0x120a7, 0x0 }, ++ { 0x130a0, 0x0 }, ++ { 0x130a1, 0x0 }, ++ { 0x130a2, 0x0 }, ++ { 0x130a3, 0x0 }, ++ { 0x130a4, 0x0 }, ++ { 0x130a5, 0x0 }, ++ { 0x130a6, 0x0 }, ++ { 0x130a7, 0x0 }, ++ { 0x2007c, 0x0 }, ++ { 0x12007c, 0x0 }, ++ { 0x22007c, 0x0 }, ++ { 0x2007d, 0x0 }, ++ { 0x12007d, 0x0 }, ++ { 0x22007d, 0x0 }, ++ { 0x400fd, 0x0 }, ++ { 0x400c0, 0x0 }, ++ { 0x90201, 0x0 }, ++ { 0x190201, 0x0 }, ++ { 0x290201, 0x0 }, ++ { 0x90202, 0x0 }, ++ { 0x190202, 0x0 }, ++ { 0x290202, 0x0 }, ++ { 0x90203, 0x0 }, ++ { 0x190203, 0x0 }, ++ { 0x290203, 0x0 }, ++ { 0x90204, 0x0 }, ++ { 0x190204, 0x0 }, ++ { 0x290204, 0x0 }, ++ { 0x90205, 0x0 }, ++ { 0x190205, 0x0 }, ++ { 0x290205, 0x0 }, ++ { 0x90206, 0x0 }, ++ { 0x190206, 0x0 }, ++ { 0x290206, 0x0 }, ++ { 0x90207, 0x0 }, ++ { 0x190207, 0x0 }, ++ { 0x290207, 0x0 }, ++ { 0x90208, 0x0 }, ++ { 0x190208, 0x0 }, ++ { 0x290208, 0x0 }, ++ { 0x10062, 0x0 }, ++ { 0x10162, 0x0 }, ++ { 0x10262, 0x0 }, ++ { 0x10362, 0x0 }, ++ { 0x10462, 0x0 }, ++ { 0x10562, 0x0 }, ++ { 0x10662, 0x0 }, ++ { 0x10762, 0x0 }, ++ { 0x10862, 0x0 }, ++ { 0x11062, 0x0 }, ++ { 0x11162, 0x0 }, ++ { 0x11262, 0x0 }, ++ { 0x11362, 0x0 }, ++ { 0x11462, 0x0 }, ++ { 0x11562, 0x0 }, ++ { 0x11662, 0x0 }, ++ { 0x11762, 0x0 }, ++ { 0x11862, 0x0 }, ++ { 0x12062, 0x0 }, ++ { 0x12162, 0x0 }, ++ { 0x12262, 0x0 }, ++ { 0x12362, 0x0 }, ++ { 0x12462, 0x0 }, ++ { 0x12562, 0x0 }, ++ { 0x12662, 0x0 }, ++ { 0x12762, 0x0 }, ++ { 0x12862, 0x0 }, ++ { 0x13062, 0x0 }, ++ { 0x13162, 0x0 }, ++ { 0x13262, 0x0 }, ++ { 0x13362, 0x0 }, ++ { 0x13462, 0x0 }, ++ { 0x13562, 0x0 }, ++ { 0x13662, 0x0 }, ++ { 0x13762, 0x0 }, ++ { 0x13862, 0x0 }, ++ { 0x20077, 0x0 }, ++ { 0x10001, 0x0 }, ++ { 0x11001, 0x0 }, ++ { 0x12001, 0x0 }, ++ { 0x13001, 0x0 }, ++ { 0x10040, 0x0 }, ++ { 0x10140, 0x0 }, ++ { 0x10240, 0x0 }, ++ { 0x10340, 0x0 }, ++ { 0x10440, 0x0 }, ++ { 0x10540, 0x0 }, ++ { 0x10640, 0x0 }, ++ { 0x10740, 0x0 }, ++ { 0x10840, 0x0 }, ++ { 0x10030, 0x0 }, ++ { 0x10130, 0x0 }, ++ { 0x10230, 0x0 }, ++ { 0x10330, 0x0 }, ++ { 0x10430, 0x0 }, ++ { 0x10530, 0x0 }, ++ { 0x10630, 0x0 }, ++ { 0x10730, 0x0 }, ++ { 0x10830, 0x0 }, ++ { 0x11040, 0x0 }, ++ { 0x11140, 0x0 }, ++ { 0x11240, 0x0 }, ++ { 0x11340, 0x0 }, ++ { 0x11440, 0x0 }, ++ { 0x11540, 0x0 }, ++ { 0x11640, 0x0 }, ++ { 0x11740, 0x0 }, ++ { 0x11840, 0x0 }, ++ { 0x11030, 0x0 }, ++ { 0x11130, 0x0 }, ++ { 0x11230, 0x0 }, ++ { 0x11330, 0x0 }, ++ { 0x11430, 0x0 }, ++ { 0x11530, 0x0 }, ++ { 0x11630, 0x0 }, ++ { 0x11730, 0x0 }, ++ { 0x11830, 0x0 }, ++ { 0x12040, 0x0 }, ++ { 0x12140, 0x0 }, ++ { 0x12240, 0x0 }, ++ { 0x12340, 0x0 }, ++ { 0x12440, 0x0 }, ++ { 0x12540, 0x0 }, ++ { 0x12640, 0x0 }, ++ { 0x12740, 0x0 }, ++ { 0x12840, 0x0 }, ++ { 0x12030, 0x0 }, ++ { 0x12130, 0x0 }, ++ { 0x12230, 0x0 }, ++ { 0x12330, 0x0 }, ++ { 0x12430, 0x0 }, ++ { 0x12530, 0x0 }, ++ { 0x12630, 0x0 }, ++ { 0x12730, 0x0 }, ++ { 0x12830, 0x0 }, ++ { 0x13040, 0x0 }, ++ { 0x13140, 0x0 }, ++ { 0x13240, 0x0 }, ++ { 0x13340, 0x0 }, ++ { 0x13440, 0x0 }, ++ { 0x13540, 0x0 }, ++ { 0x13640, 0x0 }, ++ { 0x13740, 0x0 }, ++ { 0x13840, 0x0 }, ++ { 0x13030, 0x0 }, ++ { 0x13130, 0x0 }, ++ { 0x13230, 0x0 }, ++ { 0x13330, 0x0 }, ++ { 0x13430, 0x0 }, ++ { 0x13530, 0x0 }, ++ { 0x13630, 0x0 }, ++ { 0x13730, 0x0 }, ++ { 0x13830, 0x0 }, ++}; ++ ++/* P0 message block parameter for training firmware */ ++struct dram_cfg_param ddr_fsp0_cfg[] = { ++ { 0xd0000, 0x0 }, ++ { 0x54003, 0xfa0 }, ++ { 0x54004, 0x2 }, ++ { 0x54005, 0x2228 }, ++ { 0x54006, 0x14 }, ++ { 0x54008, 0x131f }, ++ { 0x54009, 0xc8 }, ++ { 0x5400b, 0x2 }, ++ { 0x5400f, 0x100 }, ++ { 0x54012, 0x310 }, ++ { 0x54019, 0x3ff4 }, ++ { 0x5401a, 0x33 }, ++ { 0x5401b, 0x4866 }, ++ { 0x5401c, 0x4800 }, ++ { 0x5401e, 0x16 }, ++ { 0x5401f, 0x3ff4 }, ++ { 0x54020, 0x33 }, ++ { 0x54021, 0x4866 }, ++ { 0x54022, 0x4800 }, ++ { 0x54024, 0x16 }, ++ { 0x5402b, 0x1000 }, ++ { 0x5402c, 0x3 }, ++ { 0x54032, 0xf400 }, ++ { 0x54033, 0x333f }, ++ { 0x54034, 0x6600 }, ++ { 0x54035, 0x48 }, ++ { 0x54036, 0x48 }, ++ { 0x54037, 0x1600 }, ++ { 0x54038, 0xf400 }, ++ { 0x54039, 0x333f }, ++ { 0x5403a, 0x6600 }, ++ { 0x5403b, 0x48 }, ++ { 0x5403c, 0x48 }, ++ { 0x5403d, 0x1600 }, ++ { 0xd0000, 0x1 }, ++}; ++ ++/* P1 message block parameter for training firmware */ ++struct dram_cfg_param ddr_fsp1_cfg[] = { ++ { 0xd0000, 0x0 }, ++ { 0x54002, 0x101 }, ++ { 0x54003, 0x190 }, ++ { 0x54004, 0x2 }, ++ { 0x54005, 0x2228 }, ++ { 0x54006, 0x14 }, ++ { 0x54008, 0x121f }, ++ { 0x54009, 0xc8 }, ++ { 0x5400b, 0x2 }, ++ { 0x5400f, 0x100 }, ++ { 0x54012, 0x310 }, ++ { 0x54019, 0x84 }, ++ { 0x5401a, 0x33 }, ++ { 0x5401b, 0x4866 }, ++ { 0x5401c, 0x4800 }, ++ { 0x5401e, 0x16 }, ++ { 0x5401f, 0x84 }, ++ { 0x54020, 0x33 }, ++ { 0x54021, 0x4866 }, ++ { 0x54022, 0x4800 }, ++ { 0x54024, 0x16 }, ++ { 0x5402b, 0x1000 }, ++ { 0x5402c, 0x3 }, ++ { 0x54032, 0x8400 }, ++ { 0x54033, 0x3300 }, ++ { 0x54034, 0x6600 }, ++ { 0x54035, 0x48 }, ++ { 0x54036, 0x48 }, ++ { 0x54037, 0x1600 }, ++ { 0x54038, 0x8400 }, ++ { 0x54039, 0x3300 }, ++ { 0x5403a, 0x6600 }, ++ { 0x5403b, 0x48 }, ++ { 0x5403c, 0x48 }, ++ { 0x5403d, 0x1600 }, ++ { 0xd0000, 0x1 }, ++}; ++ ++/* P2 message block parameter for training firmware */ ++struct dram_cfg_param ddr_fsp2_cfg[] = { ++ { 0xd0000, 0x0 }, ++ { 0x54002, 0x102 }, ++ { 0x54003, 0x64 }, ++ { 0x54004, 0x2 }, ++ { 0x54005, 0x2228 }, ++ { 0x54006, 0x14 }, ++ { 0x54008, 0x121f }, ++ { 0x54009, 0xc8 }, ++ { 0x5400b, 0x2 }, ++ { 0x5400f, 0x100 }, ++ { 0x54012, 0x310 }, ++ { 0x54019, 0x84 }, ++ { 0x5401a, 0x33 }, ++ { 0x5401b, 0x4866 }, ++ { 0x5401c, 0x4800 }, ++ { 0x5401e, 0x16 }, ++ { 0x5401f, 0x84 }, ++ { 0x54020, 0x33 }, ++ { 0x54021, 0x4866 }, ++ { 0x54022, 0x4800 }, ++ { 0x54024, 0x16 }, ++ { 0x5402b, 0x1000 }, ++ { 0x5402c, 0x3 }, ++ { 0x54032, 0x8400 }, ++ { 0x54033, 0x3300 }, ++ { 0x54034, 0x6600 }, ++ { 0x54035, 0x48 }, ++ { 0x54036, 0x48 }, ++ { 0x54037, 0x1600 }, ++ { 0x54038, 0x8400 }, ++ { 0x54039, 0x3300 }, ++ { 0x5403a, 0x6600 }, ++ { 0x5403b, 0x48 }, ++ { 0x5403c, 0x48 }, ++ { 0x5403d, 0x1600 }, ++ { 0xd0000, 0x1 }, ++}; ++ ++/* P0 2D message block parameter for training firmware */ ++struct dram_cfg_param ddr_fsp0_2d_cfg[] = { ++ { 0xd0000, 0x0 }, ++ { 0x54003, 0xfa0 }, ++ { 0x54004, 0x2 }, ++ { 0x54005, 0x2228 }, ++ { 0x54006, 0x14 }, ++ { 0x54008, 0x61 }, ++ { 0x54009, 0xc8 }, ++ { 0x5400b, 0x2 }, ++ { 0x5400f, 0x100 }, ++ { 0x54010, 0x1f7f }, ++ { 0x54012, 0x310 }, ++ { 0x54019, 0x3ff4 }, ++ { 0x5401a, 0x33 }, ++ { 0x5401b, 0x4866 }, ++ { 0x5401c, 0x4800 }, ++ { 0x5401e, 0x16 }, ++ { 0x5401f, 0x3ff4 }, ++ { 0x54020, 0x33 }, ++ { 0x54021, 0x4866 }, ++ { 0x54022, 0x4800 }, ++ { 0x54024, 0x16 }, ++ { 0x5402b, 0x1000 }, ++ { 0x5402c, 0x3 }, ++ { 0x54032, 0xf400 }, ++ { 0x54033, 0x333f }, ++ { 0x54034, 0x6600 }, ++ { 0x54035, 0x48 }, ++ { 0x54036, 0x48 }, ++ { 0x54037, 0x1600 }, ++ { 0x54038, 0xf400 }, ++ { 0x54039, 0x333f }, ++ { 0x5403a, 0x6600 }, ++ { 0x5403b, 0x48 }, ++ { 0x5403c, 0x48 }, ++ { 0x5403d, 0x1600 }, ++ { 0xd0000, 0x1 }, ++}; ++ ++/* DRAM PHY init engine image */ ++struct dram_cfg_param ddr_phy_pie[] = { ++ { 0xd0000, 0x0 }, ++ { 0x90000, 0x10 }, ++ { 0x90001, 0x400 }, ++ { 0x90002, 0x10e }, ++ { 0x90003, 0x0 }, ++ { 0x90004, 0x0 }, ++ { 0x90005, 0x8 }, ++ { 0x90029, 0xb }, ++ { 0x9002a, 0x480 }, ++ { 0x9002b, 0x109 }, ++ { 0x9002c, 0x8 }, ++ { 0x9002d, 0x448 }, ++ { 0x9002e, 0x139 }, ++ { 0x9002f, 0x8 }, ++ { 0x90030, 0x478 }, ++ { 0x90031, 0x109 }, ++ { 0x90032, 0x0 }, ++ { 0x90033, 0xe8 }, ++ { 0x90034, 0x109 }, ++ { 0x90035, 0x2 }, ++ { 0x90036, 0x10 }, ++ { 0x90037, 0x139 }, ++ { 0x90038, 0xb }, ++ { 0x90039, 0x7c0 }, ++ { 0x9003a, 0x139 }, ++ { 0x9003b, 0x44 }, ++ { 0x9003c, 0x633 }, ++ { 0x9003d, 0x159 }, ++ { 0x9003e, 0x14f }, ++ { 0x9003f, 0x630 }, ++ { 0x90040, 0x159 }, ++ { 0x90041, 0x47 }, ++ { 0x90042, 0x633 }, ++ { 0x90043, 0x149 }, ++ { 0x90044, 0x4f }, ++ { 0x90045, 0x633 }, ++ { 0x90046, 0x179 }, ++ { 0x90047, 0x8 }, ++ { 0x90048, 0xe0 }, ++ { 0x90049, 0x109 }, ++ { 0x9004a, 0x0 }, ++ { 0x9004b, 0x7c8 }, ++ { 0x9004c, 0x109 }, ++ { 0x9004d, 0x0 }, ++ { 0x9004e, 0x1 }, ++ { 0x9004f, 0x8 }, ++ { 0x90050, 0x0 }, ++ { 0x90051, 0x45a }, ++ { 0x90052, 0x9 }, ++ { 0x90053, 0x0 }, ++ { 0x90054, 0x448 }, ++ { 0x90055, 0x109 }, ++ { 0x90056, 0x40 }, ++ { 0x90057, 0x633 }, ++ { 0x90058, 0x179 }, ++ { 0x90059, 0x1 }, ++ { 0x9005a, 0x618 }, ++ { 0x9005b, 0x109 }, ++ { 0x9005c, 0x40c0 }, ++ { 0x9005d, 0x633 }, ++ { 0x9005e, 0x149 }, ++ { 0x9005f, 0x8 }, ++ { 0x90060, 0x4 }, ++ { 0x90061, 0x48 }, ++ { 0x90062, 0x4040 }, ++ { 0x90063, 0x633 }, ++ { 0x90064, 0x149 }, ++ { 0x90065, 0x0 }, ++ { 0x90066, 0x4 }, ++ { 0x90067, 0x48 }, ++ { 0x90068, 0x40 }, ++ { 0x90069, 0x633 }, ++ { 0x9006a, 0x149 }, ++ { 0x9006b, 0x10 }, ++ { 0x9006c, 0x4 }, ++ { 0x9006d, 0x18 }, ++ { 0x9006e, 0x0 }, ++ { 0x9006f, 0x4 }, ++ { 0x90070, 0x78 }, ++ { 0x90071, 0x549 }, ++ { 0x90072, 0x633 }, ++ { 0x90073, 0x159 }, ++ { 0x90074, 0xd49 }, ++ { 0x90075, 0x633 }, ++ { 0x90076, 0x159 }, ++ { 0x90077, 0x94a }, ++ { 0x90078, 0x633 }, ++ { 0x90079, 0x159 }, ++ { 0x9007a, 0x441 }, ++ { 0x9007b, 0x633 }, ++ { 0x9007c, 0x149 }, ++ { 0x9007d, 0x42 }, ++ { 0x9007e, 0x633 }, ++ { 0x9007f, 0x149 }, ++ { 0x90080, 0x1 }, ++ { 0x90081, 0x633 }, ++ { 0x90082, 0x149 }, ++ { 0x90083, 0x0 }, ++ { 0x90084, 0xe0 }, ++ { 0x90085, 0x109 }, ++ { 0x90086, 0xa }, ++ { 0x90087, 0x10 }, ++ { 0x90088, 0x109 }, ++ { 0x90089, 0x9 }, ++ { 0x9008a, 0x3c0 }, ++ { 0x9008b, 0x149 }, ++ { 0x9008c, 0x9 }, ++ { 0x9008d, 0x3c0 }, ++ { 0x9008e, 0x159 }, ++ { 0x9008f, 0x18 }, ++ { 0x90090, 0x10 }, ++ { 0x90091, 0x109 }, ++ { 0x90092, 0x0 }, ++ { 0x90093, 0x3c0 }, ++ { 0x90094, 0x109 }, ++ { 0x90095, 0x18 }, ++ { 0x90096, 0x4 }, ++ { 0x90097, 0x48 }, ++ { 0x90098, 0x18 }, ++ { 0x90099, 0x4 }, ++ { 0x9009a, 0x58 }, ++ { 0x9009b, 0xb }, ++ { 0x9009c, 0x10 }, ++ { 0x9009d, 0x109 }, ++ { 0x9009e, 0x1 }, ++ { 0x9009f, 0x10 }, ++ { 0x900a0, 0x109 }, ++ { 0x900a1, 0x5 }, ++ { 0x900a2, 0x7c0 }, ++ { 0x900a3, 0x109 }, ++ { 0x40000, 0x811 }, ++ { 0x40020, 0x880 }, ++ { 0x40040, 0x0 }, ++ { 0x40060, 0x0 }, ++ { 0x40001, 0x4008 }, ++ { 0x40021, 0x83 }, ++ { 0x40041, 0x4f }, ++ { 0x40061, 0x0 }, ++ { 0x40002, 0x4040 }, ++ { 0x40022, 0x83 }, ++ { 0x40042, 0x51 }, ++ { 0x40062, 0x0 }, ++ { 0x40003, 0x811 }, ++ { 0x40023, 0x880 }, ++ { 0x40043, 0x0 }, ++ { 0x40063, 0x0 }, ++ { 0x40004, 0x720 }, ++ { 0x40024, 0xf }, ++ { 0x40044, 0x1740 }, ++ { 0x40064, 0x0 }, ++ { 0x40005, 0x16 }, ++ { 0x40025, 0x83 }, ++ { 0x40045, 0x4b }, ++ { 0x40065, 0x0 }, ++ { 0x40006, 0x716 }, ++ { 0x40026, 0xf }, ++ { 0x40046, 0x2001 }, ++ { 0x40066, 0x0 }, ++ { 0x40007, 0x716 }, ++ { 0x40027, 0xf }, ++ { 0x40047, 0x2800 }, ++ { 0x40067, 0x0 }, ++ { 0x40008, 0x716 }, ++ { 0x40028, 0xf }, ++ { 0x40048, 0xf00 }, ++ { 0x40068, 0x0 }, ++ { 0x40009, 0x720 }, ++ { 0x40029, 0xf }, ++ { 0x40049, 0x1400 }, ++ { 0x40069, 0x0 }, ++ { 0x4000a, 0xe08 }, ++ { 0x4002a, 0xc15 }, ++ { 0x4004a, 0x0 }, ++ { 0x4006a, 0x0 }, ++ { 0x4000b, 0x625 }, ++ { 0x4002b, 0x15 }, ++ { 0x4004b, 0x0 }, ++ { 0x4006b, 0x0 }, ++ { 0x4000c, 0x4028 }, ++ { 0x4002c, 0x80 }, ++ { 0x4004c, 0x0 }, ++ { 0x4006c, 0x0 }, ++ { 0x4000d, 0xe08 }, ++ { 0x4002d, 0xc1a }, ++ { 0x4004d, 0x0 }, ++ { 0x4006d, 0x0 }, ++ { 0x4000e, 0x625 }, ++ { 0x4002e, 0x1a }, ++ { 0x4004e, 0x0 }, ++ { 0x4006e, 0x0 }, ++ { 0x4000f, 0x4040 }, ++ { 0x4002f, 0x80 }, ++ { 0x4004f, 0x0 }, ++ { 0x4006f, 0x0 }, ++ { 0x40010, 0x2604 }, ++ { 0x40030, 0x15 }, ++ { 0x40050, 0x0 }, ++ { 0x40070, 0x0 }, ++ { 0x40011, 0x708 }, ++ { 0x40031, 0x5 }, ++ { 0x40051, 0x0 }, ++ { 0x40071, 0x2002 }, ++ { 0x40012, 0x8 }, ++ { 0x40032, 0x80 }, ++ { 0x40052, 0x0 }, ++ { 0x40072, 0x0 }, ++ { 0x40013, 0x2604 }, ++ { 0x40033, 0x1a }, ++ { 0x40053, 0x0 }, ++ { 0x40073, 0x0 }, ++ { 0x40014, 0x708 }, ++ { 0x40034, 0xa }, ++ { 0x40054, 0x0 }, ++ { 0x40074, 0x2002 }, ++ { 0x40015, 0x4040 }, ++ { 0x40035, 0x80 }, ++ { 0x40055, 0x0 }, ++ { 0x40075, 0x0 }, ++ { 0x40016, 0x60a }, ++ { 0x40036, 0x15 }, ++ { 0x40056, 0x1200 }, ++ { 0x40076, 0x0 }, ++ { 0x40017, 0x61a }, ++ { 0x40037, 0x15 }, ++ { 0x40057, 0x1300 }, ++ { 0x40077, 0x0 }, ++ { 0x40018, 0x60a }, ++ { 0x40038, 0x1a }, ++ { 0x40058, 0x1200 }, ++ { 0x40078, 0x0 }, ++ { 0x40019, 0x642 }, ++ { 0x40039, 0x1a }, ++ { 0x40059, 0x1300 }, ++ { 0x40079, 0x0 }, ++ { 0x4001a, 0x4808 }, ++ { 0x4003a, 0x880 }, ++ { 0x4005a, 0x0 }, ++ { 0x4007a, 0x0 }, ++ { 0x900a4, 0x0 }, ++ { 0x900a5, 0x790 }, ++ { 0x900a6, 0x11a }, ++ { 0x900a7, 0x8 }, ++ { 0x900a8, 0x7aa }, ++ { 0x900a9, 0x2a }, ++ { 0x900aa, 0x10 }, ++ { 0x900ab, 0x7b2 }, ++ { 0x900ac, 0x2a }, ++ { 0x900ad, 0x0 }, ++ { 0x900ae, 0x7c8 }, ++ { 0x900af, 0x109 }, ++ { 0x900b0, 0x10 }, ++ { 0x900b1, 0x10 }, ++ { 0x900b2, 0x109 }, ++ { 0x900b3, 0x10 }, ++ { 0x900b4, 0x2a8 }, ++ { 0x900b5, 0x129 }, ++ { 0x900b6, 0x8 }, ++ { 0x900b7, 0x370 }, ++ { 0x900b8, 0x129 }, ++ { 0x900b9, 0xa }, ++ { 0x900ba, 0x3c8 }, ++ { 0x900bb, 0x1a9 }, ++ { 0x900bc, 0xc }, ++ { 0x900bd, 0x408 }, ++ { 0x900be, 0x199 }, ++ { 0x900bf, 0x14 }, ++ { 0x900c0, 0x790 }, ++ { 0x900c1, 0x11a }, ++ { 0x900c2, 0x8 }, ++ { 0x900c3, 0x4 }, ++ { 0x900c4, 0x18 }, ++ { 0x900c5, 0xe }, ++ { 0x900c6, 0x408 }, ++ { 0x900c7, 0x199 }, ++ { 0x900c8, 0x8 }, ++ { 0x900c9, 0x8568 }, ++ { 0x900ca, 0x108 }, ++ { 0x900cb, 0x18 }, ++ { 0x900cc, 0x790 }, ++ { 0x900cd, 0x16a }, ++ { 0x900ce, 0x8 }, ++ { 0x900cf, 0x1d8 }, ++ { 0x900d0, 0x169 }, ++ { 0x900d1, 0x10 }, ++ { 0x900d2, 0x8558 }, ++ { 0x900d3, 0x168 }, ++ { 0x900d4, 0x70 }, ++ { 0x900d5, 0x788 }, ++ { 0x900d6, 0x16a }, ++ { 0x900d7, 0x1ff8 }, ++ { 0x900d8, 0x85a8 }, ++ { 0x900d9, 0x1e8 }, ++ { 0x900da, 0x50 }, ++ { 0x900db, 0x798 }, ++ { 0x900dc, 0x16a }, ++ { 0x900dd, 0x60 }, ++ { 0x900de, 0x7a0 }, ++ { 0x900df, 0x16a }, ++ { 0x900e0, 0x8 }, ++ { 0x900e1, 0x8310 }, ++ { 0x900e2, 0x168 }, ++ { 0x900e3, 0x8 }, ++ { 0x900e4, 0xa310 }, ++ { 0x900e5, 0x168 }, ++ { 0x900e6, 0xa }, ++ { 0x900e7, 0x408 }, ++ { 0x900e8, 0x169 }, ++ { 0x900e9, 0x6e }, ++ { 0x900ea, 0x0 }, ++ { 0x900eb, 0x68 }, ++ { 0x900ec, 0x0 }, ++ { 0x900ed, 0x408 }, ++ { 0x900ee, 0x169 }, ++ { 0x900ef, 0x0 }, ++ { 0x900f0, 0x8310 }, ++ { 0x900f1, 0x168 }, ++ { 0x900f2, 0x0 }, ++ { 0x900f3, 0xa310 }, ++ { 0x900f4, 0x168 }, ++ { 0x900f5, 0x1ff8 }, ++ { 0x900f6, 0x85a8 }, ++ { 0x900f7, 0x1e8 }, ++ { 0x900f8, 0x68 }, ++ { 0x900f9, 0x798 }, ++ { 0x900fa, 0x16a }, ++ { 0x900fb, 0x78 }, ++ { 0x900fc, 0x7a0 }, ++ { 0x900fd, 0x16a }, ++ { 0x900fe, 0x68 }, ++ { 0x900ff, 0x790 }, ++ { 0x90100, 0x16a }, ++ { 0x90101, 0x8 }, ++ { 0x90102, 0x8b10 }, ++ { 0x90103, 0x168 }, ++ { 0x90104, 0x8 }, ++ { 0x90105, 0xab10 }, ++ { 0x90106, 0x168 }, ++ { 0x90107, 0xa }, ++ { 0x90108, 0x408 }, ++ { 0x90109, 0x169 }, ++ { 0x9010a, 0x58 }, ++ { 0x9010b, 0x0 }, ++ { 0x9010c, 0x68 }, ++ { 0x9010d, 0x0 }, ++ { 0x9010e, 0x408 }, ++ { 0x9010f, 0x169 }, ++ { 0x90110, 0x0 }, ++ { 0x90111, 0x8b10 }, ++ { 0x90112, 0x168 }, ++ { 0x90113, 0x1 }, ++ { 0x90114, 0xab10 }, ++ { 0x90115, 0x168 }, ++ { 0x90116, 0x0 }, ++ { 0x90117, 0x1d8 }, ++ { 0x90118, 0x169 }, ++ { 0x90119, 0x80 }, ++ { 0x9011a, 0x790 }, ++ { 0x9011b, 0x16a }, ++ { 0x9011c, 0x18 }, ++ { 0x9011d, 0x7aa }, ++ { 0x9011e, 0x6a }, ++ { 0x9011f, 0xa }, ++ { 0x90120, 0x0 }, ++ { 0x90121, 0x1e9 }, ++ { 0x90122, 0x8 }, ++ { 0x90123, 0x8080 }, ++ { 0x90124, 0x108 }, ++ { 0x90125, 0xf }, ++ { 0x90126, 0x408 }, ++ { 0x90127, 0x169 }, ++ { 0x90128, 0xc }, ++ { 0x90129, 0x0 }, ++ { 0x9012a, 0x68 }, ++ { 0x9012b, 0x9 }, ++ { 0x9012c, 0x0 }, ++ { 0x9012d, 0x1a9 }, ++ { 0x9012e, 0x0 }, ++ { 0x9012f, 0x408 }, ++ { 0x90130, 0x169 }, ++ { 0x90131, 0x0 }, ++ { 0x90132, 0x8080 }, ++ { 0x90133, 0x108 }, ++ { 0x90134, 0x8 }, ++ { 0x90135, 0x7aa }, ++ { 0x90136, 0x6a }, ++ { 0x90137, 0x0 }, ++ { 0x90138, 0x8568 }, ++ { 0x90139, 0x108 }, ++ { 0x9013a, 0xb7 }, ++ { 0x9013b, 0x790 }, ++ { 0x9013c, 0x16a }, ++ { 0x9013d, 0x1f }, ++ { 0x9013e, 0x0 }, ++ { 0x9013f, 0x68 }, ++ { 0x90140, 0x8 }, ++ { 0x90141, 0x8558 }, ++ { 0x90142, 0x168 }, ++ { 0x90143, 0xf }, ++ { 0x90144, 0x408 }, ++ { 0x90145, 0x169 }, ++ { 0x90146, 0xd }, ++ { 0x90147, 0x0 }, ++ { 0x90148, 0x68 }, ++ { 0x90149, 0x0 }, ++ { 0x9014a, 0x408 }, ++ { 0x9014b, 0x169 }, ++ { 0x9014c, 0x0 }, ++ { 0x9014d, 0x8558 }, ++ { 0x9014e, 0x168 }, ++ { 0x9014f, 0x8 }, ++ { 0x90150, 0x3c8 }, ++ { 0x90151, 0x1a9 }, ++ { 0x90152, 0x3 }, ++ { 0x90153, 0x370 }, ++ { 0x90154, 0x129 }, ++ { 0x90155, 0x20 }, ++ { 0x90156, 0x2aa }, ++ { 0x90157, 0x9 }, ++ { 0x90158, 0x8 }, ++ { 0x90159, 0xe8 }, ++ { 0x9015a, 0x109 }, ++ { 0x9015b, 0x0 }, ++ { 0x9015c, 0x8140 }, ++ { 0x9015d, 0x10c }, ++ { 0x9015e, 0x10 }, ++ { 0x9015f, 0x8138 }, ++ { 0x90160, 0x104 }, ++ { 0x90161, 0x8 }, ++ { 0x90162, 0x448 }, ++ { 0x90163, 0x109 }, ++ { 0x90164, 0xf }, ++ { 0x90165, 0x7c0 }, ++ { 0x90166, 0x109 }, ++ { 0x90167, 0x0 }, ++ { 0x90168, 0xe8 }, ++ { 0x90169, 0x109 }, ++ { 0x9016a, 0x47 }, ++ { 0x9016b, 0x630 }, ++ { 0x9016c, 0x109 }, ++ { 0x9016d, 0x8 }, ++ { 0x9016e, 0x618 }, ++ { 0x9016f, 0x109 }, ++ { 0x90170, 0x8 }, ++ { 0x90171, 0xe0 }, ++ { 0x90172, 0x109 }, ++ { 0x90173, 0x0 }, ++ { 0x90174, 0x7c8 }, ++ { 0x90175, 0x109 }, ++ { 0x90176, 0x8 }, ++ { 0x90177, 0x8140 }, ++ { 0x90178, 0x10c }, ++ { 0x90179, 0x0 }, ++ { 0x9017a, 0x478 }, ++ { 0x9017b, 0x109 }, ++ { 0x9017c, 0x0 }, ++ { 0x9017d, 0x1 }, ++ { 0x9017e, 0x8 }, ++ { 0x9017f, 0x8 }, ++ { 0x90180, 0x4 }, ++ { 0x90181, 0x0 }, ++ { 0x90006, 0x8 }, ++ { 0x90007, 0x7c8 }, ++ { 0x90008, 0x109 }, ++ { 0x90009, 0x0 }, ++ { 0x9000a, 0x400 }, ++ { 0x9000b, 0x106 }, ++ { 0xd00e7, 0x400 }, ++ { 0x90017, 0x0 }, ++ { 0x9001f, 0x29 }, ++ { 0x90026, 0x68 }, ++ { 0x400d0, 0x0 }, ++ { 0x400d1, 0x101 }, ++ { 0x400d2, 0x105 }, ++ { 0x400d3, 0x107 }, ++ { 0x400d4, 0x10f }, ++ { 0x400d5, 0x202 }, ++ { 0x400d6, 0x20a }, ++ { 0x400d7, 0x20b }, ++ { 0x2003a, 0x2 }, ++ { 0x200be, 0x3 }, ++ { 0x2000b, 0x465 }, ++ { 0x2000c, 0xfa }, ++ { 0x2000d, 0x9c4 }, ++ { 0x2000e, 0x2c }, ++ { 0x12000b, 0x70 }, ++ { 0x12000c, 0x19 }, ++ { 0x12000d, 0xfa }, ++ { 0x12000e, 0x10 }, ++ { 0x22000b, 0x1c }, ++ { 0x22000c, 0x6 }, ++ { 0x22000d, 0x3e }, ++ { 0x22000e, 0x10 }, ++ { 0x9000c, 0x0 }, ++ { 0x9000d, 0x173 }, ++ { 0x9000e, 0x60 }, ++ { 0x9000f, 0x6110 }, ++ { 0x90010, 0x2152 }, ++ { 0x90011, 0xdfbd }, ++ { 0x90012, 0x2060 }, ++ { 0x90013, 0x6152 }, ++ { 0x20010, 0x5a }, ++ { 0x20011, 0x3 }, ++ { 0x40080, 0xe0 }, ++ { 0x40081, 0x12 }, ++ { 0x40082, 0xe0 }, ++ { 0x40083, 0x12 }, ++ { 0x40084, 0xe0 }, ++ { 0x40085, 0x12 }, ++ { 0x140080, 0xe0 }, ++ { 0x140081, 0x12 }, ++ { 0x140082, 0xe0 }, ++ { 0x140083, 0x12 }, ++ { 0x140084, 0xe0 }, ++ { 0x140085, 0x12 }, ++ { 0x240080, 0xe0 }, ++ { 0x240081, 0x12 }, ++ { 0x240082, 0xe0 }, ++ { 0x240083, 0x12 }, ++ { 0x240084, 0xe0 }, ++ { 0x240085, 0x12 }, ++ { 0x400fd, 0xf }, ++ { 0x10011, 0x1 }, ++ { 0x10012, 0x1 }, ++ { 0x10013, 0x180 }, ++ { 0x10018, 0x1 }, ++ { 0x10002, 0x6209 }, ++ { 0x100b2, 0x1 }, ++ { 0x101b4, 0x1 }, ++ { 0x102b4, 0x1 }, ++ { 0x103b4, 0x1 }, ++ { 0x104b4, 0x1 }, ++ { 0x105b4, 0x1 }, ++ { 0x106b4, 0x1 }, ++ { 0x107b4, 0x1 }, ++ { 0x108b4, 0x1 }, ++ { 0x11011, 0x1 }, ++ { 0x11012, 0x1 }, ++ { 0x11013, 0x180 }, ++ { 0x11018, 0x1 }, ++ { 0x11002, 0x6209 }, ++ { 0x110b2, 0x1 }, ++ { 0x111b4, 0x1 }, ++ { 0x112b4, 0x1 }, ++ { 0x113b4, 0x1 }, ++ { 0x114b4, 0x1 }, ++ { 0x115b4, 0x1 }, ++ { 0x116b4, 0x1 }, ++ { 0x117b4, 0x1 }, ++ { 0x118b4, 0x1 }, ++ { 0x12011, 0x1 }, ++ { 0x12012, 0x1 }, ++ { 0x12013, 0x180 }, ++ { 0x12018, 0x1 }, ++ { 0x12002, 0x6209 }, ++ { 0x120b2, 0x1 }, ++ { 0x121b4, 0x1 }, ++ { 0x122b4, 0x1 }, ++ { 0x123b4, 0x1 }, ++ { 0x124b4, 0x1 }, ++ { 0x125b4, 0x1 }, ++ { 0x126b4, 0x1 }, ++ { 0x127b4, 0x1 }, ++ { 0x128b4, 0x1 }, ++ { 0x13011, 0x1 }, ++ { 0x13012, 0x1 }, ++ { 0x13013, 0x180 }, ++ { 0x13018, 0x1 }, ++ { 0x13002, 0x6209 }, ++ { 0x130b2, 0x1 }, ++ { 0x131b4, 0x1 }, ++ { 0x132b4, 0x1 }, ++ { 0x133b4, 0x1 }, ++ { 0x134b4, 0x1 }, ++ { 0x135b4, 0x1 }, ++ { 0x136b4, 0x1 }, ++ { 0x137b4, 0x1 }, ++ { 0x138b4, 0x1 }, ++ { 0x20089, 0x1 }, ++ { 0x20088, 0x19 }, ++ { 0xc0080, 0x2 }, ++ { 0xd0000, 0x1 } ++}; ++ ++struct dram_fsp_msg ddr_dram_fsp_msg[] = { ++ { ++ /* P0 4000mts 1D */ ++ .drate = 4000, ++ .fw_type = FW_1D_IMAGE, ++ .fsp_cfg = ddr_fsp0_cfg, ++ .fsp_cfg_num = ARRAY_SIZE(ddr_fsp0_cfg), ++ }, ++ { ++ /* P1 400mts 1D */ ++ .drate = 400, ++ .fw_type = FW_1D_IMAGE, ++ .fsp_cfg = ddr_fsp1_cfg, ++ .fsp_cfg_num = ARRAY_SIZE(ddr_fsp1_cfg), ++ }, ++ { ++ /* P2 100mts 1D */ ++ .drate = 100, ++ .fw_type = FW_1D_IMAGE, ++ .fsp_cfg = ddr_fsp2_cfg, ++ .fsp_cfg_num = ARRAY_SIZE(ddr_fsp2_cfg), ++ }, ++ { ++ /* P0 4000mts 2D */ ++ .drate = 4000, ++ .fw_type = FW_2D_IMAGE, ++ .fsp_cfg = ddr_fsp0_2d_cfg, ++ .fsp_cfg_num = ARRAY_SIZE(ddr_fsp0_2d_cfg), ++ }, ++}; ++ ++/* ddr timing config params */ ++struct dram_timing_info dram_timing = { ++ .ddrc_cfg = ddr_ddrc_cfg, ++ .ddrc_cfg_num = ARRAY_SIZE(ddr_ddrc_cfg), ++ .ddrphy_cfg = ddr_ddrphy_cfg, ++ .ddrphy_cfg_num = ARRAY_SIZE(ddr_ddrphy_cfg), ++ .fsp_msg = ddr_dram_fsp_msg, ++ .fsp_msg_num = ARRAY_SIZE(ddr_dram_fsp_msg), ++ .ddrphy_trained_csr = ddr_ddrphy_trained_csr, ++ .ddrphy_trained_csr_num = ARRAY_SIZE(ddr_ddrphy_trained_csr), ++ .ddrphy_pie = ddr_phy_pie, ++ .ddrphy_pie_num = ARRAY_SIZE(ddr_phy_pie), ++ .fsp_table = { 4000, 400, 100, }, ++}; ++ ++static void apply_cfg_patch(struct dram_cfg_param *cfg, int cfg_sz, ++ struct dram_cfg_param *patch, int patch_sz) ++{ ++ int i, j; ++ ++ for (i = 0; i < cfg_sz; i++) ++ for (j = 0; j < patch_sz; j++) ++ if (cfg[i].reg == patch[j].reg) ++ cfg[i].val = patch[j].val; ++} ++ ++void lpddr4_single_rank_training_patch(void) ++{ ++ apply_cfg_patch(ddr_ddrc_cfg, ARRAY_SIZE(ddr_ddrc_cfg), ++ ddr_ddrc_cfg_single_rank_patch, ++ ARRAY_SIZE(ddr_ddrc_cfg_single_rank_patch)); ++ ++ apply_cfg_patch(ddr_fsp0_cfg, ARRAY_SIZE(ddr_fsp0_cfg), ++ ddr_fsp0_cfg_single_rank_patch, ++ ARRAY_SIZE(ddr_fsp0_cfg_single_rank_patch)); ++ ++ apply_cfg_patch(ddr_fsp1_cfg, ARRAY_SIZE(ddr_fsp1_cfg), ++ ddr_fsp1_cfg_single_rank_patch, ++ ARRAY_SIZE(ddr_fsp1_cfg_single_rank_patch)); ++ ++ apply_cfg_patch(ddr_fsp2_cfg, ARRAY_SIZE(ddr_fsp2_cfg), ++ ddr_fsp2_cfg_single_rank_patch, ++ ARRAY_SIZE(ddr_fsp2_cfg_single_rank_patch)); ++ ++ apply_cfg_patch(ddr_fsp0_2d_cfg, ARRAY_SIZE(ddr_fsp0_2d_cfg), ++ ddr_fsp0_2d_cfg_single_rank_patch, ++ ARRAY_SIZE(ddr_fsp0_2d_cfg_single_rank_patch)); ++} diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0014-lpddr4_timing.h.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0014-lpddr4_timing.h.patch new file mode 100644 index 0000000..c5263c1 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0014-lpddr4_timing.h.patch @@ -0,0 +1,12 @@ +--- /home/rossierd/edgemtech/products/edgem1/build/tmp/work/uboot-2024.07-r0/uboot-2024.07/board/toradex/smarc-imx8mp/lpddr4_timing.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./board/toradex/smarc-imx8mp/lpddr4_timing.h 2025-11-21 14:54:55.267379857 +0100 +@@ -0,0 +1,9 @@ ++/* SPDX-License-Identifier: GPL-2.0-or-later */ ++/* Copyright (C) 2024 Toradex */ ++ ++#ifndef __LPDDR4_TIMING_H__ ++#define __LPDDR4_TIMING_H__ ++ ++void lpddr4_single_rank_training_patch(void); ++ ++#endif /* __LPDDR4_TIMING_H__ */ diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0015-MAINTAINERS.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0015-MAINTAINERS.patch new file mode 100644 index 0000000..cfda188 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0015-MAINTAINERS.patch @@ -0,0 +1,13 @@ +--- /home/rossierd/edgemtech/products/edgem1/build/tmp/work/uboot-2024.07-r0/uboot-2024.07/board/toradex/smarc-imx8mp/MAINTAINERS 1970-01-01 01:00:00.000000000 +0100 ++++ ./board/toradex/smarc-imx8mp/MAINTAINERS 2025-11-21 14:54:55.267319243 +0100 +@@ -0,0 +1,10 @@ ++Toradex Smarc iMX8M Plus ++F: arch/arm/dts/imx8mp-toradex-smarc-dev-u-boot.dtsi ++F: board/toradex/smarc-imx8mp/ ++F: board/toradex/common/ ++F: configs/toradex-smarc-imx8mp_defconfig ++F: doc/board/toradex/toradex-smarc-imx8mp.rst ++F: include/configs/toradex-smarc-imx8mp.h ++M: Francesco Dolcini ++S: Maintained ++W: https://www.toradex.com/computer-on-modules/smarc-arm-family/nxp-imx-8m-plus diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0016-Makefile.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0016-Makefile.patch new file mode 100644 index 0000000..190a82c --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0016-Makefile.patch @@ -0,0 +1,12 @@ +--- /home/rossierd/edgemtech/products/edgem1/build/tmp/work/uboot-2024.07-r0/uboot-2024.07/board/toradex/smarc-imx8mp/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ ./board/toradex/smarc-imx8mp/Makefile 2025-11-21 14:54:55.267330121 +0100 +@@ -0,0 +1,9 @@ ++# SPDX-License-Identifier: GPL-2.0-or-later ++# Copyright (C) 2024 Toradex ++ ++obj-y += smarc-imx8mp.o ++ ++ifdef CONFIG_SPL_BUILD ++obj-y += spl.o ++obj-$(CONFIG_IMX8M_LPDDR4) += lpddr4_timing.o ++endif diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0017-smarc-imx8mp.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0017-smarc-imx8mp.c.patch new file mode 100644 index 0000000..b04fd04 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0017-smarc-imx8mp.c.patch @@ -0,0 +1,88 @@ +--- /home/rossierd/edgemtech/products/edgem1/build/tmp/work/uboot-2024.07-r0/uboot-2024.07/board/toradex/smarc-imx8mp/smarc-imx8mp.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./board/toradex/smarc-imx8mp/smarc-imx8mp.c 2025-11-21 14:54:55.267390796 +0100 +@@ -0,0 +1,85 @@ ++// SPDX-License-Identifier: GPL-2.0-or-later ++/* Copyright (C) 2024 Toradex */ ++ ++#include ++#include ++#include ++#include ++ ++#include "../common/tdx-cfg-block.h" ++ ++DECLARE_GLOBAL_DATA_PTR; ++ ++int board_init(void) ++{ ++ return 0; ++} ++ ++int board_phys_sdram_size(phys_size_t *size) ++{ ++ if (!size) ++ return -EINVAL; ++ ++ *size = get_ram_size((void *)PHYS_SDRAM, PHYS_SDRAM_SIZE + PHYS_SDRAM_2_SIZE); ++ ++ return 0; ++} ++ ++#if IS_ENABLED(CONFIG_OF_LIBFDT) && IS_ENABLED(CONFIG_OF_BOARD_SETUP) ++static bool board_has_wifi(void) ++{ ++ struct gpio_desc *desc; ++ ++ if (!gpio_hog_lookup_name("BT_UART_RXD_GPIO", &desc)) ++ return !!dm_gpio_get_value(desc); ++ ++ return true; ++} ++ ++/* ++ * Module variants with a Wi-Fi/Bluetooth module use UART3 for Bluetooth, ++ * those without use UART3 as the SMARC SER3 UART. ++ * Test for a Wi-Fi module and if none found reassign UART3 interface to ++ * the SMARC SER3 pins. ++ */ ++static void ft_board_assign_uart(void *blob) ++{ ++ const char *uart_path = "/soc@0/bus@30800000/spba-bus@30800000/serial@30880000"; ++ const char *pinctrl_path = "/soc@0/bus@30000000/pinctrl@30330000/uart3grp"; ++ int pinctrl_offset; ++ int uart_offset; ++ int bt_offset; ++ u32 phandle; ++ ++ if (board_has_wifi()) ++ return; ++ ++ uart_offset = fdt_path_offset(blob, uart_path); ++ if (uart_offset < 0) ++ return; ++ ++ fdt_delprop(blob, uart_offset, "uart-has-rtscts"); ++ bt_offset = fdt_subnode_offset(blob, uart_offset, "bluetooth"); ++ if (bt_offset < 0) ++ return; ++ ++ fdt_del_node(blob, bt_offset); ++ ++ pinctrl_offset = fdt_path_offset(blob, pinctrl_path); ++ if (pinctrl_offset < 0) ++ return; ++ ++ phandle = fdt_get_phandle(blob, pinctrl_offset); ++ if (phandle < 0) ++ return; ++ ++ fdt_setprop_u32(blob, uart_offset, "pinctrl-0", phandle); ++} ++ ++int ft_board_setup(void *blob, struct bd_info *bd) ++{ ++ ft_board_assign_uart(blob); ++ ++ return ft_common_board_setup(blob, bd); ++} ++#endif diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0018-smarc-imx8mp.env.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0018-smarc-imx8mp.env.patch new file mode 100644 index 0000000..937fc8a --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0018-smarc-imx8mp.env.patch @@ -0,0 +1,23 @@ +--- /home/rossierd/edgemtech/products/edgem1/build/tmp/work/uboot-2024.07-r0/uboot-2024.07/board/toradex/smarc-imx8mp/smarc-imx8mp.env 1970-01-01 01:00:00.000000000 +0100 ++++ ./board/toradex/smarc-imx8mp/smarc-imx8mp.env 2025-11-21 14:54:55.267402206 +0100 +@@ -0,0 +1,20 @@ ++boot_script_dhcp=boot.scr ++boot_targets=mmc1 mmc0 dhcp ++console=ttymxc1 ++fdt_addr_r=0x50200000 ++fdt_board=dev ++initrd_addr=0x43800000 ++initrd_high=0xffffffffffffffff ++kernel_addr_r=CONFIG_SYS_LOAD_ADDR ++kernel_comp_addr_r=0x40200000 ++kernel_comp_size=0x08000000 ++ramdisk_addr_r=0x50300000 ++scriptaddr=0x50280000 ++ ++update_uboot= ++ askenv confirm Did you load flash.bin (y/N)?; ++ if test $confirm = y; then ++ setexpr blkcnt ${filesize} + 0x1ff && setexpr blkcnt ++ ${blkcnt} / 0x200; mmc dev 0 1; mmc write ${loadaddr} 0x0 ++ ${blkcnt}; ++ fi diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0019-spl.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0019-spl.c.patch new file mode 100644 index 0000000..feb3fd6 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0019-spl.c.patch @@ -0,0 +1,133 @@ +--- /home/rossierd/edgemtech/products/edgem1/build/tmp/work/uboot-2024.07-r0/uboot-2024.07/board/toradex/smarc-imx8mp/spl.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./board/toradex/smarc-imx8mp/spl.c 2025-11-21 14:54:55.267413006 +0100 +@@ -0,0 +1,130 @@ ++// SPDX-License-Identifier: GPL-2.0-or-later ++/* Copyright (C) 2024 Toradex */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "lpddr4_timing.h" ++ ++DECLARE_GLOBAL_DATA_PTR; ++ ++int spl_board_boot_device(enum boot_device boot_dev_spl) ++{ ++ return BOOT_DEVICE_BOOTROM; ++} ++ ++void spl_dram_init(void) ++{ ++ /* ++ * Try configuring for dual rank memory falling back to single rank ++ */ ++ if (!ddr_init(&dram_timing)) { ++ puts("DDR configured as dual rank\n"); ++ return; ++ } ++ ++ lpddr4_single_rank_training_patch(); ++ if (!ddr_init(&dram_timing)) { ++ puts("DDR configured as single rank\n"); ++ return; ++ } ++ puts("DDR configuration failed\n"); ++} ++ ++void spl_board_init(void) ++{ ++ arch_misc_init(); ++ ++ /* ++ * Set GIC clock to 500Mhz for OD VDD_SOC. Kernel driver does ++ * not allow to change it. Should set the clock after PMIC ++ * setting done. Default is 400Mhz (system_pll1_800m with div = 2) ++ * set by ROM for ND VDD_SOC ++ */ ++ clock_enable(CCGR_GIC, 0); ++ clock_set_target_val(GIC_CLK_ROOT, CLK_ROOT_ON | CLK_ROOT_SOURCE_SEL(5)); ++ clock_enable(CCGR_GIC, 1); ++ ++ puts("Normal Boot\n"); ++} ++ ++int power_init_board(void) ++{ ++ struct udevice *dev; ++ int ret; ++ ++ ret = pmic_get("pmic@25", &dev); ++ if (ret == -ENODEV) { ++ puts("No pmic@25\n"); ++ return 0; ++ } ++ if (ret < 0) ++ return ret; ++ ++ /* BUCKxOUT_DVS0/1 control BUCK123 output */ ++ pmic_reg_write(dev, PCA9450_BUCK123_DVS, 0x29); ++ ++ /* ++ * Increase VDD_SOC to typical value 0.95V before first ++ * DRAM access, set DVS1 to 0.85V for suspend. ++ * Enable DVS control through PMIC_STBY_REQ and ++ * set B1_ENMODE=1 (ON by PMIC_ON_REQ=H) ++ */ ++ if (IS_ENABLED(CONFIG_IMX8M_VDD_SOC_850MV)) ++ /* set DVS0 to 0.85v for special case */ ++ pmic_reg_write(dev, PCA9450_BUCK1OUT_DVS0, 0x14); ++ else ++ pmic_reg_write(dev, PCA9450_BUCK1OUT_DVS0, 0x1c); ++ ++ pmic_reg_write(dev, PCA9450_BUCK1OUT_DVS1, 0x14); ++ pmic_reg_write(dev, PCA9450_BUCK1CTRL, 0x59); ++ ++ /* ++ * Kernel uses OD/OD freq for SOC. ++ * To avoid timing risk from SOC to ARM,increase VDD_ARM to OD ++ * voltage 0.95V. ++ */ ++ pmic_reg_write(dev, PCA9450_BUCK2OUT_DVS0, 0x1c); ++ ++ /* set LDO4 and CONFIG2 to enable the I2C level translator */ ++ pmic_reg_write(dev, PCA9450_LDO4CTRL, 0x59); ++ pmic_reg_write(dev, PCA9450_CONFIG2, 0x1); ++ ++ return 0; ++} ++ ++/* Do not use BSS area in this phase */ ++void board_init_f(ulong dummy) ++{ ++ int ret; ++ ++ arch_cpu_init(); ++ ++ init_uart_clk(3); ++ ++ ret = spl_early_init(); ++ if (ret) { ++ debug("spl_init() failed: %d\n", ret); ++ hang(); ++ } ++ ++ preloader_console_init(); ++ ++ enable_tzc380(); ++ ++ /* PMIC initialization */ ++ power_init_board(); ++ ++ /* DDR initialization */ ++ spl_dram_init(); ++} diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0020-lpddr4_timing.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0020-lpddr4_timing.c.patch new file mode 100644 index 0000000..360579d --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0020-lpddr4_timing.c.patch @@ -0,0 +1,65 @@ +--- /home/rossierd/edgemtech/products/edgem1/build/tmp/work/uboot-2024.07-r0/uboot-2024.07/board/toradex/verdin-imx8mm/lpddr4_timing.c 2025-11-21 14:56:51.518826848 +0100 ++++ ./board/toradex/verdin-imx8mm/lpddr4_timing.c 2025-11-21 14:54:55.267114225 +0100 +@@ -18,7 +18,7 @@ + {0x3d400000, 0xa1080020}, + {0x3d400020, 0x202}, + {0x3d400024, 0x3a980}, +- {0x3d400064, 0x2d00d2}, ++ {0x3d400064, 0x2d011d}, + {0x3d4000d0, 0xc00305ba}, + {0x3d4000d4, 0x940000}, + {0x3d4000dc, 0xd4002d}, +@@ -34,7 +34,7 @@ + {0x3d40011c, 0x402}, + {0x3d400130, 0x20600}, + {0x3d400134, 0xc100002}, +- {0x3d400138, 0xd8}, ++ {0x3d400138, 0x123}, + {0x3d400144, 0x96004b}, + {0x3d400180, 0x2ee0017}, + {0x3d400184, 0x2605b8e}, +@@ -56,7 +56,7 @@ + {0x3d400204, 0x80808}, + {0x3d400214, 0x7070707}, + {0x3d400218, 0x7070707}, +- {0x3d40021c, 0xf0f}, ++ {0x3d40021c, 0xf07}, + {0x3d400250, 0x29001701}, + {0x3d400254, 0x2c}, + {0x3d40025c, 0x4000030}, +@@ -71,7 +71,7 @@ + {0x3d402020, 0x0}, + {0x3d402024, 0x7d00}, + {0x3d402050, 0x20d040}, +- {0x3d402064, 0x6001c}, ++ {0x3d402064, 0x60026}, + {0x3d4020dc, 0x840000}, + {0x3d4020e0, 0x310000}, + {0x3d4020e8, 0x66004d}, +@@ -86,7 +86,7 @@ + {0x3d40211c, 0x302}, + {0x3d402130, 0x20300}, + {0x3d402134, 0xa100002}, +- {0x3d402138, 0x1d}, ++ {0x3d402138, 0x27}, + {0x3d402144, 0x14000a}, + {0x3d402180, 0x640004}, + {0x3d402190, 0x3818200}, +@@ -96,7 +96,7 @@ + {0x3d403020, 0x0}, + {0x3d403024, 0x1f40}, + {0x3d403050, 0x20d040}, +- {0x3d403064, 0x30007}, ++ {0x3d403064, 0x3000A}, + {0x3d4030dc, 0x840000}, + {0x3d4030e0, 0x310000}, + {0x3d4030e8, 0x66004d}, +@@ -111,7 +111,7 @@ + {0x3d40311c, 0x302}, + {0x3d403130, 0x20300}, + {0x3d403134, 0xa100002}, +- {0x3d403138, 0x8}, ++ {0x3d403138, 0xA}, + {0x3d403144, 0x50003}, + {0x3d403180, 0x190004}, + {0x3d403190, 0x3818200}, diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0021-verdin-imx8mm.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0021-verdin-imx8mm.c.patch new file mode 100644 index 0000000..b07c27c --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0021-verdin-imx8mm.c.patch @@ -0,0 +1,57 @@ +--- /home/rossierd/edgemtech/products/edgem1/build/tmp/work/uboot-2024.07-r0/uboot-2024.07/board/toradex/verdin-imx8mm/verdin-imx8mm.c 2025-11-21 14:56:51.518826848 +0100 ++++ ./board/toradex/verdin-imx8mm/verdin-imx8mm.c 2025-11-21 14:54:55.267149306 +0100 +@@ -84,7 +84,8 @@ + */ + is_wifi = (tdx_hw_tag.prodid == VERDIN_IMX8MMQ_WIFI_BT_IT) || + (tdx_hw_tag.prodid == VERDIN_IMX8MMDL_WIFI_BT_IT) || +- (tdx_hw_tag.prodid == VERDIN_IMX8MMQ_WIFI_BT_IT_NO_CAN); ++ (tdx_hw_tag.prodid == VERDIN_IMX8MMQ_WIFI_BT_IT_NO_CAN) || ++ (tdx_hw_tag.prodid == VERDIN_IMX8MMQ_4G_WIFI_BT_ET); + } + + switch (get_pcb_revision()) { +@@ -117,7 +118,7 @@ + if (!size) + return -EINVAL; + +- *size = get_ram_size((void *)PHYS_SDRAM, PHYS_SDRAM_SIZE); ++ *size = get_ram_size((void *)PHYS_SDRAM, PHYS_SDRAM_SIZE + PHYS_SDRAM_2_SIZE); + + return 0; + } +@@ -125,6 +126,35 @@ + #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP) + int ft_board_setup(void *blob, struct bd_info *bd) + { ++ const char *canoscpath = "/oscillator"; ++ int freq = 40000000; /* 40 MHz is used on most variants */ ++ int canoscoff, ret; ++ ++ canoscoff = fdt_path_offset(blob, canoscpath); ++ if (canoscoff < 0) /* No CAN oscillator found. */ ++ goto exit; ++ ++ /* ++ * The following "prodid" (PID4 in Toradex naming) use ++ * a 20MHz CAN oscillator: ++ * - 0055, V1.1A, V1.1B, V1.1C and V1.1D ++ * - 0059, V1.1A and V1.1B ++ */ ++ if ((tdx_hw_tag.ver_major == 1 && tdx_hw_tag.ver_minor == 1) && ++ ((tdx_hw_tag.prodid == VERDIN_IMX8MMQ_IT && ++ tdx_hw_tag.ver_assembly <= 1) || /* 0059 rev. A or B */ ++ (tdx_hw_tag.prodid == VERDIN_IMX8MMQ_WIFI_BT_IT && ++ tdx_hw_tag.ver_assembly <= 3))) { /* 0055 rev. A/B/C/D */ ++ freq = 20000000; ++ } ++ ++ ret = fdt_setprop_u32(blob, canoscoff, "clock-frequency", freq); ++ if (ret < 0) { ++ printf("Failed to set CAN oscillator clock-frequency, ret=%d\n", ++ ret); ++ } ++ ++exit: + return ft_common_board_setup(blob, bd); + } + #endif diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0022-apalis_imx6_defconfig.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0022-apalis_imx6_defconfig.patch new file mode 100644 index 0000000..8066b44 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0022-apalis_imx6_defconfig.patch @@ -0,0 +1,11 @@ +--- /home/rossierd/edgemtech/products/edgem1/build/tmp/work/uboot-2024.07-r0/uboot-2024.07/configs/apalis_imx6_defconfig 2025-11-21 14:56:51.554341987 +0100 ++++ ./configs/apalis_imx6_defconfig 2025-11-21 14:54:55.283301958 +0100 +@@ -33,7 +33,7 @@ + CONFIG_BOOTDELAY=1 + CONFIG_BOOTCOMMAND="run distro_bootcmd; usb start; setenv stdout serial,vidconsole; setenv stdin serial,usbkbd" + CONFIG_USE_PREBOOT=y +-CONFIG_PREBOOT="test -n ${fdtfile} || setenv fdtfile imx6q-apalis-${fdt_board}.dtb" ++CONFIG_PREBOOT="test -n ${fdtfile} || setenv fdtfile imx6q-apalis${variant}-${fdt_board}.dtb" + CONFIG_SYS_CBSIZE=1024 + CONFIG_SYS_PBSIZE=1055 + CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE=y diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0023-colibri_imx6_defconfig.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0023-colibri_imx6_defconfig.patch new file mode 100644 index 0000000..91741df --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0023-colibri_imx6_defconfig.patch @@ -0,0 +1,11 @@ +--- /home/rossierd/edgemtech/products/edgem1/build/tmp/work/uboot-2024.07-r0/uboot-2024.07/configs/colibri_imx6_defconfig 2025-11-21 14:56:51.556341839 +0100 ++++ ./configs/colibri_imx6_defconfig 2025-11-21 14:54:55.285120816 +0100 +@@ -32,7 +32,7 @@ + CONFIG_BOOTDELAY=1 + CONFIG_BOOTCOMMAND="run distro_bootcmd; usb start; setenv stdout serial,vidconsole; setenv stdin serial,usbkbd" + CONFIG_USE_PREBOOT=y +-CONFIG_PREBOOT="test -n ${fdtfile} || setenv fdtfile imx6dl-colibri-${fdt_board}.dtb" ++CONFIG_PREBOOT="test -n ${fdtfile} || setenv fdtfile imx6dl-colibri${variant}-${fdt_board}.dtb" + CONFIG_SYS_CBSIZE=1024 + CONFIG_SYS_PBSIZE=1056 + CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE=y diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0024-toradex-smarc-imx8mp_defconfig.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0024-toradex-smarc-imx8mp_defconfig.patch new file mode 100644 index 0000000..784f920 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0024-toradex-smarc-imx8mp_defconfig.patch @@ -0,0 +1,187 @@ +--- /home/rossierd/edgemtech/products/edgem1/build/tmp/work/uboot-2024.07-r0/uboot-2024.07/configs/toradex-smarc-imx8mp_defconfig 1970-01-01 01:00:00.000000000 +0100 ++++ ./configs/toradex-smarc-imx8mp_defconfig 2025-11-21 14:54:55.299537021 +0100 +@@ -0,0 +1,184 @@ ++CONFIG_ARM=y ++CONFIG_ARCH_IMX8M=y ++CONFIG_TEXT_BASE=0x40200000 ++CONFIG_SPL_GPIO=y ++CONFIG_SPL_LIBCOMMON_SUPPORT=y ++CONFIG_SPL_LIBGENERIC_SUPPORT=y ++CONFIG_NR_DRAM_BANKS=2 ++CONFIG_ENV_SIZE=0x2000 ++CONFIG_ENV_OFFSET=0xFFFFDE00 ++CONFIG_DM_GPIO=y ++CONFIG_DEFAULT_DEVICE_TREE="imx8mp-toradex-smarc-dev" ++CONFIG_SPL_TEXT_BASE=0x920000 ++CONFIG_TARGET_TORADEX_SMARC_IMX8MP=y ++CONFIG_OF_LIBFDT_OVERLAY=y ++CONFIG_DM_RESET=y ++CONFIG_SYS_MONITOR_LEN=524288 ++CONFIG_SPL_MMC=y ++CONFIG_SPL_SERIAL=y ++CONFIG_SPL_DRIVERS_MISC=y ++CONFIG_SPL_STACK=0x960000 ++CONFIG_SPL_SYS_MALLOC_F_LEN=0x4000 ++CONFIG_SPL_HAS_BSS_LINKER_SECTION=y ++CONFIG_SPL_BSS_START_ADDR=0x98fc00 ++CONFIG_SPL_BSS_MAX_SIZE=0x400 ++CONFIG_SPL=y ++CONFIG_IMX_BOOTAUX=y ++CONFIG_SPL_IMX_ROMAPI_LOADADDR=0x48000000 ++CONFIG_SYS_LOAD_ADDR=0x48200000 ++CONFIG_PCI=y ++CONFIG_SYS_MEMTEST_START=0x40000000 ++CONFIG_SYS_MEMTEST_END=0x80000000 ++CONFIG_REMAKE_ELF=y ++CONFIG_FIT=y ++CONFIG_FIT_EXTERNAL_OFFSET=0x3000 ++CONFIG_FIT_VERBOSE=y ++CONFIG_SPL_LOAD_FIT=y ++CONFIG_BOOTSTD_FULL=y ++# CONFIG_BOOTSTD_BOOTCOMMAND is not set ++CONFIG_BOOTDELAY=1 ++CONFIG_OF_SYSTEM_SETUP=y ++CONFIG_BOOTCOMMAND="bootflow scan -b" ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="test -n ${fdtfile} || setenv fdtfile imx8mp-toradex-smarc-dev.dtb" ++CONFIG_SYS_CBSIZE=2048 ++CONFIG_SYS_PBSIZE=2081 ++CONFIG_LOG=y ++# CONFIG_DISPLAY_BOARDINFO is not set ++CONFIG_DISPLAY_BOARDINFO_LATE=y ++CONFIG_ARCH_MISC_INIT=y ++CONFIG_SPL_MAX_SIZE=0x26000 ++CONFIG_SPL_BOARD_INIT=y ++CONFIG_SPL_BOOTROM_SUPPORT=y ++CONFIG_SPL_SYS_MALLOC_SIMPLE=y ++# CONFIG_SPL_SHARES_INIT_SP_ADDR is not set ++CONFIG_SPL_SYS_MALLOC=y ++CONFIG_SPL_HAS_CUSTOM_MALLOC_START=y ++CONFIG_SPL_CUSTOM_SYS_MALLOC_ADDR=0x42200000 ++CONFIG_SPL_SYS_MALLOC_SIZE=0x80000 ++CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR=y ++CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x300 ++CONFIG_SPL_I2C=y ++CONFIG_SPL_POWER=y ++CONFIG_SPL_WATCHDOG=y ++CONFIG_SYS_PROMPT="SMARC iMX8MP # " ++# CONFIG_BOOTM_NETBSD is not set ++CONFIG_CMD_ASKENV=y ++# CONFIG_CMD_EXPORTENV is not set ++CONFIG_CRC32_VERIFY=y ++CONFIG_CMD_MD5SUM=y ++CONFIG_MD5SUM_VERIFY=y ++CONFIG_CMD_MEMTEST=y ++CONFIG_CMD_CLK=y ++CONFIG_CMD_FUSE=y ++CONFIG_CMD_GPIO=y ++CONFIG_CMD_I2C=y ++CONFIG_CMD_MMC=y ++CONFIG_CMD_PCI=y ++CONFIG_CMD_READ=y ++CONFIG_CMD_USB=y ++CONFIG_CMD_USB_MASS_STORAGE=y ++CONFIG_CMD_BOOTCOUNT=y ++CONFIG_CMD_CACHE=y ++CONFIG_CMD_TIME=y ++CONFIG_CMD_SYSBOOT=y ++CONFIG_CMD_UUID=y ++CONFIG_CMD_REGULATOR=y ++CONFIG_CMD_EXT4_WRITE=y ++# CONFIG_ISO_PARTITION is not set ++# CONFIG_SPL_EFI_PARTITION is not set ++CONFIG_OF_CONTROL=y ++CONFIG_SPL_OF_CONTROL=y ++CONFIG_ENV_OVERWRITE=y ++CONFIG_ENV_IS_IN_MMC=y ++CONFIG_SYS_RELOC_GD_ENV_ADDR=y ++CONFIG_SYS_MMC_ENV_DEV=0 ++CONFIG_SYS_MMC_ENV_PART=1 ++CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y ++CONFIG_USE_ETHPRIME=y ++CONFIG_ETHPRIME="eth0" ++CONFIG_VERSION_VARIABLE=y ++CONFIG_NET_RANDOM_ETHADDR=y ++CONFIG_IP_DEFRAG=y ++CONFIG_TFTP_BLOCKSIZE=4096 ++CONFIG_SPL_DM=y ++CONFIG_BOOTCOUNT_LIMIT=y ++CONFIG_BOOTCOUNT_ENV=y ++CONFIG_CLK_COMPOSITE_CCF=y ++CONFIG_CLK_IMX8MP=y ++CONFIG_FSL_CAAM=y ++CONFIG_USB_FUNCTION_FASTBOOT=y ++CONFIG_FASTBOOT_BUF_ADDR=0x44200000 ++CONFIG_FASTBOOT_FLASH=y ++CONFIG_FASTBOOT_UUU_SUPPORT=y ++CONFIG_FASTBOOT_FLASH_MMC_DEV=0 ++CONFIG_GPIO_HOG=y ++CONFIG_SPL_GPIO_HOG=y ++CONFIG_MXC_GPIO=y ++CONFIG_DM_PCA953X=y ++CONFIG_DM_I2C=y ++CONFIG_LED=y ++CONFIG_LED_GPIO=y ++CONFIG_I2C_EEPROM=y ++CONFIG_SUPPORT_EMMC_BOOT=y ++CONFIG_MMC_IO_VOLTAGE=y ++CONFIG_SPL_MMC_IO_VOLTAGE=y ++CONFIG_MMC_UHS_SUPPORT=y ++CONFIG_SPL_MMC_UHS_SUPPORT=y ++CONFIG_MMC_HS400_ES_SUPPORT=y ++CONFIG_MMC_HS400_SUPPORT=y ++CONFIG_SPL_MMC_HS400_SUPPORT=y ++CONFIG_FSL_USDHC=y ++CONFIG_PHY_ADDR_ENABLE=y ++CONFIG_PHY_TI_DP83867=y ++CONFIG_DM_MDIO=y ++CONFIG_DM_ETH_PHY=y ++CONFIG_DWC_ETH_QOS=y ++CONFIG_DWC_ETH_QOS_IMX=y ++CONFIG_FEC_MXC=y ++CONFIG_RGMII=y ++CONFIG_MII=y ++CONFIG_NVME_PCI=y ++CONFIG_PCIE_DW_IMX=y ++CONFIG_PHY=y ++CONFIG_PHY_IMX8MQ_USB=y ++CONFIG_PHY_IMX8M_PCIE=y ++CONFIG_PINCTRL=y ++CONFIG_SPL_PINCTRL=y ++CONFIG_PINCTRL_IMX8M=y ++CONFIG_POWER_DOMAIN=y ++CONFIG_IMX8M_POWER_DOMAIN=y ++CONFIG_IMX8MP_HSIOMIX_BLKCTRL=y ++CONFIG_DM_PMIC=y ++CONFIG_DM_PMIC_PCA9450=y ++CONFIG_SPL_DM_PMIC_PCA9450=y ++CONFIG_DM_REGULATOR_PCA9450=y ++CONFIG_SPL_DM_REGULATOR_PCA9450=y ++CONFIG_DM_REGULATOR_FIXED=y ++CONFIG_DM_REGULATOR_GPIO=y ++CONFIG_DM_SERIAL=y ++CONFIG_MXC_UART=y ++CONFIG_SYSRESET=y ++CONFIG_SPL_SYSRESET=y ++CONFIG_SYSRESET_PSCI=y ++CONFIG_SYSRESET_WATCHDOG=y ++CONFIG_DM_THERMAL=y ++CONFIG_IMX_TMU=y ++CONFIG_USB=y ++# CONFIG_SPL_DM_USB is not set ++CONFIG_DM_USB_GADGET=y ++CONFIG_USB_XHCI_HCD=y ++CONFIG_USB_XHCI_DWC3=y ++CONFIG_USB_XHCI_DWC3_OF_SIMPLE=y ++CONFIG_USB_EHCI_HCD=y ++# CONFIG_USB_EHCI_MX7 is not set ++CONFIG_USB_DWC3=y ++CONFIG_USB_DWC3_GENERIC=y ++CONFIG_USB_KEYBOARD=y ++CONFIG_USB_HOST_ETHER=y ++CONFIG_USB_GADGET=y ++CONFIG_USB_GADGET_MANUFACTURER="Toradex" ++CONFIG_USB_GADGET_VENDOR_NUM=0x1b67 ++CONFIG_USB_GADGET_PRODUCT_NUM=0x4000 ++CONFIG_IMX_WATCHDOG=y ++CONFIG_HEXDUMP=y diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0025-verdin-imx8mm_defconfig.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0025-verdin-imx8mm_defconfig.patch new file mode 100644 index 0000000..2221653 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0025-verdin-imx8mm_defconfig.patch @@ -0,0 +1,20 @@ +--- /home/rossierd/edgemtech/products/edgem1/build/tmp/work/uboot-2024.07-r0/uboot-2024.07/configs/verdin-imx8mm_defconfig 2025-11-21 14:56:51.574340514 +0100 ++++ ./configs/verdin-imx8mm_defconfig 2025-11-21 14:54:55.298673396 +0100 +@@ -29,6 +29,7 @@ + CONFIG_FIT_EXTERNAL_OFFSET=0x3000 + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_LOAD_FIT=y ++CONFIG_SPL_LOAD_FIT_ADDRESS=0x44000000 + CONFIG_DISTRO_DEFAULTS=y + CONFIG_BOOTDELAY=1 + CONFIG_OF_SYSTEM_SETUP=y +@@ -99,8 +100,7 @@ + CONFIG_SPL_CLK_IMX8MM=y + CONFIG_CLK_IMX8MM=y + CONFIG_USB_FUNCTION_FASTBOOT=y +-CONFIG_FASTBOOT_BUF_ADDR=0x42800000 +-CONFIG_FASTBOOT_BUF_SIZE=0x40000000 ++CONFIG_FASTBOOT_BUF_ADDR=0x44200000 + CONFIG_FASTBOOT_FLASH=y + CONFIG_FASTBOOT_UUU_SUPPORT=y + CONFIG_FASTBOOT_FLASH_MMC_DEV=0 diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0026-verdin-imx8mp_defconfig.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0026-verdin-imx8mp_defconfig.patch new file mode 100644 index 0000000..2f6c824 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0026-verdin-imx8mp_defconfig.patch @@ -0,0 +1,28 @@ +--- /home/rossierd/edgemtech/products/edgem1/build/tmp/work/uboot-2024.07-r0/uboot-2024.07/configs/verdin-imx8mp_defconfig 2025-11-21 14:56:51.574340514 +0100 ++++ ./configs/verdin-imx8mp_defconfig 2025-11-21 14:54:55.298690449 +0100 +@@ -38,6 +38,7 @@ + CONFIG_FIT_EXTERNAL_OFFSET=0x3000 + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_LOAD_FIT=y ++CONFIG_SPL_LOAD_FIT_ADDRESS=0x44000000 + CONFIG_DISTRO_DEFAULTS=y + CONFIG_BOOTDELAY=1 + CONFIG_OF_SYSTEM_SETUP=y +@@ -81,6 +82,7 @@ + CONFIG_CMD_CLK=y + CONFIG_CMD_FUSE=y + CONFIG_CMD_GPIO=y ++CONFIG_CMD_GPIO_READ=y + CONFIG_CMD_I2C=y + CONFIG_CMD_MMC=y + CONFIG_CMD_PCI=y +@@ -111,8 +113,7 @@ + CONFIG_CLK_IMX8MP=y + CONFIG_FSL_CAAM=y + CONFIG_USB_FUNCTION_FASTBOOT=y +-CONFIG_FASTBOOT_BUF_ADDR=0x42800000 +-CONFIG_FASTBOOT_BUF_SIZE=0x40000000 ++CONFIG_FASTBOOT_BUF_ADDR=0x44200000 + CONFIG_FASTBOOT_FLASH=y + CONFIG_FASTBOOT_UUU_SUPPORT=y + CONFIG_FASTBOOT_FLASH_MMC_DEV=0 diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0027-index.rst.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0027-index.rst.patch new file mode 100644 index 0000000..b59ad17 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0027-index.rst.patch @@ -0,0 +1,7 @@ +--- /home/rossierd/edgemtech/products/edgem1/build/tmp/work/uboot-2024.07-r0/uboot-2024.07/doc/board/toradex/index.rst 2025-11-21 14:56:51.590210899 +0100 ++++ ./doc/board/toradex/index.rst 2025-11-21 14:54:55.307180811 +0100 +@@ -12,3 +12,4 @@ + verdin-am62 + verdin-imx8mm + verdin-imx8mp ++ smarc-imx8mp diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0028-smarc-imx8mp.rst.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0028-smarc-imx8mp.rst.patch new file mode 100644 index 0000000..64208d3 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0028-smarc-imx8mp.rst.patch @@ -0,0 +1,119 @@ +--- /home/rossierd/edgemtech/products/edgem1/build/tmp/work/uboot-2024.07-r0/uboot-2024.07/doc/board/toradex/smarc-imx8mp.rst 1970-01-01 01:00:00.000000000 +0100 ++++ ./doc/board/toradex/smarc-imx8mp.rst 2025-11-21 14:54:55.307193671 +0100 +@@ -0,0 +1,116 @@ ++.. SPDX-License-Identifier: GPL-2.0-or-later ++ ++Toradex SMARC iMX8M Plus Module ++=============================== ++ ++- SoM: https://www.toradex.com/computer-on-modules/smarc-arm-family/nxp-imx-8m-plus ++- Carrier board: https://www.toradex.com/products/carrier-board/smarc-development-board-kit ++ ++Quick Start ++----------- ++ ++- Build the ARM trusted firmware binary ++- Get the DDR firmware ++- Build U-Boot ++- Flash to eMMC ++- Boot ++ ++Get and Build the ARM Trusted Firmware (Trusted Firmware A) ++----------------------------------------------------------- ++ ++.. code-block:: bash ++ ++ $ echo "Downloading and building TF-A..." ++ $ git clone https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git ++ $ cd trusted-firmware-a ++ ++Then build ATF (TF-A): ++ ++.. code-block:: bash ++ ++ $ export CROSS_COMPILE=aarch64-linux-gnu- ++ $ make PLAT=imx8mp IMX_BOOT_UART_BASE=0x30a60000 bl31 ++ $ cp build/imx8mp/release/bl31.bin ../ ++ ++Get the DDR Firmware ++-------------------- ++ ++.. code-block:: bash ++ ++ $ cd .. ++ $ wget https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/firmware-imx-8.10.1.bin ++ $ chmod +x firmware-imx-8.10.1.bin ++ $ ./firmware-imx-8.10.1.bin ++ $ cp firmware-imx-8.10.1/firmware/ddr/synopsys/lpddr4*_202006.bin ./ ++ ++Build U-Boot ++------------ ++ ++.. code-block:: bash ++ ++ $ export CROSS_COMPILE=aarch64-linux-gnu- ++ $ make toradex-smarc-imx8mp_defconfig ++ $ make ++ ++Flash to eMMC ++------------- ++ ++.. code-block:: bash ++ ++ > tftpboot ${loadaddr} flash.bin ++ > setexpr blkcnt ${filesize} + 0x1ff && setexpr blkcnt ${blkcnt} / 0x200 ++ > mmc dev 0 1 && mmc write ${loadaddr} 0x0 ${blkcnt} ++ ++As a convenience, instead of the last two commands, one may also use the update ++U-Boot wrapper: ++ ++.. code-block:: bash ++ ++ > run update_uboot ++ ++Boot ++---- ++ ++ATF, U-Boot proper and u-boot.dtb images are packed into a FIT image, ++which is loaded and parsed by SPL. ++ ++Boot sequence is: ++ ++* SPL ---> ATF (TF-A) ---> U-Boot proper ++ ++Output:: ++ ++U-Boot SPL 2024.07-7.2.0-devel+git.3f772959501c (Jul 01 2024 - 18:07:18 +0000) ++Training FAILED ++DDR configured as single rank ++SEC0: RNG instantiated ++Normal Boot ++Trying to boot from BOOTROM ++Boot Stage: Primary boot ++Find img info 0x4802f400, size 1052 ++Need continue download 1024 ++NOTICE: Do not release JR0 to NS as it can be used by HAB ++NOTICE: BL31: v2.10.0 (release):android-14.0.0_2.2.0-rc2-0-g7c64d4e864c1-dirty ++NOTICE: BL31: Built : 10:35:32, Aug 29 2024 ++ ++ ++U-Boot 2024.07-7.2.0-devel+git.3f772959501c (Jul 01 2024 - 18:07:18 +0000) ++ ++CPU: Freescale i.MX8MP[8] rev1.1 1600 MHz (running at 1200 MHz) ++CPU: Industrial temperature grade (-40C to 105C) at 71C ++Reset cause: POR ++DRAM: 4 GiB ++Core: 183 devices, 31 uclasses, devicetree: separate ++WDT: Started watchdog@30280000 with servicing every 1000ms (60s timeout) ++MMC: FSL_SDHC: 1, FSL_SDHC: 0 ++Loading Environment from MMC... Reading from MMC(0)... OK ++In: serial@30a60000 ++Out: serial@30a60000 ++Err: serial@30a60000 ++Model: Toradex 0097 SMARC iMX8M Plus Quad 4GB WB IT V1.0A ++Serial#: 15603364 ++SEC0: RNG instantiated ++Net: Get shared mii bus on ethernet@30be0000 ++eth1: ethernet@30be0000, eth0: ethernet@30bf0000 [PRIME] ++Hit any key to stop autoboot: 0 ++SMARC iMX8MP # diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0029-imx8mm-verdin.dtsi.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0029-imx8mm-verdin.dtsi.patch new file mode 100644 index 0000000..3667b53 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0029-imx8mm-verdin.dtsi.patch @@ -0,0 +1,11 @@ +--- /home/rossierd/edgemtech/products/edgem1/build/tmp/work/uboot-2024.07-r0/uboot-2024.07/dts/upstream/src/arm64/freescale/imx8mm-verdin.dtsi 2025-11-21 14:56:52.006308725 +0100 ++++ ./dts/upstream/src/arm64/freescale/imx8mm-verdin.dtsi 2025-11-21 14:54:55.548301147 +0100 +@@ -145,7 +145,7 @@ + regulator-max-microvolt = <3300000>; + regulator-min-microvolt = <3300000>; + regulator-name = "+V3.3_SD"; +- startup-delay-us = <2000>; ++ startup-delay-us = <20000>; + }; + + reserved-memory { diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0030-imx8mp-verdin.dtsi.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0030-imx8mp-verdin.dtsi.patch new file mode 100644 index 0000000..4dec4e8 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0030-imx8mp-verdin.dtsi.patch @@ -0,0 +1,11 @@ +--- /home/rossierd/edgemtech/products/edgem1/build/tmp/work/uboot-2024.07-r0/uboot-2024.07/dts/upstream/src/arm64/freescale/imx8mp-verdin.dtsi 2025-11-21 14:56:52.009308513 +0100 ++++ ./dts/upstream/src/arm64/freescale/imx8mp-verdin.dtsi 2025-11-21 14:54:55.549694624 +0100 +@@ -151,7 +151,7 @@ + regulator-max-microvolt = <3300000>; + regulator-min-microvolt = <3300000>; + regulator-name = "+V3.3_SD"; +- startup-delay-us = <2000>; ++ startup-delay-us = <20000>; + }; + + reserved-memory { diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0031-toradex-smarc-imx8mp.h.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0031-toradex-smarc-imx8mp.h.patch new file mode 100644 index 0000000..9d39cf3 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0031-toradex-smarc-imx8mp.h.patch @@ -0,0 +1,31 @@ +--- /home/rossierd/edgemtech/products/edgem1/build/tmp/work/uboot-2024.07-r0/uboot-2024.07/include/configs/toradex-smarc-imx8mp.h 1970-01-01 01:00:00.000000000 +0100 ++++ ./include/configs/toradex-smarc-imx8mp.h 2025-11-21 14:54:55.599947130 +0100 +@@ -0,0 +1,28 @@ ++/* SPDX-License-Identifier: GPL-2.0-or-later */ ++/* Copyright (C) 2024 Toradex */ ++ ++#ifndef __TORADEX_SMARC_IMX8MP_H ++#define __TORADEX_SMARC_IMX8MP_H ++ ++#include ++#include ++ ++#define CFG_SYS_UBOOT_BASE \ ++ (QSPI0_AMBA_BASE + CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR * 512) ++ ++#ifdef CONFIG_SPL_BUILD ++/* malloc f used before GD_FLG_FULL_MALLOC_INIT set */ ++#define CFG_MALLOC_F_ADDR 0x184000 ++#endif /* CONFIG_SPL_BUILD */ ++ ++#define CFG_SYS_INIT_RAM_ADDR 0x40000000 ++#define CFG_SYS_INIT_RAM_SIZE SZ_512K ++ ++/* i.MX 8M Plus supports max. 8GB memory in two albeit consecutive banks */ ++#define CFG_SYS_SDRAM_BASE 0x40000000 ++#define PHYS_SDRAM 0x40000000 ++#define PHYS_SDRAM_SIZE (SZ_2G + SZ_1G) ++#define PHYS_SDRAM_2 0x100000000 ++#define PHYS_SDRAM_2_SIZE (SZ_4G + SZ_1G) ++ ++#endif /* __TORADEX_SMARC_IMX8MP_H */ diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0032-verdin-imx8mm.h.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0032-verdin-imx8mm.h.patch new file mode 100644 index 0000000..034dadd --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0032-verdin-imx8mm.h.patch @@ -0,0 +1,15 @@ +--- /home/rossierd/edgemtech/products/edgem1/build/tmp/work/uboot-2024.07-r0/uboot-2024.07/include/configs/verdin-imx8mm.h 2025-11-21 14:56:52.104301824 +0100 ++++ ./include/configs/verdin-imx8mm.h 2025-11-21 14:54:55.599352148 +0100 +@@ -58,8 +58,10 @@ + #define CFG_SYS_SDRAM_BASE 0x40000000 + + /* SDRAM configuration */ +-#define PHYS_SDRAM 0x40000000 +-#define PHYS_SDRAM_SIZE SZ_2G /* 2GB DDR */ ++#define PHYS_SDRAM 0x40000000 ++#define PHYS_SDRAM_SIZE (long)(SZ_2G + SZ_1G) ++#define PHYS_SDRAM_2 0x100000000 ++#define PHYS_SDRAM_2_SIZE (long)(SZ_1G) + + /* USB Configs */ + #define CFG_MXC_USB_PORTSC (PORT_PTS_UTMI | PORT_PTS_PTW) diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0033-image-board.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0033-image-board.c.patch new file mode 100644 index 0000000..7288f91 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0033-image-board.c.patch @@ -0,0 +1,36 @@ +--- /home/rossierd/edgemtech/products/edgem1/edgem1/30/build/tmp/work/uboot-2024.07-r0/uboot-2024.07/boot/image-board.c 2026-04-17 12:12:36.494906463 +0200 ++++ ./boot/image-board.c 2026-04-17 16:43:48.335346611 +0200 +@@ -730,6 +730,9 @@ + const char *uname; + u8 img_type; + ++ /* EDGEMTech */ ++ ulong load, entry; ++ + /* Check to see if the images struct has a FIT configuration */ + if (!genimg_has_config(images)) { + debug("## FIT configuration was not specified\n"); +@@ -780,6 +783,23 @@ + return fit_img_result; + } + ++ /* EDGEMTech - Prepare to send information of agency image to the AVZ hypervisor */ ++ ++ fit_image_get_load(buf, fit_image_get_node(buf, uname), &load); ++ fit_image_get_entry(buf, fit_image_get_node(buf, uname), &entry); ++ ++ fdt_add_mem_rsv(images->ft_addr, load, img_len); ++ ++ fdt_shrink_to_minimum(images->ft_addr, 128); ++ ++ fdt_record_loadable(images->ft_addr, loadables_index, uname, ++ load, img_len, entry, ++ fdt_getprop(buf, fit_image_get_node(buf, uname), "type", NULL), ++ fdt_getprop(buf, fit_image_get_node(buf, uname), "os", NULL), ++ fdt_getprop(buf, fit_image_get_node(buf, uname), "arch", NULL)); ++ ++ /************/ ++ + fit_loadable_process(img_type, img_data, img_len); + } + break; diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0034-verdin-imx8mp.h.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0034-verdin-imx8mp.h.patch new file mode 100644 index 0000000..ed52a5d --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0034-verdin-imx8mp.h.patch @@ -0,0 +1,27 @@ +--- a/include/configs/verdin-imx8mp.h ++++ b/include/configs/verdin-imx8mp.h +@@ -28,13 +28,16 @@ + "ramdisk_addr_r=0x50300000\0" \ + "scriptaddr=0x50280000\0" + ++#if 0 /* EDGEMTech */ + /* Enable Distro Boot */ + #define BOOT_TARGET_DEVICES(func) \ + func(MMC, mmc, 1) \ + func(MMC, mmc, 2) \ + func(DHCP, dhcp, na) + #include ++#endif /* 0 */ + ++#if 0 /* EDGEMTech */ + /* Initial environment variables */ + #define CFG_EXTRA_ENV_SETTINGS \ + BOOTENV \ +@@ -49,6 +52,7 @@ + "setexpr blkcnt ${filesize} + 0x1ff && setexpr blkcnt " \ + "${blkcnt} / 0x200; mmc dev 2 1; mmc write ${loadaddr} 0x0 " \ + "${blkcnt}; fi\0" ++#endif /* 0 */ + + #define CFG_SYS_INIT_RAM_ADDR 0x40000000 + #define CFG_SYS_INIT_RAM_SIZE SZ_512K diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0035-verdin-imx8mp_defconfig.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0035-verdin-imx8mp_defconfig.patch new file mode 100644 index 0000000..b79f760 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0035-verdin-imx8mp_defconfig.patch @@ -0,0 +1,11 @@ +--- /home/rossierd/edgemtech/products/edgem1/edgem1/30/build/tmp/work/uboot-2024.07-r0/uboot-2024.07/configs/verdin-imx8mp_defconfig 2026-04-17 12:12:41.987694841 +0200 ++++ ./configs/verdin-imx8mp_defconfig 2026-04-17 17:04:17.189200957 +0200 +@@ -41,6 +41,8 @@ + CONFIG_SPL_LOAD_FIT_ADDRESS=0x44000000 + CONFIG_DISTRO_DEFAULTS=y + CONFIG_BOOTDELAY=1 ++CONFIG_USE_BOOTCOMMAND=y ++CONFIG_BOOTCOMMAND="ext4load mmc 2:1 0x50280000 uEnv.txt; env import 0x50280000; run start" + CONFIG_OF_SYSTEM_SETUP=y + CONFIG_USE_PREBOOT=y + CONFIG_PREBOOT="test -n ${fdtfile} || setenv fdtfile imx8mp-verdin-${variant}-${fdt_board}.dtb" diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0036-imx8mp-u-boot.dtsi.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0036-imx8mp-u-boot.dtsi.patch new file mode 100644 index 0000000..c9e738b --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0036-imx8mp-u-boot.dtsi.patch @@ -0,0 +1,38 @@ +--- a/arch/arm/dts/imx8mp-u-boot.dtsi ++++ b/arch/arm/dts/imx8mp-u-boot.dtsi +@@ -167,6 +167,22 @@ + }; + #endif + ++#ifdef CONFIG_TARGET_VERDIN_IMX8MP ++ tee { ++ description = "OP-TEE"; ++ type = "firmware"; ++ arch = "arm64"; ++ os = "tee"; ++ compression = "none"; ++ load = <0xbe000000>; ++ entry = <0xbe000000>; ++ ++ blob-ext { ++ filename = "tee.bin"; ++ }; ++ }; ++#endif ++ + @fdt-SEQ { + description = "NAME"; + type = "flat_dt"; +@@ -186,8 +202,12 @@ + fdt = "fdt-SEQ"; + firmware = "uboot"; + #ifndef CONFIG_ARMV8_PSCI ++#ifdef CONFIG_TARGET_VERDIN_IMX8MP ++ loadables = "atf", "tee"; ++#else + loadables = "atf"; + #endif ++#endif + }; + }; + }; diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0037-verdin-imx8mp.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0037-verdin-imx8mp.c.patch new file mode 100644 index 0000000..58f8ec6 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0037-verdin-imx8mp.c.patch @@ -0,0 +1,13 @@ +--- a/board/toradex/verdin-imx8mp/verdin-imx8mp.c ++++ b/board/toradex/verdin-imx8mp/verdin-imx8mp.c +@@ -108,7 +108,9 @@ + if (!size) + return -EINVAL; + +- *size = get_ram_size((void *)PHYS_SDRAM, PHYS_SDRAM_SIZE + PHYS_SDRAM_2_SIZE); ++ /* Hardcode 2 GiB: get_ram_size() hangs because SPL's TZASC lockdown ++ * blocks non-secure probing of the upper DRAM boundary. */ ++ *size = SZ_2G; + + return 0; + } diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0038-soc.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0038-soc.c.patch new file mode 100644 index 0000000..0922a79 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0038-soc.c.patch @@ -0,0 +1,11 @@ +--- a/arch/arm/mach-imx/imx8m/soc.c ++++ b/arch/arm/mach-imx/imx8m/soc.c +@@ -1366,7 +1366,7 @@ + } + + subpath = "optee"; +- offs = fdt_add_subnode(fdt, offs, subpath); ++ offs = fdt_find_or_add_subnode(fdt, offs, subpath); + if (offs < 0) { + printf("Could not create %s node.\n", subpath); + return offs; diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0070-Kconfig.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0070-Kconfig.patch new file mode 100644 index 0000000..6897345 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0070-Kconfig.patch @@ -0,0 +1,19 @@ +--- a/cmd/Kconfig ++++ b/cmd/Kconfig +@@ -333,6 +333,16 @@ + help + Boot an AArch64 Linux Kernel image from memory. + ++config CMD_E1C_BOOT ++ bool "e1c-boot" ++ depends on ARM64 && FIT ++ help ++ Boot the AVZ hypervisor together with an e1c capsule (Linux guest) ++ from two separate FIT images. Each FIT is parsed individually; every ++ declared kernel/fdt/ramdisk/loadable is copied to its load address, ++ then control is transferred to the AVZ entry point with the AVZ FIT ++ base in x0 and the capsule FIT base in x1. ++ + config BOOTM_LINUX + bool "Support booting Linux OS images" + depends on CMD_BOOTM || CMD_BOOTZ || CMD_BOOTI diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0071-Makefile.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0071-Makefile.patch new file mode 100644 index 0000000..39f287b --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0071-Makefile.patch @@ -0,0 +1,10 @@ +--- a/cmd/Makefile ++++ b/cmd/Makefile +@@ -63,6 +63,7 @@ + obj-$(CONFIG_CMD_CYCLIC) += cyclic.o + obj-$(CONFIG_CMD_EVENT) += event.o + obj-$(CONFIG_CMD_EXTENSION) += extension_board.o ++obj-$(CONFIG_CMD_E1C_BOOT) += e1c_boot.o + obj-$(CONFIG_CMD_ECHO) += echo.o + obj-$(CONFIG_ENV_IS_IN_EEPROM) += eeprom.o + obj-$(CONFIG_CMD_EEPROM) += eeprom.o diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0072-verdin-imx8mp_defconfig.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0072-verdin-imx8mp_defconfig.patch new file mode 100644 index 0000000..10b8b7d --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0072-verdin-imx8mp_defconfig.patch @@ -0,0 +1,7 @@ +--- a/configs/verdin-imx8mp_defconfig ++++ b/configs/verdin-imx8mp_defconfig +@@ -190,3 +190,4 @@ + CONFIG_USB_GADGET_PRODUCT_NUM=0x4000 + CONFIG_IMX_WATCHDOG=y + CONFIG_HEXDUMP=y ++CONFIG_CMD_E1C_BOOT=y diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0073-e1c_boot.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0073-e1c_boot.c.patch new file mode 100644 index 0000000..4656e32 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0073-e1c_boot.c.patch @@ -0,0 +1,215 @@ +--- /dev/null ++++ b/cmd/e1c_boot.c +@@ -0,0 +1,212 @@ ++// SPDX-License-Identifier: GPL-2.0+ ++/* ++ * Copyright (C) 2026 EDGEMTech SA ++ * ++ * e1c-boot: load an AVZ FIT image and an e1c capsule FIT image individually, ++ * place each declared loadable/kernel/fdt/ramdisk at its declared load address, ++ * then transfer control to the AVZ entry point. ++ * ++ * Argument convention to AVZ (aarch64): ++ * x0 = AVZ FIT base (so AVZ can locate its avz_dt loadable inside it) ++ * x1 = e1c capsule FIT base (so AVZ can later load the guest from it) ++ * x2 = 0 ++ * x3 = 0 ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++static int e1c_place_image(const void *fit, int img_off, const char *desc, ++ ulong *load_out, ulong *entry_out) ++{ ++ const void *data; ++ size_t size; ++ ulong load; ++ ++ if (fit_image_get_data_and_size(fit, img_off, &data, &size)) { ++ printf("e1c-boot: %s: missing data\n", desc); ++ return -1; ++ } ++ ++ if (fit_image_get_load(fit, img_off, &load)) { ++ printf("e1c-boot: %s: missing load address\n", desc); ++ return -1; ++ } ++ ++ debug("e1c-boot: %s -> 0x%lx (%zu bytes)\n", desc, load, size); ++ memmove((void *)load, data, size); ++ flush_cache(load, size); ++ ++ if (load_out) ++ *load_out = load; ++ ++ if (entry_out) { ++ ulong entry; ++ ++ if (fit_image_get_entry(fit, img_off, &entry)) ++ entry = load; ++ *entry_out = entry; ++ } ++ return 0; ++} ++ ++static int e1c_place_named(const void *fit, int conf_off, const char *prop, ++ ulong *load_out, ulong *entry_out, bool required) ++{ ++ int img_off; ++ ++ img_off = fit_conf_get_prop_node(fit, conf_off, prop, IH_PHASE_NONE); ++ if (img_off < 0) { ++ if (required) { ++ printf("e1c-boot: config has no '%s' image\n", prop); ++ return -1; ++ } ++ return 0; ++ } ++ return e1c_place_image(fit, img_off, prop, load_out, entry_out); ++} ++ ++static int e1c_place_loadables(const void *fit, int conf_off) ++{ ++ const char *uname; ++ int idx; ++ ++ for (idx = 0; ++ (uname = fdt_stringlist_get(fit, conf_off, FIT_LOADABLE_PROP, ++ idx, NULL)) != NULL; ++ idx++) { ++ int img_off = fit_image_get_node(fit, uname); ++ ++ if (img_off < 0) { ++ printf("e1c-boot: loadable '%s' not found\n", uname); ++ return -1; ++ } ++ if (e1c_place_image(fit, img_off, uname, NULL, NULL)) ++ return -1; ++ } ++ return 0; ++} ++ ++static int e1c_load_fit(ulong fit_addr, const char *conf_name, ++ ulong *kernel_entry, ulong *fdt_load) ++{ ++ const void *fit = (const void *)fit_addr; ++ int conf_off; ++ ++ if (fit_check_format(fit, IMAGE_SIZE_INVAL)) { ++ printf("e1c-boot: invalid FIT at 0x%lx\n", fit_addr); ++ return -1; ++ } ++ ++ conf_off = fit_conf_get_node(fit, conf_name); ++ if (conf_off < 0) { ++ printf("e1c-boot: config '%s' not found at 0x%lx\n", ++ conf_name ? conf_name : "", fit_addr); ++ return -1; ++ } ++ ++ if (e1c_place_named(fit, conf_off, FIT_KERNEL_PROP, NULL, ++ kernel_entry, kernel_entry != NULL)) ++ return -1; ++ ++ if (e1c_place_named(fit, conf_off, FIT_FDT_PROP, fdt_load, ++ NULL, false)) ++ return -1; ++ ++ if (e1c_place_named(fit, conf_off, FIT_RAMDISK_PROP, NULL, ++ NULL, false)) ++ return -1; ++ ++ if (e1c_place_loadables(fit, conf_off)) ++ return -1; ++ ++ return 0; ++} ++ ++static int do_e1c_boot(struct cmd_tbl *cmdtp, int flag, int argc, ++ char *const argv[]) ++{ ++ ulong avz_itb, e1c_itb, avz_entry = 0, capsule_fdt = 0; ++ ++ if (argc != 3) ++ return CMD_RET_USAGE; ++ ++ avz_itb = simple_strtoul(argv[1], NULL, 16); ++ e1c_itb = simple_strtoul(argv[2], NULL, 16); ++ ++ printf("e1c-boot: AVZ ITB @ 0x%lx, e1c ITB @ 0x%lx\n", ++ avz_itb, e1c_itb); ++ ++ if (e1c_load_fit(avz_itb, "avz", &avz_entry, NULL)) ++ return CMD_RET_FAILURE; ++ if (!avz_entry) { ++ printf("e1c-boot: AVZ config has no kernel entry\n"); ++ return CMD_RET_FAILURE; ++ } ++ ++ if (e1c_load_fit(e1c_itb, "capsule", NULL, &capsule_fdt)) ++ return CMD_RET_FAILURE; ++ ++ /* Propagate U-Boot's bootargs env into the guest FDT's /chosen so the ++ * guest kernel sees the cmdline. e1c-boot replaces bootm's standard ++ * fdt_chosen() call — without this, the guest kernel cmdline is empty ++ * and OSTree-aware initramfs (e.g. TorizonOS) can't find its root. */ ++ if (capsule_fdt) { ++ void *fdt = (void *)capsule_fdt; ++ const char *ba = env_get("bootargs"); ++ int ret; ++ ++ printf("e1c-boot: capsule fdt @ 0x%lx, bootargs=[%s]\n", ++ capsule_fdt, ba ? ba : ""); ++ ++ /* The guest DTB is tightly packed by mkimage and has no room ++ * for fdt_chosen() to add bootargs (FDT_ERR_NOSPACE). Expand ++ * in place with 4 KiB headroom — plenty for bootargs + any ++ * extra props AVZ injects later. */ ++ ret = fdt_open_into(fdt, fdt, fdt_totalsize(fdt) + 0x1000); ++ if (ret < 0) { ++ printf("e1c-boot: WARN: fdt_open_into failed (%d)\n", ++ ret); ++ } ++ ++ ret = fdt_chosen(fdt); ++ if (ret < 0) ++ printf("e1c-boot: WARN: fdt_chosen failed (%d)\n", ret); ++ else ++ flush_cache(capsule_fdt, fdt_totalsize(fdt)); ++ } ++ ++ printf("e1c-boot: jumping to AVZ at 0x%lx (capsule ITB @ 0x%lx)\n", ++ avz_entry, e1c_itb); ++ ++ cleanup_before_linux(); ++ ++ armv8_switch_to_el2(avz_itb, e1c_itb, 0, 0, avz_entry, ++ ES_TO_AARCH64); ++ ++ return CMD_RET_FAILURE; ++} ++ ++#ifdef CONFIG_SYS_LONGHELP ++static char e1c_boot_help_text[] = ++ " \n" ++ " - Parse the AVZ FIT and the e1c capsule FIT loaded at the given\n" ++ " addresses, place every kernel/fdt/ramdisk/loadable at its\n" ++ " declared load address, then jump to the AVZ entry point with:\n" ++ " x0 = avz_itb_addr (AVZ scans this FIT for its avz_dt)\n" ++ " x1 = e1c_itb_addr (AVZ uses this FIT to load the guest)"; ++#endif ++ ++ll_entry_declare(struct cmd_tbl, e1c_boot, cmd) = { ++ "e1c-boot", 3, cmd_never_repeatable, do_e1c_boot, ++ "boot AVZ hypervisor with an e1c capsule", ++#ifdef CONFIG_SYS_LONGHELP ++ e1c_boot_help_text ++#endif ++}; diff --git a/build/meta-uboot/recipes-uboot/uboot/uboot_2022.04.bb b/build/meta-uboot/recipes-uboot/uboot/uboot_2022.04.bb index 28b9c97..cf682f6 100644 --- a/build/meta-uboot/recipes-uboot/uboot/uboot_2022.04.bb +++ b/build/meta-uboot/recipes-uboot/uboot/uboot_2022.04.bb @@ -1,3 +1,5 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD SUMMARY = "U-boot Universal Bootloader" DESCRIPTION = "U-boot bootloader receipt" @@ -15,7 +17,7 @@ SRCREV = "e4b6ebd3de982ae7185dbf689a030e73fd06e0d2" SRC_URI = "git://github.com/u-boot/u-boot;branch=master;protocol=https" -# Set of patches to be applied to get a version adapted +# Set of patches to be applied to get a version adapted # and adding various defconfig files. FILESPATH:prepend = "${THISDIR}/files/0001-${PF}:" @@ -25,28 +27,52 @@ require files/0001-${PF}-patches.inc # Where the working directory will be placed in infrabase root dir IB_TARGET = "${IB_UBOOT_PATH}" -# Future enhancement with ATF -# do_configure[depends] += "atf:do_build" -# do_configure[depends] += "bsp-linux:do_build_firmware" +# ATF is only needed when the boot chain actually carries it (FIP-loaded +# U-Boot in atf+uboot / full modes). In "uboot" mode QEMU's -bios loads +# u-boot.bin directly — no BL31 in the chain, no reason to build ATF. +# bb.utils.contains_any returns the second arg when IB_BOOT_CHAIN is in +# the set, else the third arg. -# The following code is here as example, but actually currently not used +do_configure[depends] = "${@bb.utils.contains_any('IB_BOOT_CHAIN', 'atf+uboot full', 'atf:do_build', '', d)}" do_configure[nostamp] = "1" do_configure () { - + cd ${IB_TARGET} - make ${IB_PLATFORM}_defconfig - + + # Defconfig selection on virt64: + # - IB_BOOT_CHAIN="uboot" (bare bsp-linux, no ATF): + # upstream qemu_arm64_defconfig — CONFIG_POSITION_INDEPENDENT=y + # and CONFIG_ARCH_QEMU=y, both required for QEMU `-kernel` to + # load the U-Boot ELF at any address. Linux runs at EL1 (no + # secure / no virtualization in QEMU machine). + # - IB_BOOT_CHAIN="atf+uboot" (bare bsp-torizon) and "full" (capsule) + # both use virt64_defconfig — same FIP-aware U-Boot, the boot + # chain difference lives in ATF (no SPD vs SPD=opteed) and the + # guest DT (see bsp_torizon doc, "Known virt64 DT Workarounds"). + # U-Boot is entered at EL2 by ATF and does NOT switch to EL1 + # before booting the kernel — the kernel performs its own + # el2_setup and drops to EL1 itself, as per the arm64 boot + # protocol. + # - verdin platforms: ${IB_PLATFORM}_defconfig (verdin uses + # uboot_2024.07.bb anyway). + + if [ "${IB_PLATFORM}" = "virt64" ] && [ "${IB_BOOT_CHAIN}" = "uboot" ]; then + make qemu_arm64_defconfig + else + make ${IB_PLATFORM}_defconfig + fi + # Specific handling for bbb platform if [ "${IB_PLATFORM}" = "bbb" ]; then - + # If a disk image is used with BBB, it is intended to be # deployed in the eMMC, hence some different uEnv configurations - - if [ "${IB_STORAGE}" = "soft" ]; then - ln -fs ${IB_UBOOT_PATH}/uEnv.d/uEnv_bbb_flash.txt ${IB_UBOOT_PATH}/uEnv.d/uEnv_bbb.txt + + if [ "${IB_STORAGE_MODE}" = "soft" ]; then + ln -fs ${IB_UBOOT_PATH}/uEnv.d/uEnv_bbb_flash.txt ${IB_UBOOT_PATH}/uEnv.d/uEnv_bbb.txt else - ln -fs ${IB_UBOOT_PATH}/uEnv.d/uEnv_bbb_sd.txt ${IB_UBOOT_PATH}/uEnv.d/uEnv_bbb.txt + ln -fs ${IB_UBOOT_PATH}/uEnv.d/uEnv_bbb_sd.txt ${IB_UBOOT_PATH}/uEnv.d/uEnv_bbb.txt fi elif [ "${IB_PLATFORM}" = "imx8_colibri" ]; then @@ -54,17 +80,25 @@ do_configure () { ln -fs ${IB_ATF_PATH}/build/imx8qx/release/bl31.bin . echo "--> ${IB_BSP_PATH}" cp ${IB_BSP_PATH}/mx8qxc0-ahab-container.img mx8qx-ahab-container.img - + fi - + } do_build[nostamp] = "1" do_build () { - - bbplain "Building U-boot with ${CORES} cores..." + + bbplain "Building U-boot with ${CORES} cores (CROSS_COMPILE=${IB_TOOLCHAIN}-)..." cd ${IB_TARGET} - make -j${CORES} + # Pin the cross compiler per platform (IB_TOOLCHAIN) so the build does + # not depend on a CROSS_COMPILE inherited from the caller's shell — + # e.g. virt32 (arm-linux-gnueabihf) vs virt64 (aarch64-none-linux-gnu). + make CROSS_COMPILE=${IB_TOOLCHAIN}- -j${CORES} + + if [ "${IB_PLATFORM}" = "virt64" ]; then + mkdir -p ${IB_DIR}/filesystem + cp ${IB_UBOOT_PATH}/u-boot.bin ${IB_DIR}/filesystem/ + fi } def __do_platform_deploy(d): diff --git a/build/meta-uboot/recipes-uboot/uboot/uboot_2024.07.bb b/build/meta-uboot/recipes-uboot/uboot/uboot_2024.07.bb new file mode 100644 index 0000000..5fe6691 --- /dev/null +++ b/build/meta-uboot/recipes-uboot/uboot/uboot_2024.07.bb @@ -0,0 +1,134 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + +SUMMARY = "U-boot Universal Bootloader" +DESCRIPTION = "U-boot bootloader receipt" +LICENSE = "GPLv2" + +# Release and version +PR = "r0" +PV = "2024.07" + +inherit filesystem +inherit uboot +inherit bsp +inherit atf +inherit logging + +SRCREV = "3f772959501c99fbe5aa0b22a36efe3478d1ae1c" +SRC_URI = "git://gitlab.com/u-boot/u-boot.git;nobranch=1;protocol=https" + +# Set of patches to be applied to get a version adapted +# and adding various defconfig files. + +FILESPATH:prepend = "${THISDIR}/files/0001-${PF}:" + +require files/0001-${PF}-patches.inc + +# Where the working directory will be placed in infrabase root dir +IB_TARGET = "${IB_UBOOT_PATH}" + +# Future enhancement with ATF +do_configure[depends] += "atf:do_build" + +# Verdin's do_configure shells out to OP-TEE's gen_tee_bin.py and +# consumes tee.elf to produce ./tee.bin embedded in flash.bin. Optee +# must be built (and its source attached at ${IB_OPTEE_PATH}) first. +# Gated on platform via anonymous python because the optee path is +# wrapped in `if [ "${IB_PLATFORM}" = "verdin-imx8mp" ]` below — virt64 +# and other targets don't touch optee here. +python () { + if d.getVar('IB_PLATFORM') == 'verdin-imx8mp': + d.appendVarFlag('do_configure', 'depends', ' optee:do_build') +} + +do_configure[nostamp] = "1" +do_configure () { + + cd ${IB_TARGET} + make ${IB_PLATFORM}_defconfig + + # Hand the OS off at EL1 instead of EL2 (SO3 standalone is EL1-native; + # AVZ needs EL2, so this is opt-in via IB_UBOOT_SWITCH_EL1 in local.conf). + if [ "${IB_UBOOT_SWITCH_EL1}" = "1" ]; then + echo "CONFIG_ARMV8_SWITCH_TO_EL1=y" >> .config + make olddefconfig + fi + + # NXP DDR training firmware (lpddr4 PMU), vendored capsule-free under + # meta-bsp; IB_IMX_FIRMWARE_PATH (local.conf) is one flat directory. + IMX8MP_FW_PATH="${IB_IMX_FIRMWARE_PATH}" + + if [ "${IB_PLATFORM}" = "verdin-imx8mp" ]; then + + cp ${IB_ATF_PATH}/build/imx8mp/release/bl31.bin . + # Use raw binary (no OPTE v1 header): ATF BL31-only mode jumps directly + # to BL32_BASE so the binary must start with _start, not a header. + python3 ${IB_OPTEE_PATH}/scripts/gen_tee_bin.py \ + --input ${IB_OPTEE_PATH}/out/arm-plat-imx/core/tee.elf \ + --out_tee_raw_bin ./tee.bin + + cp ${IMX8MP_FW_PATH}/lpddr4*_202006.bin . + fi +} + +addtask do_configure + +# do_build must run after do_configure so atf:do_build (a do_configure dep) is triggered first +addtask do_build after do_configure + +do_build[nostamp] = "1" +do_build[depends] += "atf:do_build" +do_build () { + + bbplain "Building U-boot with ${CORES} cores..." + cd ${IB_TARGET} + if [ "${IB_PLATFORM}" = "verdin-imx8mp" ]; then + BL31="${IB_ATF_PATH}/build/imx8mp/release/bl31.bin" + TEE_ELF="${IB_OPTEE_PATH}/out/arm-plat-imx/core/tee.elf" + HASH_FILE="flash.bin.inputs.sha256" + CURRENT_HASH="$(sha256sum "$BL31" "$TEE_ELF" 2>/dev/null | sha256sum | cut -d' ' -f1)" + if [ -f flash.bin ] && [ -f "$HASH_FILE" ] && [ "$(cat $HASH_FILE)" = "$CURRENT_HASH" ]; then + echo "U-Boot flash.bin is up to date, skipping rebuild" + else + make CROSS_COMPILE=${IB_TOOLCHAIN}- TEE=./tee.bin -j${CORES} + echo "$CURRENT_HASH" > "$HASH_FILE" + fi + else + make CROSS_COMPILE=${IB_TOOLCHAIN}- -j${CORES} + fi +} + +def __do_platform_deploy(d): + import os + import subprocess + + src_dir = d.getVar('FILE_DIRNAME') + dst_dir = d.getVar('IB_FILESYSTEM_PATH') + u_boot_path = d.getVar('IB_UBOOT_PATH') + IB_PLATFORM = d.getVar('IB_PLATFORM') + + if IB_PLATFORM == "verdin-imx8mp": + + cmd = f"cp -r {u_boot_path}/flash.bin {dst_dir}/p1/imx-boot" + result = subprocess.run(cmd, shell=True, check=True) + + else: + cmd = f"cp {u_boot_path}/u-boot.bin {dst_dir}/p1/" + result = subprocess.run(cmd, shell=True, check=True) + +do_deploy[nostamp] = "1" +python do_deploy() { + + bb.plain("Deploy U-boot only ...") + + __do_deploy_boot(d); +} + +addtask do_deploy + +do_clean[nostamp] = "1" +do_clean () { + rm -f ${TMPDIR}/stamps/uboot* +} +addtask do_clean diff --git a/build/meta-usr/classes/usr.bbclass b/build/meta-usr/classes/usr.bbclass index de6cf2c..c803409 100644 --- a/build/meta-usr/classes/usr.bbclass +++ b/build/meta-usr/classes/usr.bbclass @@ -1,3 +1,5 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD inherit filesystem inherit logging @@ -11,20 +13,20 @@ usr_do_install_file_root () { echo "Installing $1" mkdir -p ${IB_TARGET}/build/deploy/root - cp $1 ${IB_TARGET}/build/deploy/root + cp $1 ${IB_TARGET}/build/deploy/root 2>/dev/null || true } usr_do_install_directory_root () { echo "Installing $1" mkdir -p ${IB_TARGET}/build/deploy/root - cp -R "$1" "${IB_TARGET}/build/deploy/root" + cp -R "$1" "${IB_TARGET}/build/deploy/root" 2>/dev/null || true } usr_do_install_file_dir () { echo "Installing $1 into $2" mkdir -p ${IB_TARGET}/build/deploy/$2 - cp -r $1 ${IB_TARGET}/build/deploy/$2 + cp -r $1 ${IB_TARGET}/build/deploy/$2 2>/dev/null || true } @@ -55,6 +57,41 @@ python retrieve_usr_dir() { __retrieve_usr_dir(d) } +# De-duplicate add_subdirectory() lines in CMakeLists.txt files. +# Implemented as a separate Python function and attached to do_configure via +# [prefuncs] — using `python do_configure:prepend()` directly mixes badly +# with the shell do_configure on some bitbake versions and the parser +# treats the python body as shell code. + +python usr_dedup_add_subdirectory() { + import os + import glob + + target = d.getVar('IB_TARGET') + for cmake_file in glob.glob(os.path.join(target, '**', 'CMakeLists.txt'), recursive=True): + with open(cmake_file, 'r') as f: + lines = f.readlines() + + seen = set() + deduped = [] + removed = [] + for line in lines: + key = line.strip() + if key.startswith('add_subdirectory(') and key in seen: + removed.append(key) + else: + if key.startswith('add_subdirectory('): + seen.add(key) + deduped.append(line) + + if removed: + bb.warn("Duplicate add_subdirectory removed in %s: %s" % (cmake_file, ', '.join(removed))) + with open(cmake_file, 'w') as f: + f.writelines(deduped) +} + +do_configure[prefuncs] += "usr_dedup_add_subdirectory" + do_configure () { mkdir -p ${IB_TARGET}/build } @@ -85,13 +122,17 @@ do_build () { do_clean[nostamp] = "1" addtask do_clean -do_clean () { - - # Remove all patches - rm -rf ${IB_TARGET}/patches - - # Clean the user space apps - rm -rf ${IB_TARGET}/build +# Implemented in Python on purpose: a *shell* task needs ${WORKDIR}/temp to +# exist so bitbake can create its output fifo there, but do_clean often runs +# when that dir is absent (fresh tree / already-cleaned), giving +# "No such file or directory: .../temp/fifo.NNNN". Python tasks create the +# temp dir themselves and use no fifo, so they are robust here. +python do_clean() { + import shutil + target = d.getVar('IB_TARGET') + # Remove the applied patches and the (in-tree) user-space build dir. + shutil.rmtree(target + '/patches', ignore_errors=True) + shutil.rmtree(target + '/build', ignore_errors=True) } diff --git a/build/meta-usr/conf/layer.conf b/build/meta-usr/conf/layer.conf index 288ef22..22def7b 100644 --- a/build/meta-usr/conf/layer.conf +++ b/build/meta-usr/conf/layer.conf @@ -1,3 +1,6 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + BBPATH .= ":${LAYERDIR}" BBFILES += "${LAYERDIR}/recipes-*/*/*.bb ${LAYERDIR}/recipes-*/*/*.bbappend" diff --git a/build/meta-usr/recipes-usr/linux/usr-linux_1.0.bb b/build/meta-usr/recipes-usr/linux/usr-linux_1.0.bb index d7fa17d..8fdadb9 100644 --- a/build/meta-usr/recipes-usr/linux/usr-linux_1.0.bb +++ b/build/meta-usr/recipes-usr/linux/usr-linux_1.0.bb @@ -1,3 +1,5 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD SUMMARY = "User space applications for Linux" DESCRIPTION = "All (Linux) user space custom applications which take place in the rootfs of Linux" @@ -29,64 +31,70 @@ do_deploy[nostamp] = "1" python do_deploy() { import os - + __do_fs_mount(d) - + IB_USR_PATH = d.getVar('IB_USR_PATH') IB_FILESYSTEM_PATH = d.getVar('IB_FILESYSTEM_PATH') IB_ROOTFS_PARTITION = d.getVar('IB_ROOTFS_PARTITION') if not os.path.isdir(os.path.join(IB_USR_PATH, "build", "deploy")): - + __do_fs_umount(d) bb.fatal("The {} does not exist; please build usr first...".format(IB_USR_PATH)) if not os.path.isdir(os.path.join(IB_FILESYSTEM_PATH, IB_ROOTFS_PARTITION, "root")): __do_fs_umount(d) bb.fatal("The root directory is not present in the second partition; please deploy rootfs...") - - + + os.system("cp -r {}/build/deploy/* {}/{}/".format(IB_USR_PATH, IB_FILESYSTEM_PATH, IB_ROOTFS_PARTITION)) - + __do_fs_umount(d) } - -addtask do_deploy + +# `after do_build` is required: do_deploy expects ${IB_USR_PATH}/build/deploy/ +# (populated by do_build) to exist. Without explicit ordering, bitbake +# schedules do_deploy as soon as its declared depends (rootfs-linux:do_deploy) +# are met — which can be before this recipe's own do_build has run. +addtask do_deploy after do_build # Build extra components which is not in src/ directory like modules do_build:prepend () { # Modules - - if [ ! -f ${IB_LINUX_PATH}/Module.symvers ]; then - echo "Generating Module.symvers..." ; - make -j${CORES} -C ${IB_LINUX_PATH} modules ; + + if [ ! -f ${IB_LINUX_PATH}/Module.symvers ]; then + echo "Generating Module.symvers..." ; + make -j${CORES} -C ${IB_LINUX_PATH} modules ; make INSTALL_MOD_PATH=${IB_ROOTFS_PATH}/target -C ${IB_LINUX_PATH} modules_install ; \ fi - make -C ${IB_LINUX_PATH} M=${IB_TARGET}/src/modules modules -} + make -C ${IB_LINUX_PATH} M=${IB_TARGET}/src/modules modules IB_PLATFORM=${IB_PLATFORM} +} # Installing usr apps mean to move the binary and all files which need to # be copied to the rootfs. Be aware that it is a deploy directory and not # the rootfs itself; this is achieved with the do_deploy task (by the bsp recipe) do_install_apps () { - - usr_do_install_file_root "${IB_TARGET}/build/src/examples/hello" - + + usr_do_install_file_root "${IB_TARGET}/build/src/applications/examples/hello" + usr_do_install_file_root "${IB_TARGET}/build/bin/capsule-flash-test" + usr_do_install_file_root "${IB_TARGET}/build/bin/capsule-http-test" + # Installation of modules if any - + usr_do_install_file_root "${IB_TARGET}/src/modules/*.ko" } do_clean:append () { - + # Clean the modules if [ -d ${IB_TARGET}/src/modules ]; then make -C ${IB_LINUX_PATH} M=${IB_TARGET}/src/modules clean fi - + rm -f ${TMPDIR}/stamps/usr-linux* # Remove the usr organization in the build directory to avoid @@ -96,7 +104,7 @@ do_clean:append () { # Remove all patches rm -rf ${IB_TARGET}/patches - + # Clean the user space apps rm -rf ${IB_TARGET}/build } diff --git a/build/meta-usr/recipes-usr/linux/usr-linux_1.0.bbappend b/build/meta-usr/recipes-usr/linux/usr-linux_1.0.bbappend new file mode 100644 index 0000000..141eb6c --- /dev/null +++ b/build/meta-usr/recipes-usr/linux/usr-linux_1.0.bbappend @@ -0,0 +1,42 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + +SUMMARY = "EDGE-M1 Factory Capsule - User space applications for Linux" +DESCRIPTION = "All (Linux) user space custom applications which take place in the rootfs of Linux" +LICENSE = "GPLv2" + +inherit usr +inherit linux +inherit filesystem +inherit rootfs + +python do_deploy() { + + import os + import subprocess + + d.setVar('ROOTFS_FILENAME', 'rootfs') + __do_rootfs_mount(d) + + IB_USR_PATH = d.getVar('IB_USR_PATH') + + if not os.path.isdir(os.path.join(IB_USR_PATH, "build", "deploy")): + + __do_rootfs_umount(d) + bb.fatal("The {} does not exist; please build usr first...".format(IB_USR_PATH)) + + IB_ROOTFS_PATH = d.getVar('IB_ROOTFS_PATH') + IB_PLATFORM = d.getVar('IB_PLATFORM') + + if not os.path.isfile(os.path.join(IB_ROOTFS_PATH, "board", IB_PLATFORM, "rootfs.cpio")): + __do_rootfs_umount(d) + bb.fatal("rootfs.cpio is missing; please deploy rootfs first...") + + # The destination tree is root-owned (cpio -id), so rsync needs root + # to preserve mode bits / ownership while writing into it. + utils_sudo(["rsync", "-a", "--keep-dirlinks", + f"{IB_USR_PATH}/build/deploy/", + f"{IB_ROOTFS_PATH}/fs/"], check=True) + + __do_rootfs_umount(d) +} \ No newline at end of file diff --git a/build/meta-usr/recipes-usr/so3/files/0001-usr-so3-1.0-r0-patches.inc b/build/meta-usr/recipes-usr/so3/files/0001-usr-so3-1.0-r0-patches.inc index 1b91339..ee1c1be 100644 --- a/build/meta-usr/recipes-usr/so3/files/0001-usr-so3-1.0-r0-patches.inc +++ b/build/meta-usr/recipes-usr/so3/files/0001-usr-so3-1.0-r0-patches.inc @@ -1,4 +1,7 @@ -LVGL_FILES = "\ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + +SRC_URI += "\ file://0026-lvgl_benchmark.c.patch \ file://0023-CMakeLists.txt.patch \ file://0010-CMakeLists.txt.patch \ @@ -18,6 +21,4 @@ LVGL_FILES = "\ file://0024-fillfb.c.patch \ file://0015-slv_fb.h.patch \ file://0028-lvgl_perf.c.patch \ -" -SRC_URI += "${LVGL_FILES}" -SRC_URI:remove:lvgl = "${LVGL_FILES}" +" \ No newline at end of file diff --git a/build/meta-usr/recipes-usr/so3/files/0001-usr-so3-1.0-r0/0014-slv_fb.c.patch b/build/meta-usr/recipes-usr/so3/files/0001-usr-so3-1.0-r0/0014-slv_fb.c.patch index 69c78b7..b456af8 100644 --- a/build/meta-usr/recipes-usr/so3/files/0001-usr-so3-1.0-r0/0014-slv_fb.c.patch +++ b/build/meta-usr/recipes-usr/so3/files/0001-usr-so3-1.0-r0/0014-slv_fb.c.patch @@ -1,5 +1,5 @@ --- build/tmp/work/usr-so3-1.0-r0/usr-so3-1.0/lib/slv/slv_fb.c 2026-01-23 09:53:53.371401254 +0100 -+++ ./lib/slv/slv_fb.c 1970-01-01 01:00:00.000000000 +0100 ++++ ./lib/slv/slv_fb.c 2026-01-23 07:53:14.427120833 +0100 @@ -1,146 +0,0 @@ -/* - * Copyright (C) 2025 André Costa diff --git a/build/meta-usr/recipes-usr/so3/usr-so3_1.0.bb b/build/meta-usr/recipes-usr/so3/usr-so3_1.0.bb index 62ecd75..6cfdef8 100644 --- a/build/meta-usr/recipes-usr/so3/usr-so3_1.0.bb +++ b/build/meta-usr/recipes-usr/so3/usr-so3_1.0.bb @@ -1,3 +1,5 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD SUMMARY = "User space applications for SO3" DESCRIPTION = "All (SO3) user space custom applications which take place in the rootfs of SO3" @@ -9,7 +11,11 @@ inherit usr PR = "r0" PV = "1.0" -OVERRIDES += ":so3" +# Use :append (not +=) so no space is inserted before ":so3". With +=, +# OVERRIDES becomes "...:arm :so3" and the CPU token parses as "arm " +# (trailing space), so :arm overrides like IB_MUSL_TARGET:arm never +# collapse — breaking the musl toolchain PATH on virt32. +OVERRIDES:append = ":so3" # These patches bring lv_port_linux/lvgl in the usr structure FILESPATH:prepend = "${THISDIR}/files/0001-${PF}:" @@ -21,8 +27,41 @@ IB_TARGET = "${IB_DIR}/so3/usr" IB_TOOLCHAIN_PATH = "${IB_TARGET}/${IB_PLAT_CPU}-linux-musl.cmake" +# lvgl is FETCHED at build time (see the meta-usr/recipes-usr/lvgl +# usr-so3 bbappend, gated on the :lvgl override) into usr/lib/lvgl — it is +# NOT a committed git submodule. do_fetch/do_unpack/do_attach therefore run +# so the bbappend's do_handle_fetch_git can pull lvgl into the workdir and +# attach it back into usr/. +# +# do_patch stays noexec: the slv/lvgl integration patches are already baked +# into the in-tree usr/ source, so re-applying them fails (reversed patch). +do_patch[noexec] = "1" + do_build[depends] = "rootfs-so3:do_build" +# The user space is cross-compiled with the SO3 musl toolchain built by +# the musl-toolchain recipe (meta-toolchain). Make it available and put +# its bin/ on PATH so the bare compiler names in the cmake toolchain +# file (e.g. aarch64-linux-musl-gcc) resolve. +do_build[depends] += "musl-toolchain:do_build" +do_build:prepend () { + export PATH="${IB_MUSL_TOOLCHAIN_DIR}/${IB_MUSL_TARGET}/bin:$PATH" + + # The cmake build dir caches the toolchain (CMakeCache.txt pins the + # compiler), so switching IB_PLATFORM between virt64 and virt32 + # (aarch64<->arm) would otherwise keep producing wrong-arch user + # binaries (e.g. an aarch64 init.elf on a 32-bit kernel -> prefetch + # abort at boot). Wipe build/ when the arch changes; same-arch + # rebuilds stay incremental. The marker lives at the usr/ root so it + # survives the build/ wipe. + _arch_marker="${IB_TARGET}/.ib_last_arch" + if [ -f "$_arch_marker" ] && [ "$(cat $_arch_marker)" != "${IB_PLAT_CPU}" ]; then + echo "SO3 usr arch changed ($(cat $_arch_marker) -> ${IB_PLAT_CPU}); wiping build/" + rm -rf ${IB_TARGET}/build + fi + echo "${IB_PLAT_CPU}" > "$_arch_marker" +} + # Make sure so3 has been installed correctly to fetch other components if required do_unpack[depends] += "so3:do_attach_infrabase" @@ -40,14 +79,18 @@ python do_deploy() { src_dir = os.path.join(d.getVar('IB_TARGET'), 'build', 'deploy') dst_dir = os.path.join(d.getVar('IB_ROOTFS_PATH'), 'fs') - - cmd = f"cp -r {src_dir}/. {dst_dir}/" - + + # The SO3 rootfs.fat is loop-mounted at rootfs/fs as root + # (rootfs/mount.sh), so the copy must be privileged. The split + # debug-info files (*.debug) are host-side gdb symbols, not + # runtime artifacts — keep them out of the (small) rootfs. + # -r only (no -a): vfat rejects chown/owner/perms preservation. + cmd = f"sudo rsync -rL --exclude='*.debug' {src_dir}/ {dst_dir}/" + result = subprocess.run(cmd, shell=True, check=True) __do_rootfs_umount(d) else: - utils_restore_user_ownership(d) bb.fatal("Hum, it seeems the so3 usr has not been built correctly - rootfs missing...") } @@ -65,7 +108,14 @@ do_install_apps () { usr_do_install_file_dir "${IB_TARGET}/out/*" . } -do_clean:append () { - rm -f ${TMPDIR}/stamps/usr-so3* +# Python (not shell) to match the Python do_clean in usr.bbclass and to +# avoid the shell-task temp/fifo failure. Removes this recipe's stamps. +python do_clean:append() { + import glob, os + for f in glob.glob(d.getVar('TMPDIR') + '/stamps/usr-so3*'): + try: + os.remove(f) + except OSError: + pass } diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0-patches.inc b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0-patches.inc index 2810f65..dcd30de 100644 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0-patches.inc +++ b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0-patches.inc @@ -1,3 +1,6 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + SOO_URI:append = "\ file://0020-capsule.cpp.patch \ file://0040-plugins.hpp.patch \ @@ -48,6 +51,6 @@ SOO_URI:append = "\ file://0005-leds.h.patch \ file://0010-core.h.patch \ file://0052-CMakeLists.txt.patch \ - file://0053-fb_mapper.c.patch \ - file://0054-input_forwarding.c.patch \ + file://0053-fb_mapper.c.patch \ + file://0054-input_forwarding.c.patch \ " diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0016-CMakeLists.txt.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0016-CMakeLists.txt.patch index 79a9d8c..25e46ee 100644 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0016-CMakeLists.txt.patch +++ b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0016-CMakeLists.txt.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/CMakeLists.txt 1970-01-01 01:00:00.000000000 +0100 +++ ./src/soo/CMakeLists.txt 2025-10-10 17:28:33.593542342 +0200 -@@ -0,0 +1,17 @@ +@@ -0,0 +1,14 @@ + + +add_executable(injector injector.c) @@ -11,9 +11,6 @@ + +add_executable(melist melist.c) + -+add_executable(fb_mapper fb_mapper.c) -+add_executable(input_forwarding input_forwarding.c) -+ +add_subdirectory(emiso_engine) + +target_link_libraries(saveme zip) diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0020-capsule.cpp.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0020-capsule.cpp.patch index 6be1230..787b478 100644 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0020-capsule.cpp.patch +++ b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0020-capsule.cpp.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/emiso_engine/daemon/capsule.cpp 1970-01-01 01:00:00.000000000 +0100 +++ ./src/soo/emiso_engine/daemon/capsule.cpp 2025-10-10 17:28:33.593649878 +0200 -@@ -0,0 +1,543 @@ +@@ -0,0 +1,542 @@ +/* + * Copyright (C) 2023 Jean-Pierre Miceli + * @@ -260,7 +260,6 @@ + return EXIT_FAILURE; + } + -+ free(args.buffer); + close(fd); + + return args.slotID; diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0049-restoreme.c.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0049-restoreme.c.patch index 53db1dd..58af786 100644 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0049-restoreme.c.patch +++ b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0049-restoreme.c.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/restoreme.c 1970-01-01 01:00:00.000000000 +0100 +++ ./src/soo/restoreme.c 2025-10-10 17:28:33.594328500 +0200 -@@ -0,0 +1,77 @@ +@@ -0,0 +1,76 @@ +/* + * Copyright (C) 2014-2020 Daniel Rossier + * @@ -71,7 +71,6 @@ + args.slotID = -1; + ioctl(fd_core, AGENCY_IOCTL_WRITE_SNAPSHOT, &args); + -+ free(args.buffer); + close(fd_core); + + printf(" ** ME successfully restored and resumed...\n"); diff --git a/build/meta-usr/recipes-usr/soo/usr-linux_1.0.bbappend b/build/meta-usr/recipes-usr/soo/usr-linux_1.0.bbappend index 3d7672f..220c9b3 100644 --- a/build/meta-usr/recipes-usr/soo/usr-linux_1.0.bbappend +++ b/build/meta-usr/recipes-usr/soo/usr-linux_1.0.bbappend @@ -1,3 +1,5 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD SUMMARY = "Add-ons for SOO user space environment" DESCRIPTION = "Additional applications are used to manage SO3 capsules" @@ -25,8 +27,6 @@ do_install_apps:append () { usr_do_install_file_root "${IB_TARGET}/build/src/soo/shutdownme" usr_do_install_file_root "${IB_TARGET}/build/src/soo/emiso_engine/emiso_engine" - usr_do_install_file_root "${IB_TARGET}/build/src/soo/fb_mapper" - usr_do_install_file_root "${IB_TARGET}/build/src/soo/input_forwarding" fi } diff --git a/build/meta/classes/base.bbclass b/build/meta/classes/base.bbclass index 8594c0b..fc1d65e 100644 --- a/build/meta/classes/base.bbclass +++ b/build/meta/classes/base.bbclass @@ -15,6 +15,7 @@ FILESPATH = "${@base_set_filespath(["${FILE_DIRNAME}/${P}", "${FILE_DIRNAME}/${P # THISDIR only works properly with imediate expansion as it has to run # in the context of the location its used (:=) + THISDIR = "${@os.path.dirname(d.getVar('FILE'))}" python () { @@ -55,6 +56,7 @@ DEPENDS:prepend = "${BASEDEPENDS} " # THISDIR only works properly with imediate expansion as it has to run # in the context of the location its used (:=) + THISDIR = "${@os.path.dirname(d.getVar('FILE'))}" addtask fetch @@ -180,16 +182,47 @@ python do_handle_fetch_git() { } do_unpack[postfuncs] = "do_handle_fetch_git" +# Default to the safe behaviour; set IB_FORCE_ATTACH=1 (env or local.conf) +# to override the dirty-tree guard below. +IB_FORCE_ATTACH ??= "0" + do_attach_infrabase () { + ib_manifest="${IB_TARGET}.attach.sha256" + + # Guard against silently clobbering local edits. + # + # do_attach_infrabase regenerates ${IB_TARGET} from the freshly + # fetched+patched ${S}. The fetched component trees (avz/, u-boot/, + # qemu/, ...) are gitignored, so an edit made directly in ${IB_TARGET} + # that hasn't been folded back into the patch set (via do_updiff) has no + # version-control safety net — re-attaching would destroy it. After each + # attach we record a sha256 manifest of the files we wrote; on the next + # attach we verify those files are still untouched and abort if any were + # modified or removed. Build artefacts produced by a later `make` are not + # in the manifest, so a freshly-built tree still verifies clean. Newly + # *added* source files are not tracked by the manifest — the ${IB_TARGET}.back + # copy remains the last-resort net for that case. + if [ -d "${IB_TARGET}" ] && [ -f "$ib_manifest" ] && [ "${IB_FORCE_ATTACH}" != "1" ]; then + ib_dirty=$(cd "${IB_TARGET}" && LC_ALL=C sha256sum -c --quiet "$ib_manifest" 2>/dev/null | sed -n 's/: FAILED.*$//p') + if [ -n "$ib_dirty" ]; then + bbwarn "Local modifications detected in ${IB_TARGET}, not captured in the ${PN} patch set:" + echo "$ib_dirty" | sed 's|^\./| |' >&2 + bbfatal "Refusing to re-attach ${PN} (would overwrite the files above). Run 'bitbake ${PN} -c updiff' to fold them into the patch set, or set IB_FORCE_ATTACH=1 to discard them and re-attach (prior tree is kept in ${IB_TARGET}.back)." + fi + fi + echo "Attaching ${PN} to ${IB_TARGET}" - + if [ -d "${IB_TARGET}" ]; then rm -rf ${IB_TARGET}.back mv ${IB_TARGET} ${IB_TARGET}.back fi - + mkdir -p ${IB_TARGET} cp -r ${S}/. ${IB_TARGET} + + # Record what we just wrote so the next attach can detect local edits. + ( cd "${IB_TARGET}" && find . -type f -print0 | LC_ALL=C sort -z | xargs -0 sha256sum ) > "$ib_manifest" 2>/dev/null || rm -f "$ib_manifest" } addtask cleansstate after do_clean diff --git a/build/meta/classes/logging.bbclass b/build/meta/classes/logging.bbclass index ce03abf..28cfd63 100644 --- a/build/meta/classes/logging.bbclass +++ b/build/meta/classes/logging.bbclass @@ -14,6 +14,7 @@ LOGFIFO = "${T}/fifo.${@os.getpid()}" # Print the output exactly as it is passed in. Typically used for output of # tasks that should be seen on the console. Use sparingly. # Output: logs console + bbplain() { if [ -p ${LOGFIFO} ] ; then printf "%b\0" "bbplain $*" > ${LOGFIFO} @@ -24,6 +25,7 @@ bbplain() { # Notify the user of a noteworthy condition. # Output: logs + bbnote() { if [ -p ${LOGFIFO} ] ; then printf "%b\0" "bbnote $*" > ${LOGFIFO} @@ -35,6 +37,7 @@ bbnote() { # Print a warning to the log. Warnings are non-fatal, and do not # indicate a build failure. # Output: logs console + bbwarn() { if [ -p ${LOGFIFO} ] ; then printf "%b\0" "bbwarn $*" > ${LOGFIFO} @@ -46,6 +49,7 @@ bbwarn() { # Print an error to the log. Errors are non-fatal in that the build can # continue, but they do indicate a build failure. # Output: logs console + bberror() { if [ -p ${LOGFIFO} ] ; then printf "%b\0" "bberror $*" > ${LOGFIFO} @@ -57,6 +61,7 @@ bberror() { # Print a fatal error to the log. Fatal errors indicate build failure # and halt the build, exiting with an error code. # Output: logs console + bbfatal() { if [ -p ${LOGFIFO} ] ; then printf "%b\0" "bbfatal $*" > ${LOGFIFO} @@ -69,6 +74,7 @@ bbfatal() { # Like bbfatal, except prevents the suppression of the error log by # bitbake's UI. # Output: logs console + bbfatal_log() { if [ -p ${LOGFIFO} ] ; then printf "%b\0" "bbfatal_log $*" > ${LOGFIFO} @@ -84,6 +90,7 @@ bbfatal_log() { # Output: logs console # Usage: bbdebug 1 "first level debug message" # bbdebug 2 "second level debug message" + bbdebug() { USAGE='Usage: bbdebug [123] "message"' if [ $# -lt 2 ]; then diff --git a/build/meta/classes/patch.bbclass b/build/meta/classes/patch.bbclass index 12b730d..cd5922c 100644 --- a/build/meta/classes/patch.bbclass +++ b/build/meta/classes/patch.bbclass @@ -1,5 +1,6 @@ # Copyright (C) 2006 OpenedHand LTD -# Copyright (C) 2023-2025 EDGEMTech Ltd +# Copyright (C) 2023-2026 EDGEMTech Ltd +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD # # SPDX-License-Identifier: MIT @@ -23,6 +24,14 @@ python () { d.appendVarFlag('do_patch', 'prefuncs', ' patch_task_patch_prefunc') for task in extratasks: d.appendVarFlag(task, 'postfuncs', ' patch_task_postfunc') + + # Append patch_save_pristine after every other do_unpack postfunc — in + # particular do_handle_fetch_git from base.bbclass, which is what + # actually populates ${S} on git-fetched recipes. Done here (parse-time + # anonymous python) so we run AFTER base.bbclass's `do_unpack[postfuncs] + # = ...` overwrite, preserving the run order + # handle_fetch_git → patch_save_pristine. + d.appendVarFlag('do_unpack', 'postfuncs', ' patch_save_pristine') } python patch_task_patch_prefunc() { @@ -175,82 +184,413 @@ def get_next_number(patchdir): do_diffcompose[nostamp] = "1" +# Save an untouched copy of ${S} right after do_unpack (+ its +# do_handle_fetch_git postfunc) populates it, BEFORE do_patch mutates the +# tree. do_diffcompose later compares this pristine snapshot against +# IB_TARGET so that the staged patches reflect the FULL divergence of +# IB_TARGET from upstream — enabling do_updiff to consolidate per-file +# patches instead of appending an ever-growing chain. + +python patch_save_pristine() { + import os + import shutil + s = d.getVar('S') + if not s or not os.path.isdir(s): + return + pristine = s + '.pristine' + if os.path.isdir(pristine): + shutil.rmtree(pristine) + shutil.copytree(s, pristine, symlinks=True) +} + # Infrabase patch generation algorithm +# +# Produces per-file patches in ${FILE_DIRNAME}/files/${PF}/ comparing the +# pristine upstream sources (${S}.pristine, saved by patch_save_pristine +# right after do_unpack) against the local working tree (IB_TARGET). Each +# staged patch is therefore a self-contained "upstream → final" diff for +# one source file; do_updiff can drop it in place at the slot of the +# existing patch for that file, fully replacing the previous content. +# +# Patch headers use git-style "a/" / "b/" labels so the resulting +# patches apply cleanly with `patch -p1` from the source tree root, +# independent of where the project was checked out. Earlier versions of +# this task wrote absolute paths on both sides (e.g. /home/...//.../), +# which silently broke as soon as the repository was cloned anywhere else. +# +# The staging directory ${FILE_DIRNAME}/files/${PF}/ is wiped and recreated +# on every run so that stale patches from previous invocations do not leak +# into the new patchset (do_updiff promotes this directory in place into +# the existing numbered patchset). + python patch_do_diffcompose() { + import os + import re + import shlex + import shutil import subprocess - - source_dir = d.getVar('S') + + source_dir = d.getVar('S') + '.pristine' + if not os.path.isdir(source_dir): + bb.fatal( + f"do_diffcompose: pristine source {source_dir} missing. " + f"Run './scripts/build.sh -xc {d.getVar('PN')}' first so that " + f"do_unpack regenerates the pristine snapshot, then re-run updiff." + ) target_dir = d.getVar('IB_TARGET') - output_dir = d.getVar('FILE_DIRNAME') + '/files/' + d.getVar('PF') - - # Create the output directory if it doesn't exist - os.makedirs(output_dir, exist_ok=True) - - # Diff files - - # To avoid having the temporary file in the directory to patch, - # we create it in the parent directory. + output_dir = os.path.join(d.getVar('FILE_DIRNAME'), 'files', d.getVar('PF')) + + if os.path.isdir(output_dir): + shutil.rmtree(output_dir) + os.makedirs(output_dir) + diff_files_tmp = os.path.join(d.getVar('TMPDIR'), "diff_files.tmp") - - statement = 'diff -Nrq -x "*.su" -x "*.o.d" -x "*.ko" -x "*.mod.*" -x "*.o" -x "*.cmd" -x "*.a" --no-dereference --exclude=.git ' + source_dir + ' . > ' + diff_files_tmp + + # Enumerate differing/added/removed files. cwd=target_dir so the target + # side of each line is reported as "./". + # + # Excludes filter out build artefacts that leak into IB_TARGET when the + # user runs `make` before `updiff`. Without this filter the patchset + # gets polluted with hundreds of generated files (kconfig output, dtc + # intermediates, kbuild auto-generated headers, etc.). Patterns are + # matched against basenames by `diff -x`. + exclude_patterns = [ + # compiler / linker object artefacts. NOTE: *.lds is NOT excluded — + # SO3 ships hand-written linker scripts (e.g. arch/*/so3.lds) and + # filtering them silently kills the corresponding source patch. + '*.o', '*.a', '*.ko', '*.so', '*.cmd', '*.su', '*.o.d', '*.d', + '*.mod', '*.mod.*', + # kbuild auto-generated headers and asm. NOTE: *.lds is generated + # only for some files (e.g. arch/arm64/kernel/module.lds.S → module.lds); + # we cannot blacklist `*.lds` globally so individual names go below. + 'autoconf.h', 'asm-offsets.h', 'asm-offsets.s', + 'devicetable-offsets.h', 'devicetable-offsets.s', + 'elfconfig.h', 'module.lds', + # lex / yacc / bison generated parsers — kconfig, dtc, and any other + # consumer of flex/bison. Sources are *.l / *.y (kept); outputs are + # *.lex.c, *.tab.c, *.tab.h (excluded). + 'lex.zconf.c', 'zconf.tab.c', 'zconf.hash.c', + '*lex.lex.c', '*.lex.c', '*.tab.c', '*.tab.h', '*lexer.l.c', + # kconfig output / state files + '.config', '.config.old', 'auto.conf', 'auto.conf.cmd', + 'tristate.conf', 'config_data', 'config_data.gz', 'config_data.h', + # generated SO3 syscall tables + 'syscall_number.h', 'syscall_table.h', 'syscall_table.h.in', + # device-tree build outputs and intermediates (the *.tmp pattern + # also catches the leading-dot dtc temp files such as + # ".virt64.dtb.dts.tmp") + '*.dtb', '*.dtbo', '*.tmp', + # vmlinux + kallsyms-pass artefacts (`.tmp_vmlinux*.{syms,kallsyms.S}`, + # `.vmlinux.export.c`, `.version` — the build counter file at root). + 'vmlinux*', '.vmlinux.*', '.version', '.tmp_*', '.missing-*', + 'System.map', 'Module.symvers', + 'modules.builtin', 'modules.builtin.modinfo', 'modules.order', + # u-boot build outputs (final binaries, maps, configs) + 'u-boot', 'u-boot.cfg*', 'u-boot.sym', 'u-boot.srec', + 'u-boot.map', 'u-boot.lds', 'u-boot.bin', 'u-boot.bin.*', + 'u-boot-dtb*', 'u-boot-nodtb*', + # u-boot kbuild-generated config + example/efi build outputs that + # leak into IB_TARGET after a `make` (include/generated and + # include/config are dir-excluded below; these live elsewhere). + 'autoconf.mk', 'autoconf.mk.dep', '*.srec', + 'efi_miniapp_*.h', + # initramfs build deps + '.initramfs_*', + ] + # Exclude the quilt working directory + kbuild-generated trees: + # patches/ — quilt staging from do_attach_infrabase + # include/generated/ — kbuild's auto-generated arch headers (cfi.h, + # delay.h, etc. from arch/*/include/asm/Kbuild) + # include/config/ — kbuild's symbol-tracking files + excludes = ' '.join(f'-x "{p}"' for p in exclude_patterns) + excludes += ' --exclude=.git --exclude=patches' + excludes += ' --exclude=generated --exclude=config' + # Recipe-supplied extra excludes — space-separated directory/file + # basenames (glob), matched by `diff --exclude` at any depth. Used for + # things that vary per recipe and would otherwise flood the patchset, + # most notably an out-of-tree build directory (e.g. QEMU's meson/ninja + # `build/`, which holds 1000+ generated files). A blanket exclude in + # this shared class would be unsafe (another recipe might ship real + # source under such a name), so each recipe opts in via IB_UPDIFF_EXCLUDE. + for x in (d.getVar('IB_UPDIFF_EXCLUDE') or '').split(): + excludes += f' --exclude={shlex.quote(x)}' + statement = ( + f'diff -Nrq {excludes} --no-dereference ' + f'{shlex.quote(source_dir)} . > {shlex.quote(diff_files_tmp)}' + ) subprocess.call(statement, shell=True, cwd=target_dir) - - # Prefix before patch (ex. : 0001-mypatch.patch) + new_number = 1 - + src_norm = source_dir.rstrip('/') + '/' + with open(diff_files_tmp, "r") as diff_file: - for line in diff_file: - line = line.strip() - line_parts = line.split() - - type = line_parts[0] - src = line_parts[1] - target = line_parts[3] - - filename = os.path.basename(target) - statement = 'diff --no-dereference -Naur ' + src + ' ' + target + ' --exclude=.git > ' + output_dir + '/' + f"{new_number:04d}-{filename}" + '.patch' - subprocess.call(statement, shell=True, cwd=target_dir) - + for raw_line in diff_file: + line = raw_line.rstrip('\n') + if not line: + continue + + src_path = None + tgt_path = None + rel = None + + # Form 1: "Files and differ" + m = re.match(r'^Files (.+) and (.+) differ$', line) + if m: + src_path = m.group(1) + tgt_path = m.group(2) + if tgt_path.startswith('./'): + rel = tgt_path[2:] + elif src_path.startswith(src_norm): + rel = src_path[len(src_norm):] + else: + bb.warn(f"do_diffcompose: cannot derive relative path for: {line}") + continue + else: + # Form 2: "Only in

: " + m = re.match(r'^Only in (.+): (.+)$', line) + if not m: + bb.warn(f"do_diffcompose: unrecognised diff -Nrq line: {line}") + continue + only_dir = m.group(1) + only_name = m.group(2) + full = os.path.join(only_dir, only_name) + if only_dir == source_dir or only_dir.startswith(src_norm): + # Present only in source -> file deleted in target. + src_path = full + rel = os.path.relpath(full, source_dir) + tgt_path = os.path.join('.', rel) + else: + # only_dir is relative to cwd=target_dir; file added locally. + tgt_path = full + rel = os.path.relpath(full, '.') + src_path = os.path.join(source_dir, rel) + + filename = os.path.basename(rel) + output_patch = os.path.join(output_dir, f"{new_number:04d}-{filename}.patch") + + # Per-file unified diff with git-style a/ b/ labels so + # the patch applies cleanly with `patch -p1` regardless of the + # checkout location. + cmd = [ + 'diff', '--no-dereference', '-uN', + '--label', f'a/{rel}', + '--label', f'b/{rel}', + src_path, tgt_path, + ] + with open(output_patch, 'wb') as out: + subprocess.run(cmd, stdout=out, cwd=target_dir, check=False) + + # `diff -uN` emits "Binary files and differ" instead of + # a usable hunk when either side is binary. Writing that as a + # .patch file makes do_patch fail later with "Only garbage was + # found in the patch input". These are typically build + # artefacts (e.g. compiled scripts/kconfig/conf) that leaked + # into IB_TARGET; just drop the patch and move on. + with open(output_patch, 'rb') as f: + first = f.readline() + if first.startswith(b'Binary files '): + bb.note(f"do_diffcompose: skipping binary file: {rel}") + os.remove(output_patch) + continue + new_number += 1 - + os.remove(diff_files_tmp) } def generate_src_uri(patch_directory): - patches = [patch for patch in os.listdir(patch_directory) if patch.endswith(".patch")] - src_uri = "SRC_URI += \"\\ \n" + patches = sorted(p for p in os.listdir(patch_directory) + if p.endswith(".patch")) + # Standard header so repeated updiff runs don't churn it out of the .inc. + src_uri = "# Copyright (c) 2025-2026 EDGEMTech SA\n\n" +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + src_uri += "SRC_URI += \"\\ \n" for patch in patches: src_uri += " file://" + patch + " \\ \n" src_uri += "\"\n" - return src_uri.strip() + return src_uri + + +def patch_identifier(path): + """Return the relative path encoded in a patch's "--- a/" or + "+++ b/" header line. Patches produced by do_diffcompose always + carry git-style a/ b/ labels, so this identifier uniquely + designates the source file the patch targets, independent of the + patch's own filename or sequence number.""" + src = None + dst = None + try: + with open(path, 'r', errors='replace') as f: + for i, line in enumerate(f): + if i > 8: + break + if line.startswith('--- '): + src = line[4:].rstrip('\r\n').split('\t', 1)[0] + elif line.startswith('+++ '): + dst = line[4:].rstrip('\r\n').split('\t', 1)[0] + break + except OSError: + return None + for s in (dst, src): + if not s or s == '/dev/null': + continue + if s.startswith('a/') or s.startswith('b/'): + return s[2:] + return s + return None + + +def index_patchset(directory): + """Build {relative_path: [patch_filename, ...]} for a patchset + directory. The list lets callers detect when several patches in the + series modify the same source file (a chain) and treat that case + specially — consolidation only works when exactly one patch targets a + given file.""" + idx = {} + if not os.path.isdir(directory): + return idx + for fname in sorted(os.listdir(directory)): + if not fname.endswith('.patch'): + continue + pid = patch_identifier(os.path.join(directory, fname)) + if pid is not None: + idx.setdefault(pid, []).append(fname) + return idx addtask do_updiff do_updiff[nostamp] = "1" +# Merge the staged patchset produced by do_diffcompose +# (${FILE_DIRNAME}/files/${PF}/) into the canonical numbered patchset. +# +# Staged patches are self-contained "pristine → IB_TARGET" diffs (one per +# source file). do_updiff decides, per file, between three outcomes: +# +# * CONSOLIDATE — the patchset already has exactly one patch targeting +# this file. We overwrite that patch in place with the new content +# (keeping its NNNN prefix and series position). This works because +# no earlier patch in the series modifies the file (otherwise the +# existing patch would coexist with another), so the slot's ${S} +# state at do_patch time equals the pristine state our diff is based +# on — the regenerated patch applies cleanly. +# * APPEND — no patch exists yet for this file. The next-available +# NNNN gets the new patch at the end of the series, where ${S} is +# already at its post-all-previous-patches state and the diff (which +# was generated against pristine) is the complete divergence from +# upstream → applies cleanly. +# * SKIP (chain warning) — the patchset already has TWO OR MORE patches +# for this file (a chain of incremental edits accumulated over past +# append-only updiff runs). Consolidation would have to pick one +# entry of the chain to overwrite, and the others would either be +# redundant or actively conflicting. Append would re-apply the chain's +# cumulative effect a second time at the end, which do_patch rejects. +# We log a warning and leave the chain alone; resolution is manual: +# either delete every patch in the chain except the first one (then +# re-run updiff to consolidate into that first slot), or hand-merge +# them into one patch. +# +# Patches present in the target but not in staging are ALWAYS kept +# untouched (e.g. when an existing patch creates a file that's been +# excluded from the diff, or when staging is empty because the user +# hasn't edited anything yet). +# +# If no numbered patchset exists yet, a fresh 0001-${PF}/ is populated. +# The corresponding NNNN-${PF}-patches.inc is regenerated (sorted) from +# the actual contents of the patchset directory. + python do_updiff() { - - # Get the highest four-digit number among existing files - highest_number = 0 - + import os + import re + import shutil + import filecmp + patchdir = d.getVar('FILE_DIRNAME') + '/files/' - - new_number = get_next_number(patchdir) - - patchfile = d.getVar('PF') + ".patch" - - if not os.path.exists(patchfile): - patchfile = d.getVar('PF') - - # Rename the file with the new prefix - - new_filename = f"{new_number:04d}-{patchfile}" - - os.rename(patchdir + patchfile, patchdir + new_filename) - print(f"Renamed {patchfile} to {new_filename}") - - src_uri = generate_src_uri(patchdir + new_filename) - with open(patchdir + new_filename + "-patches.inc", 'w') as file: - file.write(src_uri) + pf = d.getVar('PF') + staging = os.path.join(patchdir, pf) + + if not os.path.isdir(staging): + bb.fatal(f"do_updiff: staging directory {staging} not found " + "(run do_diffcompose first?)") + + # Find existing numbered patchsets matching this PF. + pattern = re.compile(r'^(\d{4})-' + re.escape(pf) + r'$') + existing = [] + if os.path.isdir(patchdir): + for entry in os.listdir(patchdir): + full = os.path.join(patchdir, entry) + m = pattern.match(entry) + if m and os.path.isdir(full): + existing.append((int(m.group(1)), entry)) + + if existing: + existing.sort() + target_dirname = existing[0][1] + target_dir = os.path.join(patchdir, target_dirname) + bb.note(f"do_updiff: merging into existing patchset {target_dirname}") + else: + target_dirname = f"0001-{pf}" + target_dir = os.path.join(patchdir, target_dirname) + os.makedirs(target_dir, exist_ok=True) + bb.note(f"do_updiff: creating initial patchset {target_dirname}") + + target_idx = index_patchset(target_dir) + staging_idx = index_patchset(staging) + + # Highest existing NNNN prefix in the target — used for new patches. + used_numbers = set() + for fnames in target_idx.values(): + for fname in fnames: + try: + used_numbers.add(int(fname[:4])) + except ValueError: + pass + next_number = max(used_numbers, default=0) + 1 + + kept = consolidated = appended = skipped_chain = 0 + + # Per-file: CONSOLIDATE (overwrite the single existing patch), + # APPEND (no existing patch yet), or SKIP (existing chain — manual + # consolidation required). See the docstring above. + for pid, sname_list in staging_idx.items(): + # do_diffcompose only ever emits one patch per pid. + sname = sname_list[0] + spath = os.path.join(staging, sname) + existing = target_idx.get(pid, []) + if len(existing) == 1: + tname = existing[0] + tpath = os.path.join(target_dir, tname) + if filecmp.cmp(spath, tpath, shallow=False): + kept += 1 + else: + shutil.copyfile(spath, tpath) + consolidated += 1 + elif len(existing) == 0: + new_name = f"{next_number:04d}-{os.path.basename(pid)}.patch" + shutil.copyfile(spath, os.path.join(target_dir, new_name)) + next_number += 1 + appended += 1 + else: + bb.warn( + f"do_updiff: {pid} already has {len(existing)} patches " + f"in the series ({', '.join(existing)}). Refusing to " + f"append a cumulative diff on top: it would re-apply the " + f"chain's content and break do_patch. Manually merge the " + f"chain into a single patch, then re-run updiff." + ) + skipped_chain += 1 + + # Drop the staging directory. + shutil.rmtree(staging) + + # Regenerate the .inc manifest (sorted, deterministic). + inc_path = os.path.join(patchdir, target_dirname + "-patches.inc") + with open(inc_path, 'w') as f: + f.write(generate_src_uri(target_dir)) + + bb.plain(f"do_updiff: patchset {target_dirname}: " + f"{kept} unchanged, {consolidated} consolidated, " + f"{appended} appended, {skipped_chain} skipped (existing chain) " + f"({sum(len(v) for v in target_idx.values())} existing patches kept intact)") } addtask do_diffcompose before do_updiff diff --git a/build/meta/classes/utils.bbclass b/build/meta/classes/utils.bbclass index ce45da8..4d5bcf8 100644 --- a/build/meta/classes/utils.bbclass +++ b/build/meta/classes/utils.bbclass @@ -2,9 +2,10 @@ # # Various utility functions # -# Copyright (c) 2025 EDGEMTech Ltd +# Copyright (c) 2025-2026 EDGEMTech Ltd +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD # -# Authors: +# Authors: # EDGEMTech Ltd, Daniel Rossier (daniel.rossier@edgemtech.ch) # EDGEMTech Ltd, Erik Tagirov (erik.tagirov@edgemtech.ch) # @@ -30,136 +31,29 @@ def base_set_filespath(path, d): filespath.append(os.path.join(p, o)) return ":".join(filespath) -# Check if the user is root -def utils_chk_is_root_user(d): - - import os - - if os.geteuid() == 0: - return True - - return False - -# Get uid of the user that ran sudo or su, by -# first attempting to check if the IB_UNPRIVILEDGED_USER_ID -# env var is present this env var is set by env.sh +# Run a single command under `sudo -n` (non-interactive). bitbake itself +# runs unprivileged: only the specific operations that genuinely need +# root (mount/umount/losetup/mkfs/parted/...) are escalated here. # -# if not present then fallback to -# getting the username via logname(1) which uses -# the user name of the active session similar to who -m -# However logname(1) returns the user that opened the session -# so doesn't work if running BB while impersonating a service account - -def utils_get_user_uid(d): - import subprocess - import os - - IB_UNPRIVILEDGED_USER_ID = d.getVar("IB_UNPRIVILEDGED_USER_ID") - - if IB_UNPRIVILEDGED_USER_ID: - return int(IB_UNPRIVILEDGED_USER_ID) - - # Fallback method - try: - - login_name = subprocess.check_output(["logname"], - stderr=subprocess.DEVNULL).strip().decode() - - uid = subprocess.check_output(["id", "-u", login_name], - stderr=subprocess.DEVNULL).strip().decode() - - except Exception as e: - bb.fatal(f"Failed to retrieve user uid error: {e}") - - return int(uid) - -def utils_get_user_gid(d): - import subprocess - import os - - IB_UNPRIVILEDGED_GROUP_ID = d.getVar("IB_UNPRIVILEDGED_GROUP_ID") - - if IB_UNPRIVILEDGED_GROUP_ID: - return int(IB_UNPRIVILEDGED_GROUP_ID) - - # Fallback method - try: - - login_name = subprocess.check_output(["logname"], - stderr=subprocess.DEVNULL).strip().decode() - - gid = subprocess.check_output(["id", "-g", login_name], - stderr=subprocess.DEVNULL).strip().decode() - - except Exception as e: - bb.fatal(f"Failed to retrieve user gid error: {e}") - - return int(gid) - -# Change the owner of a file or directory to the user that opened the -# the session because for the filesystem or rootfs recipes bitbake -# is executed through sudo, Therefore -# changing back to the user required to avoid -# the need for sudo when cleaning the build/tmp directory - -def utils_chown_file(d, path, follow_symlinks=True, recursive=True): - import os +# The caller chain (deploy.sh / build.sh / mount.sh / umount.sh) MUST +# have validated the sudo timestamp via `sudo_session_start` before +# bitbake is launched — otherwise the very first `utils_sudo` call +# fails fast with sudo's standard "a password is required" message. +# +# Args: +# cmd: list of argv items (preferred) — escapes nothing for you +# but is shell-injection-proof +# shell: when True, `cmd` is a shell command string and the call +# becomes `sudo -n sh -c `. Use this for pipelines. +# Stdout redirection inside `cmd` runs as root: pass +# `stdout=open(path, 'wb')` instead to keep the output file +# user-owned. +# **kwargs: forwarded to subprocess.run (check, capture_output, +# input, stdin, stdout, stderr, text, cwd, env, ...). + +def utils_sudo(cmd, shell=False, **kwargs): import subprocess - - uid = utils_get_user_uid(d) - gid = utils_get_user_gid(d) - - try: - param = "-" - - if follow_symlinks: - param = f"{param}L" - - if os.path.isdir(path) and recursive: - param = f"{param}R" - - if os.path.islink(path): - # Change the owner of the link itself - subprocess.check_output(["chown", f"{uid}:{gid}", path]).strip().decode() - - if param != "-": - subprocess.check_output(["chown", param, f"{uid}:{gid}", path]).strip().decode() - else: - subprocess.check_output(["chown", f"{uid}:{gid}", path]).strip().decode() - - except Exception as e: - bb.fatal(f"Failed to change the owner of dir/file: {path} error: {e}") - - -# Change ownership of directory - -# seperate function for clarity at the call site - -def utils_chown_dir(d, dir_path, follow_symlinks=True, recursive=True): - - utils_chown_file(d, dir_path, follow_symlinks, recursive) - -# Changes ownership of bitbake cache tmp/cache -# and the temp dir of the task -# NOTE: This is only called by tasks executed as root - -def utils_restore_user_ownership(d): - - CACHE_PATH = d.getVar("CACHE") - WORKDIR = d.getVar("WORKDIR") - - # Reset the ownership incl. symlinks bitbake creates - utils_chown_dir(d, CACHE_PATH) - utils_chown_dir(d, CACHE_PATH, follow_symlinks=False) - - # Follow symlinks - utils_chown_dir(d, f"{WORKDIR}/temp") - - # Change the ownership of all the symlinks in 'temp' - utils_chown_dir(d, f"{WORKDIR}/temp", follow_symlinks=False) - - # The 'temp' directory itself - utils_chown_dir(d, f"{WORKDIR}/temp", follow_symlinks=False, recursive=False) - - # And finally, the workdir but not its contents - utils_chown_dir(d, f"{WORKDIR}", follow_symlinks=False, recursive=False) + if shell: + return subprocess.run(["sudo", "-n", "sh", "-c", cmd], **kwargs) + return subprocess.run(["sudo", "-n"] + list(cmd), **kwargs) diff --git a/build/meta/conf/bitbake.conf b/build/meta/conf/bitbake.conf index ec68358..a2b1a9d 100644 --- a/build/meta/conf/bitbake.conf +++ b/build/meta/conf/bitbake.conf @@ -68,6 +68,7 @@ PATCHTOOL = "patch" # EDGEMTech # Please do *not* change the IB directory path, it corresponds to the root dir of IB repository + IB_DIR = "${TOPDIR}/.." CORES = "$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu || echo "$NUMBER_OF_PROCESSORS")" diff --git a/build/meta/conf/layer.conf b/build/meta/conf/layer.conf index 0b5927d..1bd1c8b 100644 --- a/build/meta/conf/layer.conf +++ b/build/meta/conf/layer.conf @@ -1,3 +1,6 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + BBPATH .= ":${LAYERDIR}" BBFILES += "${LAYERDIR}/recipes-*/*/*.bb" @@ -12,5 +15,6 @@ LAYERSERIES_CORENAMES = "infrabase_core" # This should only be incremented on significant changes that will # cause compatibility issues with other layers + LAYERVERSION_core = "1" LAYERSERIES_COMPAT_core = "infrabase_core" diff --git a/env.sh b/env.sh index 2b2e5b7..eb092ee 100755 --- a/env.sh +++ b/env.sh @@ -1,8 +1,24 @@ #!/bin/sh + +# Strip the previous tree's contributions from PATH before adding new +# ones. Without this, `cd ../sibling && . ./env.sh` would leave both +# trees' scripts/ entries on PATH, and the older entry could win for +# `which build.sh`. +if [ -n "$IB_ROOT_DIR" ] && [ "$IB_ROOT_DIR" != "$PWD" ]; then + _escaped_root=$(printf '%s' "$IB_ROOT_DIR" | sed 's|[][\.*^$()+?{}\|]|\\&|g') + PATH=$(printf '%s:' "$PATH" | \ + sed -e "s|$_escaped_root/scripts:||g" \ + -e "s|$_escaped_root/build/bitbake/bin:||g" \ + -e 's/:$//') + unset _escaped_root +fi + export IB_ROOT_DIR=$PWD export BUILDDIR="$PWD/build" export BBPATH=$BUILDDIR -PATH=$PATH:$PWD/scripts:$BUILDDIR/bitbake/bin +# Prepend so the active tree's scripts always win, even if leftover +# entries from another tree are still on PATH. +PATH="$PWD/scripts:$BUILDDIR/bitbake/bin:$PATH" # Specify auxiliary layers for the -x component opt export IB_AUX_LAYERS="meta-usr meta-torizon meta-so3 meta-qemu meta-atf" @@ -14,27 +30,109 @@ then PATH="$PATH:$IB_TOOLCHAIN_PATH" fi -# Avoid setting uid/gid of the regular user -# when sourced again by the root user in deploy.sh -if test -z "$IB_UNPRIVILEDGED_USER_ID" -then - IB_UNPRIVILEDGED_USER_ID=`id -u` -fi - -if test -z "$IB_UNPRIVILEDGED_GROUP_ID" -then - IB_UNPRIVILEDGED_GROUP_ID=`id -g` -fi - -# If not set - set default list of preserved variables -# that are passed to bitbake +# Variables passed through to bitbake task scripts. bitbake now runs +# unprivileged so the IB_UNPRIVILEDGED_USER_ID/GROUP_ID variables that +# used to be needed to chown root-written files back are gone; only +# build inputs remain. if test -z "$BB_ENV_PASSTHROUGH_ADDITIONS" then - BB_ENV_PASSTHROUGH_ADDITIONS='IB_TOOLCHAIN_PATH IB_UNPRIVILEDGED_USER_ID IB_UNPRIVILEDGED_GROUP_ID IB_ROOT_DIR' + BB_ENV_PASSTHROUGH_ADDITIONS='IB_TOOLCHAIN_PATH IB_ROOT_DIR IB_FORCE_ATTACH' export BB_ENV_PASSTHROUGH_ADDITIONS fi export PATH -export IB_UNPRIVILEDGED_USER_ID -export IB_UNPRIVILEDGED_GROUP_ID +# Auto-switch the build env when cwd moves into a sibling infrabase +# tree. The hook runs in the user's interactive shell (bash via +# PROMPT_COMMAND, zsh via chpwd_functions) so the switch is a real +# parent-shell change, not a subshell-local one. The function walks +# up from $PWD looking for env.sh; when it finds one belonging to a +# different tree than IB_ROOT_DIR, it prompts the user and (on y) +# re-sources that env.sh in-place. Cwd is preserved across the switch. +# +# A declined target is remembered in _ib_declined_tree so the user +# isn't re-prompted for the same tree on every subsequent prompt +# cycle (bash's PROMPT_COMMAND fires per-prompt, not per-cd). Cd'ing +# into a different tree resets the prompt. +_ib_chpwd_hook() { + # Per-session opt-out — `export IB_NO_AUTO_SWITCH=1` to silence the + # prompt without unwrapping cd/pushd/popd; `unset IB_NO_AUTO_SWITCH` + # to re-enable. + [ "${IB_NO_AUTO_SWITCH:-}" = "1" ] && return 0 + _t="$PWD" + while [ "$_t" != "/" ] && [ ! -f "$_t/env.sh" ]; do + _t=$(dirname "$_t") + done + if [ ! -f "$_t/env.sh" ]; then + unset _t + return 0 + fi + _t=$(builtin cd "$_t" && pwd) + if [ "$_t" = "$IB_ROOT_DIR" ] || [ "$_t" = "${_ib_declined_tree:-}" ]; then + unset _t + return 0 + fi + + printf '\n[infrabase] env switch requested:\n' >&2 + printf ' current : %s\n' "${IB_ROOT_DIR:-}" >&2 + printf ' target : %s\n\n' "$_t" >&2 + printf 'Switch env to %s? [y/N] ' "$_t" >&2 + # The hook fires from the interactive shell prompt, so plain + # `read` reads from the user's terminal (stdin == tty). + read -r _ib_answer + case "$_ib_answer" in + y|Y|yes|YES) + _ib_orig_pwd="$PWD" + builtin cd "$_t" && . ./env.sh + builtin cd "$_ib_orig_pwd" 2>/dev/null + unset _ib_orig_pwd _ib_declined_tree + ;; + *) + printf '[infrabase] declined — staying on %s\n' \ + "${IB_ROOT_DIR:-}" >&2 + _ib_declined_tree="$_t" + ;; + esac + unset _t _ib_answer +} + +# Wrap cd / pushd / popd so the env-switch check fires after every +# directory change. This is more robust than installing the hook via +# PROMPT_COMMAND (bash) or chpwd_functions (zsh): some shell configs +# rewrite PROMPT_COMMAND aggressively (e.g. edkrepo's +# `edkrepo_combo_chpwd` strips entries it didn't add), and a function +# override is immune. `builtin cd` inside the hook avoids recursion +# when the hook itself cds during the re-source. +cd() { + builtin cd "$@" && _ib_chpwd_hook +} + +pushd() { + builtin pushd "$@" && _ib_chpwd_hook +} + +popd() { + builtin popd "$@" && _ib_chpwd_hook +} + +# Quick toggles for the auto-switch prompt. These are shell functions +# (not scripts) so they run in the current shell and can flip the env +# var that the hook reads. A standalone executable would only flip it +# inside its own subshell. +ib_autoswitch_off() { + export IB_NO_AUTO_SWITCH=1 + echo "[infrabase] auto-switch OFF (cd between trees stays silent)" >&2 +} + +ib_autoswitch_on() { + unset IB_NO_AUTO_SWITCH + echo "[infrabase] auto-switch ON" >&2 +} + +ib_autoswitch_status() { + if [ "${IB_NO_AUTO_SWITCH:-}" = "1" ]; then + echo "auto-switch: OFF" + else + echo "auto-switch: ON" + fi +} diff --git a/scripts/bitbake b/scripts/bitbake new file mode 100755 index 0000000..7a5bf6c --- /dev/null +++ b/scripts/bitbake @@ -0,0 +1,53 @@ +#!/bin/sh + +# bitbake wrapper: prints the active infrabase environment to stderr +# before delegating to the real bitbake binary. Picked up automatically +# because env.sh puts $IB_ROOT_DIR/scripts ahead of bitbake/bin in PATH. +# Helps catch the case where the wrong env.sh is loaded for the +# project being worked on. + +if test -z "$IB_ROOT_DIR" || test -z "$BUILDDIR"; then + echo "bitbake wrapper: IB_ROOT_DIR/BUILDDIR not set; source env.sh first." >&2 + exit 1 +fi + +. "$IB_ROOT_DIR/scripts/common/bblayers.sh" + +# Walk argv to extract the recipe and the task (-c ). Skip the +# arguments to bitbake options that take a value (-c, -b, -e, -r, -R, +# -u, -T, --read, --runall, --runonly, --postfile, --prefile, --token). +# We pick the last positional argument as the recipe, which matches +# the common forms `bitbake recipe`, `bitbake -c task recipe`, and +# `bitbake recipe -c task`. +_recipe= +_task= +_skip_next= +for _arg in "$@"; do + if test -n "$_skip_next"; then + case "$_skip_next" in + task) _task="$_arg" ;; + esac + _skip_next= + continue + fi + case "$_arg" in + -c) + _skip_next=task + ;; + --cmd=*) + _task="${_arg#--cmd=}" + ;; + -b|-e|-r|-R|-u|-T|--read|--runall|--runonly|--postfile|--prefile|--token) + _skip_next=other + ;; + --*=*|-*) + ;; + *) + _recipe="$_arg" + ;; + esac +done + +show_env "$_recipe" "$_task" + +exec "$BUILDDIR/bitbake/bin/bitbake" "$@" diff --git a/scripts/build.sh b/scripts/build.sh index a55a058..2faa0de 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -1,16 +1,30 @@ #!/bin/sh # General build script for the infrabase infrastructure. +# +# bitbake runs as the unprivileged user. The only build invocation that +# needs root (the filesystem image creation, `-x filesystem`) still runs +# bitbake unprivileged — its recipe calls `sudo -n` for the privileged ops +# (losetup/fdisk/mkfs) via the sudo timestamp opened by +# sudo_session_start. -# Copyright (c) 2014-2023 REDS Institute, HEIG-VD -# Copyright (c) 2023-2025 EDGEMTech +# Copyright (c) 2014-2026 REDS Institute, HEIG-VD +# Copyright (c) 2023-2026 EDGEMTech +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD progname=$(basename $0) +# Resolve the project root from this script's own location, cd there, +# and source env.sh — prompting the user first if the parent shell is +# wired to a different tree. Lets build.sh be invoked from anywhere +# (sibling worktree, build/, etc.) without silently switching shells +# between trees. +. "$(cd "$(dirname "$(command -v -- "$0")")" && pwd)/common/setup_env.sh" + pr_usage() { printf "Infrabase build script\n\n" - printf "Usage: $progname [-h] [-l] [-a|-b|-x|-k|-f|-r] [-c][-v]\n" + printf "Usage: $progname [-h] [-l] [-a|-x] [-c] [-v]\n" } pr_help() @@ -18,20 +32,19 @@ pr_help() printf "\nAvailable options:\n" printf " -h Print this help\n" - printf " -l List available BSPs, kernels, components\n" - printf " -a Build all, the name of BSP is required\n" - printf " -k Build kernel only\n" - printf " -x Build component or tool\n" - printf " -r Build rootfs\n" - printf " -f Create and format filesystem image\n" - printf " -b Build uboot only\n" - printf " -v Emit verbose build logs\n" - printf " -c Clean before rebuilding\n\n" + printf " -l List available recipes (BSPs and components)\n" + printf " -a Build a full BSP (kernel, uboot, rootfs, usr)\n" + printf " -x Build a single recipe (component, tool, kernel,\n" + printf " uboot, rootfs, filesystem, ...)\n" + printf " -c Clean (combine with -a/-x to clean then rebuild)\n" + printf " -v Emit verbose build logs\n\n" printf "Examples: \n\n" - printf "$progname -l Print all recipes\n" - printf "$progname -l -a Print all BSP recipes\n" - printf "$progname -l -k Print all kernel recipes\n" - printf "$progname -v -a bsp-linux -c Clean and rebuild all emitting verbose logs\n" + printf "$progname -l Print all recipes\n" + printf "$progname -l -a Print all BSP recipes\n" + printf "$progname -x uboot Build u-boot\n" + printf "$progname -x usr-so3 Build the SO3 user space\n" + printf "$progname -a bsp-so3 Build the full SO3 BSP\n" + printf "$progname -v -a bsp-so3 -c Clean and rebuild the BSP, verbose\n" } if test $# -eq 0 @@ -41,8 +54,8 @@ then exit 1 fi -. ./env.sh . ./scripts/common/bblayers.sh +. ./scripts/common/sudo_session.sh layernames='' recipename='' @@ -51,8 +64,8 @@ dobuild=0 doclean=0 optverbose=0 rootprivs=0 - -while getopts "abcfhklrvx" o; do + +while getopts "achlvx" o; do case "$o" in l) dolist=1 @@ -71,27 +84,35 @@ while getopts "abcfhklrvx" o; do else recipename="$2" dobuild=1 + # do_build is pure compilation for most BSPs, so `-a` needs + # NO privileges. The privileged rootfs loop-mount lives in + # usr-*:do_deploy, which a BSP pulls in via do_itb. Whether + # that happens at *build* time depends on how the recipe + # wires do_itb: + # - bsp-so3 / bsp-capsules: `do_itb before do_deploy` only + # -> do_build is privilege-free; the mount happens in + # deploy.sh. `build.sh -a` must NOT prompt for sudo. + # - bsp-linux: `do_itb before do_build` (so `-a` also + # produces the .itb) -> do_build DOES pull the mount and + # needs root at build time. + # Only open a sudo session for the recipes that actually need + # it at build time (extend this match if more are added). + case "$recipename" in + bsp-linux*) rootprivs=1 ;; + esac fi ;; - r) - if ! test -n "$2" - then - layernames="meta-rootfs" - else - recipename="$2" - dobuild=1 - fi - ;; - b) - layernames="meta-uboot" - recipename="uboot" - dobuild=1 - ;; x) if test -n "$2" then recipename="$2" dobuild=1 + # Some recipes need root at build time (loop-mount / + # losetup / mkfs). Open a sudo session for them, mirroring + # the -a detection. Extend this match if more are added. + case "$recipename" in + bsp-linux*|filesystem) rootprivs=1 ;; + esac else layernames="$IB_AUX_LAYERS" fi @@ -103,19 +124,6 @@ while getopts "abcfhklrvx" o; do v) optverbose=1 ;; - k) - if ! test -n "$2" - then - layernames="meta-linux meta-so3" - else - recipename="$2" - dobuild=1 - fi - ;; - f) - recipename="filesystem" - rootprivs=1 - ;; *) pr_usage; exit 1 @@ -123,7 +131,7 @@ while getopts "abcfhklrvx" o; do esac done -show_platform +show_env "$recipename" if test -z $recipename && test $dolist -eq 0 then @@ -134,6 +142,7 @@ fi # The user is willing to list available recipes # dolist action is available for component options + if test $dolist -eq 1 then if test -z "$layernames" @@ -154,6 +163,24 @@ then IB_BB_OPTS='-vDDD' fi +# Repair stale recipe workdirs first. An interrupted task (e.g. Ctrl-C +# during a clean) can leave a recipe WORKDIR that exists but is missing +# its temp/ subdir; bitbake then can't create that task's fifo and fails +# with "No such file or directory: .../temp/fifo.NNNN" (typically on +# do_clean). Such a workdir holds nothing useful, so remove it and let +# bitbake recreate it cleanly. +if test -d "$BUILDDIR/tmp/work" +then + for _wd in "$BUILDDIR"/tmp/work/*/ + do + if test -d "$_wd" && ! test -d "${_wd}temp" + then + echo "[infrabase] removing stale workdir (no temp/): $_wd" + rm -rf "$_wd" + fi + done +fi + if test $doclean -eq 1 then bitbake $recipename -c clean $IB_BB_OPTS @@ -163,12 +190,14 @@ if test $dobuild -eq 1 then if test $rootprivs -eq 1 then - printf "\n *** NOTE: *** '$recipename' requires root access\n" - printf "you may be prompted for the password\n\n" + printf "\n *** NOTE: *** '$recipename' invokes privileged tools\n" + printf "You may be prompted for the sudo password once.\n\n" - preservedvars='IB_TOOLCHAIN_PATH,IB_UNPRIVILEDGED_USER_ID,IB_UNPRIVILEDGED_GROUP_ID' - sudo --preserve-env=$preservedvars sh -c ". $(pwd)/env.sh; bitbake $recipename ${IB_BB_OPTS}" - else - bitbake $recipename $IB_BB_OPTS + # Open a sudo session: validate timestamp upfront + keep alive + # in the background. Recipes escalate individual commands via + # `sudo -n`. bitbake itself stays unprivileged. + sudo_session_start || exit 1 fi + + bitbake $recipename $IB_BB_OPTS fi diff --git a/scripts/ci-local.sh b/scripts/ci-local.sh new file mode 100755 index 0000000..a68155f --- /dev/null +++ b/scripts/ci-local.sh @@ -0,0 +1,109 @@ +#!/usr/bin/env bash +# +# ci-local.sh — run the GitHub "Build" workflow (.github/workflows/build.yml) +# locally, without pushing. +# +# The CI checks out the repository with actions/checkout (only git-TRACKED +# files, a fresh tree with no build output) and then, inside the so3-env +# container, appends IB_PLATFORM and runs `build.sh -x so3` + `build.sh -x +# usr-so3`. To match that faithfully this script exports the tracked files +# into a throwaway directory and runs the exact same docker command. +# +# Why a throwaway copy instead of mounting the repo directly: +# - untracked files are EXCLUDED, so "I forgot to `git add` a patch" fails +# here exactly like it does in CI (instead of silently passing); +# - your real build/tmp is untouched, and the container builds from scratch +# (fresh timestamps), reproducing the toolchain build the CI actually does. +# Uncommitted edits to tracked files ARE included, so you can test before you +# commit. Use -r to test an exact committed state (git archive) instead. +# +# Usage: +# scripts/ci-local.sh # both platforms (virt32, virt64) +# scripts/ci-local.sh -p virt32 # one platform +# scripts/ci-local.sh -p virt32,virt64 +# scripts/ci-local.sh -r HEAD # test committed HEAD exactly (byte-for-byte) +# scripts/ci-local.sh -k # keep the temp dir even on success +# +set -euo pipefail + +IMAGE="ghcr.io/smartobjectoriented/so3-env:latest" +PLATFORMS="virt32,virt64" +REF="" # empty => working-tree tracked files; non-empty => git archive of REF +KEEP=0 + +# Where the throwaway trees are created. This MUST live under $HOME: snap- and +# rootless-packaged Docker daemons are confined and can only bind-mount paths +# under the user's home — a /tmp mount silently shows up EMPTY in the container +# (the daemon has its own /tmp namespace). Override with CI_LOCAL_WORKDIR. +WORKBASE="${CI_LOCAL_WORKDIR:-$HOME/.cache/so3-ci-local}" + +usage() { sed -n '2,40p' "$0"; exit "${1:-0}"; } + +while getopts ":p:r:kh" opt; do + case "$opt" in + p) PLATFORMS="$OPTARG" ;; + r) REF="$OPTARG" ;; + k) KEEP=1 ;; + h) usage 0 ;; + *) usage 1 ;; + esac +done + +ROOT="$(git rev-parse --show-toplevel)" +cd "$ROOT" + +# Export the tree to copy into the container mount. +populate() { + local dest="$1" + if [ -n "$REF" ]; then + git archive --format=tar "$REF" | tar -C "$dest" -xf - + else + # tracked files with current (working-tree) content; build/tmp & other + # gitignored output are not tracked, so they are naturally excluded. + git ls-files -z | tar --null -C "$ROOT" -cf - -T - | tar -C "$dest" -xf - + fi +} + +# The build runs as root inside the container, so it leaves root-owned files in +# the work tree that the host user cannot delete (rm: "Permission denied"). Hand +# ownership back to the invoking user via the same image (root) before the host +# removes or inspects the tree. +reown() { + docker run --rm -v "$1:/w" "$IMAGE" chown -R "$(id -u):$(id -g)" /w 2>/dev/null || true +} + +rc=0 +IFS=',' read -ra PLATS <<< "$PLATFORMS" +for plat in "${PLATS[@]}"; do + [ -n "$plat" ] || continue + src_desc="${REF:-working tree (tracked files)}" + echo "============================================================" + echo "[ci-local] platform=$plat source=$src_desc image=$IMAGE" + echo "============================================================" + + mkdir -p "$WORKBASE" + work="$(mktemp -d "$WORKBASE/$plat.XXXXXX")" + populate "$work" + + # Exact replica of the build.yml step (IB_PLATFORM appended, then the builds). + if docker run --rm -v "$work:/so3" "$IMAGE" bash -c ' + set -e + cd /so3 + echo "IB_PLATFORM = \"'"$plat"'\"" >> build/conf/local.conf + . ./env.sh + build.sh -x so3 + build.sh -x usr-so3 + '; then + echo "[ci-local] platform=$plat: PASS" + reown "$work" + [ "$KEEP" -eq 1 ] || rm -rf "$work" + else + rc=1 + reown "$work" # so the kept tree can be inspected / removed without sudo + echo "[ci-local] platform=$plat: FAIL (tree kept for inspection: $work)" + fi +done + +echo "============================================================" +[ "$rc" -eq 0 ] && echo "[ci-local] ALL PASSED" || echo "[ci-local] FAILURES (exit $rc)" +exit "$rc" diff --git a/scripts/common/bblayers.sh b/scripts/common/bblayers.sh index d32e3ff..6d71cef 100755 --- a/scripts/common/bblayers.sh +++ b/scripts/common/bblayers.sh @@ -1,3 +1,5 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD # Display main platform - NOTE: this doesn't handle overrides... show_platform() { @@ -5,9 +7,92 @@ show_platform() { echo "Configured for platform = ${IB_PLATFORM}" } +# Print the active infrabase environment to stderr. Sourced by the +# top-level scripts (build.sh, deploy.sh) and the bitbake wrapper so +# the active project is always visible at invocation time. Also warns +# when cwd lives inside a different infrabase project than the one +# whose env.sh is currently loaded. +# +# Optional arguments: recipe name, then task name. When provided, they +# are shown right after the "[infrabase]" tag so the user sees which +# recipe and task the active env will be applied to. + +show_env() { + _recipe="$1" + _task="$2" + _tag='[infrabase]' + if test -n "$_recipe"; then + _tag="$_tag $_recipe" + fi + if test -n "$_task"; then + _tag="$_tag -c $_task" + fi + + _platform= + if test -n "$BUILDDIR" && test -r "$BUILDDIR/conf/local.conf"; then + _platform=$(grep "^IB_PLATFORM" "$BUILDDIR/conf/local.conf" \ + | head -1 | sed -n 's/.*"\([^"]*\)".*/\1/p') + fi + + printf '%s root=%s platform=%s\n' \ + "$_tag" "${IB_ROOT_DIR:-}" "${_platform:-}" >&2 + + # Walk up from cwd looking for an env.sh; if it belongs to a + # different project than IB_ROOT_DIR, that's almost certainly a + # user mistake — flag it. + + _candidate=$(readlink -f "$PWD" 2>/dev/null || pwd) + while test "$_candidate" != "/" && ! test -f "$_candidate/env.sh"; do + _candidate=$(dirname "$_candidate") + done + if test -f "$_candidate/env.sh" && test -n "$IB_ROOT_DIR"; then + _active=$(readlink -f "$IB_ROOT_DIR" 2>/dev/null || echo "$IB_ROOT_DIR") + if test "$_candidate" != "$_active"; then + printf '%s WARNING: cwd is inside %s but loaded env is %s\n' \ + "$_tag" "$_candidate" "$_active" >&2 + printf '%s Re-source %s/env.sh if that was unintended.\n' \ + "$_tag" "$_candidate" >&2 + fi + fi +} + + +# Regenerate build/conf/bblayers.conf with the full set of so3 layers. +# +# The file is rewritten in-place ONLY when its content would change — this +# keeps `git status` quiet for back-to-back invocations. + +regen_bblayers() { + _path="$BUILDDIR/conf/bblayers.conf" + + _tmp=$(mktemp) + { + echo "# Auto-generated by scripts/build.sh —" + echo "# scripts/common/bblayers.sh:regen_bblayers(). Hand edits will be" + echo "# overwritten on the next build.sh invocation." + echo "" + echo 'BBPATH := "${TOPDIR}"' + echo 'BBFILES ?= ""' + echo 'BBLAYERS = " \' + for _l in meta meta-qemu meta-filesystem meta-uboot meta-linux \ + meta-rootfs meta-usr meta-bsp meta-so3 meta-atf \ + meta-toolchain; do + echo " \${TOPDIR}/$_l \\" + done + echo ' "' + } > "$_tmp" + + if ! cmp -s "$_tmp" "$_path" 2>/dev/null; then + mv "$_tmp" "$_path" + printf '[infrabase] bblayers.conf regenerated\n' >&2 + else + rm -f "$_tmp" + fi +} # Determine the amount of first lines to # throw away from the output generated by bitbake-layers + bblayers_header_end_lineno() { echo $1 | grep -n "=== Available recipes: ===" | awk -F':' '{print $1}' } diff --git a/scripts/common/setup_env.sh b/scripts/common/setup_env.sh new file mode 100644 index 0000000..ef590a6 --- /dev/null +++ b/scripts/common/setup_env.sh @@ -0,0 +1,105 @@ +# Source me from any user-facing script under scripts/ to keep the +# build environment aligned with the user's intent. Three trees may +# disagree at invocation time: +# +# A) script tree — derived from `command -v "$0"` (where the binary +# came from: explicit path or PATH lookup). +# B) cwd tree — found by walking up $PWD looking for env.sh. +# C) env tree — value of IB_ROOT_DIR in the parent shell. +# +# Target = B if cwd lives inside an infrabase tree, else A. This honors +# the "I cd'd here, build here" intuition — without it, a PATH-resolved +# binary from a sibling worktree (because env.sh was sourced there +# earlier) silently wins and the user's `cd` is ignored. +# +# When C disagrees with the target, env.sh is re-sourced from the +# target (interactive prompt) or the script aborts (non-interactive, +# e.g. CI). The switch is local to THIS invocation — the parent shell +# stays as it was; the user is told to re-source env.sh manually if +# they want the change to persist. +# +# Once accepted, the choice is remembered per parent shell session via +# a marker file in /tmp tagged with $PPID and the target tree. As long +# as the user's interactive shell stays alive, subsequent invocations +# from the same shell skip the prompt and silently re-source. New +# shells (different PPID) re-ask. The chpwd hook installed by env.sh +# is still the better path — it switches the parent shell's env for +# real — but the marker keeps the UX clean when a user hasn't sourced +# env.sh in their interactive shell yet. + +_ib_script_path="$(command -v -- "$0")" +_ib_script_dir="$(cd "$(dirname "$_ib_script_path")" && pwd)" +_ib_script_tree="$(cd "$_ib_script_dir/.." && pwd)" + +_ib_cwd_tree="$(readlink -f "$PWD" 2>/dev/null || pwd)" +while [ "$_ib_cwd_tree" != "/" ] && [ ! -f "$_ib_cwd_tree/env.sh" ]; do + _ib_cwd_tree="$(dirname "$_ib_cwd_tree")" +done +[ -f "$_ib_cwd_tree/env.sh" ] || _ib_cwd_tree="" + +if [ -n "$_ib_cwd_tree" ]; then + _ib_target="$_ib_cwd_tree" +else + _ib_target="$_ib_script_tree" +fi + +_ib_env_tree="" +if [ -n "$IB_ROOT_DIR" ]; then + _ib_env_tree="$(realpath "$IB_ROOT_DIR" 2>/dev/null || echo "$IB_ROOT_DIR")" +fi + +_ib_marker="/tmp/.infrabase-accept.$PPID.$(printf '%s' "$_ib_target" | sed 's|/|_|g' | sed 's|_|__SLASH__|g')" + +if [ -n "$_ib_env_tree" ] && [ "$_ib_env_tree" = "$_ib_target" ]; then + # Env already wired to the target tree; normalize cwd silently. + cd "$_ib_target" +elif [ -f "$_ib_marker" ]; then + # This shell session already accepted the switch — silent re-source. + cd "$_ib_target" + . ./env.sh +else + echo "" >&2 + echo "[infrabase] env switch required for this invocation:" >&2 + echo " target tree : $_ib_target" >&2 + if [ -n "$IB_ROOT_DIR" ]; then + echo " current env : $IB_ROOT_DIR" >&2 + else + echo " current env : " >&2 + fi + if [ "$_ib_script_tree" != "$_ib_target" ]; then + echo " script path : $_ib_script_path" >&2 + echo " (resolved via PATH from a sibling tree)" >&2 + fi + echo "" >&2 + echo " env.sh will be re-sourced from the target tree for this" >&2 + echo " invocation only. To make the switch permanent in your" >&2 + echo " interactive shell, run:" >&2 + echo "" >&2 + echo " cd $_ib_target && . ./env.sh" >&2 + echo "" >&2 + if [ -t 0 ]; then + printf "Continue with env.sh from %s? [y/N] " "$_ib_target" >&2 + read -r _ib_answer + case "$_ib_answer" in + y|Y|yes|YES) ;; + *) + echo "Aborted by user." >&2 + exit 1 + ;; + esac + else + echo "ERROR: refusing to reconfigure env in non-interactive mode." >&2 + echo " Source env.sh from $_ib_target first," >&2 + echo " or run the script interactively to confirm." >&2 + exit 1 + fi + # Remember the accept for this shell session so the next invocation + # from the same parent shell is silent. + : > "$_ib_marker" 2>/dev/null || true + cd "$_ib_target" + . ./env.sh + echo "[infrabase] env switched to $_ib_target for this run" >&2 +fi + +unset _ib_script_path _ib_script_dir _ib_script_tree \ + _ib_cwd_tree _ib_env_tree _ib_target _ib_marker _ib_answer diff --git a/scripts/common/setup_sudo.sh b/scripts/common/setup_sudo.sh new file mode 100755 index 0000000..a652372 --- /dev/null +++ b/scripts/common/setup_sudo.sh @@ -0,0 +1,84 @@ +#!/bin/sh + +# One-time host setup: configure sudo so that privileged operations +# invoked from bitbake recipes (via `sudo -n`) share the credential +# timestamp with the parent deploy/build shell. +# +# By default sudo uses tty_tickets, tying each cached password to a +# specific TTY. bitbake tasks run in subprocesses that may not inherit +# the caller's TTY, so `sudo -n` fails even after sudo_session_start +# has validated the password. Setting timestamp_type=global makes the +# credential UID-scoped and shared across all processes for this user. +# +# This script only needs to be run once per host. It writes to +# /etc/sudoers.d/ and requires sudo itself to do so. +# +# Usage: +# scripts/common/setup_sudo.sh +# scripts/common/setup_sudo.sh --check (check only, no changes) + +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + +set -e + +SUDOERS_FILE="/etc/sudoers.d/infrabase-${USER}" +CHECK_ONLY=0 + +if [ "$1" = "--check" ]; then + CHECK_ONLY=1 +fi + +_check_already_configured() { + if [ -f "$SUDOERS_FILE" ]; then + if grep -q "timestamp_type=global" "$SUDOERS_FILE" 2>/dev/null; then + return 0 + fi + fi + # Also check if the main sudoers file already has timestamp_type=global + if sudo grep -q "timestamp_type=global" /etc/sudoers 2>/dev/null; then + return 0 + fi + return 1 +} + +if _check_already_configured; then + printf "sudo timestamp_type=global is already configured for %s.\n" "$USER" + exit 0 +fi + +if [ "$CHECK_ONLY" = "1" ]; then + printf "sudo is NOT configured for global timestamps (tty_tickets is active).\n" + printf "Run: scripts/common/setup_sudo.sh\n" + printf "to fix it (requires your sudo password once).\n" + exit 1 +fi + +printf "Configuring sudo for user '%s' to use global timestamp type.\n" "$USER" +printf "This allows bitbake recipe tasks to use 'sudo -n' after\n" +printf "sudo_session_start has validated your password.\n\n" +printf "You will be prompted for your sudo password once.\n\n" + +# Write the sudoers snippet via a temp file, validate it, then install. +TMPFILE="$(mktemp)" +cat > "$TMPFILE" <&1; then + rm -f "$TMPFILE" + printf "Error: sudoers syntax check failed. Aborting.\n" >&2 + exit 1 +fi + +sudo install -m 0440 -o root -g root "$TMPFILE" "$SUDOERS_FILE" +rm -f "$TMPFILE" + +printf "Installed %s\n" "$SUDOERS_FILE" +printf "Done. Run 'scripts/deploy.sh' or 'scripts/build.sh' normally now.\n" diff --git a/scripts/common/sudo_session.sh b/scripts/common/sudo_session.sh new file mode 100644 index 0000000..ccbcc17 --- /dev/null +++ b/scripts/common/sudo_session.sh @@ -0,0 +1,65 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD +# +# Sudo session helper: keep a sudo timestamp valid for the lifetime of +# the calling script so privileged operations issued from bitbake +# recipes (via `sudo -n`) never hit an interactive password prompt +# mid-build. +# +# bitbake itself runs as the unprivileged user — only individual +# privileged operations (mount/umount/losetup/mkfs/parted/...) are +# escalated, and each one is invoked with `sudo -n` so a missing +# timestamp fails fast rather than blocking on stdin. +# +# Usage in callers: +# . scripts/common/sudo_session.sh +# sudo_session_start || exit 1 +# # ... run bitbake / scripts that may invoke `sudo -n` ... +# # keep-alive is auto-killed on EXIT/INT/TERM via the installed trap + +sudo_session_start() { + # Validate the sudo timestamp upfront. With a NOPASSWD sudoers + # entry this is a silent no-op; otherwise the user gets a single + # password prompt right here, BEFORE bitbake starts. + if ! sudo -v + then + printf "Error: failed to acquire sudo credentials\n" >&2 + return 1 + fi + + # The keep-alive below refreshes the timestamp every 60 s so that + # bitbake recipe tasks can use `sudo -n` throughout the build. + # This only works when the sudo timestamp is UID-scoped (global), + # not TTY-scoped (the default). Detect the common misconfiguration + # and guide the user to the one-time fix. + _ts_type=$(sudo -V 2>/dev/null | sed -n 's/.*Timestamp type: *//p') + if [ -n "$_ts_type" ] && [ "$_ts_type" != "global" ] + then + printf "\nWARNING: sudo timestamp_type is '%s' (not global).\n" "$_ts_type" >&2 + printf " bitbake recipe tasks run in subprocesses without a TTY\n" >&2 + printf " and will fail with 'sudo: a password is required'.\n\n" >&2 + printf " Fix (run once on this host):\n\n" >&2 + printf " scripts/common/setup_sudo.sh\n\n" >&2 + printf " Continuing anyway — the build may fail mid-task.\n\n" >&2 + fi + unset _ts_type + + # Background poker: refresh the sudo timestamp every 60s. The + # default sudo TTL is 5 min — 60s gives generous headroom while + # staying cheap. The loop exits when the parent shell is gone + # (kill -0 check) so we never leak a daemon if the script dies. + _sudo_parent_pid=$$ + ( + while true; do + sudo -n true 2>/dev/null || exit + sleep 60 + kill -0 "$_sudo_parent_pid" 2>/dev/null || exit + done + ) & + _sudo_keepalive_pid=$! + + # Kill the keep-alive on any exit path (normal, ^C, kill). + trap "kill $_sudo_keepalive_pid 2>/dev/null" EXIT INT TERM + + return 0 +} diff --git a/scripts/deploy.sh b/scripts/deploy.sh index 0cb47b4..ca4b086 100755 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -1,16 +1,27 @@ #!/bin/sh # General deployment script for the infrabase infrastructure. +# +# bitbake itself runs as the unprivileged user. Privileged operations +# inside individual recipe tasks (mount/umount/losetup/mkfs/parted/...) +# escalate to root via `sudo -n` and rely on the sudo timestamp opened +# here by sudo_session_start. -# Copyright (c) 2014-2023 REDS Institute, HEIG-VD -# Copyright (c) 2023-2025 EDGEMTech +# Copyright (c) 2014-2026 REDS Institute, HEIG-VD +# Copyright (c) 2023-2026 EDGEMTech +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD progname=$(basename $0) +# Resolve project root from this script's own location, cd there, and +# source env.sh — prompting the user first if the parent shell points +# at a different tree. See scripts/common/setup_env.sh for details. +. "$(cd "$(dirname "$(command -v -- "$0")")" && pwd)/common/setup_env.sh" + pr_usage() { printf "Infrabase deployment script\n\n" - printf "Usage: $progname [-h] [-l] [-a|-b|-r|-x|-k] [-v] ... \n" + printf "Usage: $progname [-h] [-l] [-a|-x] [-v] ... \n" } pr_help() @@ -18,17 +29,14 @@ pr_help() printf "\nAvailable options:\n" printf " -h Print this help\n" printf " -l List available recipes per layer or globally\n" - printf " -a Deploy all, kernel, uboot, rootfs, usr\n" - printf " -k Deploy kernel (with ITB)\n" - printf " -b Deploy uboot\n" - printf " -r Deploy specified rootfs\n" - printf " -x Deploy auxiliary component\n" + printf " -a Deploy a full BSP (rootfs, kernel, uboot, usr, ITB)\n" + printf " -x Deploy a single recipe (component, uboot, rootfs, usr, ...)\n" printf " -v Emit logs during deployment\n" printf "Examples: \n\n" printf "$progname -l -a List all deployable BSP recipes\n" - printf "$progname -l -x List all deployable auxiliary components\n" - printf "$progname -b -v Deploy uboot with verbose logs\n" - printf "$progname -a bsp-linux -v Deploy ALL rootfs, kernel, uboot with verbose logs\n" + printf "$progname -l -x List all deployable components\n" + printf "$progname -x usr-so3 Deploy the SO3 user space into the rootfs\n" + printf "$progname -a bsp-so3 -v Deploy the full SO3 BSP with verbose logs\n" } if test $# -eq 0 @@ -38,16 +46,16 @@ then exit 1 fi -. ./env.sh . ./scripts/common/bblayers.sh +. ./scripts/common/sudo_session.sh recipename='' layernames='' optverbose=0 dolist=0 dodeploy=0 - -while getopts "abhklrvx" o; do + +while getopts "ahlvx" o; do case "$o" in h) # Help summary @@ -65,16 +73,6 @@ while getopts "abhklrvx" o; do dodeploy=1 fi ;; - k) - if ! test -n "$2" - then - layernames="meta-bsp" - else - recipename="$2" - deploytask="do_deploy_boot" - dodeploy=1 - fi - ;; x) if ! test -n "$2" then @@ -85,24 +83,6 @@ while getopts "abhklrvx" o; do dodeploy=1 fi ;; - r) - if ! test -n "$2" - then - layernames="meta-rootfs" - else - recipename="$2" - deploytask="do_deploy" - dodeploy=1 - fi - ;; - b) - # We only currently have uboot for everything - # So no optarg for -b - layernames="meta-uboot" - recipename="uboot" - deploytask="do_deploy" - dodeploy=1 - ;; l) dolist=1 ;; @@ -116,7 +96,7 @@ while getopts "abhklrvx" o; do esac done -show_platform +show_env "$recipename" if test -z $recipename && test $dolist -eq 0 then @@ -125,6 +105,9 @@ then exit 1 fi +# deploy.sh inherits the bblayers/build state left by the prior +# `build.sh` invocation for the same recipe. + if test $dolist -eq 1 then if test -z "$layernames" @@ -157,22 +140,21 @@ fi if test $dodeploy -eq 1 then - printf "\n*** NOTE: *** Deployment requires root access, to be able to mount/umount\n" - printf "and access loop devices, you may be prompted for the password\n\n" + printf "\n*** NOTE: *** Deployment may require root access for mount/losetup/\n" + printf "mkfs/parted/... You may be prompted for the sudo password once.\n\n" - # NOTE: Currently these variables need to be specified in /etc/sudoers - # and it is not clear why at this stage - this is not the case with - # the user created during installation of the system - deeper investigations needed.. - preservedvars='IB_TOOLCHAIN_PATH,IB_UNPRIVILEDGED_USER_ID,IB_UNPRIVILEDGED_GROUP_ID' + # Acquire a sudo timestamp upfront and keep it warm for the entire + # deploy. bitbake runs unprivileged below; recipes escalate via + # `sudo -n` so a missing timestamp fails fast rather than blocking + # on stdin mid-build. The keep-alive is killed on EXIT/INT/TERM by + # a trap installed inside sudo_session_start. + sudo_session_start || exit 1 - deploycmd=". $(pwd)/env.sh; bitbake $recipename -c $deploytask ${IB_BB_OPTS}" - sudo --preserve-env=$preservedvars sh -c "$deploycmd; echo \$? > /tmp/ib-deploy-res;" - res=$(cat /tmp/ib-deploy-res) + bitbake $recipename -c $deploytask $IB_BB_OPTS + res=$? if test $res -ne 0 then - # This is required to properly fail the CI - # otherwise 0 is returned and job continues exit 1 fi fi diff --git a/scripts/diffdir.sh b/scripts/diffdir.sh index a6a64f2..894b9a3 100755 --- a/scripts/diffdir.sh +++ b/scripts/diffdir.sh @@ -1,5 +1,8 @@ #!/bin/bash +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + source_dir=$1 target_dir=$2 output_dir=$3 diff --git a/scripts/init_storage.sh b/scripts/init_storage.sh index 027f7bb..145df3f 100755 --- a/scripts/init_storage.sh +++ b/scripts/init_storage.sh @@ -1,6 +1,19 @@ #!/bin/sh -source $IB_ROOT_DIR/env.sh -cd $IB_ROOT_DIR/build -sudo -E ./bitbake/bin/bitbake filesystem -c fs_init_storage $1 -cd - +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD +# +# Trigger filesystem:fs_init_storage. bitbake itself runs unprivileged +# — the recipe internally invokes losetup/fdisk/parted/mkfs via +# `sudo -n` against the timestamp opened here. + +# Resolve project root from this script's own location, cd there, and +# source env.sh — prompting the user first if the parent shell points +# at a different tree. See scripts/common/setup_env.sh for details. +. "$(cd "$(dirname "$(command -v -- "$0")")" && pwd)/common/setup_env.sh" +. ./scripts/common/sudo_session.sh + +sudo_session_start || exit 1 + +cd "$BUILDDIR" +./bitbake/bin/bitbake filesystem -c fs_init_storage $1 diff --git a/scripts/mount.sh b/scripts/mount.sh index cb692e4..ad47a03 100755 --- a/scripts/mount.sh +++ b/scripts/mount.sh @@ -1,5 +1,19 @@ #!/bin/sh -cd $IB_ROOT_DIR/build -sudo -E ./bitbake/bin/bitbake filesystem -c fs_mount $1 -cd - +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD +# +# Trigger filesystem:fs_mount. bitbake itself runs unprivileged — the +# recipe internally invokes mount/losetup via `sudo -n` against the +# timestamp opened here. + +# Resolve project root from this script's own location, cd there, and +# source env.sh — prompting the user first if the parent shell points +# at a different tree. See scripts/common/setup_env.sh for details. +. "$(cd "$(dirname "$(command -v -- "$0")")" && pwd)/common/setup_env.sh" +. ./scripts/common/sudo_session.sh + +sudo_session_start || exit 1 + +cd "$BUILDDIR" +./bitbake/bin/bitbake filesystem -c fs_mount $1 diff --git a/scripts/qemu-ifdown.sh b/scripts/qemu-ifdown.sh index 671fd9a..f87aba2 100755 --- a/scripts/qemu-ifdown.sh +++ b/scripts/qemu-ifdown.sh @@ -1,5 +1,8 @@ #!/bin/bash +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + other_qemu=`sudo brctl show | grep tap | wc -l` if [[ ${other_qemu} -eq 1 ]] then diff --git a/scripts/qemu-ifup.sh b/scripts/qemu-ifup.sh index 1dd8565..43b10da 100755 --- a/scripts/qemu-ifup.sh +++ b/scripts/qemu-ifup.sh @@ -72,6 +72,7 @@ do_iptables_restore < reset). + echo "AVZ guest (ITS=$SO3_ITS) — enabling EL2 (virtualization=on)" + MACHINE_OPT="-M virt,gic-version=2,virtualization=on" + BOOT_OPT="-kernel u-boot/u-boot" + else + MACHINE_OPT="-M virt,gic-version=2" + BOOT_OPT="-kernel u-boot/u-boot" + fi + ${QEMU_BIN} $@ ${USR_OPTION} \ + -smp 4 \ + -chardev stdio,id=char0,mux=on,signal=off \ + -mon chardev=char0 \ + -serial chardev:char0 \ + ${MACHINE_OPT} -cpu cortex-a72 \ + ${BOOT_OPT} \ -device virtio-blk-device,drive=hd0 \ - -drive if=none,file=filesystem/sdcard.img.virt32,id=hd0,format=raw,file.locking=off \ + -drive if=none,file=filesystem/sdcard.img.virt64,id=hd0,format=raw,file.locking=off \ -m 1024 \ + -display none \ + -netdev user,id=n1,hostfwd=tcp::2222-:22 \ + -device virtio-net-device,netdev=n1,mac=${QEMU_MAC_ADDR} \ + -gdb tcp::${GDB_PORT} + fi + + if [ "$IB_PLATFORM" == "virt32" ]; then + QEMU_BIN="$IB_ROOT_DIR/qemu/build/qemu-system-arm" + echo Starting on virt32 + # SO3 standalone on 32-bit ARM virt: U-Boot is loaded directly with + # -kernel (no ATF / flash chain on this platform), cortex-a15 matches + # the SO3 virt32 build. Serial console is muxed onto stdio like virt64; + # slirp user networking keeps QEMU artefacts owned by the regular user. + ${QEMU_BIN} $@ ${USR_OPTION} \ + -smp 4 \ + -chardev stdio,id=char0,mux=on,signal=off \ + -mon chardev=char0 \ + -serial chardev:char0 \ + -M virt -cpu cortex-a15 \ -kernel u-boot/u-boot \ - -net tap,script=scripts/qemu-ifup.sh,downscript=scripts/qemu-ifdown.sh -net nic,macaddr=${QEMU_MAC_ADDR} \ - -nographic \ - -gdb tcp::${GDB_PORT} - fi - - if [ "$IB_PLATFORM" == "x86-qemu" ]; then - echo Starting on x86 - sudo qemu-system-x86_64 $@ $1 \ - -cpu Cascadelake-Server-v4 \ - -smp 4 \ - -serial mon:stdio \ - -netdev tap,id=n1,script=scripts/qemu-ifup.sh,downscript=scripts/qemu-ifdown.sh \ - -device e1000e,netdev=n1,mac=00:01:29:53:97:BA \ - -hda filesystem/sdcard.img.x86_qemu \ - -s \ + -device virtio-blk-device,drive=hd0 \ + -drive if=none,file=filesystem/sdcard.img.virt32,id=hd0,format=raw,file.locking=off \ -m 1024 \ - -kernel linux/linux/arch/x86/boot/bzImage \ - -nographic \ - -append "root=/dev/ram console=ttyS0 earlyprintk=pciserial" - fi - + -display none \ + -netdev user,id=n1,hostfwd=tcp::2222-:22 \ + -device virtio-net-device,netdev=n1,mac=${QEMU_MAC_ADDR} \ + -gdb tcp::${GDB_PORT} + fi + QEMU_RESULT=$? } -launch_qemu $0 +launch_qemu diff --git a/scripts/stg.sh b/scripts/stg.sh index df6183a..c5ad4e5 100755 --- a/scripts/stg.sh +++ b/scripts/stg.sh @@ -1,10 +1,23 @@ #!/bin/bash - + +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + +# Resolve project root from this script's own location, cd there, and +# source env.sh — prompting the user first if the parent shell points +# at a different tree. Every relative path below (filesystem/..., +# build/conf/local.conf) is anchored on that root. See +# scripts/common/setup_env.sh. + +. "$(cd "$(dirname "$(command -v -- "$0")")" && pwd)/common/setup_env.sh" + QEMU_AUDIO_DRV="none" -USR_OPTION=$1 GDB_PORT_BASE=1234 +USR_OPTION=$1 +# QEMU_BIN is selected per IB_PLATFORM below (qemu-system-aarch64 for +# virt64, qemu-system-arm for virt32). -N_QEMU_INSTANCES=`ps -A | grep "qemu-system-\(arm\|aar\)" | wc -l` +N_QEMU_INSTANCES=`ps -A | grep qemu-system | wc -l` launch_qemu() { QEMU_MAC_ADDR="$(printf 'DE:AD:BE:EF:%02X:%02X\n' $((N_QEMU_INSTANCES)) $((N_QEMU_INSTANCES)))" @@ -23,45 +36,108 @@ launch_qemu() { # Set the IB_PLATFORM variable to the extracted value IB_PLATFORM="$value" break - fi + fi done < build/conf/local.conf - if [ "$IB_PLATFORM" == "virt64" ]; then - echo Starting on virt64 - sudo qemu/build/aarch64-softmmu/qemu-system-aarch64 $@ ${USR_OPTION} \ - -smp 4 \ - -m 1024 \ - -serial mon:stdio \ - -M virt,gic-version=2 -cpu cortex-a72 \ - -device virtio-blk-device,drive=hd0 \ - -device virtio-gpu-pci \ - -device virtio-keyboard-pci \ - -device virtio-mouse-pci \ - -display sdl \ - -drive if=none,file=filesystem/sdcard.img.virt64,id=hd0,format=raw,file.locking=off \ - -kernel u-boot/u-boot \ - -display sdl \ - -netdev tap,id=n1,script=scripts/qemu-ifup.sh,downscript=scripts/qemu-ifdown.sh \ - -device virtio-net-device,netdev=n1,mac=${QEMU_MAC_ADDR} \ - -gdb tcp::${GDB_PORT} - fi + # Detect a SO3-on-AVZ boot from the selected (uncommented) so3 ITS — AVZ + # is an EL2 hypervisor, so QEMU must expose EL2 (virtualization=on). + SO3_ITS=$(grep -E "^IB_TARGET_ITS:so3:${IB_PLATFORM}\b" build/conf/local.conf | awk -F'"' '{print $2}' | tail -1) + + if [ "$IB_PLATFORM" != "virt64" ] && [ "$IB_PLATFORM" != "virt32" ]; then + echo "ERROR: stg.sh only supports IB_PLATFORM=virt64 or virt32, but" >&2 + echo " build/conf/local.conf has IB_PLATFORM=\"$IB_PLATFORM\"." >&2 + echo "" >&2 + echo " Edit build/conf/local.conf to set" >&2 + echo " IB_PLATFORM ?= \"virt64\" (or \"virt32\")" >&2 + echo " then rebuild+redeploy before retrying stg.sh." >&2 + exit 1 + fi + + # SO3 now uses the ABSOLUTE pointer (so3,absmouse — see the so3 QEMU patch + # and devices/input/absmouse.c), so QEMU runs in absolute pointer mode: the + # host pointer maps 1:1 onto the guest with NO grab and NO warp. This sheds + # the relative-mouse grab workaround (grab-on-hover) entirely. + # + # GDK_BACKEND=x11 is still needed on a FRACTIONALLY-SCALED HiDPI Wayland + # panel: there QEMU's GTK reports pointer coordinates in a different scale + # than the framebuffer surface, so the absolute mapping comes out OFFSET + # (host vs guest cursor shifted) — fine on a 1x external monitor, shifted + # on the laptop. Routing GTK through XWayland gives a uniform pointer-to- + # surface mapping, so the cursors line up on every monitor. (GDK_SCALE just + # keeps the window native-sized; not load-bearing for the mapping.) + # Harmless on a real X11 session. + export GDK_BACKEND=x11 + export GDK_SCALE=1 + export GDK_DPI_SCALE=1 + + if [ "$IB_PLATFORM" == "virt64" ]; then + QEMU_BIN="$IB_ROOT_DIR/qemu/build/qemu-system-aarch64" + echo Starting on virt64 + # See st.sh for rationale and for the flash0.img-presence boot-mode + # heuristic (AVZ chain vs bare U-Boot). + # Like virt32, SO3 drives the PL111 CLCD + PL050 keyboard/mouse that the + # so3 QEMU patch wires unconditionally into '-M virt' (virt64.dts has the + # clcd@08800000 / pl050 nodes). It has NO virtio-gpu driver, so we do not + # add virtio-gpu/keyboard/mouse here. Use the GTK backend: SDL does not + # present the PL111 console's surface (the window stays black even though + # the framebuffer is rendered); GTK shows it and its View menu lists every + # console. + + if [ -f filesystem/flash0.img ]; then + # ATF/OP-TEE chain (flash0/FIP): EL3 (secure=on) + EL2. + MACHINE_OPT="-M virt,virtualization=on,gic-version=2,secure=on" + BOOT_OPT="-drive if=pflash,format=raw,file=filesystem/flash0.img" + elif [[ "$SO3_ITS" == *avz* ]]; then + # SO3-on-AVZ via the ITS, no ATF: AVZ runs at EL2, so QEMU must + # expose it (virtualization=on). U-Boot here is virt64_defconfig + # (EL2-aware) and hands off to AVZ at EL2. + echo "AVZ guest (ITS=$SO3_ITS) — enabling EL2 (virtualization=on)" + MACHINE_OPT="-M virt,gic-version=2,virtualization=on" + BOOT_OPT="-kernel u-boot/u-boot" + else + MACHINE_OPT="-M virt,gic-version=2" + BOOT_OPT="-kernel u-boot/u-boot" + fi + ${QEMU_BIN} $@ ${USR_OPTION} \ + -smp 4 \ + -serial mon:stdio \ + ${MACHINE_OPT} -cpu cortex-a72 \ + ${BOOT_OPT} \ + -device virtio-blk-device,drive=hd0 \ + -drive if=none,file=filesystem/sdcard.img.virt64,id=hd0,format=raw,file.locking=off \ + -display gtk,zoom-to-fit=off \ + -m 1024 \ + -netdev user,id=n1,hostfwd=tcp::2222-:22 \ + -device virtio-net-device,netdev=n1,mac=${QEMU_MAC_ADDR} \ + -gdb tcp::${GDB_PORT} + fi if [ "$IB_PLATFORM" == "virt32" ]; then - echo Starting on virt32 - echo $1 - sudo qemu/build/arm-softmmu/qemu-system-arm $@ \ - -smp 4 \ + QEMU_BIN="$IB_ROOT_DIR/qemu/build/qemu-system-arm" + echo Starting on virt32 + # Graphical sibling of st.sh's virt32 branch: bare U-Boot chain + # (no ATF / flash on this platform), cortex-a15. + # NOTE: SO3 drives the PL111 CLCD + PL050 keyboard/mouse that the + # so3 QEMU patch wires unconditionally into '-M virt' (see boot log: + # pl111_init / pl050_init_*). It has NO virtio-gpu driver, so we must + # NOT add virtio-gpu/keyboard/mouse here. + # Use the GTK backend: its View menu lists every graphic console, so the + # PL111 panel is reachable even if QEMU registers more than one console. + ${QEMU_BIN} $@ ${USR_OPTION} \ + -smp 4 \ -serial mon:stdio \ - -M virt -cpu cortex-a15 \ + -M virt -cpu cortex-a15 \ + -kernel u-boot/u-boot \ -device virtio-blk-device,drive=hd0 \ -drive if=none,file=filesystem/sdcard.img.virt32,id=hd0,format=raw,file.locking=off \ + -display gtk,zoom-to-fit=off \ -m 1024 \ - -kernel u-boot/u-boot \ - -net tap,script=scripts/qemu-ifup.sh,downscript=scripts/qemu-ifdown.sh -net nic,macaddr=${QEMU_MAC_ADDR} \ - -gdb tcp::${GDB_PORT} - fi - + -netdev user,id=n1,hostfwd=tcp::2222-:22 \ + -device virtio-net-device,netdev=n1,mac=${QEMU_MAC_ADDR} \ + -gdb tcp::${GDB_PORT} + fi + QEMU_RESULT=$? } -launch_qemu $0 +launch_qemu diff --git a/scripts/umount.sh b/scripts/umount.sh index d131e44..8ede3be 100755 --- a/scripts/umount.sh +++ b/scripts/umount.sh @@ -1,5 +1,19 @@ #!/bin/sh -cd $IB_ROOT_DIR/build -sudo -E ./bitbake/bin/bitbake filesystem -c fs_umount $1 -cd - +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD +# +# Trigger filesystem:fs_umount. bitbake itself runs unprivileged — the +# recipe internally invokes umount/losetup via `sudo -n` against the +# timestamp opened here. + +# Resolve project root from this script's own location, cd there, and +# source env.sh — prompting the user first if the parent shell points +# at a different tree. See scripts/common/setup_env.sh for details. +. "$(cd "$(dirname "$(command -v -- "$0")")" && pwd)/common/setup_env.sh" +. ./scripts/common/sudo_session.sh + +sudo_session_start || exit 1 + +cd "$BUILDDIR" +./bitbake/bin/bitbake filesystem -c fs_umount $1 diff --git a/scripts/updiff.sh b/scripts/updiff.sh new file mode 100755 index 0000000..5da24ba --- /dev/null +++ b/scripts/updiff.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + +bitbake $1 -c updiff + From 787eb6b9e6dc371946e8cba13efc3c3500995cae Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Tue, 23 Jun 2026 18:40:41 +0200 Subject: [PATCH 12/52] meta-linux: drop orphan base patches shadowing the soo patch set MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The base linux patch dir (recipes-linux/linux/files/0001-linux-6.12-r0) carried three patch files not referenced by its patches.inc — leftovers from upstream so3: 0021-Makefile.patch, 0022-virt64.dts.patch, 0023-virt64_guest.dts.patch (duplicates of 0005/0002/0004). With virt64_soo_defconfig the soo bbappend adds its own files dir to FILESPATH, but the base dir is searched first. The soo set legitimately ships file://0021-Makefile.patch (soo/drivers/vdummyback/Makefile); the orphan base 0021-Makefile.patch shadowed it, re-adding the virt64.dtb lines already applied by 0005-Makefile.patch -> do_patch aborts with "Reversed (or previously applied) patch detected". Removing the dead orphans lets do_patch resolve the soo patches correctly. Verified: build.sh -x linux builds the agency kernel (virt64_soo_defconfig) end-to-end (Image + virt64/virt64_guest dtbs). Also gitignore build-attached/generated paths that were not yet covered (linux/usr/{include/core,include/soo,src/graphic,src/soo,src/lvgl} and filesystem/u-boot.bin) so they are not accidentally committed. --- .gitignore | 8 + .../0001-linux-6.12-r0/0021-Makefile.patch | 10 - .../0001-linux-6.12-r0/0022-virt64.dts.patch | 392 ---------------- .../0023-virt64_guest.dts.patch | 428 ------------------ 4 files changed, 8 insertions(+), 830 deletions(-) delete mode 100644 build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0021-Makefile.patch delete mode 100644 build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0022-virt64.dts.patch delete mode 100644 build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0023-virt64_guest.dts.patch diff --git a/.gitignore b/.gitignore index 422e95d..a28c5ba 100644 --- a/.gitignore +++ b/.gitignore @@ -74,3 +74,11 @@ filesystem/work # do_attach_infrabase manifests (build artifacts) *.attach.sha256 *.back/ + +# --- Build-generated / attached at build time (materialized from patch sets / fetch) --- +/linux/usr/include/core/ +/linux/usr/include/soo/ +/linux/usr/src/graphic/ +/linux/usr/src/soo/ +/linux/usr/src/lvgl/ +/filesystem/u-boot.bin diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0021-Makefile.patch b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0021-Makefile.patch deleted file mode 100644 index dcc3136..0000000 --- a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0021-Makefile.patch +++ /dev/null @@ -1,10 +0,0 @@ ---- a/arch/arm64/boot/dts/arm/Makefile -+++ b/arch/arm64/boot/dts/arm/Makefile -@@ -7,3 +7,7 @@ - dtb-$(CONFIG_ARCH_VEXPRESS) += vexpress-v2f-1xv7-ca53x2.dtb - dtb-$(CONFIG_ARCH_VEXPRESS) += fvp-base-revc.dtb - dtb-$(CONFIG_ARCH_VEXPRESS) += corstone1000-fvp.dtb corstone1000-mps3.dtb -+ -+# Infrabase -+dtb-$(CONFIG_ARCH_VEXPRESS) += virt64.dtb virt64_guest.dtb -+ diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0022-virt64.dts.patch b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0022-virt64.dts.patch deleted file mode 100644 index 4c08dc8..0000000 --- a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0022-virt64.dts.patch +++ /dev/null @@ -1,392 +0,0 @@ ---- a/arch/arm64/boot/dts/arm/virt64.dts -+++ b/arch/arm64/boot/dts/arm/virt64.dts -@@ -0,0 +1,389 @@ -+/dts-v1/; -+ -+/ { -+ interrupt-parent = <0x8001>; -+ #size-cells = <0x02>; -+ #address-cells = <0x02>; -+ compatible = "linux,dummy-virt"; -+ -+ psci { -+ migrate = <0xc4000005>; -+ cpu_on = <0xc4000003>; -+ cpu_off = <0x84000002>; -+ cpu_suspend = <0xc4000001>; -+ method = "hvc"; -+ compatible = "arm,psci-0.2\0arm,psci"; -+ }; -+ -+ memory@40000000 { -+ reg = <0x00 0x40000000 0x0 0x40000000>; -+ device_type = "memory"; -+ }; -+ -+ platform@c000000 { -+ interrupt-parent = <0x8001>; -+ ranges = <0x00 0x00 0xc000000 0x2000000>; -+ #address-cells = <0x01>; -+ #size-cells = <0x01>; -+ compatible = "qemu,platform\0simple-bus"; -+ }; -+ -+ fw-cfg@9020000 { -+ dma-coherent; -+ reg = <0x00 0x9020000 0x00 0x18>; -+ compatible = "qemu,fw-cfg-mmio"; -+ }; -+ -+ virtio_mmio@a000000 { -+ dma-coherent; -+ interrupts = <0x00 0x10 0x01>; -+ reg = <0x00 0xa000000 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a000200 { -+ dma-coherent; -+ interrupts = <0x00 0x11 0x01>; -+ reg = <0x00 0xa000200 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a000400 { -+ dma-coherent; -+ interrupts = <0x00 0x12 0x01>; -+ reg = <0x00 0xa000400 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a000600 { -+ dma-coherent; -+ interrupts = <0x00 0x13 0x01>; -+ reg = <0x00 0xa000600 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a000800 { -+ dma-coherent; -+ interrupts = <0x00 0x14 0x01>; -+ reg = <0x00 0xa000800 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a000a00 { -+ dma-coherent; -+ interrupts = <0x00 0x15 0x01>; -+ reg = <0x00 0xa000a00 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a000c00 { -+ dma-coherent; -+ interrupts = <0x00 0x16 0x01>; -+ reg = <0x00 0xa000c00 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a000e00 { -+ dma-coherent; -+ interrupts = <0x00 0x17 0x01>; -+ reg = <0x00 0xa000e00 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a001000 { -+ dma-coherent; -+ interrupts = <0x00 0x18 0x01>; -+ reg = <0x00 0xa001000 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a001200 { -+ dma-coherent; -+ interrupts = <0x00 0x19 0x01>; -+ reg = <0x00 0xa001200 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a001400 { -+ dma-coherent; -+ interrupts = <0x00 0x1a 0x01>; -+ reg = <0x00 0xa001400 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a001600 { -+ dma-coherent; -+ interrupts = <0x00 0x1b 0x01>; -+ reg = <0x00 0xa001600 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a001800 { -+ dma-coherent; -+ interrupts = <0x00 0x1c 0x01>; -+ reg = <0x00 0xa001800 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a001a00 { -+ dma-coherent; -+ interrupts = <0x00 0x1d 0x01>; -+ reg = <0x00 0xa001a00 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a001c00 { -+ dma-coherent; -+ interrupts = <0x00 0x1e 0x01>; -+ reg = <0x00 0xa001c00 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a001e00 { -+ dma-coherent; -+ interrupts = <0x00 0x1f 0x01>; -+ reg = <0x00 0xa001e00 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a002000 { -+ dma-coherent; -+ interrupts = <0x00 0x20 0x01>; -+ reg = <0x00 0xa002000 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a002200 { -+ dma-coherent; -+ interrupts = <0x00 0x21 0x01>; -+ reg = <0x00 0xa002200 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a002400 { -+ dma-coherent; -+ interrupts = <0x00 0x22 0x01>; -+ reg = <0x00 0xa002400 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a002600 { -+ dma-coherent; -+ interrupts = <0x00 0x23 0x01>; -+ reg = <0x00 0xa002600 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a002800 { -+ dma-coherent; -+ interrupts = <0x00 0x24 0x01>; -+ reg = <0x00 0xa002800 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a002a00 { -+ dma-coherent; -+ interrupts = <0x00 0x25 0x01>; -+ reg = <0x00 0xa002a00 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a002c00 { -+ dma-coherent; -+ interrupts = <0x00 0x26 0x01>; -+ reg = <0x00 0xa002c00 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a002e00 { -+ dma-coherent; -+ interrupts = <0x00 0x27 0x01>; -+ reg = <0x00 0xa002e00 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a003000 { -+ dma-coherent; -+ interrupts = <0x00 0x28 0x01>; -+ reg = <0x00 0xa003000 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a003200 { -+ dma-coherent; -+ interrupts = <0x00 0x29 0x01>; -+ reg = <0x00 0xa003200 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a003400 { -+ dma-coherent; -+ interrupts = <0x00 0x2a 0x01>; -+ reg = <0x00 0xa003400 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a003600 { -+ dma-coherent; -+ interrupts = <0x00 0x2b 0x01>; -+ reg = <0x00 0xa003600 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a003800 { -+ dma-coherent; -+ interrupts = <0x00 0x2c 0x01>; -+ reg = <0x00 0xa003800 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a003a00 { -+ dma-coherent; -+ interrupts = <0x00 0x2d 0x01>; -+ reg = <0x00 0xa003a00 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a003c00 { -+ dma-coherent; -+ interrupts = <0x00 0x2e 0x01>; -+ reg = <0x00 0xa003c00 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a003e00 { -+ dma-coherent; -+ interrupts = <0x00 0x2f 0x01>; -+ reg = <0x00 0xa003e00 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ gpio-keys { -+ #address-cells = <0x01>; -+ #size-cells = <0x00>; -+ compatible = "gpio-keys"; -+ -+ poweroff { -+ gpios = <&pl061 0x03 0x00>; -+ linux,code = <0x74>; -+ label = "GPIO Key Poweroff"; -+ }; -+ }; -+ -+ pl061: pl061@9030000 { -+ clock-names = "apb_pclk"; -+ clocks = <&apb_clk>; -+ interrupts = <0x00 0x07 0x04>; -+ gpio-controller; -+ #gpio-cells = <0x02>; -+ compatible = "arm,pl061\0arm,primecell"; -+ reg = <0x00 0x9030000 0x00 0x1000>; -+ }; -+ -+ pcie@10000000 { -+ interrupt-map-mask = <0x1800 0x00 0x00 0x07>; -+ interrupt-map = <0x00 0x00 0x00 0x01 0x8001 0x00 0x00 0x00 0x03 0x04 0x00 0x00 0x00 0x02 0x8001 0x00 0x00 0x00 0x04 0x04 0x00 0x00 0x00 0x03 0x8001 0x00 0x00 0x00 0x05 0x04 0x00 0x00 0x00 0x04 0x8001 0x00 0x00 0x00 0x06 0x04 0x800 0x00 0x00 0x01 0x8001 0x00 0x00 0x00 0x04 0x04 0x800 0x00 0x00 0x02 0x8001 0x00 0x00 0x00 0x05 0x04 0x800 0x00 0x00 0x03 0x8001 0x00 0x00 0x00 0x06 0x04 0x800 0x00 0x00 0x04 0x8001 0x00 0x00 0x00 0x03 0x04 0x1000 0x00 0x00 0x01 0x8001 0x00 0x00 0x00 0x05 0x04 0x1000 0x00 0x00 0x02 0x8001 0x00 0x00 0x00 0x06 0x04 0x1000 0x00 0x00 0x03 0x8001 0x00 0x00 0x00 0x03 0x04 0x1000 0x00 0x00 0x04 0x8001 0x00 0x00 0x00 0x04 0x04 0x1800 0x00 0x00 0x01 0x8001 0x00 0x00 0x00 0x06 0x04 0x1800 0x00 0x00 0x02 0x8001 0x00 0x00 0x00 0x03 0x04 0x1800 0x00 0x00 0x03 0x8001 0x00 0x00 0x00 0x04 0x04 0x1800 0x00 0x00 0x04 0x8001 0x00 0x00 0x00 0x05 0x04>; -+ #interrupt-cells = <0x01>; -+ ranges = <0x1000000 0x00 0x00 0x00 0x3eff0000 0x00 0x10000 0x2000000 0x00 0x10000000 0x00 0x10000000 0x00 0x2eff0000 0x3000000 0x80 0x00 0x80 0x00 0x80 0x00>; -+ reg = <0x40 0x10000000 0x00 0x10000000>; -+ msi-parent = <&v2m>; -+ dma-coherent; -+ bus-range = <0x00 0xff>; -+ linux,pci-domain = <0x00>; -+ #size-cells = <0x02>; -+ #address-cells = <0x03>; -+ device_type = "pci"; -+ compatible = "pci-host-ecam-generic"; -+ }; -+ -+ pl031@9010000 { -+ clock-names = "apb_pclk"; -+ clocks = <&apb_clk>; -+ interrupts = <0x00 0x02 0x04>; -+ reg = <0x00 0x9010000 0x00 0x1000>; -+ compatible = "arm,pl031\0arm,primecell"; -+ }; -+ -+ pl011@9000000 { -+ clock-names = "uartclk\0apb_pclk"; -+ clocks = <&apb_clk &apb_clk>; -+ interrupts = <0x00 0x01 0x04>; -+ reg = <0x00 0x9000000 0x00 0x1000>; -+ compatible = "arm,pl011\0arm,primecell"; -+ }; -+ -+ pmu { -+ interrupts = <0x01 0x07 0xf04>; -+ compatible = "arm,armv8-pmuv3"; -+ }; -+ -+ intc@8000000 { -+ phandle = <0x8001>; -+ reg = <0x00 0x8000000 0x00 0x10000 0x00 0x8010000 0x00 0x10000>; -+ compatible = "arm,cortex-a15-gic"; -+ ranges; -+ #size-cells = <0x02>; -+ #address-cells = <0x02>; -+ interrupt-controller; -+ #interrupt-cells = <0x03>; -+ -+ v2m: v2m@8020000 { -+ reg = <0x00 0x8020000 0x00 0x1000>; -+ msi-controller; -+ compatible = "arm,gic-v2m-frame"; -+ }; -+ }; -+ -+ flash@0 { -+ bank-width = <0x04>; -+ reg = <0x00 0x00 0x00 0x4000000 0x00 0x4000000 0x00 0x4000000>; -+ compatible = "cfi-flash"; -+ }; -+ -+ cpus { -+ #size-cells = <0x00>; -+ #address-cells = <0x01>; -+ -+ cpu@0 { -+ reg = <0x00>; -+ enable-method = "psci"; -+ compatible = "arm,cortex-a72"; -+ device_type = "cpu"; -+ }; -+ -+ cpu@1 { -+ reg = <0x01>; -+ enable-method = "psci"; -+ compatible = "arm,cortex-a72"; -+ device_type = "cpu"; -+ }; -+ -+ cpu@2 { -+ reg = <0x02>; -+ enable-method = "psci"; -+ compatible = "arm,cortex-a72"; -+ device_type = "cpu"; -+ }; -+ -+ cpu@3 { -+ reg = <0x03>; -+ enable-method = "psci"; -+ compatible = "arm,cortex-a72"; -+ device_type = "cpu"; -+ }; -+ }; -+ -+ timer { -+ interrupts = <0x01 0x0d 0xf04 0x01 0x0e 0xf04 0x01 0x0b 0xf04 0x01 0x0a 0xf04>; -+ always-on; -+ compatible = "arm,armv8-timer\0arm,armv7-timer"; -+ }; -+ -+ apb_clk: apb-pclk { -+ clock-output-names = "clk24mhz"; -+ clock-frequency = <0x16e3600>; -+ #clock-cells = <0x00>; -+ compatible = "fixed-clock"; -+ }; -+ -+}; diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0023-virt64_guest.dts.patch b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0023-virt64_guest.dts.patch deleted file mode 100644 index ef33a72..0000000 --- a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0023-virt64_guest.dts.patch +++ /dev/null @@ -1,428 +0,0 @@ ---- a/arch/arm64/boot/dts/arm/virt64_guest.dts -+++ b/arch/arm64/boot/dts/arm/virt64_guest.dts -@@ -0,0 +1,425 @@ -+/dts-v1/; -+ -+/ { -+ interrupt-parent = <0x8001>; -+ #size-cells = <0x02>; -+ #address-cells = <0x02>; -+ compatible = "linux,dummy-virt"; -+ -+ reserved-memory { -+ #address-cells = <2>; -+ #size-cells = <2>; -+ ranges; -+ linux,cma { -+ compatible = "shared-dma-pool"; -+ reusable; -+ size = <0x0 0x6000000>; -+ alignment = <0x0 0x1000>; -+ linux,cma-default; -+ }; -+ }; -+ -+ console { -+ focus-dom-max = <3>; -+ }; -+ -+ psci { -+ migrate = <0xc4000005>; -+ cpu_on = <0xc4000003>; -+ cpu_off = <0x84000002>; -+ cpu_suspend = <0xc4000001>; -+ method = "hvc"; -+ compatible = "arm,psci-0.2\0arm,psci"; -+ }; -+ -+ memory@41000000 { -+ reg = <0x00 0x41000000 0x00 0x20000000>; -+ device_type = "memory"; -+ }; -+ -+ platform@c000000 { -+ interrupt-parent = <0x8001>; -+ ranges = <0x00 0x00 0xc000000 0x2000000>; -+ #address-cells = <0x01>; -+ #size-cells = <0x01>; -+ compatible = "qemu,platform\0simple-bus"; -+ }; -+ -+ fw-cfg@9020000 { -+ dma-coherent; -+ reg = <0x00 0x9020000 0x00 0x18>; -+ compatible = "qemu,fw-cfg-mmio"; -+ }; -+ -+ virtio_mmio@a000000 { -+ dma-coherent; -+ interrupts = <0x00 0x10 0x01>; -+ reg = <0x00 0xa000000 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a000200 { -+ dma-coherent; -+ interrupts = <0x00 0x11 0x01>; -+ reg = <0x00 0xa000200 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a000400 { -+ dma-coherent; -+ interrupts = <0x00 0x12 0x01>; -+ reg = <0x00 0xa000400 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a000600 { -+ dma-coherent; -+ interrupts = <0x00 0x13 0x01>; -+ reg = <0x00 0xa000600 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a000800 { -+ dma-coherent; -+ interrupts = <0x00 0x14 0x01>; -+ reg = <0x00 0xa000800 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a000a00 { -+ dma-coherent; -+ interrupts = <0x00 0x15 0x01>; -+ reg = <0x00 0xa000a00 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a000c00 { -+ dma-coherent; -+ interrupts = <0x00 0x16 0x01>; -+ reg = <0x00 0xa000c00 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a000e00 { -+ dma-coherent; -+ interrupts = <0x00 0x17 0x01>; -+ reg = <0x00 0xa000e00 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a001000 { -+ dma-coherent; -+ interrupts = <0x00 0x18 0x01>; -+ reg = <0x00 0xa001000 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a001200 { -+ dma-coherent; -+ interrupts = <0x00 0x19 0x01>; -+ reg = <0x00 0xa001200 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a001400 { -+ dma-coherent; -+ interrupts = <0x00 0x1a 0x01>; -+ reg = <0x00 0xa001400 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a001600 { -+ dma-coherent; -+ interrupts = <0x00 0x1b 0x01>; -+ reg = <0x00 0xa001600 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a001800 { -+ dma-coherent; -+ interrupts = <0x00 0x1c 0x01>; -+ reg = <0x00 0xa001800 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a001a00 { -+ dma-coherent; -+ interrupts = <0x00 0x1d 0x01>; -+ reg = <0x00 0xa001a00 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a001c00 { -+ dma-coherent; -+ interrupts = <0x00 0x1e 0x01>; -+ reg = <0x00 0xa001c00 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a001e00 { -+ dma-coherent; -+ interrupts = <0x00 0x1f 0x01>; -+ reg = <0x00 0xa001e00 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a002000 { -+ dma-coherent; -+ interrupts = <0x00 0x20 0x01>; -+ reg = <0x00 0xa002000 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a002200 { -+ dma-coherent; -+ interrupts = <0x00 0x21 0x01>; -+ reg = <0x00 0xa002200 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a002400 { -+ dma-coherent; -+ interrupts = <0x00 0x22 0x01>; -+ reg = <0x00 0xa002400 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a002600 { -+ dma-coherent; -+ interrupts = <0x00 0x23 0x01>; -+ reg = <0x00 0xa002600 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a002800 { -+ dma-coherent; -+ interrupts = <0x00 0x24 0x01>; -+ reg = <0x00 0xa002800 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a002a00 { -+ dma-coherent; -+ interrupts = <0x00 0x25 0x01>; -+ reg = <0x00 0xa002a00 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a002c00 { -+ dma-coherent; -+ interrupts = <0x00 0x26 0x01>; -+ reg = <0x00 0xa002c00 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a002e00 { -+ dma-coherent; -+ interrupts = <0x00 0x27 0x01>; -+ reg = <0x00 0xa002e00 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a003000 { -+ dma-coherent; -+ interrupts = <0x00 0x28 0x01>; -+ reg = <0x00 0xa003000 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a003200 { -+ dma-coherent; -+ interrupts = <0x00 0x29 0x01>; -+ reg = <0x00 0xa003200 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a003400 { -+ dma-coherent; -+ interrupts = <0x00 0x2a 0x01>; -+ reg = <0x00 0xa003400 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a003600 { -+ dma-coherent; -+ interrupts = <0x00 0x2b 0x01>; -+ reg = <0x00 0xa003600 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a003800 { -+ dma-coherent; -+ interrupts = <0x00 0x2c 0x01>; -+ reg = <0x00 0xa003800 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a003a00 { -+ dma-coherent; -+ interrupts = <0x00 0x2d 0x01>; -+ reg = <0x00 0xa003a00 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a003c00 { -+ dma-coherent; -+ interrupts = <0x00 0x2e 0x01>; -+ reg = <0x00 0xa003c00 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ virtio_mmio@a003e00 { -+ dma-coherent; -+ interrupts = <0x00 0x2f 0x01>; -+ reg = <0x00 0xa003e00 0x00 0x200>; -+ compatible = "virtio,mmio"; -+ }; -+ -+ pcie@10000000 { -+ interrupt-map-mask = <0x1800 0x00 0x00 0x07>; -+ interrupt-map = <0x00 0x00 0x00 0x01 0x8001 0x00 0x00 0x00 0x03 0x04 0x00 0x00 0x00 0x02 0x8001 0x00 0x00 0x00 0x04 0x04 0x00 0x00 0x00 0x03 0x8001 0x00 0x00 0x00 0x05 0x04 0x00 0x00 0x00 0x04 0x8001 0x00 0x00 0x00 0x06 0x04 0x800 0x00 0x00 0x01 0x8001 0x00 0x00 0x00 0x04 0x04 0x800 0x00 0x00 0x02 0x8001 0x00 0x00 0x00 0x05 0x04 0x800 0x00 0x00 0x03 0x8001 0x00 0x00 0x00 0x06 0x04 0x800 0x00 0x00 0x04 0x8001 0x00 0x00 0x00 0x03 0x04 0x1000 0x00 0x00 0x01 0x8001 0x00 0x00 0x00 0x05 0x04 0x1000 0x00 0x00 0x02 0x8001 0x00 0x00 0x00 0x06 0x04 0x1000 0x00 0x00 0x03 0x8001 0x00 0x00 0x00 0x03 0x04 0x1000 0x00 0x00 0x04 0x8001 0x00 0x00 0x00 0x04 0x04 0x1800 0x00 0x00 0x01 0x8001 0x00 0x00 0x00 0x06 0x04 0x1800 0x00 0x00 0x02 0x8001 0x00 0x00 0x00 0x03 0x04 0x1800 0x00 0x00 0x03 0x8001 0x00 0x00 0x00 0x04 0x04 0x1800 0x00 0x00 0x04 0x8001 0x00 0x00 0x00 0x05 0x04>; -+ #interrupt-cells = <0x01>; -+ ranges = <0x1000000 0x00 0x00 0x00 0x3eff0000 0x00 0x10000 0x2000000 0x00 0x10000000 0x00 0x10000000 0x00 0x2eff0000 0x3000000 0x80 0x00 0x80 0x00 0x80 0x00>; -+ reg = <0x40 0x10000000 0x00 0x10000000>; -+ msi-parent = <&v2m>; -+ dma-coherent; -+ bus-range = <0x00 0xff>; -+ linux,pci-domain = <0x00>; -+ #size-cells = <0x02>; -+ #address-cells = <0x03>; -+ device_type = "pci"; -+ compatible = "pci-host-ecam-generic"; -+ }; -+ -+ pl011@9000000 { -+ clock-names = "uartclk\0apb_pclk"; -+ clocks = <&apb_clk &apb_clk>; -+ interrupts = <0x00 0x01 0x04>; -+ reg = <0x00 0x9000000 0x00 0x1000>; -+ compatible = "arm,pl011\0arm,primecell"; -+ }; -+ -+ pmu { -+ interrupts = <0x01 0x07 0xf04>; -+ compatible = "arm,armv8-pmuv3"; -+ }; -+ -+ intc@8000000 { -+ phandle = <0x8001>; -+ reg = <0x00 0x8000000 0x00 0x10000 0x00 0x8010000 0x00 0x10000>; -+ compatible = "arm,cortex-a15-gic"; -+ ranges; -+ #size-cells = <0x02>; -+ #address-cells = <0x02>; -+ interrupt-controller; -+ #interrupt-cells = <0x03>; -+ -+ v2m: v2m@8020000 { -+ reg = <0x00 0x8020000 0x00 0x1000>; -+ msi-controller; -+ compatible = "arm,gic-v2m-frame"; -+ }; -+ }; -+ -+ flash@0 { -+ bank-width = <0x04>; -+ reg = <0x00 0x00 0x00 0x4000000 0x00 0x4000000 0x00 0x4000000>; -+ compatible = "cfi-flash"; -+ }; -+ -+ cpus { -+ #size-cells = <0x00>; -+ #address-cells = <0x01>; -+ -+ cpu@0 { -+ reg = <0x00>; -+ enable-method = "psci"; -+ compatible = "arm,cortex-a72"; -+ device_type = "cpu"; -+ }; -+ -+ cpu@1 { -+ reg = <0x01>; -+ enable-method = "psci"; -+ compatible = "arm,cortex-a72"; -+ device_type = "cpu"; -+ }; -+ -+ cpu@2 { -+ reg = <0x02>; -+ enable-method = "psci"; -+ compatible = "arm,cortex-a72"; -+ device_type = "cpu"; -+ }; -+ -+ cpu@3 { -+ reg = <0x03>; -+ enable-method = "psci"; -+ compatible = "arm,cortex-a72"; -+ device_type = "cpu"; -+ }; -+ }; -+ -+ timer { -+ interrupts = <0x01 0x0d 0xf04 0x01 0x0e 0xf04 0x01 0x0b 0xf04 0x01 0x0a 0xf04>; -+ always-on; -+ compatible = "arm,armv8-timer\0arm,armv7-timer"; -+ }; -+ -+ apb_clk: apb-pclk { -+ clock-output-names = "clk24mhz"; -+ clock-frequency = <0x16e3600>; -+ #clock-cells = <0x00>; -+ compatible = "fixed-clock"; -+ }; -+ -+ clcd_clk: clcd-clk { -+ compatible = "fixed-clock"; -+ #clock-cells = <0x00>; -+ clock-frequency = <25175000>; -+ clock-output-names = "clcdclk"; -+ }; -+ -+ panel: panel { -+ compatible = "panel-dpi"; -+ width-mm = <152>; -+ height-mm = <91>; -+ -+ panel-timing { -+ clock-frequency = <25175000>; -+ hactive = <640>; -+ vactive = <480>; -+ hback-porch = <48>; -+ hfront-porch = <16>; -+ hsync-len = <96>; -+ vback-porch = <33>; -+ vfront-porch = <10>; -+ vsync-len = <2>; -+ hsync-active = <0>; -+ vsync-active = <0>; -+ de-active = <1>; -+ pixelclk-active = <0>; -+ }; -+ -+ port { -+ panel_in: endpoint { -+ remote-endpoint = <&clcd_out>; -+ }; -+ }; -+ }; -+ -+ clcd@8800000 { -+ compatible = "arm,pl111", "arm,primecell"; -+ reg = <0x00 0x8800000 0x00 0x1000>; -+ interrupts = <0x00 0x0a 0x04>; -+ clocks = <&clcd_clk>, <&apb_clk>; -+ clock-names = "clcdclk", "apb_pclk"; -+ -+ port { -+ clcd_out: endpoint { -+ remote-endpoint = <&panel_in>; -+ }; -+ }; -+ }; -+ -+}; From 808453740265e09d21d5382b813aaade0dc23100 Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Tue, 23 Jun 2026 19:10:52 +0200 Subject: [PATCH 13/52] meta-bsp: split bsp-linux into the AVZ + Linux-agency 2-ITB boot MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Align bsp-linux with the so3/edgem1 two-ITB principle: one ITB for AVZ, one for the Linux agency (loaded together by U-Boot's e1c-boot, AVZ FIT in x0, agency guest in x1). Previously micofe bundled AVZ + Linux agency into a single virt64_avz.itb, which did not match the AVZ deploy path (which stages avz_itb + a separate guest_itb) and broke deploy. - linux/target/virt64_avz.its: now AVZ-only (avz + avz_dt), mirroring so3's virt64_avz.its. - linux/target/virt64_linux_guest.its: new — the Linux agency guest (Image + fdt + initrd), modelled on so3's virt64_so3_guest.its. - bsp-linux do_itb: mirror bsp-so3 — build ${IB_TARGET_ITS}.itb (AVZ) then the derived guest ITB. The guest kind is IB_AVZ_GUEST ("linux_guest" for bsp-linux; bsp-so3 keeps the "so3_guest" default). Strip _avz via a shell variable (bitbake does not pass ${VAR%_avz} through to the shell). - bsp_arm_common.inc __deploy_arm_common: derive the guest ITB from IB_AVZ_GUEST instead of the hardcoded _so3_guest, so the same deploy serves both the SO3 guest (bsp-so3) and the Linux agency (bsp-linux). - uEnv_virt64_avz.txt for bsp-linux: e1c-boot loads virt64_avz.itb + virt64_guest.itb (the deploy stages the guest under the generic _guest.itb name). Verified: bsp-linux do_itb builds both virt64_avz.itb (AVZ-only) and virt64_linux_guest.itb (Linux agency). --- .../recipes-bsp/bsp/files/bsp_arm_common.inc | 5 +- .../recipes-bsp/linux/bsp-linux_1.0.bb | 49 +++++++---- .../linux/files/uEnv_virt64_avz.txt | 10 +++ linux/target/virt64_avz.its | 81 +++++-------------- linux/target/virt64_linux_guest.its | 64 +++++++++++++++ 5 files changed, 131 insertions(+), 78 deletions(-) create mode 100644 build/meta-bsp/recipes-bsp/linux/files/uEnv_virt64_avz.txt create mode 100644 linux/target/virt64_linux_guest.its diff --git a/build/meta-bsp/recipes-bsp/bsp/files/bsp_arm_common.inc b/build/meta-bsp/recipes-bsp/bsp/files/bsp_arm_common.inc index d7c1a48..1666abe 100644 --- a/build/meta-bsp/recipes-bsp/bsp/files/bsp_arm_common.inc +++ b/build/meta-bsp/recipes-bsp/bsp/files/bsp_arm_common.inc @@ -20,11 +20,14 @@ def __deploy_arm_common(d): plat = d.getVar('IB_PLATFORM') its = d.getVar('IB_TARGET_ITS') or "" IB_UENV = d.getVar("IB_UENV") + # Kind of x1 guest in the AVZ two-ITB boot: "so3_guest" (bsp-so3) or + # "linux_guest" (bsp-linux agency). Set per recipe; default so3_guest. + guest_kind = d.getVar('IB_AVZ_GUEST') or "so3_guest" if its.endswith("_avz"): # Two-ITB AVZ boot. avz_itb = f"{itb_dir}/{its}.itb" - guest_itb = f"{itb_dir}/{its[:-len('_avz')]}_so3_guest.itb" + guest_itb = f"{itb_dir}/{its[:-len('_avz')]}_{guest_kind}.itb" avz_uenv = os.path.join(os.path.dirname(IB_UENV), f"uEnv_{plat}_avz.txt") for f in (avz_itb, guest_itb, avz_uenv): diff --git a/build/meta-bsp/recipes-bsp/linux/bsp-linux_1.0.bb b/build/meta-bsp/recipes-bsp/linux/bsp-linux_1.0.bb index fcdf4e3..5336a5a 100644 --- a/build/meta-bsp/recipes-bsp/linux/bsp-linux_1.0.bb +++ b/build/meta-bsp/recipes-bsp/linux/bsp-linux_1.0.bb @@ -20,6 +20,13 @@ inherit atf OVERRIDES += ":linux" +# Kind of guest carried by the second (x1) ITB in the AVZ two-ITB boot. +# For bsp-linux the guest is the Linux agency (Linux runs as the AVZ +# agency hosting the SO3 capsules) -> _avz pairs with +# _linux_guest. bsp-so3 keeps the default "so3_guest". The shared +# deploy (__deploy_arm_common) reads this to locate the guest ITB. +IB_AVZ_GUEST = "linux_guest" + COMPATIBLE_PLATFORM = "virt32|virt64|rpi4_64" do_attach_infrabase[noexec] = "1" @@ -44,23 +51,33 @@ do_itb[nostamp] = "1" do_itb () { - if [ "${IB_BOOT_CHAIN}" = "full" ]; then - # AVZ mode: wrap Linux (agency) into the AVZ ITB. - - if [ ! -f ${IB_ITB_PATH}/${IB_TARGET_ITS}.its ]; then - bbfatal "No corresponding ITS found (${IB_TARGET_ITS})" - fi - mkimage -f ${IB_ITB_PATH}/${IB_TARGET_ITS}.its ${IB_ITB_PATH}/${IB_PLATFORM}_avz.itb - else - # Bare bsp-linux (IB_BOOT_CHAIN ∈ {uboot, atf+uboot}): single - # plain ITB from ${IB_PLATFORM}.its with the buildroot initrd - # bundled in. Direct bootm by U-Boot, no AVZ wrapping. - - if [ ! -f ${IB_ITB_PATH}/${IB_PLATFORM}.its ]; then - bbfatal "No bare ITS found at ${IB_ITB_PATH}/${IB_PLATFORM}.its" - fi - mkimage -f ${IB_ITB_PATH}/${IB_PLATFORM}.its ${IB_ITB_PATH}/${IB_PLATFORM}.itb + # Build the selected ITB from its ITS (AVZ ITB for the *_avz target, + # or a plain single ITB otherwise). Mirrors bsp-so3:do_itb. + if [ ! -f ${IB_ITB_PATH}/${IB_TARGET_ITS}.its ]; then + bbfatal "No corresponding ITS found (${IB_TARGET_ITS})" fi + mkimage -f ${IB_ITB_PATH}/${IB_TARGET_ITS}.its ${IB_ITB_PATH}/${IB_TARGET_ITS}.itb + + # AVZ boot uses a SEPARATE guest ITB loaded alongside the AVZ ITB by + # the e1c-boot U-Boot command (AVZ FIT in x0, guest ITB in x1). For + # bsp-linux the guest is the Linux agency: _avz -> _linux_guest + # (IB_AVZ_GUEST). Deriving from IB_TARGET_ITS keeps the underscore + # naming on hyphenated platforms (e.g. verdin-imx8mp). + # NB: assign IB_TARGET_ITS to a shell var before the ${var%_avz} + # parameter expansion — bitbake does not pass ${IB_TARGET_ITS%_avz} + # through to the shell (it resolves the literal ${...} itself), so the + # strip must run on a real shell variable. + its="${IB_TARGET_ITS}" + case "$its" in + *_avz) + guest_its="${its%_avz}_${IB_AVZ_GUEST}" + if [ -f ${IB_ITB_PATH}/${guest_its}.its ]; then + mkimage -f ${IB_ITB_PATH}/${guest_its}.its ${IB_ITB_PATH}/${guest_its}.itb + else + bbfatal "No guest ITS found at ${IB_ITB_PATH}/${guest_its}.its" + fi + ;; + esac } # do_prepare_initrd: gzip rootfs.cpio (produced by usr-linux:do_deploy) diff --git a/build/meta-bsp/recipes-bsp/linux/files/uEnv_virt64_avz.txt b/build/meta-bsp/recipes-bsp/linux/files/uEnv_virt64_avz.txt new file mode 100644 index 0000000..91c5506 --- /dev/null +++ b/build/meta-bsp/recipes-bsp/linux/files/uEnv_virt64_avz.txt @@ -0,0 +1,10 @@ +fdt_high=ffffffffffffffff +initrd_high=ffffffffffffffff + +# AVZ boot on virt64: two ITBs (AVZ + Linux agency guest) loaded to +# staging addresses, then jumped via the e1c-boot U-Boot command which +# passes the AVZ FIT in x0 and the guest ITB in x1 (AVZ loadAgency loads +# the agency guest from x1). EL2 is required (st.sh enables +# -M virt,virtualization=on). + +start=load virtio 0 0x65000000 virt64_avz.itb; load virtio 0 0x70000000 virt64_guest.itb; e1c-boot 0x65000000 0x70000000 diff --git a/linux/target/virt64_avz.its b/linux/target/virt64_avz.its index 63d2c77..ec31cfa 100644 --- a/linux/target/virt64_avz.its +++ b/linux/target/virt64_avz.its @@ -1,95 +1,54 @@ /* - * Copyright (C) 2020 Daniel Rossier + * Copyright (C) 2020-2026 Daniel Rossier + * + * AVZ ITB for virt64 (armv8). Carries only the AVZ hypervisor binary + * (so3.bin) + the AVZ device tree. The Linux agency guest lives in a + * SEPARATE ITB (virt64_linux_guest.its); both are loaded by U-Boot's + * e1c-boot command, which passes the AVZ FIT in x0 and the guest ITB in + * x1; AVZ's loadAgency() loads the agency guest from it. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * */ /dts-v1/; / { - description = "Kernel and rootfs components for virt64 (armv8) environment"; + description = "AVZ Hypervisor bundle for virt64 (armv8)"; images { - avz { + avz { description = "AVZ Hypervisor (64-bit) Polymorphic SO3"; - data = /incbin/("../../avz/so3.bin"); + data = /incbin/("../../avz/so3.bin"); type = "kernel"; - os = "linux"; + os = "linux"; arch = "arm64"; compression = "none"; load = <0x40080000>; entry = <0x40080000>; }; -/* The location of the linux guest is the same than in the DTS - so that we avoid to use the IOMMU -*/ - - linux { - description = "Linux kernel"; - data = /incbin/("../linux/arch/arm64/boot/Image"); - type = "guest"; - arch = "arm64"; - os = "linux"; - compression = "none"; - load = <0x41000000>; - entry = <0x41000000>; - }; - - avz_dt { - description = "Flattened Device Tree blob"; + avz_dt { + description = "AVZ device tree"; data = /incbin/("../../avz/dts/virt64_avz.dtb"); type = "avz_dt"; arch = "arm64"; compression = "none"; - /* Find a region above the heap to preserve the DT */ load = <0x46000000>; }; - - fdt { - description = "Linux device tree blob"; - data = /incbin/("../linux/arch/arm64/boot/dts/arm/virt64_guest.dtb"); - type = "flat_dt"; - arch = "arm64"; - compression = "none"; - load = <0x50000000>; - }; - - initrd { - description = "Initial rootfs (initrd)"; - data = /incbin/("../rootfs/board/virt64/initrd.cpio"); - type = "ramdisk"; - arch = "arm64"; - os = "linux"; - compression = "none"; - load = <0x50c00000>; - }; }; configurations { - default = "agency"; - - agency { - description = "SOO Agency on virt64"; - kernel = "avz"; - loadables = "avz_dt", "linux"; - fdt = "fdt"; - ramdisk = "initrd"; + default = "avz"; + + avz { + description = "AVZ hypervisor on virt64"; + kernel = "avz"; + loadables = "avz_dt"; + fdt = "avz_dt"; }; - }; - }; diff --git a/linux/target/virt64_linux_guest.its b/linux/target/virt64_linux_guest.its new file mode 100644 index 0000000..2e7d44a --- /dev/null +++ b/linux/target/virt64_linux_guest.its @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2020-2026 Daniel Rossier + * + * Linux agency guest ITB for virt64 (armv8). Carries the Linux agency + * kernel (Image) + its device tree + initrd. Paired with virt64_avz.itb + * and loaded by U-Boot's e1c-boot command, which passes this ITB to AVZ + * in x1; AVZ's loadAgency() loads the agency guest from it. The Linux + * agency hosts the SO3 capsules (injected at runtime via EMISO). + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +/dts-v1/; + +/ { + description = "Linux agency guest bundle for virt64 (armv8)"; + + images { + + linux { + description = "Linux agency kernel (guest)"; + data = /incbin/("../linux/arch/arm64/boot/Image"); + type = "guest"; + arch = "arm64"; + os = "linux"; + compression = "none"; + load = <0x41000000>; + entry = <0x41000000>; + }; + + fdt { + description = "Linux agency device tree (AVZ-exposed)"; + data = /incbin/("../linux/arch/arm64/boot/dts/arm/virt64_guest.dtb"); + type = "flat_dt"; + arch = "arm64"; + compression = "none"; + load = <0x50000000>; + }; + + initrd { + description = "Linux agency initrd"; + data = /incbin/("../rootfs/board/virt64/initrd.cpio"); + type = "ramdisk"; + arch = "arm64"; + os = "linux"; + compression = "none"; + load = <0x50c00000>; + }; + }; + + configurations { + default = "agency"; + + agency { + description = "SOO Linux agency on virt64"; + loadables = "linux"; + fdt = "fdt"; + ramdisk = "initrd"; + }; + }; +}; From e63f162ceba671154f3b455ec5e1a1856c9482eb Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Tue, 23 Jun 2026 19:26:46 +0200 Subject: [PATCH 14/52] meta-bsp/st.sh: fix Linux-agency AVZ boot (EL2 detect + guest config name) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two fixes found while bringing up the virt64 agency 2-ITB boot end to end: - scripts/st.sh: enable QEMU EL2 (virtualization=on) when the *linux* ITS is an _avz target, not only the so3 ITS. micofe boots the Linux agency on AVZ (IB_TARGET_ITS:linux:virt64=virt64_avz) while the so3 ITS is virt64_capsule, so the old so3-only check left EL2 disabled and AVZ faulted. - linux/target/virt64_linux_guest.its: the guest configuration node must be named "capsule" — U-Boot's e1c-boot looks it up by that fixed name (cmd/e1c_boot.c: e1c_load_fit(e1c_itb, "capsule", ...)). Also switched the in-node comments to /* */ (DTC rejects '#'). Verified end to end: build.sh -a + deploy.sh -a + st.sh boots AVZ -> Linux agency (vbus/vbstore up, SO3-capsule backend ready) to a shell. --- linux/target/virt64_linux_guest.its | 8 ++++++-- scripts/st.sh | 21 ++++++++++++--------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/linux/target/virt64_linux_guest.its b/linux/target/virt64_linux_guest.its index 2e7d44a..e76f80f 100644 --- a/linux/target/virt64_linux_guest.its +++ b/linux/target/virt64_linux_guest.its @@ -52,9 +52,13 @@ }; configurations { - default = "agency"; + /* Node name MUST be "capsule": U-Boot's e1c-boot command looks + * up the guest config by that fixed name (cmd/e1c_boot.c: + * e1c_load_fit(e1c_itb, "capsule", ...)). Same slot as the SO3 + * guest; here it carries the Linux agency. */ + default = "capsule"; - agency { + capsule { description = "SOO Linux agency on virt64"; loadables = "linux"; fdt = "fdt"; diff --git a/scripts/st.sh b/scripts/st.sh index 91c7aab..3758c76 100755 --- a/scripts/st.sh +++ b/scripts/st.sh @@ -39,10 +39,13 @@ launch_qemu() { fi done < build/conf/local.conf - # Detect a SO3-on-AVZ boot from the selected (uncommented) so3 ITS. - # AVZ is an EL2 hypervisor, so QEMU must expose EL2 (virtualization=on); - # a standalone SO3 boots at EL1. + # Detect an AVZ boot from the selected (uncommented) ITS. AVZ is an EL2 + # hypervisor, so QEMU must expose EL2 (virtualization=on); a standalone + # SO3 / plain Linux boots at EL1. Either context can be the AVZ guest: + # * SO3 on AVZ -> IB_TARGET_ITS:so3: = _avz + # * Linux agency on AVZ-> IB_TARGET_ITS:linux: = _avz (MICOFE) SO3_ITS=$(grep -E "^IB_TARGET_ITS:so3:${IB_PLATFORM}\b" build/conf/local.conf | awk -F'"' '{print $2}' | tail -1) + LINUX_ITS=$(grep -E "^IB_TARGET_ITS:linux:${IB_PLATFORM}\b" build/conf/local.conf | awk -F'"' '{print $2}' | tail -1) if [ "$IB_PLATFORM" == "virt64" ]; then QEMU_BIN="$IB_ROOT_DIR/qemu/build/qemu-system-aarch64" @@ -72,13 +75,13 @@ launch_qemu() { # ATF/OP-TEE chain (flash0/FIP): EL3 (secure=on) + EL2 enabled. MACHINE_OPT="-M virt,virtualization=on,gic-version=2,secure=on" BOOT_OPT="-drive if=pflash,format=raw,file=filesystem/flash0.img" - elif [[ "$SO3_ITS" == *avz* ]]; then - # SO3-on-AVZ via the ITS, no ATF: AVZ is an EL2 hypervisor, so QEMU - # must expose EL2 (virtualization=on). The U-Boot here is - # virt64_defconfig (FIP/EL2-aware), so it runs fine at EL2 and hands - # off to AVZ at EL2. Without this, AVZ faults on its first EL2 + elif [[ "$SO3_ITS" == *avz* || "$LINUX_ITS" == *avz* ]]; then + # AVZ via the ITS (SO3 guest or Linux agency), no ATF: AVZ is an EL2 + # hypervisor, so QEMU must expose EL2 (virtualization=on). The U-Boot + # here is virt64_defconfig (FIP/EL2-aware), so it runs fine at EL2 and + # hands off to AVZ at EL2. Without this, AVZ faults on its first EL2 # system-register access (Synchronous Abort -> reset). - echo "AVZ guest (ITS=$SO3_ITS) — enabling EL2 (virtualization=on)" + echo "AVZ guest (so3=$SO3_ITS linux=$LINUX_ITS) — enabling EL2 (virtualization=on)" MACHINE_OPT="-M virt,gic-version=2,virtualization=on" BOOT_OPT="-kernel u-boot/u-boot" else From 334404d673369bfdc3135b055ba81da029b51fcd Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Tue, 23 Jun 2026 19:52:41 +0200 Subject: [PATCH 15/52] meta-bsp/meta-rootfs: keep the 2-stage rootfs + rebrand agency to MICOFE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The wholesale-adopted so3 do_prepare_initrd uses the full-initramfs model: it copies the ~96 MB rootfs.cpio over the committed 6 MB REDS minimal ramdisk (initrd.cpio) and gzips it. micofe instead uses a 2-stage rootfs — the small REDS ramdisk (bundled in the guest ITS) switch_root's to the full agency rootfs on /dev/vda2 (p2), deployed by rootfs-linux. The overwrite ballooned the guest ITB to 145 MB (overflowing the p1 FAT boot partition) and booted the wrong rootfs. - bsp-linux: do_prepare_initrd[noexec]="1" — keep the committed REDS ramdisk as initrd.cpio (guest ITB back to ~50 MB, fits p1). The agency rootfs already lands on vda2 via rootfs-linux:do_deploy. - rebrand the agency from the EDGE-M1 / EDGEMTech leftovers to MICOFE: rootfs_overlay/etc/profile banner (ANSI-shadow MICOFE + "Welcome to MICOFE" / "REDS HEIG-VD"), buildroot defconfig BR2_TARGET_GENERIC_HOSTNAME="micofe", BR2_TARGET_GENERIC_ISSUE="MICOFE". Verified: st.sh boots AVZ (REDS/HEIG-VD banner) -> Linux agency -> vbus/vbstore SOO backend (vuart/vlogs/soo-me) -> agency login on vda2. --- .../meta-bsp/recipes-bsp/linux/bsp-linux_1.0.bb | 10 ++++++++++ .../0003-virt64_defconfig.patch | 4 ++-- .../board/common/rootfs_overlay/etc/profile | 16 ++++++++-------- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/build/meta-bsp/recipes-bsp/linux/bsp-linux_1.0.bb b/build/meta-bsp/recipes-bsp/linux/bsp-linux_1.0.bb index 5336a5a..6e6cf6b 100644 --- a/build/meta-bsp/recipes-bsp/linux/bsp-linux_1.0.bb +++ b/build/meta-bsp/recipes-bsp/linux/bsp-linux_1.0.bb @@ -88,6 +88,16 @@ do_itb () { # in place — the content-hash guard below picks up the new content and # regenerates initrd.cpio.gz. +# MICOFE uses a 2-stage rootfs (NOT the so3/edgem1 full-initramfs model): +# the committed REDS minimal ramdisk (meta-rootfs .../files/board/${IB_PLATFORM}/ +# initrd.cpio, ~6 MB) is bundled in the guest ITS and switch_root's to the +# full agency rootfs on /dev/vda2 (p2, deployed by rootfs-linux). So this +# task is DISABLED: regenerating initrd.cpio from the ~96 MB rootfs.cpio +# (shutil.copy2 below) would clobber the ramdisk and overflow the p1 FAT +# boot partition. (Future option: repurpose this task to assemble/refresh +# the ramdisk instead of committing it as a static file.) +do_prepare_initrd[noexec] = "1" + do_prepare_initrd[nostamp] = "1" do_prepare_initrd[depends] = "usr-linux:do_deploy" diff --git a/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0003-virt64_defconfig.patch b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0003-virt64_defconfig.patch index fb8072d..71986bd 100644 --- a/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0003-virt64_defconfig.patch +++ b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0003-virt64_defconfig.patch @@ -345,8 +345,8 @@ +# +BR2_ROOTFS_SKELETON_DEFAULT=y +# BR2_ROOTFS_SKELETON_CUSTOM is not set -+BR2_TARGET_GENERIC_HOSTNAME="edge-m1" -+BR2_TARGET_GENERIC_ISSUE="EDGEMTech Factory Capsule" ++BR2_TARGET_GENERIC_HOSTNAME="micofe" ++BR2_TARGET_GENERIC_ISSUE="MICOFE" +BR2_TARGET_GENERIC_PASSWD_SHA256=y +# BR2_TARGET_GENERIC_PASSWD_SHA512 is not set +BR2_TARGET_GENERIC_PASSWD_METHOD="sha-256" diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/profile b/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/profile index bea7342..1a203fb 100755 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/profile +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/profile @@ -11,15 +11,15 @@ export PATH=\ if [ "$PS1" ]; then printf "\n" - printf "\033[38;2;240;130;26m ███████╗██████╗ ██████╗ ███████╗ ███╗ ███╗ ██╗\033[0m\n" - printf "\033[38;2;240;130;26m ██╔════╝██╔══██╗██╔════╝ ██╔════╝ ████╗ ████║███║\033[0m\n" - printf "\033[38;2;237;104;20m █████╗ ██║ ██║██║ ███╗█████╗ ██╔████╔██║╚██║\033[0m\n" - printf "\033[38;2;235;91;17m ██╔══╝ ██║ ██║██║ ██║██╔══╝ ██║╚██╔╝██║ ██║\033[0m\n" - printf "\033[38;2;233;78;15m ███████╗██████╔╝╚██████╔╝███████╗ ██║ ╚═╝ ██║ ██║\033[0m\n" - printf "\033[38;2;232;78;15m ╚══════╝╚═════╝ ╚═════╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝\033[0m\n" + printf "\033[38;2;240;130;26m ███╗ ███╗██╗ ██████╗ ██████╗ ███████╗███████╗\033[0m\n" + printf "\033[38;2;240;130;26m ████╗ ████║██║██╔════╝██╔═══██╗██╔════╝██╔════╝\033[0m\n" + printf "\033[38;2;237;104;20m ██╔████╔██║██║██║ ██║ ██║█████╗ █████╗ \033[0m\n" + printf "\033[38;2;235;91;17m ██║╚██╔╝██║██║██║ ██║ ██║██╔══╝ ██╔══╝ \033[0m\n" + printf "\033[38;2;233;78;15m ██║ ╚═╝ ██║██║╚██████╗╚██████╔╝██║ ███████╗\033[0m\n" + printf "\033[38;2;232;78;15m ╚═╝ ╚═╝╚═╝ ╚═════╝ ╚═════╝ ╚═╝ ╚══════╝\033[0m\n" printf "\n" - printf "\033[38;2;240;130;26m Welcome to \033[1;38;2;232;78;15mEDGE-M1 Factory Capsule\033[0m\n" - printf "\033[0;37m EDGEMTech SA — %s %s\033[0m\n" "$(uname -s)" "$(uname -r)" + printf "\033[38;2;240;130;26m Welcome to \033[1;38;2;232;78;15mMICOFE\033[0m\n" + printf "\033[0;37m REDS HEIG-VD — %s %s\033[0m\n" "$(uname -s)" "$(uname -r)" printf "\n" fi From 328146be2d23d614760797a7a847240ce7b4b363 Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Tue, 23 Jun 2026 21:26:55 +0200 Subject: [PATCH 16/52] meta-usr/meta-rootfs/meta-bsp: build+install fb_mapper/input_forwarding, blue banner, boot logs - meta-usr (soo): the fb_mapper / input_forwarding userspace apps shipped as sources (src/soo/fb_mapper.c, input_forwarding.c) but were neither compiled nor installed, so the framebuffer/input forwarders never reached the agency rootfs (only their .service units did). Add add_executable() for both in the soo CMakeLists patch (0016) and install them via the soo usr-linux bbappend. Verified: both build (aarch64 ELF) and stage in build/deploy/root alongside emiso_engine, injector, melist, save/restore/shutdownme. - meta-rootfs: agency /etc/profile MICOFE banner recoloured orange -> blue gradient. - meta-bsp: uEnv_virt64_avz.txt sets bootargs="console=ttyAMA0 loglevel=8" (e1c-boot propagates it to the agency /chosen) so the boot log is visible on the serial console. --- .../recipes-bsp/linux/files/uEnv_virt64_avz.txt | 6 ++++++ .../files/board/common/rootfs_overlay/etc/profile | 14 +++++++------- .../0016-CMakeLists.txt.patch | 4 +++- .../recipes-usr/soo/usr-linux_1.0.bbappend | 3 +++ 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/build/meta-bsp/recipes-bsp/linux/files/uEnv_virt64_avz.txt b/build/meta-bsp/recipes-bsp/linux/files/uEnv_virt64_avz.txt index 91c5506..14fcf70 100644 --- a/build/meta-bsp/recipes-bsp/linux/files/uEnv_virt64_avz.txt +++ b/build/meta-bsp/recipes-bsp/linux/files/uEnv_virt64_avz.txt @@ -7,4 +7,10 @@ initrd_high=ffffffffffffffff # the agency guest from x1). EL2 is required (st.sh enables # -M virt,virtualization=on). +# Agency kernel cmdline: e1c-boot propagates this 'bootargs' env into the +# agency guest's /chosen (cmd/e1c_boot.c: env_get("bootargs") + fdt_chosen). +# console=ttyAMA0 routes the boot log to the serial console; loglevel=8 +# shows all kernel messages during boot. +bootargs=console=ttyAMA0 loglevel=8 + start=load virtio 0 0x65000000 virt64_avz.itb; load virtio 0 0x70000000 virt64_guest.itb; e1c-boot 0x65000000 0x70000000 diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/profile b/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/profile index 1a203fb..5986153 100755 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/profile +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/profile @@ -11,14 +11,14 @@ export PATH=\ if [ "$PS1" ]; then printf "\n" - printf "\033[38;2;240;130;26m ███╗ ███╗██╗ ██████╗ ██████╗ ███████╗███████╗\033[0m\n" - printf "\033[38;2;240;130;26m ████╗ ████║██║██╔════╝██╔═══██╗██╔════╝██╔════╝\033[0m\n" - printf "\033[38;2;237;104;20m ██╔████╔██║██║██║ ██║ ██║█████╗ █████╗ \033[0m\n" - printf "\033[38;2;235;91;17m ██║╚██╔╝██║██║██║ ██║ ██║██╔══╝ ██╔══╝ \033[0m\n" - printf "\033[38;2;233;78;15m ██║ ╚═╝ ██║██║╚██████╗╚██████╔╝██║ ███████╗\033[0m\n" - printf "\033[38;2;232;78;15m ╚═╝ ╚═╝╚═╝ ╚═════╝ ╚═════╝ ╚═╝ ╚══════╝\033[0m\n" + printf "\033[38;2;120;215;255m ███╗ ███╗██╗ ██████╗ ██████╗ ███████╗███████╗\033[0m\n" + printf "\033[38;2;90;190;255m ████╗ ████║██║██╔════╝██╔═══██╗██╔════╝██╔════╝\033[0m\n" + printf "\033[38;2;64;160;248m ██╔████╔██║██║██║ ██║ ██║█████╗ █████╗ \033[0m\n" + printf "\033[38;2;48;132;240m ██║╚██╔╝██║██║██║ ██║ ██║██╔══╝ ██╔══╝ \033[0m\n" + printf "\033[38;2;36;106;230m ██║ ╚═╝ ██║██║╚██████╗╚██████╔╝██║ ███████╗\033[0m\n" + printf "\033[38;2;28;84;220m ╚═╝ ╚═╝╚═╝ ╚═════╝ ╚═════╝ ╚═╝ ╚══════╝\033[0m\n" printf "\n" - printf "\033[38;2;240;130;26m Welcome to \033[1;38;2;232;78;15mMICOFE\033[0m\n" + printf "\033[38;2;120;215;255m Welcome to \033[1;38;2;48;132;240mMICOFE\033[0m\n" printf "\033[0;37m REDS HEIG-VD — %s %s\033[0m\n" "$(uname -s)" "$(uname -r)" printf "\n" fi diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0016-CMakeLists.txt.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0016-CMakeLists.txt.patch index 25e46ee..4e4af54 100644 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0016-CMakeLists.txt.patch +++ b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0016-CMakeLists.txt.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/CMakeLists.txt 1970-01-01 01:00:00.000000000 +0100 +++ ./src/soo/CMakeLists.txt 2025-10-10 17:28:33.593542342 +0200 -@@ -0,0 +1,14 @@ +@@ -0,0 +1,16 @@ + + +add_executable(injector injector.c) @@ -10,6 +10,8 @@ +add_executable(shutdownme shutdownme.c) + +add_executable(melist melist.c) ++add_executable(fb_mapper fb_mapper.c) ++add_executable(input_forwarding input_forwarding.c) + +add_subdirectory(emiso_engine) + diff --git a/build/meta-usr/recipes-usr/soo/usr-linux_1.0.bbappend b/build/meta-usr/recipes-usr/soo/usr-linux_1.0.bbappend index 220c9b3..2a0da47 100644 --- a/build/meta-usr/recipes-usr/soo/usr-linux_1.0.bbappend +++ b/build/meta-usr/recipes-usr/soo/usr-linux_1.0.bbappend @@ -26,6 +26,9 @@ do_install_apps:append () { usr_do_install_file_root "${IB_TARGET}/build/src/soo/melist" usr_do_install_file_root "${IB_TARGET}/build/src/soo/shutdownme" + usr_do_install_file_root "${IB_TARGET}/build/src/soo/fb_mapper" + usr_do_install_file_root "${IB_TARGET}/build/src/soo/input_forwarding" + usr_do_install_file_root "${IB_TARGET}/build/src/soo/emiso_engine/emiso_engine" fi } From b25d6de86079992310f062f37a37f3f112ee93e3 Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Tue, 23 Jun 2026 21:54:38 +0200 Subject: [PATCH 17/52] meta-usr: deploy agency usr apps as root (fix silent permission failure) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit usr-linux:do_deploy copied build/deploy/* into the rootfs partition with a plain unprivileged os.system("cp -r ...") whose return code was ignored. Since the rootfs is extracted via sudo (cpio -id), /root is owned by root (0700); with bitbake now running unprivileged the cp was denied and the copy silently dropped — so NONE of the soo agency apps (emiso_engine, fb_mapper, input_forwarding, injector, melist, save/restore/shutdownme) ever reached the agency /root. Use utils_sudo(..., shell=True, check=True): run the copy as root (matching the sudo'd rootfs extraction) and fail loudly if it errors. Verified by loop-mounting the deployed image: /root was empty before, has all 8 apps after a root copy. --- build/meta-usr/recipes-usr/linux/usr-linux_1.0.bb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/build/meta-usr/recipes-usr/linux/usr-linux_1.0.bb b/build/meta-usr/recipes-usr/linux/usr-linux_1.0.bb index 8fdadb9..4de3b30 100644 --- a/build/meta-usr/recipes-usr/linux/usr-linux_1.0.bb +++ b/build/meta-usr/recipes-usr/linux/usr-linux_1.0.bb @@ -48,7 +48,12 @@ python do_deploy() { bb.fatal("The root directory is not present in the second partition; please deploy rootfs...") - os.system("cp -r {}/build/deploy/* {}/{}/".format(IB_USR_PATH, IB_FILESYSTEM_PATH, IB_ROOTFS_PARTITION)) + # Copy as root: the rootfs cpio extraction (run via sudo) creates /root + # owned by root (0700), and bitbake runs unprivileged — a plain cp would + # be denied and silently drop the apps. check=True so a failure is no + # longer swallowed (the old os.system() ignored the return code, which is + # why the soo apps never reached the agency /root). + utils_sudo("cp -r {}/build/deploy/* {}/{}/".format(IB_USR_PATH, IB_FILESYSTEM_PATH, IB_ROOTFS_PARTITION), shell=True, check=True) __do_fs_umount(d) } From d09955d342310150b4db64f770391383e73e6bf8 Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Tue, 23 Jun 2026 21:58:00 +0200 Subject: [PATCH 18/52] meta-bsp: label the bare U-Boot boot chain instead of '?' Empty IB_BOOT_CHAIN is the valid bare-U-Boot mode (treated as 'uboot' in __do_platform_boot_chain), but the deploy log printed 'chain=?' because the empty string is falsy. Label it 'uboot (bare)' so the log no longer reads like a misconfiguration. --- build/meta-bsp/classes/bsp.bbclass | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/build/meta-bsp/classes/bsp.bbclass b/build/meta-bsp/classes/bsp.bbclass index 7e5178a..02271cb 100644 --- a/build/meta-bsp/classes/bsp.bbclass +++ b/build/meta-bsp/classes/bsp.bbclass @@ -64,7 +64,10 @@ python () { python do_deploy_boot_chain () { plat = d.getVar('IB_PLATFORM') or '?' - chain = d.getVar('IB_BOOT_CHAIN') or '?' + # Empty IB_BOOT_CHAIN is the valid "bare U-Boot" mode (treated as "uboot" + # in __do_platform_boot_chain) — label it so the log doesn't read like a + # misconfiguration. + chain = d.getVar('IB_BOOT_CHAIN') or 'uboot (bare)' bb.plain(f"Deploy boot chain for platform {plat} (chain={chain})") try: From d48b525237458da100ddec685e6db89dfed30fea Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Sat, 11 Jul 2026 15:29:58 +0200 Subject: [PATCH 19/52] meta-so3: pin so3+avz fetch to the SO3 v6.2.0 release tag Bump SRCREV from the 255 migration branch (60f6da75c) to the v6.2.0 release commit (c6001712), and document it via IB_SO3_TAG="v6.2.0". --- build/meta-so3/recipes-so3/avz/avz_6.2.0.bb | 8 +++++--- build/meta-so3/recipes-so3/so3/so3_6.2.0.bb | 8 +++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/build/meta-so3/recipes-so3/avz/avz_6.2.0.bb b/build/meta-so3/recipes-so3/avz/avz_6.2.0.bb index 976ea97..a930ff0 100644 --- a/build/meta-so3/recipes-so3/avz/avz_6.2.0.bb +++ b/build/meta-so3/recipes-so3/avz/avz_6.2.0.bb @@ -19,10 +19,12 @@ IB_TARGET = "${IB_AVZ_PATH}" # MICOFE is a separate repository and does not embed the SO3/AVZ sources, so # AVZ is FETCHED from the SO3 repo (unlike the SO3 tree itself, which builds -# in place). Track the latest SO3 (branch 255: build-system→infrabase + SOO -# capsule + new logo). Bump SRCREV to follow upstream SO3 / AVZ changes. +# in place). Pinned to the SO3 v6.2.0 release tag (build-system→infrabase + +# SOO capsule + new logo). The bitbake git fetcher takes the tag's commit as +# SRCREV; IB_SO3_TAG records the human-readable tag it corresponds to. +IB_SO3_TAG = "v6.2.0" SRC_URI = "git://github.com/smartobjectoriented/so3.git;nobranch=1;protocol=https" -SRCREV = "60f6da75c8969d2710c0e98572f2a43febb6a34b" +SRCREV = "c6001712742296973b1a601f58a7db91b3abbffe" # MICOFE-specific AVZ patches applied on top of the fetched SO3 tree. # Generate/refresh the set with `bitbake avz -c updiff` (do_diffcompose diff --git a/build/meta-so3/recipes-so3/so3/so3_6.2.0.bb b/build/meta-so3/recipes-so3/so3/so3_6.2.0.bb index 40c4b0b..7ca7640 100644 --- a/build/meta-so3/recipes-so3/so3/so3_6.2.0.bb +++ b/build/meta-so3/recipes-so3/so3/so3_6.2.0.bb @@ -21,10 +21,12 @@ IB_TARGET = "${IB_SO3_PATH}" # MICOFE is a separate repository and does not embed the SO3 sources, so the # kernel is FETCHED from the SO3 repo (unlike the SO3 tree itself, which builds -# in place). Track the latest SO3 (branch 255: build-system→infrabase + SOO -# capsule + new logo). Bump SRCREV to follow upstream SO3 changes. +# in place). Pinned to the SO3 v6.2.0 release tag (build-system→infrabase + +# SOO capsule + new logo). The bitbake git fetcher takes the tag's commit as +# SRCREV; IB_SO3_TAG records the human-readable tag it corresponds to. +IB_SO3_TAG = "v6.2.0" SRC_URI = "git://github.com/smartobjectoriented/so3.git;nobranch=1;protocol=https" -SRCREV = "60f6da75c8969d2710c0e98572f2a43febb6a34b" +SRCREV = "c6001712742296973b1a601f58a7db91b3abbffe" # MICOFE-specific SO3 patches applied on top of the fetched tree. # Generate/refresh the set with `bitbake so3 -c updiff` (do_diffcompose From 87c0314bb8bb4fc823bdd3a312705fe4c1b5ddce Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Sat, 11 Jul 2026 15:29:58 +0200 Subject: [PATCH 20/52] meta-linux: reconcile the SOO agency patchset to SO3 v6.2.0 Adopt the v6.2.0 versions of the 24 shared SOO patches on both the virt64 (0001-linux-6.12-r0) and rpi4 (-rpi4-r0) sets: the ME->S3C rename, the removal of the migration vestiges and the RT-agency subdomain, and the vuart add_console() sizeof fix (kzalloc of sizeof(struct vdev_console), not the shadowing pointer parameter). Preserve and S3C-rename the MICOFE-only vfbdev/vinput backend drivers (me_cons_send_input -> s3c_cons_send_input). --- .../0001-linux-6.12-r0/0018-Kconfig.patch | 2 +- .../0001-linux-6.12-r0/0020-vdevback.c.patch | 4 +- .../0001-linux-6.12-r0/0022-vdummy.c.patch | 2 +- .../0001-linux-6.12-r0/0026-vsensej.c.patch | 2 +- .../0001-linux-6.12-r0/0030-vsenseled.c.patch | 2 +- .../0001-linux-6.12-r0/0032-vuart.c.patch | 12 +- .../files/0001-linux-6.12-r0/0033-avz.h.patch | 14 +- .../0001-linux-6.12-r0/0036-capsule.h.patch | 12 +- .../0001-linux-6.12-r0/0041-vuart.h.patch | 2 +- .../files/0001-linux-6.12-r0/0054-soo.h.patch | 14 +- .../0001-linux-6.12-r0/0060-debug.h.patch | 3 +- .../0001-linux-6.12-r0/0061-injector.h.patch | 20 +-- .../files/0001-linux-6.12-r0/0062-soo.h.patch | 119 +++++++------ .../0001-linux-6.12-r0/0064-vbus.h.patch | 4 +- .../0001-linux-6.12-r0/0073-capsule.c.patch | 156 +++++++++--------- .../0001-linux-6.12-r0/0074-console.c.patch | 24 +-- .../0001-linux-6.12-r0/0077-core.c.patch | 38 ++--- .../0087-soo_guest_activity.c.patch | 4 +- .../0001-linux-6.12-r0/0090-vbstorage.c.patch | 8 +- .../0001-linux-6.12-r0/0091-vbstore.c.patch | 4 +- .../0093-vbus_backend.c.patch | 10 +- .../0001-linux-6.12-r0/0094-vbus.c.patch | 36 ++-- .../0096-vbus_vbstore.c.patch | 4 +- .../0001-linux-6.12-r0/0126-vlogs.c.patch | 2 +- .../0001-linux-6.12-r0/0128-vfbdev.c.patch | 2 +- .../0001-linux-6.12-r0/0130-vinput.c.patch | 12 +- .../0001-linux-6.12-r0/0131-vinput.h.patch | 2 +- .../0018-Kconfig.patch | 2 +- .../0020-vdevback.c.patch | 4 +- .../0022-vdummy.c.patch | 2 +- .../0026-vsensej.c.patch | 2 +- .../0030-vsenseled.c.patch | 2 +- .../0032-vuart.c.patch | 12 +- .../0001-linux-6.12-rpi4-r0/0033-avz.h.patch | 14 +- .../0036-capsule.h.patch | 12 +- .../0041-vuart.h.patch | 2 +- .../0001-linux-6.12-rpi4-r0/0054-soo.h.patch | 14 +- .../0060-debug.h.patch | 3 +- .../0061-injector.h.patch | 20 +-- .../0001-linux-6.12-rpi4-r0/0062-soo.h.patch | 119 +++++++------ .../0001-linux-6.12-rpi4-r0/0064-vbus.h.patch | 4 +- .../0073-capsule.c.patch | 156 +++++++++--------- .../0074-console.c.patch | 24 +-- .../0001-linux-6.12-rpi4-r0/0077-core.c.patch | 38 ++--- .../0087-soo_guest_activity.c.patch | 4 +- .../0090-vbstorage.c.patch | 8 +- .../0091-vbstore.c.patch | 4 +- .../0093-vbus_backend.c.patch | 10 +- .../0001-linux-6.12-rpi4-r0/0094-vbus.c.patch | 36 ++-- .../0096-vbus_vbstore.c.patch | 4 +- .../0126-vlogs.c.patch | 2 +- .../0128-vfbdev.c.patch | 2 +- .../0130-vinput.c.patch | 12 +- .../0131-vinput.h.patch | 2 +- 54 files changed, 508 insertions(+), 520 deletions(-) diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0018-Kconfig.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0018-Kconfig.patch index 3418d4a..febe962 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0018-Kconfig.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0018-Kconfig.patch @@ -9,7 +9,7 @@ +menu "Smart Object Oriented subsystem" + +config VDUMMY_BACKEND -+ bool "SOO (realtime and no-RT) vDummy support for debugging and testing" ++ bool "SOO vDummy support for debugging and testing" + +config VUART_BACKEND + bool "vuart UART Backend support for SOO Mobile Entity consoles" diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0020-vdevback.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0020-vdevback.c.patch index 99e3f75..92a557b 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0020-vdevback.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0020-vdevback.c.patch @@ -285,7 +285,7 @@ +} + +/* -+ * Search for a console related to a specific ME according to its domid. ++ * Search for a console related to a specific S3C according to its domid. + */ +struct vbus_device *vdevback_get_entry(uint32_t domid, struct list_head *_list) { + vdev_entry_t *entry; @@ -297,7 +297,7 @@ +} + +/* -+ * Remove a console attached to a specific ME ++ * Remove a console attached to a specific S3C + */ +void vdevback_del_entry(struct vbus_device *vdev, struct list_head *_list) { + vdev_entry_t *entry; diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0022-vdummy.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0022-vdummy.c.patch index b9778da..ac6f289 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0022-vdummy.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0022-vdummy.c.patch @@ -135,7 +135,7 @@ + DBG(VDUMMY_PREFIX "Backend reconfigured: %d\n", vdev->otherend_id); + + /* -+ * Set up a ring (shared page & event channel) between the agency and the ME. ++ * Set up a ring (shared page & event channel) between the agency and the S3C. + */ + + vbus_gather(VBT_NIL, vdev->otherend, "ring-ref", "%lu", &vdummy_priv->ring_ref, "ring-evtchn", "%u", &evtchn, NULL); diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0026-vsensej.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0026-vsensej.c.patch index 08ba07f..8956618 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0026-vsensej.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0026-vsensej.c.patch @@ -170,7 +170,7 @@ + DBG(VSENSEJ_PREFIX "Backend reconfigured: %d\n", vdev->otherend_id); + + /* -+ * Set up a ring (shared page & event channel) between the agency and the ME. ++ * Set up a ring (shared page & event channel) between the agency and the S3C. + */ + + vbus_gather(VBT_NIL, vdev->otherend, "ring-ref", "%lu", &ring_ref, "ring-evtchn", "%u", &evtchn, NULL); diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0030-vsenseled.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0030-vsenseled.c.patch index 21e6640..2eccab3 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0030-vsenseled.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0030-vsenseled.c.patch @@ -141,7 +141,7 @@ + DBG(VSENSELED_PREFIX "Backend reconfigured: %d\n", vdev->otherend_id); + + /* -+ * Set up a ring (shared page & event channel) between the agency and the ME. ++ * Set up a ring (shared page & event channel) between the agency and the S3C. + */ + + vbus_gather(VBT_NIL, vdev->otherend, "ring-ref", "%lu", &ring_ref, "ring-evtchn", "%u", &evtchn, NULL); diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0032-vuart.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0032-vuart.c.patch index dc00f61..df3e290 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0032-vuart.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0032-vuart.c.patch @@ -83,13 +83,13 @@ +} + +/* -+ * Add a new console for a new ME. ++ * Add a new console for a new S3C. + */ +static void add_console(struct vbus_device *vdev_console) +{ + struct vdev_console *console; + -+ console = kzalloc(sizeof(vdev_console), GFP_ATOMIC); ++ console = kzalloc(sizeof(struct vdev_console), GFP_ATOMIC); + BUG_ON(!console); + + console->vdev_console = vdev_console; @@ -98,7 +98,7 @@ +} + +/* -+ * Search for a console related to a specific ME according to its domid. ++ * Search for a console related to a specific S3C according to its domid. + */ +static struct vbus_device *get_console(uint32_t domid) +{ @@ -111,7 +111,7 @@ +} + +/* -+ * Remove a console attached to a specific ME ++ * Remove a console attached to a specific S3C + */ +static void del_console(struct vbus_device *vdev_console) +{ @@ -183,7 +183,7 @@ + * - If the state is not Connected, the character is pushed into a circular buffer that + * will be flushed at the next call to the Connected callback. + */ -+void me_cons_sendc(domid_t domid, uint8_t ch) ++void s3c_cons_sendc(domid_t domid, uint8_t ch) +{ + struct vbus_device *console; + vuart_priv_t *vuart_priv; @@ -278,7 +278,7 @@ + DBG(VUART_PREFIX "Backend reconfigured: %d\n", vdev->otherend_id); + + /* -+ * Set up a ring (shared page & event channel) between the agency and the ME. ++ * Set up a ring (shared page & event channel) between the agency and the S3C. + */ + + vbus_gather(VBT_NIL, vdev->otherend, "ring-ref", "%lu", diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0033-avz.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0033-avz.h.patch index f1f5d39..71f9bc2 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0033-avz.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0033-avz.h.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/avz/uapi/avz.h 1970-01-01 01:00:00.000000000 +0100 +++ ./soo/include/avz/uapi/avz.h 2025-08-29 08:46:41.396291602 +0200 -@@ -0,0 +1,304 @@ +@@ -0,0 +1,300 @@ +/* + * Copyright (C) 2016-2022 Daniel Rossier + * @@ -37,7 +37,6 @@ +#define NR_VIRQS 256 + +#define VIRQ_TIMER 0 /* System timer tick virtualized interrupt */ -+#define VIRQ_TIMER_RT 1 /* Timer tick issued from the oneshot timer (for RT agency and MEs */ + +/**************************************************/ + @@ -53,17 +52,14 @@ +/* DOMID_SELF is used in certain contexts to refer to oneself. */ +#define DOMID_SELF (0x7FF0U) + -+#define MAX_ME_DOMAINS 5 ++#define MAX_S3C_DOMAINS 5 + -+/* We include the (non-RT & RT) agency domain */ -+#define MAX_DOMAINS (2 + MAX_ME_DOMAINS) ++/* domains[]: 0 = agency, 1 = reserved, 2.. = up to MAX_S3C_DOMAINS capsules */ ++#define MAX_DOMAINS (2 + MAX_S3C_DOMAINS) + +/* Agency */ +#define DOMID_AGENCY 0 + -+/* Realtime agency subdomain */ -+#define DOMID_AGENCY_RT 1 -+ +#define DOMID_INVALID (0x7FF4U) + +#define AVZ_HYPERCALL_TRAP 0x2605 @@ -288,7 +284,7 @@ + */ + u64 current_s_time; + -+ /* Used to store a signature for consistency checking, for example after a migration/restoration */ ++ /* Used to store a signature for consistency checking, for example after a snapshot restoration */ + char signature[4]; +}; + diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0036-capsule.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0036-capsule.h.patch index d98bce2..cbc88cb 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0036-capsule.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0036-capsule.h.patch @@ -28,14 +28,14 @@ +void read_snapshot(uint32_t slotID, void *buffer, uint32_t *size); +int write_snapshot(void *buffer); + -+int get_ME_state(unsigned int ME_slotID); -+void set_ME_state(unsigned int ME_slotID, ME_state_t state); ++int get_S3C_state(unsigned int S3C_slotID); ++void set_S3C_state(unsigned int S3C_slotID, S3C_state_t state); + -+void get_ME_desc(unsigned int slotID, ME_desc_t *ME_desc); ++void get_S3C_desc(unsigned int slotID, S3C_desc_t *S3C_desc); + -+bool get_ME_id(uint32_t slotID, ME_id_t *ME_id); -+char *xml_prepare_id_array(ME_id_t *ME_id_array); -+void get_ME_id_array(ME_id_t *ME_id_array); ++bool get_S3C_id(uint32_t slotID, S3C_id_t *S3C_id); ++char *xml_prepare_id_array(S3C_id_t *S3C_id_array); ++void get_S3C_id_array(S3C_id_t *S3C_id_array); + +void capsule_init(void); +void capsule_exit(void); diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0041-vuart.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0041-vuart.h.patch index b39dd81..0c8bc12 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0041-vuart.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0041-vuart.h.patch @@ -58,6 +58,6 @@ +} vuart_t; + +bool vuart_ready(void); -+void me_cons_sendc(domid_t domid, uint8_t ch); ++void s3c_cons_sendc(domid_t domid, uint8_t ch); + +#endif /* VUART_H */ diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0054-soo.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0054-soo.h.patch index cc0e96c..904ef2d 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0054-soo.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0054-soo.h.patch @@ -25,17 +25,17 @@ + +#include + -+int get_ME_state(unsigned int ME_slotID); -+void set_ME_state(unsigned int ME_slotID, ME_state_t state); ++int get_S3C_state(unsigned int S3C_slotID); ++void set_S3C_state(unsigned int S3C_slotID, S3C_state_t state); + -+int32_t get_ME_free_slot(uint32_t size); ++int32_t get_S3C_free_slot(uint32_t size); + -+bool get_ME_id(uint32_t slotID, ME_id_t *ME_id); ++bool get_S3C_id(uint32_t slotID, S3C_id_t *S3C_id); + -+void get_ME_id_array(ME_id_t *ME_id_array); -+char *xml_prepare_id_array(ME_id_t *ME_id_array); ++void get_S3C_id_array(S3C_id_t *S3C_id_array); ++char *xml_prepare_id_array(S3C_id_t *S3C_id_array); + -+void get_ME_desc(unsigned int slotID, ME_desc_t *ME_desc); ++void get_S3C_desc(unsigned int slotID, S3C_desc_t *S3C_desc); + + +#endif /* SOO_H */ diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0060-debug.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0060-debug.h.patch index c93fc0e..70e95bb 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0060-debug.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0060-debug.h.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/uapi/debug.h 1970-01-01 01:00:00.000000000 +0100 +++ ./soo/include/soo/uapi/debug.h 2025-08-29 08:46:41.395937531 +0200 -@@ -0,0 +1,76 @@ +@@ -0,0 +1,75 @@ +/* + * Copyright (C) 2015-2019 Daniel Rossier + * @@ -67,7 +67,6 @@ +#else + +#define DBG(fmt, ...) -+#define RTDBG(fmt, ...) +#define DBG0(...) +#define DBG_BUFFER(buffer, ...) +#define DBG_ON__ diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0061-injector.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0061-injector.h.patch index b076898..2d153da 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0061-injector.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0061-injector.h.patch @@ -42,8 +42,8 @@ + +#define INJECTOR_N_RECV_BUFFERS 10 + -+/* Max ME size in bytes */ -+#define DATACOMM_ME_MAX_SIZE (32 * 1024 * 1024) ++/* Max S3C size in bytes */ ++#define DATACOMM_S3C_MAX_SIZE (32 * 1024 * 1024) + +#endif /* __KERNEL__ */ + @@ -60,7 +60,7 @@ + +/* + * - INJECTOR_BUFFER_FREE means the buffer is ready for send/receive operations. -+ * - INJECTOR_BUFFER_BUSY means the buffer is reserved for a ME. ++ * - INJECTOR_BUFFER_BUSY means the buffer is reserved for a S3C. + * - INJECTOR_BUFFER_SENDING means the buffer is currently along the path for being sent out. + * The buffer can still be altered depending on the steps of sending (See SOOlink/Coder). + */ @@ -77,9 +77,9 @@ + injector_buffer_status_t status; + + /* -+ * Reference to the ME. ++ * Reference to the S3C. + */ -+ void *ME_data; ++ void *S3C_data; + size_t size; + + uint32_t prio; @@ -87,18 +87,18 @@ +} injector_buffer_desc_t; + +void injector_prepare(uint32_t size); -+void injector_clean_ME(void); -+uint32_t injector_retrieve_ME(void); ++void injector_clean_S3C(void); ++uint32_t injector_retrieve_S3C(void); + -+void *injector_get_ME_buffer(void); -+size_t injector_get_ME_size(void); ++void *injector_get_S3C_buffer(void); ++size_t injector_get_S3C_size(void); + +void *injector_get_tmp_buf(void); +size_t injector_get_tmp_size(void); +bool injector_is_full(void); +void injector_set_full(bool _full); + -+void injector_receive_ME(void *ME, size_t size); ++void injector_receive_S3C(void *S3C, size_t size); + +int inject_capsule(void *buffer, size_t size, int slotID, unsigned capsuleID); +void start_capsule(int slotID); diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0062-soo.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0062-soo.h.patch index abc42f5..dbbdc56 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0062-soo.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0062-soo.h.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/uapi/soo.h 1970-01-01 01:00:00.000000000 +0100 +++ ./soo/include/soo/uapi/soo.h 2025-08-29 08:46:41.395924678 +0200 -@@ -0,0 +1,462 @@ +@@ -0,0 +1,461 @@ +/* + * Copyright (C) 2014-2025 Daniel Rossier + * @@ -26,15 +26,14 @@ + +#include + -+/* This signature is used to check the coherency of the ME image, after a migration ++/* This signature is used to check the coherency of the S3C image, after a snapshot + * or a restoration for example. + */ -+#define SOO_ME_SIGNATURE "SooZ" ++#define SOO_S3C_SIGNATURE "SooZ" + +#endif /* __ASSEMBLY__ */ + +#define AGENCY_CPU 0 -+#define AGENCY_RT_CPU 1 + +#ifndef __ASSEMBLY__ + @@ -78,51 +77,51 @@ +#define AVZ_SCHEDULER_FLIP 0 + +/* -+ * ME states: -+ * - ME_state_stopped: Capsule is stopped (right after start or later) -+ * - ME_state_living: ME is full-functional and activated (all frontend devices are consistent) -+ * - ME_state_suspended: ME is suspended before migrating. This state is maintained for the resident ME instance -+ * - ME_state_hibernate: ME is in a state of hibernate snapshot -+ * - ME_state_resuming: ME ready to perform resuming (after recovering) -+ * - ME_state_awakened: ME is just being awakened -+ * - ME_state_terminated: ME has been terminated (by a shutdown) -+ * - ME_state_dead: ME does not exist ++ * S3C states: ++ * - S3C_state_stopped: Capsule is stopped (right after start or later) ++ * - S3C_state_living: S3C is full-functional and activated (all frontend devices are consistent) ++ * - S3C_state_suspended: S3C is suspended (e.g. before taking a snapshot) ++ * - S3C_state_hibernate: S3C is in a state of hibernate snapshot ++ * - S3C_state_resuming: S3C ready to perform resuming (after recovering) ++ * - S3C_state_awakened: S3C is just being awakened ++ * - S3C_state_terminated: S3C has been terminated (by a shutdown) ++ * - S3C_state_dead: S3C does not exist + */ +typedef enum { -+ ME_state_stopped, -+ ME_state_living, -+ ME_state_suspended, -+ ME_state_hibernate, -+ ME_state_resuming, -+ ME_state_awakened, -+ ME_state_killed, -+ ME_state_terminated, -+ ME_state_dead -+} ME_state_t; ++ S3C_state_stopped, ++ S3C_state_living, ++ S3C_state_suspended, ++ S3C_state_hibernate, ++ S3C_state_resuming, ++ S3C_state_awakened, ++ S3C_state_killed, ++ S3C_state_terminated, ++ S3C_state_dead ++} S3C_state_t; + +/* Keep information about slot availability -+ * FREE: the slot is available (no ME) -+ * BUSY: the slot is allocated a ME ++ * FREE: the slot is available (no S3C) ++ * BUSY: the slot is allocated a S3C + */ -+typedef enum { ME_SLOT_FREE, ME_SLOT_BUSY } ME_slotState_t; ++typedef enum { S3C_SLOT_FREE, S3C_SLOT_BUSY } S3C_slotState_t; + -+/* ME ID related information */ -+#define ME_NAME_SIZE 40 -+#define ME_SHORTDESC_SIZE 1024 ++/* S3C ID related information */ ++#define S3C_NAME_SIZE 40 ++#define S3C_SHORTDESC_SIZE 1024 + +/* -+ * Definition of ME ID information used by functions which need ++ * Definition of S3C ID information used by functions which need + * to get a list of running MEs with their information. + */ +typedef struct { + uint32_t slotID; -+ ME_state_t state; ++ S3C_state_t state; + + uint64_t spid; + -+ char name[ME_NAME_SIZE]; -+ char shortdesc[ME_SHORTDESC_SIZE]; -+} ME_id_t; ++ char name[S3C_NAME_SIZE]; ++ char shortdesc[S3C_SHORTDESC_SIZE]; ++} S3C_id_t; + +struct work_struct; +struct semaphore; @@ -152,7 +151,7 @@ +extern atomic_t dc_incoming_domID[DC_EVENT_MAX]; + +/* -+ * IOCTL commands for migration. ++ * IOCTL commands for S3C management. + * This part is shared between the kernel and user spaces. + */ + @@ -165,24 +164,24 @@ +#define AGENCY_IOCTL_SHUTDOWN _IOW('S', 3, agency_ioctl_args_t) +#define AGENCY_IOCTL_INJECT_CAPSULE _IOWR('S', 4, agency_ioctl_args_t) +#define AGENCY_IOCTL_START_CAPSULE _IOWR('S', 5, agency_ioctl_args_t) -+#define AGENCY_IOCTL_GET_ME_ID _IOWR('S', 6, agency_ioctl_args_t) -+#define AGENCY_IOCTL_GET_ME_ID_ARRAY _IOR('S', 7, agency_ioctl_args_t) ++#define AGENCY_IOCTL_GET_S3C_ID _IOWR('S', 6, agency_ioctl_args_t) ++#define AGENCY_IOCTL_GET_S3C_ID_ARRAY _IOR('S', 7, agency_ioctl_args_t) + +#define SOO_NAME_SIZE 16 + +/* -+ * ME descriptor ++ * S3C descriptor + * + * WARNING !! Be careful when modifying this structure. It *MUST* be aligned with -+ * the same structure used in the ME. ++ * the same structure used in the S3C. + */ +typedef struct { + unsigned int slotID; + uint64_t spid; + -+ ME_state_t state; ++ S3C_state_t state; + -+ unsigned int size; /* Size of the ME with the struct dom_context size */ ++ unsigned int size; /* Size of the S3C with the struct dom_context size */ + unsigned int dc_evtchn; + + unsigned int vbstore_revtchn, vbstore_levtchn; @@ -190,7 +189,7 @@ + + void (*resume_fn)(void); + -+} ME_desc_t; ++} S3C_desc_t; + +/* + * Agency descriptor @@ -203,7 +202,7 @@ + + uint64_t agencyUID; /* Agency UID */ + -+ /* Event channels used for directcomm channel between agency and agency-RT or ME */ ++ /* Event channels used for directcomm channel between agency and S3C */ + unsigned int dc_evtchn[MAX_DOMAINS]; + + /* Event channels used by vbstore */ @@ -215,13 +214,13 @@ +} agency_desc_t; + +/* -+ * SOO agency & ME descriptor - This structure is used in the shared info page of the agency or ME domain. ++ * SOO agency & S3C descriptor - This structure is used in the shared info page of the agency or S3C domain. + */ + +typedef struct { + union { + agency_desc_t agency; -+ ME_desc_t ME; ++ S3C_desc_t S3C; + } u; +} dom_desc_t; + @@ -255,10 +254,10 @@ + */ + u64 current_s_time; + -+ /* Agency or ME descriptor */ ++ /* Agency or S3C descriptor */ + dom_desc_t dom_desc; + -+ /* Used to store a signature for consistency checking, for example after a migration/restoration */ ++ /* Used to store a signature for consistency checking, for example after a snapshot restoration */ + char signature[4]; +}; + @@ -293,14 +292,14 @@ + +/* AVZ hypercalls devoted to SOO */ + -+#define AVZ_ME_READ_SNAPSHOT 4 -+#define AVZ_ME_WRITE_SNAPSHOT 5 ++#define AVZ_S3C_READ_SNAPSHOT 4 ++#define AVZ_S3C_WRITE_SNAPSHOT 5 +#define AVZ_START_CAPSULE 6 +#define AVZ_INJECT_CAPSULE 7 -+#define AVZ_KILL_ME 8 ++#define AVZ_KILL_S3C 8 +#define AVZ_DC_EVENT_SET 9 -+#define AVZ_GET_ME_STATE 10 -+#define AVZ_SET_ME_STATE 11 ++#define AVZ_GET_S3C_STATE 10 ++#define AVZ_SET_S3C_STATE 11 +#define AVZ_GET_DOM_DESC 12 +#define AVZ_GRANT_TABLE_OP 13 + @@ -323,8 +322,8 @@ + int state; +} avz_dc_event_t; + -+/* AVZ_GET_ME_STATE */ -+/* AVZ_SET_ME_STATE */ ++/* AVZ_GET_S3C_STATE */ ++/* AVZ_SET_S3C_STATE */ +typedef struct { + uint32_t slotID; + int state; @@ -336,7 +335,7 @@ + dom_desc_t dom_desc; +} avz_dom_desc_t; + -+/* AVZ_GET_ME_FREE_SLOT */ ++/* AVZ_GET_S3C_FREE_SLOT */ +typedef struct { + int slotID; + int size; @@ -355,7 +354,7 @@ + int size; +} avz_snapshot_t; + -+/* AVZ_KILL_ME */ ++/* AVZ_KILL_S3C */ +typedef struct { + uint32_t slotID; +} avz_kill_me_t; @@ -406,7 +405,7 @@ +/* + * SOO callback functions. + * The following definitions are used as argument in domcalls or in the -+ * agency_ctl() function as a callback to be propagated to a specific ME. ++ * agency_ctl() function as a callback to be propagated to a specific S3C. + * + */ + @@ -417,7 +416,7 @@ + +typedef struct soo_domcall_arg { + /* Stores the agency ctl function. -+ * Possibly, the agency_ctl function can be associated to a callback operation asked by a ME ++ * Possibly, the agency_ctl function can be associated to a callback operation asked by a S3C + */ + unsigned int cmd; + unsigned int slotID; /* Origin of the domcall */ @@ -427,7 +426,7 @@ + pre_resume_args_t pre_resume_args; + + post_activate_args_t post_activate_args; -+ ME_state_t set_me_state_args; ++ S3C_state_t set_me_state_args; + } u; + +} soo_domcall_arg_t; @@ -456,7 +455,7 @@ + +void perform_task(dc_event_t dc_event); + -+void shutdown_ME(unsigned int ME_slotID); ++void shutdown_S3C(unsigned int S3C_slotID); + +void cache_flush_all(void); + diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0064-vbus.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0064-vbus.h.patch index 8669905..7eb1d67 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0064-vbus.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0064-vbus.h.patch @@ -111,7 +111,7 @@ + */ + enum vbus_state fe_state; + -+ /* So far, only the ME use this completion struct. On the agency side, ++ /* So far, only the S3C use this completion struct. On the agency side, + * the device can not be shutdown on live. + */ + struct completion down; @@ -319,7 +319,7 @@ +void vbstore_trigger_dev_probe(void); +int vbstore_uart_remove(unsigned int domID); + -+void postmig_setup(void); ++void postresume_setup(void); +int gnttab_remove(bool with_vbus); + +void remove_devices(void); diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0073-capsule.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0073-capsule.c.patch index bee3db2..11dcccd 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0073-capsule.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0073-capsule.c.patch @@ -47,12 +47,12 @@ +#include +#include + -+/* Buffer in which the ME will be received. It is dynamically allocated ++/* Buffer in which the S3C will be received. It is dynamically allocated +in injector_prepare */ -+uint8_t *ME_buffer; ++uint8_t *S3C_buffer; + +/* Full size of the me we are receiving */ -+size_t ME_size; ++size_t S3C_size; + +/* Current size received */ +size_t current_size = 0; @@ -90,13 +90,13 @@ + + DBG("Original contents at address: 0x%08x\n with size %d bytes\n", (unsigned long) buffer, size); + -+ /* Allocate a contiguous memory region to host the ME */ ++ /* Allocate a contiguous memory region to host the S3C */ + me = dma_alloc_coherent(capsule_dev, size, &dma_handle, GFP_KERNEL); + BUG_ON(!me); + + memcpy(me, buffer, size); + -+ /* Since the ME buffer is in the CMA zone and allocated via the ++ /* Since the S3C buffer is in the CMA zone and allocated via the + * dma_alloc_cohenrent() function, we cannot use virt_to_phys(). So, we + * take the CPU phys addr stored in dma_handle, and we force to a + * (wrong) virtual address to make sure the soo_hypercall() function @@ -125,7 +125,7 @@ +void start_capsule(int slotID) { + avz_hyp_t args; + -+ BUG_ON(get_ME_state(slotID) != ME_state_stopped); ++ BUG_ON(get_S3C_state(slotID) != S3C_state_stopped); + + args.cmd = AVZ_START_CAPSULE; + @@ -138,29 +138,29 @@ + + DBG("Capsule in slot %d in state living...\n", slotID); + -+ set_ME_state(slotID, ME_state_living); ++ set_S3C_state(slotID, S3C_state_living); +} + +/** -+ * Read a ME snapshot for migration or saving. -+ * The ME is read and stored in a vmalloc'd memory area. ++ * Read a S3C snapshot for saving. ++ * The S3C is read and stored in a vmalloc'd memory area. + * + * @param slotID -+ * @param buffer pointer to the ME buffer ++ * @param buffer pointer to the S3C buffer + */ +void read_snapshot(uint32_t slotID, void *buffer, uint32_t *size) { + avz_hyp_t args; + void *me = NULL; + int ret; + dma_addr_t dma_handle; -+ ME_state_t ME_state; ++ S3C_state_t S3C_state; + + /* Ask the size only */ + if (*size == 0) { + + DBG("%s: ask the snapshot size...\n", __func__); + -+ args.cmd = AVZ_ME_READ_SNAPSHOT; ++ args.cmd = AVZ_S3C_READ_SNAPSHOT; + args.u.avz_snapshot_args.slotID = slotID; + args.u.avz_snapshot_args.size = 0; + @@ -170,29 +170,29 @@ + return; + } + -+ if (get_ME_state(slotID) == ME_state_living) { ++ if (get_S3C_state(slotID) == S3C_state_living) { + -+ /* Suspend the ME */ ++ /* Suspend the S3C */ + do_sync_dom(slotID, DC_PRE_SUSPEND); + -+ /* Set the ME in suspended state */ -+ set_ME_state(slotID, ME_state_suspended); ++ /* Set the S3C in suspended state */ ++ set_S3C_state(slotID, S3C_state_suspended); + + vbus_suspend_devices(slotID); + + do_sync_dom(slotID, DC_SUSPEND); + -+ printk("### state: %d\n", get_ME_state(slotID)); ++ printk("### state: %d\n", get_S3C_state(slotID)); + } + + /* -+ * Prepare a buffer to store the ME and additional header information like migration structure. ++ * Prepare a buffer to store the S3C and additional header information like the snapshot structure. + */ + + me = dma_alloc_coherent(capsule_dev, *size, &dma_handle, GFP_KERNEL); + BUG_ON(!me); + -+ args.cmd = AVZ_ME_READ_SNAPSHOT; ++ args.cmd = AVZ_S3C_READ_SNAPSHOT; + + args.u.avz_snapshot_args.slotID = slotID; + args.u.avz_snapshot_args.snapshot_paddr = (void *) dma_handle; @@ -206,29 +206,29 @@ + + dma_free_coherent(capsule_dev, *size, me, dma_handle); + -+ ME_state = get_ME_state(slotID); ++ S3C_state = get_S3C_state(slotID); + -+ if (ME_state == ME_state_resuming) { ++ if (S3C_state == S3C_state_resuming) { + -+ DBG("Pinging ME %d for DC_RESUME...\n", slotID); ++ DBG("Pinging S3C %d for DC_RESUME...\n", slotID); + do_sync_dom(slotID, DC_RESUME); + + DBG("Resuming all devices (resuming from backend devices) on domain %d...\n", slotID); + vbus_resume_devices(slotID); + -+ DBG("Pinging ME %d for DC_POST_ACTIVATE...\n", slotID); ++ DBG("Pinging S3C %d for DC_POST_ACTIVATE...\n", slotID); + do_sync_dom(slotID, DC_POST_ACTIVATE); + -+ DBG("Putting ME domid %d in state living...\n", slotID); -+ set_ME_state(slotID, ME_state_living); ++ DBG("Putting S3C domid %d in state living...\n", slotID); ++ set_S3C_state(slotID, S3C_state_living); + } +} + +/** -+ * Write a ME snapshot provided a ME_info_transfer_t descriptor. ++ * Write a S3C snapshot provided a S3C_info_transfer_t descriptor. + * + * @param slotID -+ * @param buffer Adresse of a buffer of ME_info_transfert_t ++ * @param buffer Adresse of a buffer of S3C_info_transfert_t + * @return slotID in case of success, -1 if no available slot + */ +int write_snapshot(void *buffer) { @@ -238,14 +238,14 @@ + dma_addr_t dma_handle; + uint32_t snapshot_size; + uint32_t slotID; -+ ME_state_t ME_state; ++ S3C_state_t S3C_state; + + snapshot_size = *((uint32_t *) buffer); + + DBG("Retrieving a size of %d bytes.\n", snapshot_size); + + /* -+ * Prepare a buffer to store the ME and additional header information like migration structure. ++ * Prepare a buffer to store the S3C and additional header information like the snapshot structure. + */ + me = dma_alloc_coherent(capsule_dev, snapshot_size, &dma_handle, GFP_KERNEL); + BUG_ON(!me); @@ -254,7 +254,7 @@ + ret = copy_from_user(me, buffer, snapshot_size); + BUG_ON(ret); + -+ args.cmd = AVZ_ME_WRITE_SNAPSHOT; ++ args.cmd = AVZ_S3C_WRITE_SNAPSHOT; + + args.u.avz_snapshot_args.size = snapshot_size; + args.u.avz_snapshot_args.slotID = -1; @@ -273,52 +273,52 @@ + + dma_free_coherent(capsule_dev, snapshot_size, me, dma_handle); + -+ ME_state = get_ME_state(slotID); ++ S3C_state = get_S3C_state(slotID); + -+ if (ME_state == ME_state_stopped) { ++ if (S3C_state == S3C_state_stopped) { + /* Normal processing, start of the capsule */ + + start_capsule(slotID); + return slotID; + } + -+ BUG_ON((ME_state != ME_state_hibernate) && (ME_state != ME_state_awakened)); ++ BUG_ON((S3C_state != S3C_state_hibernate) && (S3C_state != S3C_state_awakened)); + -+ DBG0("SOO migration subsys: Entering restoring tasks...\n"); ++ DBG0("SOO capsule subsys: Entering restoring tasks...\n"); + + /* The capsule is performing an asynchronous signal-based resume callback and will -+ * be set to ME_state_awakened after its execution ++ * be set to S3C_state_awakened after its execution + */ + while (1) { + schedule(); + -+ if (get_ME_state(slotID) == ME_state_awakened) { -+ DBG("ME now resuming...\n"); ++ if (get_S3C_state(slotID) == S3C_state_awakened) { ++ DBG("S3C now resuming...\n"); + break; + } + } + -+ DBG("Pinging ME %d for DC_RESUME...\n", slotID); ++ DBG("Pinging S3C %d for DC_RESUME...\n", slotID); + do_sync_dom(slotID, DC_RESUME); + + DBG("Resuming all devices (resuming from backend devices) on domain %d...\n", slotID); + vbus_resume_devices(slotID); + -+ DBG("Pinging ME %d for DC_POST_ACTIVATE...\n", slotID); ++ DBG("Pinging S3C %d for DC_POST_ACTIVATE...\n", slotID); + do_sync_dom(slotID, DC_POST_ACTIVATE); + -+ DBG("Putting ME domid %d in state living...\n", slotID); -+ set_ME_state(slotID, ME_state_living); ++ DBG("Putting S3C domid %d in state living...\n", slotID); ++ set_S3C_state(slotID, S3C_state_living); + + return slotID; +} + -+int get_ME_state(unsigned int ME_slotID) ++int get_S3C_state(unsigned int S3C_slotID) +{ + avz_hyp_t args; + -+ args.cmd = AVZ_GET_ME_STATE; -+ args.u.avz_me_state_args.slotID = ME_slotID; ++ args.cmd = AVZ_GET_S3C_STATE; ++ args.u.avz_me_state_args.slotID = S3C_slotID; + + avz_hypercall(&args); + @@ -326,26 +326,26 @@ +} + +/* -+ * Setting the ME state to the specific ME_slotID. ++ * Setting the S3C state to the specific S3C_slotID. + * The hypercall args is passed by 2 contiguous (unsigned) int, the first one is + * used for slotID, the second for the state + */ -+void set_ME_state(unsigned int ME_slotID, ME_state_t state) ++void set_S3C_state(unsigned int S3C_slotID, S3C_state_t state) +{ + avz_hyp_t args; + -+ args.cmd = AVZ_SET_ME_STATE; ++ args.cmd = AVZ_SET_S3C_STATE; + -+ args.u.avz_me_state_args.slotID = ME_slotID; ++ args.u.avz_me_state_args.slotID = S3C_slotID; + args.u.avz_me_state_args.state = state; + + avz_hypercall(&args); +} + +/** -+ * Retrieve the ME descriptor including the SPID, the state. ++ * Retrieve the S3C descriptor including the SPID, the state. + */ -+void get_ME_desc(unsigned int slotID, ME_desc_t *ME_desc) { ++void get_S3C_desc(unsigned int slotID, S3C_desc_t *S3C_desc) { + avz_hyp_t args; + + args.cmd = AVZ_GET_DOM_DESC; @@ -353,49 +353,49 @@ + + avz_hypercall(&args); + -+ memcpy(ME_desc, &args.u.avz_dom_desc_args.dom_desc, sizeof(ME_desc_t)); ++ memcpy(S3C_desc, &args.u.avz_dom_desc_args.dom_desc, sizeof(S3C_desc_t)); +} + +/** -+ * Retrieve the ME identity information including SPID, state. ++ * Retrieve the S3C identity information including SPID, state. + * + * @param slotID -+ * @param ME_id -+ * @return true if a ME has been found in slotID, false otherwise. ++ * @param S3C_id ++ * @return true if a S3C has been found in slotID, false otherwise. + */ -+bool get_ME_id(uint32_t slotID, ME_id_t *ME_id) { ++bool get_S3C_id(uint32_t slotID, S3C_id_t *S3C_id) { + char *prop; + char rootname[VBS_KEY_LENGTH]; + unsigned int len; + -+ /* The ME can be dormant but without any accessible ID information */ -+ ME_id->state = get_ME_state(slotID); ++ /* The S3C can be dormant but without any accessible ID information */ ++ S3C_id->state = get_S3C_state(slotID); + -+ if (ME_id->state == ME_state_dead) ++ if (S3C_id->state == S3C_state_dead) + return false; + -+ sprintf(rootname, "soo/me/%d", slotID); ++ sprintf(rootname, "soo/s3c/%d", slotID); + -+ /* Check if there is a ME? */ ++ /* Check if there is a S3C? */ + prop = vbus_read(VBT_NIL, rootname, "spid", &len); + + if (len == 1) { /* If no entry in vbstore, it returns 1 (byte \0) */ + return true; + } else { -+ sscanf(prop, "%llx", &ME_id->spid); ++ sscanf(prop, "%llx", &S3C_id->spid); + kfree(prop); + + prop = vbus_read(VBT_NIL, rootname, "name", &len); + -+ strcpy(ME_id->name, prop); ++ strcpy(S3C_id->name, prop); + kfree(prop); + + prop = vbus_read(VBT_NIL, rootname, "shortdesc", &len); + -+ strcpy(ME_id->shortdesc, prop); ++ strcpy(S3C_id->shortdesc, prop); + kfree(prop); + -+ ME_id->slotID = slotID; ++ S3C_id->slotID = slotID; + } + + return true; @@ -403,23 +403,23 @@ + +/** + * Get a list of all residing MEs in this smart object. -+ * The caller must have allocated an array of elements. ++ * The caller must have allocated an array of elements. + * -+ * The ME state will be used to determine if a ME is residing or not (ME_state_dead). ++ * The S3C state will be used to determine if a S3C is residing or not (S3C_state_dead). + */ -+void get_ME_id_array(ME_id_t *ME_id_array) { ++void get_S3C_id_array(S3C_id_t *S3C_id_array) { + uint32_t slotID; + + /* Empty the array first */ -+ memset(ME_id_array, 0, MAX_DOMAINS * sizeof(ME_id_array)); ++ memset(S3C_id_array, 0, MAX_DOMAINS * sizeof(S3C_id_array)); + + /* Walk through all entries in vbstore regarding MEs */ + + for (slotID = 2; slotID < MAX_DOMAINS; slotID++) -+ get_ME_id(slotID, &ME_id_array[slotID-2]); ++ get_S3C_id(slotID, &S3C_id_array[slotID-2]); + +} -+EXPORT_SYMBOL(get_ME_id_array); ++EXPORT_SYMBOL(get_S3C_id_array); + +/** + * Prepare a XML message which contains the list of MEs with their specific ID information @@ -427,9 +427,9 @@ + * + * + * @return buffer Buffer allocated by the which contains the XML message. Caller must free it. -+ * @param ME_id_array Array of ME_id_t entries (got with get_ME_id_array()) ++ * @param S3C_id_array Array of S3C_id_t entries (got with get_S3C_id_array()) + */ -+char *xml_prepare_id_array(ME_id_t *ME_id_array) { ++char *xml_prepare_id_array(S3C_id_t *S3C_id_array) { + uint32_t pos; + char *__buffer; + char *buffer; /* Output buffer */ @@ -440,28 +440,28 @@ + /* Adding the messages node */ + messages = roxml_add_node(NULL, 0, ROXML_ELM_NODE, "mobile-entities", NULL); + -+ for (pos = 0; pos < MAX_ME_DOMAINS; pos++) { ++ for (pos = 0; pos < MAX_S3C_DOMAINS; pos++) { + -+ if (ME_id_array[pos].state != ME_state_dead) { ++ if (S3C_id_array[pos].state != S3C_state_dead) { + + /* Adding the message itself */ + me = roxml_add_node(messages, 0, ROXML_ELM_NODE, "mobile-entity", NULL); + + /* Add SPID */ -+ sprintf(spid, "%016llx", ME_id_array[pos].spid); ++ sprintf(spid, "%016llx", S3C_id_array[pos].spid); + roxml_add_node(me, 0, ROXML_ATTR_NODE, "spid", spid); + + /* Add the slotID */ -+ sprintf(slotID, "%d", ME_id_array[pos].slotID); ++ sprintf(slotID, "%d", S3C_id_array[pos].slotID); + roxml_add_node(me, 0, ROXML_ATTR_NODE, "slotID", slotID); + + /* Add short name */ + name = roxml_add_node(me, 0, ROXML_ELM_NODE, "name", NULL); -+ roxml_add_node(name, 0, ROXML_TXT_NODE, NULL, ME_id_array[pos].name); ++ roxml_add_node(name, 0, ROXML_TXT_NODE, NULL, S3C_id_array[pos].name); + + /* And the short description */ + shortdesc = roxml_add_node(me, 0, ROXML_ELM_NODE, "description", NULL); -+ roxml_add_node(shortdesc, 0, ROXML_TXT_NODE, NULL, ME_id_array[pos].shortdesc); ++ roxml_add_node(shortdesc, 0, ROXML_TXT_NODE, NULL, S3C_id_array[pos].shortdesc); + + } + diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0074-console.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0074-console.c.patch index a1f546e..a75408f 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0074-console.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0074-console.c.patch @@ -44,7 +44,7 @@ +static int volatile vfb_active = 0; + +/* Provided by vUART backend */ -+void me_cons_sendc(domid_t domid, uint8_t ch); ++void s3c_cons_sendc(domid_t domid, uint8_t ch); + +int avzcons_get_focus(void) +{ @@ -79,13 +79,13 @@ +int avz_switch_console(char ch) +{ + static int switch_code_count = 0; -+ static char *input_str[N_SWITCH_FOCUS] = { "Agency domain", "Agency-RT domain", "ME-1(2)", "ME-2(3)", "ME-3(4)", "ME-4(5)", "ME-5(6)", "Agency AVZ Hypervisor" }; ++ static char *input_str[N_SWITCH_FOCUS] = { "Agency domain", "reserved", "S3C-1(2)", "S3C-2(3)", "S3C-3(4)", "S3C-4(5)", "S3C-5(6)", "Agency AVZ Hypervisor" }; + struct device_node *np; + int active = 0; + u32 focus_max = N_SWITCH_FOCUS - 1; + avz_hyp_t args; + -+#if 0 /* Interactions with RT domain? */ ++#if 0 /* Interactions with reserved domain? */ + int next = 1; +#endif + int next = 2; @@ -94,9 +94,9 @@ + if (np) + of_property_read_u32((const struct device_node *) np, "focus-dom-max", &focus_max); + -+/* Debugging purpose - enabled forces to forward to an ME */ ++/* Debugging purpose - enabled forces to forward to an S3C */ +#if 0 -+ me_cons_sendc(1, ch); ++ s3c_cons_sendc(1, ch); +#endif + + if ((SWITCH_CODE != 0) && (ch == SWITCH_CODE)) { @@ -127,14 +127,14 @@ + case 0: /* Input to the agency */ + return 0; + -+ case 1: /* RT domain */ -+ case 2: /* Input to ME #1 */ -+ case 3: /* Input to ME #2 */ -+ case 4: /* Input to ME #3 */ -+ case 5: /* Input to ME #4 */ -+ case 6: /* Input to ME #5 */ ++ case 1: /* reserved domain */ ++ case 2: /* Input to S3C #1 */ ++ case 3: /* Input to S3C #2 */ ++ case 4: /* Input to S3C #3 */ ++ case 5: /* Input to S3C #4 */ ++ case 6: /* Input to S3C #5 */ +#ifdef CONFIG_VUART_BACKEND -+ me_cons_sendc(avzcons_get_focus(), ch); ++ s3c_cons_sendc(avzcons_get_focus(), ch); +#endif /* CONFIG_VUART_BACKEND */ + return 1; + diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0077-core.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0077-core.c.patch index f3b31ca..1c4f2e8 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0077-core.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0077-core.c.patch @@ -53,21 +53,21 @@ +/** + * @brief Shutdown the capsule in a way it depends on its state. + * -+ * @param ME_slotID ++ * @param S3C_slotID + */ -+static void shutdown_capsule(unsigned int ME_slotID) ++static void shutdown_capsule(unsigned int S3C_slotID) +{ + avz_hyp_t args; + + /* Asynchronous termination of the capsule */ -+ if (get_ME_state(ME_slotID) != ME_state_stopped) -+ do_sync_dom(ME_slotID, DC_SHUTDOWN); ++ if (get_S3C_state(S3C_slotID) != S3C_state_stopped) ++ do_sync_dom(S3C_slotID, DC_SHUTDOWN); + -+ /* Then, final termination of the residual ME */ -+ if ((get_ME_state(ME_slotID) == ME_state_terminated) || -+ (get_ME_state(ME_slotID) == ME_state_stopped)) { -+ args.cmd = AVZ_KILL_ME; -+ args.u.avz_kill_me_args.slotID = ME_slotID; ++ /* Then, final termination of the residual S3C */ ++ if ((get_S3C_state(S3C_slotID) == S3C_state_terminated) || ++ (get_S3C_state(S3C_slotID) == S3C_state_stopped)) { ++ args.cmd = AVZ_KILL_S3C; ++ args.u.avz_kill_me_args.slotID = S3C_slotID; + + avz_hypercall(&args); + } @@ -95,8 +95,8 @@ + } + + switch (cmd) { -+ case AGENCY_IOCTL_GET_ME_ID: -+ args.value = (get_ME_id(args.slotID, (ME_id_t *)args.buffer) ? 0 : -1); ++ case AGENCY_IOCTL_GET_S3C_ID: ++ args.value = (get_S3C_id(args.slotID, (S3C_id_t *)args.buffer) ? 0 : -1); + break; + + case AGENCY_IOCTL_READ_SNAPSHOT: @@ -119,8 +119,8 @@ + shutdown_capsule(args.slotID); + break; + -+ case AGENCY_IOCTL_GET_ME_ID_ARRAY: -+ get_ME_id_array((ME_id_t *)args.buffer); ++ case AGENCY_IOCTL_GET_S3C_ID_ARRAY: ++ get_S3C_id_array((S3C_id_t *)args.buffer); + break; + + default: @@ -217,21 +217,21 @@ + void *unused) +{ + int slotID; -+ ME_desc_t desc; ++ S3C_desc_t desc; + + lprintk("%s: !! Now terminating all Mobile Entities of this smart object...\n", + __func__); + + for (slotID = 2; slotID < MAX_DOMAINS; slotID++) { + /* -+ * Check if the ME slot is used or not in order to not ++ * Check if the S3C slot is used or not in order to not + call shutdown on an empty slot, which would cause an error. + */ + -+ get_ME_desc(slotID, &desc); ++ get_S3C_desc(slotID, &desc); + + if (desc.size > 0) { -+ lprintk("%s: terminating ME %d...\n", __func__, slotID); ++ lprintk("%s: terminating S3C %d...\n", __func__, slotID); + shutdown_capsule(slotID); + } + } @@ -257,7 +257,7 @@ +{ + int rc; + -+ DBG("SOO Migration subsystem registering...\n"); ++ DBG("SOO capsule subsystem registering...\n"); + + soo_sysfs_init(); + @@ -283,7 +283,7 @@ + + capsule_init(); + -+ DBG("SOO Migration subsystem registered...\n"); ++ DBG("SOO capsule subsystem registered...\n"); + + register_reboot_notifier(&agency_reboot_nb); + diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0087-soo_guest_activity.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0087-soo_guest_activity.c.patch index 500f0f1..ccb8248 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0087-soo_guest_activity.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0087-soo_guest_activity.c.patch @@ -74,8 +74,8 @@ +} + +/* -+ * Prepare a remote ME to react to a ping event. -+ * @domID: the target ME ++ * Prepare a remote S3C to react to a ping event. ++ * @domID: the target S3C + */ +void set_dc_event(domid_t domID, dc_event_t dc_event) +{ diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0090-vbstorage.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0090-vbstorage.c.patch index 2375844..6c4103e 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0090-vbstorage.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0090-vbstorage.c.patch @@ -428,7 +428,7 @@ + vbs_store_mkdir("/backend"); + vbs_store_mkdir("/device"); + -+#warning the following entries (domain + directcomm) need to be revisited (see soo/me entries) ++#warning the following entries (domain + directcomm) need to be revisited (see soo/s3c entries) + + vbs_store_mkdir("/domain"); + vbs_store_mkdir("/domain/gnttab"); @@ -440,7 +440,7 @@ + vbs_store_mkdir("/domain/gnttab/5"); + vbs_store_mkdir("/domain/gnttab/6"); + -+ /* Target ME directcomm event channel */ ++ /* Target S3C directcomm event channel */ + vbs_store_mkdir("/soo"); + vbs_store_mkdir("/soo/directcomm"); + vbs_store_mkdir("/soo/directcomm/0"); @@ -451,8 +451,8 @@ + vbs_store_mkdir("/soo/directcomm/5"); + vbs_store_mkdir("/soo/directcomm/6"); + -+ /* Prepare the entries for ME ID information */ -+ vbs_store_mkdir("/soo/me"); ++ /* Prepare the entries for S3C ID information */ ++ vbs_store_mkdir("/soo/s3c"); + + /* Agency backend side of virtual LED device */ + np = of_find_compatible_node(NULL, NULL, "vleds,backend"); diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0091-vbstore.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0091-vbstore.c.patch index b80de25..b7f0be1 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0091-vbstore.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0091-vbstore.c.patch @@ -446,7 +446,7 @@ + DBG("%s: allocating unbound evtchn %d for vbstore shared page on domain: %d (intf = %lx)...\n", __func__, + args.u.avz_evtchn.evtchn_op.u.alloc_unbound.evtchn, i, vbstore_intf[i]); + -+ /* This evtchn will be the remote for all clients, including the agency itself and the ME (using their levtchn). */ ++ /* This evtchn will be the remote for all clients, including the agency itself and the S3C (using their levtchn). */ + avz_shared->dom_desc.u.agency.vbstore_evtchn[i] = args.u.avz_evtchn.evtchn_op.u.alloc_unbound.evtchn; + } + @@ -456,7 +456,7 @@ + /* Bind the vbstore listening event channels */ + for (i = 0; i < MAX_DOMAINS; i++) { + -+ /* Bind IRQ used as event channel to discuss with the ME to the vbstore interrupt handler */ ++ /* Bind IRQ used as event channel to discuss with the S3C to the vbstore interrupt handler */ + DBG("%s: binding evtchn %d to vbstore_interrupt handler..\n", __func__, avz_shared->dom_desc.u.agency.vbstore_evtchn[i]); + + res = bind_evtchn_to_virq_handler(avz_shared->dom_desc.u.agency.vbstore_evtchn[i], diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0093-vbus_backend.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0093-vbus_backend.c.patch index 5bbab32..2e92d0c 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0093-vbus_backend.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0093-vbus_backend.c.patch @@ -150,7 +150,7 @@ + kfree(dir); + + /* Keep the synchronization with the injector */ -+ if (get_ME_state(domid) == ME_state_stopped) ++ if (get_S3C_state(domid) == S3C_state_stopped) + complete(&backend_initialized); + + return err; @@ -285,7 +285,7 @@ +/* + * vbus_suspend_devices + * -+ * Inform all vbus devices that we are preparing to migrate (or some other scenarios requiring ++ * Inform all vbus devices that we are preparing to suspend (or some other scenarios requiring + * temporary suspension of their activities) + * + */ @@ -297,7 +297,7 @@ +/* + * vbus_resume_devices + * -+ * Inform all vbus devices that we are preparing to migrate (or some other scenarios requiring ++ * Inform all vbus devices that we are preparing to suspend (or some other scenarios requiring + * temporary suspension of their activities) + * + */ @@ -308,9 +308,9 @@ + + +/* This function is called from vs_prepare_to_resume() in vbus/vbus_xs.c -+ * after the FSM thread activities in order to setup post-migration vbus and frontend drivers. ++ * after the FSM thread activities in order to setup post-resume vbus and frontend drivers. + */ -+void postmig_setup(void) { ++void postresume_setup(void) { + + /* Nothing at the moment */ + diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0094-vbus.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0094-vbus.c.patch index f4df9f2..c91c6ab 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0094-vbus.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0094-vbus.c.patch @@ -195,7 +195,7 @@ + +/* + * The following function is called either in the backend OR the frontend. -+ * On the backend side, it may run on CPU #0 (non-RT) or CPU #1 if the backend is configured as realtime. ++ * On the backend side, it runs on the agency CPU. + */ +void vbus_otherend_changed(struct vbus_watch *watch) { + struct vbus_device *vdev = container_of(watch, struct vbus_device, otherend_watch); @@ -246,9 +246,9 @@ + if (vdev->resuming) { + + /* -+ * It happens after migration & resume ++ * It happens after resume + * -+ * If we have migrated, we are already in connected state; ++ * If we have resumed, we are already in connected state; + * we have been put in this state during the reconfiguring process. + * + */ @@ -302,12 +302,12 @@ + + vdrv->probe(vdev); + -+ /* Get the state from the otherend to see if we are in a post-migration situation. */ ++ /* Get the state from the otherend to see if we are in a post-resume situation. */ + otherend_state = vbus_read_driver_state(vdev->otherend); + -+ /* If the node is probed after a migration, it means that the frontend will be reconfigured. ++ /* If the node is probed after a resume, it means that the frontend will be reconfigured. + * In this case, the resuming operation can go ahead. -+ * If the ME is not migrated (injected), the node is created and the synchronization will be ++ * If the S3C is freshly injected, the node is created and the synchronization will be + * achieved once the device gets connected. + */ + if (otherend_state == VbusStateInitialising) { @@ -317,7 +317,7 @@ + */ + vbus_switch_state(vdev, VbusStateInitWait); + -+ /* For both RT and non-RT initialization, we wait that the device gets connected */ ++ /* We wait until the device gets connected */ + wait_for_completion(&vdev->sync_backfront); + } + @@ -334,7 +334,7 @@ + DBG("%s", vdev->nodename); + + /* -+ * If the ME is running on a Smart Object which does not offer all the backends matching the ME's frontends, ++ * If the S3C is running on a Smart Object which does not offer all the backends matching the S3C's frontends, + * some frontend related entries may not have been created. We must check here if the entry matching the dev + * to remove exists. + */ @@ -359,7 +359,7 @@ +/* + * Shutdown a device. This function can be called externally, but *not* by the Linux subsystem + * during a reboot operation for instance (because of IRQs off). In this case, force_terminate DC events -+ * will be sent to each running ME during the reboot process. ++ * will be sent to each running S3C during the reboot process. + */ +void vbus_dev_shutdown(struct device *dev) +{ @@ -371,7 +371,7 @@ + dir_exists = vbus_directory_exists(VBT_NIL, vdev->otherend_watch.node, ""); + + /* -+ * If the ME is running on a Smart Object which does not offer all the backends matching the ME's frontends, ++ * If the S3C is running on a Smart Object which does not offer all the backends matching the S3C's frontends, + * some frontend related entries may not have been created. We must check here if the entry matching the dev + * to shutdown exists. + */ @@ -512,7 +512,7 @@ + +/* + * Create a new node and initialize basic structure (vdev). -+ * This function is NOT re-entrant and must be executed in the specific context during injection or post-migration sequence. ++ * This function is NOT re-entrant and must be executed in the specific context during injection or post-resume sequence. + */ +static int vbus_probe_node(struct vbus_type *bus, const char *type, const char *nodename) +{ @@ -568,7 +568,7 @@ + +/******************/ + -+/* Suspend devices which eventually match with a certain root name (specific ME) */ ++/* Suspend devices which eventually match with a certain root name (specific S3C) */ +static int suspend_dev(struct device *dev, void *data) +{ + const struct vbus_driver *vdrv; @@ -668,7 +668,7 @@ + vdev->resuming = 1; + + if (vdev->state != VbusStateSuspended) -+ /* we are in StateInitWait because newly create vbstore entries after migration */ ++ /* we are in StateInitWait because newly create vbstore entries after resume */ + vbus_switch_state(vdev, VbusStateReconfiguring); + else { + DBG("Changing state of %s to resuming\n", vdev->nodename); @@ -813,8 +813,8 @@ + + /* + * Set up the directcomm communication channel that -+ * is used between the different domains, mainly between the agency and MEs, -+ * or the non-realtime and realtime agency. ++ * is used between the different domains, mainly between the agency and the ++ * MEs (capsules). + */ + + for (i = 1; i < MAX_DOMAINS; i++) { @@ -848,9 +848,9 @@ + BUG(); + } + -+ /* Finally, we put the directcomm event channel in vbstore (intended to ME usage) */ ++ /* Finally, we put the directcomm event channel in vbstore (intended to S3C usage) */ + /* Save it in vbstore */ -+ DBG("%s: writing initial vbstore entries for directcomm activities for ME %d ...\n", __func__, i); ++ DBG("%s: writing initial vbstore entries for directcomm activities for S3C %d ...\n", __func__, i); + + vbus_transaction_start(&vbt); + @@ -859,7 +859,7 @@ + + vbus_transaction_end(vbt); + -+ DBG("%s: direct communication set up between Agency and ME %d with event channel: %d irq: %d\n", __func__, i, ++ DBG("%s: direct communication set up between Agency and S3C %d with event channel: %d irq: %d\n", __func__, i, + avz_shared->dom_desc.u.agency.dc_evtchn[i], evtchn); + } + diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0096-vbus_vbstore.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0096-vbus_vbstore.c.patch index dee3578..6d1b84f 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0096-vbus_vbstore.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0096-vbus_vbstore.c.patch @@ -78,7 +78,7 @@ + + struct completion watch_wait; + -+ /* To manage ongoing transactions when the ME must be suspended */ ++ /* To manage ongoing transactions when the S3C must be suspended */ + struct mutex transaction_group_mutex; + + /* Protect watch (de)register against save/restore. */ @@ -923,7 +923,7 @@ + int vbus_irq; + + /* -+ * Bind evtchn for interdomain communication: must be executed from the agency or from a ME. ++ * Bind evtchn for interdomain communication: must be executed from the agency or from a S3C. + */ + + /* dev temporary used to set up event channel used by vbstore. */ diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0126-vlogs.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0126-vlogs.c.patch index 96e8978..3deda2f 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0126-vlogs.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0126-vlogs.c.patch @@ -147,7 +147,7 @@ + DBG(VLOGS_PREFIX "Backend reconfigured: %d\n", vdev->otherend_id); + + /* -+ * Set up a ring (shared page & event channel) between the agency and the ME. ++ * Set up a ring (shared page & event channel) between the agency and the S3C. + */ + + vbus_gather(VBT_NIL, vdev->otherend, "ring-ref", "%lu", diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0128-vfbdev.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0128-vfbdev.c.patch index 75c8c9a..075270c 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0128-vfbdev.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0128-vfbdev.c.patch @@ -305,7 +305,7 @@ + DBG(VFBDEV_PREFIX "Backend reconfigured: %d\n", vdev->otherend_id); + + /* -+ * Set up a ring (shared page & event channel) between the agency and the ME. ++ * Set up a ring (shared page & event channel) between the agency and the S3C. + */ + + vbus_gather(VBT_NIL, vdev->otherend, "ring-ref", "%lu", diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0130-vinput.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0130-vinput.c.patch index d39abf4..4246049 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0130-vinput.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0130-vinput.c.patch @@ -65,7 +65,7 @@ + + +/* -+ * Add a new destination for a new ME. ++ * Add a new destination for a new S3C. + */ +static void add_destination(struct vbus_device *vdev_destination) +{ @@ -80,7 +80,7 @@ +} + +/* -+ * Search for a destination related to a specific ME according to its domid. ++ * Search for a destination related to a specific S3C according to its domid. + */ +static struct vbus_device *get_destination(uint32_t domid) +{ @@ -93,7 +93,7 @@ +} + +/* -+ * Remove a destination attached to a specific ME ++ * Remove a destination attached to a specific S3C + */ +static void del_destination(struct vbus_device *vdev_destination) +{ @@ -145,7 +145,7 @@ + * - If the state is not Connected, the character is pushed into a circular buffer that + * will be flushed at the next call to the Connected callback. + */ -+void me_cons_send_input(domid_t domid, struct input_event *event) ++void s3c_cons_send_input(domid_t domid, struct input_event *event) +{ + struct vbus_device *destination; + vinput_priv_t *vinput_priv; @@ -242,7 +242,7 @@ + DBG(VINPUT_PREFIX "Backend reconfigured: %d\n", vdev->otherend_id); + + /* -+ * Set up a ring (shared page & event channel) between the agency and the ME. ++ * Set up a ring (shared page & event channel) between the agency and the S3C. + */ + + vbus_gather(VBT_NIL, vdev->otherend, "ring-ref", "%lu", @@ -295,7 +295,7 @@ + return -EFAULT; + } + -+ me_cons_send_input(vfb_get_focus(), &event); ++ s3c_cons_send_input(vfb_get_focus(), &event); + } + + return len; diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0131-vinput.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0131-vinput.h.patch index 28b16b2..4b24de2 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0131-vinput.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0131-vinput.h.patch @@ -60,6 +60,6 @@ + +} vinput_t; + -+void me_cons_send_input(domid_t domid, struct input_event *event); ++void s3c_cons_send_input(domid_t domid, struct input_event *event); + +#endif /* VINPUT_H */ diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0018-Kconfig.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0018-Kconfig.patch index 3418d4a..febe962 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0018-Kconfig.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0018-Kconfig.patch @@ -9,7 +9,7 @@ +menu "Smart Object Oriented subsystem" + +config VDUMMY_BACKEND -+ bool "SOO (realtime and no-RT) vDummy support for debugging and testing" ++ bool "SOO vDummy support for debugging and testing" + +config VUART_BACKEND + bool "vuart UART Backend support for SOO Mobile Entity consoles" diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0020-vdevback.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0020-vdevback.c.patch index 99e3f75..92a557b 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0020-vdevback.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0020-vdevback.c.patch @@ -285,7 +285,7 @@ +} + +/* -+ * Search for a console related to a specific ME according to its domid. ++ * Search for a console related to a specific S3C according to its domid. + */ +struct vbus_device *vdevback_get_entry(uint32_t domid, struct list_head *_list) { + vdev_entry_t *entry; @@ -297,7 +297,7 @@ +} + +/* -+ * Remove a console attached to a specific ME ++ * Remove a console attached to a specific S3C + */ +void vdevback_del_entry(struct vbus_device *vdev, struct list_head *_list) { + vdev_entry_t *entry; diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0022-vdummy.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0022-vdummy.c.patch index b9778da..ac6f289 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0022-vdummy.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0022-vdummy.c.patch @@ -135,7 +135,7 @@ + DBG(VDUMMY_PREFIX "Backend reconfigured: %d\n", vdev->otherend_id); + + /* -+ * Set up a ring (shared page & event channel) between the agency and the ME. ++ * Set up a ring (shared page & event channel) between the agency and the S3C. + */ + + vbus_gather(VBT_NIL, vdev->otherend, "ring-ref", "%lu", &vdummy_priv->ring_ref, "ring-evtchn", "%u", &evtchn, NULL); diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0026-vsensej.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0026-vsensej.c.patch index 08ba07f..8956618 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0026-vsensej.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0026-vsensej.c.patch @@ -170,7 +170,7 @@ + DBG(VSENSEJ_PREFIX "Backend reconfigured: %d\n", vdev->otherend_id); + + /* -+ * Set up a ring (shared page & event channel) between the agency and the ME. ++ * Set up a ring (shared page & event channel) between the agency and the S3C. + */ + + vbus_gather(VBT_NIL, vdev->otherend, "ring-ref", "%lu", &ring_ref, "ring-evtchn", "%u", &evtchn, NULL); diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0030-vsenseled.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0030-vsenseled.c.patch index 21e6640..2eccab3 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0030-vsenseled.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0030-vsenseled.c.patch @@ -141,7 +141,7 @@ + DBG(VSENSELED_PREFIX "Backend reconfigured: %d\n", vdev->otherend_id); + + /* -+ * Set up a ring (shared page & event channel) between the agency and the ME. ++ * Set up a ring (shared page & event channel) between the agency and the S3C. + */ + + vbus_gather(VBT_NIL, vdev->otherend, "ring-ref", "%lu", &ring_ref, "ring-evtchn", "%u", &evtchn, NULL); diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0032-vuart.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0032-vuart.c.patch index dc00f61..df3e290 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0032-vuart.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0032-vuart.c.patch @@ -83,13 +83,13 @@ +} + +/* -+ * Add a new console for a new ME. ++ * Add a new console for a new S3C. + */ +static void add_console(struct vbus_device *vdev_console) +{ + struct vdev_console *console; + -+ console = kzalloc(sizeof(vdev_console), GFP_ATOMIC); ++ console = kzalloc(sizeof(struct vdev_console), GFP_ATOMIC); + BUG_ON(!console); + + console->vdev_console = vdev_console; @@ -98,7 +98,7 @@ +} + +/* -+ * Search for a console related to a specific ME according to its domid. ++ * Search for a console related to a specific S3C according to its domid. + */ +static struct vbus_device *get_console(uint32_t domid) +{ @@ -111,7 +111,7 @@ +} + +/* -+ * Remove a console attached to a specific ME ++ * Remove a console attached to a specific S3C + */ +static void del_console(struct vbus_device *vdev_console) +{ @@ -183,7 +183,7 @@ + * - If the state is not Connected, the character is pushed into a circular buffer that + * will be flushed at the next call to the Connected callback. + */ -+void me_cons_sendc(domid_t domid, uint8_t ch) ++void s3c_cons_sendc(domid_t domid, uint8_t ch) +{ + struct vbus_device *console; + vuart_priv_t *vuart_priv; @@ -278,7 +278,7 @@ + DBG(VUART_PREFIX "Backend reconfigured: %d\n", vdev->otherend_id); + + /* -+ * Set up a ring (shared page & event channel) between the agency and the ME. ++ * Set up a ring (shared page & event channel) between the agency and the S3C. + */ + + vbus_gather(VBT_NIL, vdev->otherend, "ring-ref", "%lu", diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0033-avz.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0033-avz.h.patch index f1f5d39..71f9bc2 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0033-avz.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0033-avz.h.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/avz/uapi/avz.h 1970-01-01 01:00:00.000000000 +0100 +++ ./soo/include/avz/uapi/avz.h 2025-08-29 08:46:41.396291602 +0200 -@@ -0,0 +1,304 @@ +@@ -0,0 +1,300 @@ +/* + * Copyright (C) 2016-2022 Daniel Rossier + * @@ -37,7 +37,6 @@ +#define NR_VIRQS 256 + +#define VIRQ_TIMER 0 /* System timer tick virtualized interrupt */ -+#define VIRQ_TIMER_RT 1 /* Timer tick issued from the oneshot timer (for RT agency and MEs */ + +/**************************************************/ + @@ -53,17 +52,14 @@ +/* DOMID_SELF is used in certain contexts to refer to oneself. */ +#define DOMID_SELF (0x7FF0U) + -+#define MAX_ME_DOMAINS 5 ++#define MAX_S3C_DOMAINS 5 + -+/* We include the (non-RT & RT) agency domain */ -+#define MAX_DOMAINS (2 + MAX_ME_DOMAINS) ++/* domains[]: 0 = agency, 1 = reserved, 2.. = up to MAX_S3C_DOMAINS capsules */ ++#define MAX_DOMAINS (2 + MAX_S3C_DOMAINS) + +/* Agency */ +#define DOMID_AGENCY 0 + -+/* Realtime agency subdomain */ -+#define DOMID_AGENCY_RT 1 -+ +#define DOMID_INVALID (0x7FF4U) + +#define AVZ_HYPERCALL_TRAP 0x2605 @@ -288,7 +284,7 @@ + */ + u64 current_s_time; + -+ /* Used to store a signature for consistency checking, for example after a migration/restoration */ ++ /* Used to store a signature for consistency checking, for example after a snapshot restoration */ + char signature[4]; +}; + diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0036-capsule.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0036-capsule.h.patch index b523e1a..261d794 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0036-capsule.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0036-capsule.h.patch @@ -28,14 +28,14 @@ +void read_snapshot(uint32_t slotID, void *buffer, uint32_t *size); +int write_snapshot(void *buffer); + -+int get_ME_state(unsigned int ME_slotID); -+void set_ME_state(unsigned int ME_slotID, ME_state_t state); ++int get_S3C_state(unsigned int S3C_slotID); ++void set_S3C_state(unsigned int S3C_slotID, S3C_state_t state); + -+void get_ME_desc(unsigned int slotID, ME_desc_t *ME_desc); ++void get_S3C_desc(unsigned int slotID, S3C_desc_t *S3C_desc); + -+bool get_ME_id(uint32_t slotID, ME_id_t *ME_id); -+char *xml_prepare_id_array(ME_id_t *ME_id_array); -+void get_ME_id_array(ME_id_t *ME_id_array); ++bool get_S3C_id(uint32_t slotID, S3C_id_t *S3C_id); ++char *xml_prepare_id_array(S3C_id_t *S3C_id_array); ++void get_S3C_id_array(S3C_id_t *S3C_id_array); + +void capsule_init(void); +void capsule_exit(void); diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0041-vuart.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0041-vuart.h.patch index b39dd81..0c8bc12 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0041-vuart.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0041-vuart.h.patch @@ -58,6 +58,6 @@ +} vuart_t; + +bool vuart_ready(void); -+void me_cons_sendc(domid_t domid, uint8_t ch); ++void s3c_cons_sendc(domid_t domid, uint8_t ch); + +#endif /* VUART_H */ diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0054-soo.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0054-soo.h.patch index cc0e96c..904ef2d 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0054-soo.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0054-soo.h.patch @@ -25,17 +25,17 @@ + +#include + -+int get_ME_state(unsigned int ME_slotID); -+void set_ME_state(unsigned int ME_slotID, ME_state_t state); ++int get_S3C_state(unsigned int S3C_slotID); ++void set_S3C_state(unsigned int S3C_slotID, S3C_state_t state); + -+int32_t get_ME_free_slot(uint32_t size); ++int32_t get_S3C_free_slot(uint32_t size); + -+bool get_ME_id(uint32_t slotID, ME_id_t *ME_id); ++bool get_S3C_id(uint32_t slotID, S3C_id_t *S3C_id); + -+void get_ME_id_array(ME_id_t *ME_id_array); -+char *xml_prepare_id_array(ME_id_t *ME_id_array); ++void get_S3C_id_array(S3C_id_t *S3C_id_array); ++char *xml_prepare_id_array(S3C_id_t *S3C_id_array); + -+void get_ME_desc(unsigned int slotID, ME_desc_t *ME_desc); ++void get_S3C_desc(unsigned int slotID, S3C_desc_t *S3C_desc); + + +#endif /* SOO_H */ diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0060-debug.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0060-debug.h.patch index c93fc0e..70e95bb 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0060-debug.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0060-debug.h.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/uapi/debug.h 1970-01-01 01:00:00.000000000 +0100 +++ ./soo/include/soo/uapi/debug.h 2025-08-29 08:46:41.395937531 +0200 -@@ -0,0 +1,76 @@ +@@ -0,0 +1,75 @@ +/* + * Copyright (C) 2015-2019 Daniel Rossier + * @@ -67,7 +67,6 @@ +#else + +#define DBG(fmt, ...) -+#define RTDBG(fmt, ...) +#define DBG0(...) +#define DBG_BUFFER(buffer, ...) +#define DBG_ON__ diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0061-injector.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0061-injector.h.patch index f8a56f2..b684ad4 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0061-injector.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0061-injector.h.patch @@ -42,8 +42,8 @@ + +#define INJECTOR_N_RECV_BUFFERS 10 + -+/* Max ME size in bytes */ -+#define DATACOMM_ME_MAX_SIZE (32 * 1024 * 1024) ++/* Max S3C size in bytes */ ++#define DATACOMM_S3C_MAX_SIZE (32 * 1024 * 1024) + +#endif /* __KERNEL__ */ + @@ -60,7 +60,7 @@ + +/* + * - INJECTOR_BUFFER_FREE means the buffer is ready for send/receive operations. -+ * - INJECTOR_BUFFER_BUSY means the buffer is reserved for a ME. ++ * - INJECTOR_BUFFER_BUSY means the buffer is reserved for a S3C. + * - INJECTOR_BUFFER_SENDING means the buffer is currently along the path for being sent out. + * The buffer can still be altered depending on the steps of sending (See SOOlink/Coder). + */ @@ -77,9 +77,9 @@ + injector_buffer_status_t status; + + /* -+ * Reference to the ME. ++ * Reference to the S3C. + */ -+ void *ME_data; ++ void *S3C_data; + size_t size; + + uint32_t prio; @@ -87,18 +87,18 @@ +} injector_buffer_desc_t; + +void injector_prepare(uint32_t size); -+void injector_clean_ME(void); -+uint32_t injector_retrieve_ME(void); ++void injector_clean_S3C(void); ++uint32_t injector_retrieve_S3C(void); + -+void *injector_get_ME_buffer(void); -+size_t injector_get_ME_size(void); ++void *injector_get_S3C_buffer(void); ++size_t injector_get_S3C_size(void); + +void *injector_get_tmp_buf(void); +size_t injector_get_tmp_size(void); +bool injector_is_full(void); +void injector_set_full(bool _full); + -+void injector_receive_ME(void *ME, size_t size); ++void injector_receive_S3C(void *S3C, size_t size); + +int inject_capsule(void *buffer, size_t size, int slotID); +void start_capsule(int slotID); diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0062-soo.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0062-soo.h.patch index 8766ecd..6738454 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0062-soo.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0062-soo.h.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/uapi/soo.h 1970-01-01 01:00:00.000000000 +0100 +++ ./soo/include/soo/uapi/soo.h 2025-08-29 08:46:41.395924678 +0200 -@@ -0,0 +1,460 @@ +@@ -0,0 +1,459 @@ +/* + * Copyright (C) 2014-2025 Daniel Rossier + * @@ -26,15 +26,14 @@ + +#include + -+/* This signature is used to check the coherency of the ME image, after a migration ++/* This signature is used to check the coherency of the S3C image, after a snapshot + * or a restoration for example. + */ -+#define SOO_ME_SIGNATURE "SooZ" ++#define SOO_S3C_SIGNATURE "SooZ" + +#endif /* __ASSEMBLY__ */ + +#define AGENCY_CPU 0 -+#define AGENCY_RT_CPU 1 + +#ifndef __ASSEMBLY__ + @@ -78,51 +77,51 @@ +#define AVZ_SCHEDULER_FLIP 0 + +/* -+ * ME states: -+ * - ME_state_stopped: Capsule is stopped (right after start or later) -+ * - ME_state_living: ME is full-functional and activated (all frontend devices are consistent) -+ * - ME_state_suspended: ME is suspended before migrating. This state is maintained for the resident ME instance -+ * - ME_state_hibernate: ME is in a state of hibernate snapshot -+ * - ME_state_resuming: ME ready to perform resuming (after recovering) -+ * - ME_state_awakened: ME is just being awakened -+ * - ME_state_terminated: ME has been terminated (by a shutdown) -+ * - ME_state_dead: ME does not exist ++ * S3C states: ++ * - S3C_state_stopped: Capsule is stopped (right after start or later) ++ * - S3C_state_living: S3C is full-functional and activated (all frontend devices are consistent) ++ * - S3C_state_suspended: S3C is suspended (e.g. before taking a snapshot) ++ * - S3C_state_hibernate: S3C is in a state of hibernate snapshot ++ * - S3C_state_resuming: S3C ready to perform resuming (after recovering) ++ * - S3C_state_awakened: S3C is just being awakened ++ * - S3C_state_terminated: S3C has been terminated (by a shutdown) ++ * - S3C_state_dead: S3C does not exist + */ +typedef enum { -+ ME_state_stopped, -+ ME_state_living, -+ ME_state_suspended, -+ ME_state_hibernate, -+ ME_state_resuming, -+ ME_state_awakened, -+ ME_state_killed, -+ ME_state_terminated, -+ ME_state_dead -+} ME_state_t; ++ S3C_state_stopped, ++ S3C_state_living, ++ S3C_state_suspended, ++ S3C_state_hibernate, ++ S3C_state_resuming, ++ S3C_state_awakened, ++ S3C_state_killed, ++ S3C_state_terminated, ++ S3C_state_dead ++} S3C_state_t; + +/* Keep information about slot availability -+ * FREE: the slot is available (no ME) -+ * BUSY: the slot is allocated a ME ++ * FREE: the slot is available (no S3C) ++ * BUSY: the slot is allocated a S3C + */ -+typedef enum { ME_SLOT_FREE, ME_SLOT_BUSY } ME_slotState_t; ++typedef enum { S3C_SLOT_FREE, S3C_SLOT_BUSY } S3C_slotState_t; + -+/* ME ID related information */ -+#define ME_NAME_SIZE 40 -+#define ME_SHORTDESC_SIZE 1024 ++/* S3C ID related information */ ++#define S3C_NAME_SIZE 40 ++#define S3C_SHORTDESC_SIZE 1024 + +/* -+ * Definition of ME ID information used by functions which need ++ * Definition of S3C ID information used by functions which need + * to get a list of running MEs with their information. + */ +typedef struct { + uint32_t slotID; -+ ME_state_t state; ++ S3C_state_t state; + + uint64_t spid; + -+ char name[ME_NAME_SIZE]; -+ char shortdesc[ME_SHORTDESC_SIZE]; -+} ME_id_t; ++ char name[S3C_NAME_SIZE]; ++ char shortdesc[S3C_SHORTDESC_SIZE]; ++} S3C_id_t; + +struct work_struct; +struct semaphore; @@ -152,7 +151,7 @@ +extern atomic_t dc_incoming_domID[DC_EVENT_MAX]; + +/* -+ * IOCTL commands for migration. ++ * IOCTL commands for S3C management. + * This part is shared between the kernel and user spaces. + */ + @@ -165,24 +164,24 @@ +#define AGENCY_IOCTL_SHUTDOWN _IOW('S', 3, agency_ioctl_args_t) +#define AGENCY_IOCTL_INJECT_CAPSULE _IOWR('S', 4, agency_ioctl_args_t) +#define AGENCY_IOCTL_START_CAPSULE _IOWR('S', 5, agency_ioctl_args_t) -+#define AGENCY_IOCTL_GET_ME_ID _IOWR('S', 6, agency_ioctl_args_t) -+#define AGENCY_IOCTL_GET_ME_ID_ARRAY _IOR('S', 7, agency_ioctl_args_t) ++#define AGENCY_IOCTL_GET_S3C_ID _IOWR('S', 6, agency_ioctl_args_t) ++#define AGENCY_IOCTL_GET_S3C_ID_ARRAY _IOR('S', 7, agency_ioctl_args_t) + +#define SOO_NAME_SIZE 16 + +/* -+ * ME descriptor ++ * S3C descriptor + * + * WARNING !! Be careful when modifying this structure. It *MUST* be aligned with -+ * the same structure used in the ME. ++ * the same structure used in the S3C. + */ +typedef struct { + unsigned int slotID; + uint64_t spid; + -+ ME_state_t state; ++ S3C_state_t state; + -+ unsigned int size; /* Size of the ME with the struct dom_context size */ ++ unsigned int size; /* Size of the S3C with the struct dom_context size */ + unsigned int dc_evtchn; + + unsigned int vbstore_revtchn, vbstore_levtchn; @@ -190,7 +189,7 @@ + + void (*resume_fn)(void); + -+} ME_desc_t; ++} S3C_desc_t; + +/* + * Agency descriptor @@ -203,7 +202,7 @@ + + uint64_t agencyUID; /* Agency UID */ + -+ /* Event channels used for directcomm channel between agency and agency-RT or ME */ ++ /* Event channels used for directcomm channel between agency and S3C */ + unsigned int dc_evtchn[MAX_DOMAINS]; + + /* Event channels used by vbstore */ @@ -215,13 +214,13 @@ +} agency_desc_t; + +/* -+ * SOO agency & ME descriptor - This structure is used in the shared info page of the agency or ME domain. ++ * SOO agency & S3C descriptor - This structure is used in the shared info page of the agency or S3C domain. + */ + +typedef struct { + union { + agency_desc_t agency; -+ ME_desc_t ME; ++ S3C_desc_t S3C; + } u; +} dom_desc_t; + @@ -255,10 +254,10 @@ + */ + u64 current_s_time; + -+ /* Agency or ME descriptor */ ++ /* Agency or S3C descriptor */ + dom_desc_t dom_desc; + -+ /* Used to store a signature for consistency checking, for example after a migration/restoration */ ++ /* Used to store a signature for consistency checking, for example after a snapshot restoration */ + char signature[4]; +}; + @@ -292,14 +291,14 @@ + +/* AVZ hypercalls devoted to SOO */ + -+#define AVZ_ME_READ_SNAPSHOT 4 -+#define AVZ_ME_WRITE_SNAPSHOT 5 ++#define AVZ_S3C_READ_SNAPSHOT 4 ++#define AVZ_S3C_WRITE_SNAPSHOT 5 +#define AVZ_START_CAPSULE 6 +#define AVZ_INJECT_CAPSULE 7 -+#define AVZ_KILL_ME 8 ++#define AVZ_KILL_S3C 8 +#define AVZ_DC_EVENT_SET 9 -+#define AVZ_GET_ME_STATE 10 -+#define AVZ_SET_ME_STATE 11 ++#define AVZ_GET_S3C_STATE 10 ++#define AVZ_SET_S3C_STATE 11 +#define AVZ_GET_DOM_DESC 12 +#define AVZ_GRANT_TABLE_OP 13 + @@ -321,8 +320,8 @@ + int state; +} avz_dc_event_t; + -+/* AVZ_GET_ME_STATE */ -+/* AVZ_SET_ME_STATE */ ++/* AVZ_GET_S3C_STATE */ ++/* AVZ_SET_S3C_STATE */ +typedef struct { + uint32_t slotID; + int state; @@ -334,7 +333,7 @@ + dom_desc_t dom_desc; +} avz_dom_desc_t; + -+/* AVZ_GET_ME_FREE_SLOT */ ++/* AVZ_GET_S3C_FREE_SLOT */ +typedef struct { + int slotID; + int size; @@ -353,7 +352,7 @@ + int size; +} avz_snapshot_t; + -+/* AVZ_KILL_ME */ ++/* AVZ_KILL_S3C */ +typedef struct { + uint32_t slotID; +} avz_kill_me_t; @@ -404,7 +403,7 @@ +/* + * SOO callback functions. + * The following definitions are used as argument in domcalls or in the -+ * agency_ctl() function as a callback to be propagated to a specific ME. ++ * agency_ctl() function as a callback to be propagated to a specific S3C. + * + */ + @@ -415,7 +414,7 @@ + +typedef struct soo_domcall_arg { + /* Stores the agency ctl function. -+ * Possibly, the agency_ctl function can be associated to a callback operation asked by a ME ++ * Possibly, the agency_ctl function can be associated to a callback operation asked by a S3C + */ + unsigned int cmd; + unsigned int slotID; /* Origin of the domcall */ @@ -425,7 +424,7 @@ + pre_resume_args_t pre_resume_args; + + post_activate_args_t post_activate_args; -+ ME_state_t set_me_state_args; ++ S3C_state_t set_me_state_args; + } u; + +} soo_domcall_arg_t; @@ -454,7 +453,7 @@ + +void perform_task(dc_event_t dc_event); + -+void shutdown_ME(unsigned int ME_slotID); ++void shutdown_S3C(unsigned int S3C_slotID); + +void cache_flush_all(void); + diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0064-vbus.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0064-vbus.h.patch index 8669905..7eb1d67 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0064-vbus.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0064-vbus.h.patch @@ -111,7 +111,7 @@ + */ + enum vbus_state fe_state; + -+ /* So far, only the ME use this completion struct. On the agency side, ++ /* So far, only the S3C use this completion struct. On the agency side, + * the device can not be shutdown on live. + */ + struct completion down; @@ -319,7 +319,7 @@ +void vbstore_trigger_dev_probe(void); +int vbstore_uart_remove(unsigned int domID); + -+void postmig_setup(void); ++void postresume_setup(void); +int gnttab_remove(bool with_vbus); + +void remove_devices(void); diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0073-capsule.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0073-capsule.c.patch index b35e01f..2268255 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0073-capsule.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0073-capsule.c.patch @@ -47,12 +47,12 @@ +#include +#include + -+/* Buffer in which the ME will be received. It is dynamically allocated ++/* Buffer in which the S3C will be received. It is dynamically allocated +in injector_prepare */ -+uint8_t *ME_buffer; ++uint8_t *S3C_buffer; + +/* Full size of the me we are receiving */ -+size_t ME_size; ++size_t S3C_size; + +/* Current size received */ +size_t current_size = 0; @@ -89,13 +89,13 @@ + + DBG("Original contents at address: 0x%08x\n with size %d bytes\n", (unsigned long) buffer, size); + -+ /* Allocate a contiguous memory region to host the ME */ ++ /* Allocate a contiguous memory region to host the S3C */ + me = dma_alloc_coherent(capsule_dev, size, &dma_handle, GFP_KERNEL); + BUG_ON(!me); + + memcpy(me, buffer, size); + -+ /* Since the ME buffer is in the CMA zone and allocated via the ++ /* Since the S3C buffer is in the CMA zone and allocated via the + * dma_alloc_cohenrent() function, we cannot use virt_to_phys(). So, we + * take the CPU phys addr stored in dma_handle, and we force to a + * (wrong) virtual address to make sure the soo_hypercall() function @@ -123,7 +123,7 @@ +void start_capsule(int slotID) { + avz_hyp_t args; + -+ BUG_ON(get_ME_state(slotID) != ME_state_stopped); ++ BUG_ON(get_S3C_state(slotID) != S3C_state_stopped); + + args.cmd = AVZ_START_CAPSULE; + @@ -136,29 +136,29 @@ + + DBG("Capsule in slot %d in state living...\n", slotID); + -+ set_ME_state(slotID, ME_state_living); ++ set_S3C_state(slotID, S3C_state_living); +} + +/** -+ * Read a ME snapshot for migration or saving. -+ * The ME is read and stored in a vmalloc'd memory area. ++ * Read a S3C snapshot for saving. ++ * The S3C is read and stored in a vmalloc'd memory area. + * + * @param slotID -+ * @param buffer pointer to the ME buffer ++ * @param buffer pointer to the S3C buffer + */ +void read_snapshot(uint32_t slotID, void *buffer, uint32_t *size) { + avz_hyp_t args; + void *me = NULL; + int ret; + dma_addr_t dma_handle; -+ ME_state_t ME_state; ++ S3C_state_t S3C_state; + + /* Ask the size only */ + if (*size == 0) { + + DBG("%s: ask the snapshot size...\n", __func__); + -+ args.cmd = AVZ_ME_READ_SNAPSHOT; ++ args.cmd = AVZ_S3C_READ_SNAPSHOT; + args.u.avz_snapshot_args.slotID = slotID; + args.u.avz_snapshot_args.size = 0; + @@ -168,29 +168,29 @@ + return; + } + -+ if (get_ME_state(slotID) == ME_state_living) { ++ if (get_S3C_state(slotID) == S3C_state_living) { + -+ /* Suspend the ME */ ++ /* Suspend the S3C */ + do_sync_dom(slotID, DC_PRE_SUSPEND); + -+ /* Set the ME in suspended state */ -+ set_ME_state(slotID, ME_state_suspended); ++ /* Set the S3C in suspended state */ ++ set_S3C_state(slotID, S3C_state_suspended); + + vbus_suspend_devices(slotID); + + do_sync_dom(slotID, DC_SUSPEND); + -+ printk("### state: %d\n", get_ME_state(slotID)); ++ printk("### state: %d\n", get_S3C_state(slotID)); + } + + /* -+ * Prepare a buffer to store the ME and additional header information like migration structure. ++ * Prepare a buffer to store the S3C and additional header information like the snapshot structure. + */ + + me = dma_alloc_coherent(capsule_dev, *size, &dma_handle, GFP_KERNEL); + BUG_ON(!me); + -+ args.cmd = AVZ_ME_READ_SNAPSHOT; ++ args.cmd = AVZ_S3C_READ_SNAPSHOT; + + args.u.avz_snapshot_args.slotID = slotID; + args.u.avz_snapshot_args.snapshot_paddr = (void *) dma_handle; @@ -204,29 +204,29 @@ + + dma_free_coherent(capsule_dev, *size, me, dma_handle); + -+ ME_state = get_ME_state(slotID); ++ S3C_state = get_S3C_state(slotID); + -+ if (ME_state == ME_state_resuming) { ++ if (S3C_state == S3C_state_resuming) { + -+ DBG("Pinging ME %d for DC_RESUME...\n", slotID); ++ DBG("Pinging S3C %d for DC_RESUME...\n", slotID); + do_sync_dom(slotID, DC_RESUME); + + DBG("Resuming all devices (resuming from backend devices) on domain %d...\n", slotID); + vbus_resume_devices(slotID); + -+ DBG("Pinging ME %d for DC_POST_ACTIVATE...\n", slotID); ++ DBG("Pinging S3C %d for DC_POST_ACTIVATE...\n", slotID); + do_sync_dom(slotID, DC_POST_ACTIVATE); + -+ DBG("Putting ME domid %d in state living...\n", slotID); -+ set_ME_state(slotID, ME_state_living); ++ DBG("Putting S3C domid %d in state living...\n", slotID); ++ set_S3C_state(slotID, S3C_state_living); + } +} + +/** -+ * Write a ME snapshot provided a ME_info_transfer_t descriptor. ++ * Write a S3C snapshot provided a S3C_info_transfer_t descriptor. + * + * @param slotID -+ * @param buffer Adresse of a buffer of ME_info_transfert_t ++ * @param buffer Adresse of a buffer of S3C_info_transfert_t + * @return slotID in case of success, -1 if no available slot + */ +int write_snapshot(void *buffer) { @@ -236,14 +236,14 @@ + dma_addr_t dma_handle; + uint32_t snapshot_size; + uint32_t slotID; -+ ME_state_t ME_state; ++ S3C_state_t S3C_state; + + snapshot_size = *((uint32_t *) buffer); + + DBG("Retrieving a size of %d bytes.\n", snapshot_size); + + /* -+ * Prepare a buffer to store the ME and additional header information like migration structure. ++ * Prepare a buffer to store the S3C and additional header information like the snapshot structure. + */ + me = dma_alloc_coherent(capsule_dev, snapshot_size, &dma_handle, GFP_KERNEL); + BUG_ON(!me); @@ -252,7 +252,7 @@ + ret = copy_from_user(me, buffer, snapshot_size); + BUG_ON(ret); + -+ args.cmd = AVZ_ME_WRITE_SNAPSHOT; ++ args.cmd = AVZ_S3C_WRITE_SNAPSHOT; + + args.u.avz_snapshot_args.size = snapshot_size; + args.u.avz_snapshot_args.slotID = -1; @@ -271,52 +271,52 @@ + + dma_free_coherent(capsule_dev, snapshot_size, me, dma_handle); + -+ ME_state = get_ME_state(slotID); ++ S3C_state = get_S3C_state(slotID); + -+ if (ME_state == ME_state_stopped) { ++ if (S3C_state == S3C_state_stopped) { + /* Normal processing, start of the capsule */ + + start_capsule(slotID); + return slotID; + } + -+ BUG_ON((ME_state != ME_state_hibernate) && (ME_state != ME_state_awakened)); ++ BUG_ON((S3C_state != S3C_state_hibernate) && (S3C_state != S3C_state_awakened)); + -+ DBG0("SOO migration subsys: Entering restoring tasks...\n"); ++ DBG0("SOO capsule subsys: Entering restoring tasks...\n"); + + /* The capsule is performing an asynchronous signal-based resume callback and will -+ * be set to ME_state_awakened after its execution ++ * be set to S3C_state_awakened after its execution + */ + while (1) { + schedule(); + -+ if (get_ME_state(slotID) == ME_state_awakened) { -+ DBG("ME now resuming...\n"); ++ if (get_S3C_state(slotID) == S3C_state_awakened) { ++ DBG("S3C now resuming...\n"); + break; + } + } + -+ DBG("Pinging ME %d for DC_RESUME...\n", slotID); ++ DBG("Pinging S3C %d for DC_RESUME...\n", slotID); + do_sync_dom(slotID, DC_RESUME); + + DBG("Resuming all devices (resuming from backend devices) on domain %d...\n", slotID); + vbus_resume_devices(slotID); + -+ DBG("Pinging ME %d for DC_POST_ACTIVATE...\n", slotID); ++ DBG("Pinging S3C %d for DC_POST_ACTIVATE...\n", slotID); + do_sync_dom(slotID, DC_POST_ACTIVATE); + -+ DBG("Putting ME domid %d in state living...\n", slotID); -+ set_ME_state(slotID, ME_state_living); ++ DBG("Putting S3C domid %d in state living...\n", slotID); ++ set_S3C_state(slotID, S3C_state_living); + + return slotID; +} + -+int get_ME_state(unsigned int ME_slotID) ++int get_S3C_state(unsigned int S3C_slotID) +{ + avz_hyp_t args; + -+ args.cmd = AVZ_GET_ME_STATE; -+ args.u.avz_me_state_args.slotID = ME_slotID; ++ args.cmd = AVZ_GET_S3C_STATE; ++ args.u.avz_me_state_args.slotID = S3C_slotID; + + avz_hypercall(&args); + @@ -324,26 +324,26 @@ +} + +/* -+ * Setting the ME state to the specific ME_slotID. ++ * Setting the S3C state to the specific S3C_slotID. + * The hypercall args is passed by 2 contiguous (unsigned) int, the first one is + * used for slotID, the second for the state + */ -+void set_ME_state(unsigned int ME_slotID, ME_state_t state) ++void set_S3C_state(unsigned int S3C_slotID, S3C_state_t state) +{ + avz_hyp_t args; + -+ args.cmd = AVZ_SET_ME_STATE; ++ args.cmd = AVZ_SET_S3C_STATE; + -+ args.u.avz_me_state_args.slotID = ME_slotID; ++ args.u.avz_me_state_args.slotID = S3C_slotID; + args.u.avz_me_state_args.state = state; + + avz_hypercall(&args); +} + +/** -+ * Retrieve the ME descriptor including the SPID, the state. ++ * Retrieve the S3C descriptor including the SPID, the state. + */ -+void get_ME_desc(unsigned int slotID, ME_desc_t *ME_desc) { ++void get_S3C_desc(unsigned int slotID, S3C_desc_t *S3C_desc) { + avz_hyp_t args; + + args.cmd = AVZ_GET_DOM_DESC; @@ -351,49 +351,49 @@ + + avz_hypercall(&args); + -+ memcpy(ME_desc, &args.u.avz_dom_desc_args.dom_desc, sizeof(ME_desc_t)); ++ memcpy(S3C_desc, &args.u.avz_dom_desc_args.dom_desc, sizeof(S3C_desc_t)); +} + +/** -+ * Retrieve the ME identity information including SPID, state. ++ * Retrieve the S3C identity information including SPID, state. + * + * @param slotID -+ * @param ME_id -+ * @return true if a ME has been found in slotID, false otherwise. ++ * @param S3C_id ++ * @return true if a S3C has been found in slotID, false otherwise. + */ -+bool get_ME_id(uint32_t slotID, ME_id_t *ME_id) { ++bool get_S3C_id(uint32_t slotID, S3C_id_t *S3C_id) { + char *prop; + char rootname[VBS_KEY_LENGTH]; + unsigned int len; + -+ /* The ME can be dormant but without any accessible ID information */ -+ ME_id->state = get_ME_state(slotID); ++ /* The S3C can be dormant but without any accessible ID information */ ++ S3C_id->state = get_S3C_state(slotID); + -+ if (ME_id->state == ME_state_dead) ++ if (S3C_id->state == S3C_state_dead) + return false; + -+ sprintf(rootname, "soo/me/%d", slotID); ++ sprintf(rootname, "soo/s3c/%d", slotID); + -+ /* Check if there is a ME? */ ++ /* Check if there is a S3C? */ + prop = vbus_read(VBT_NIL, rootname, "spid", &len); + + if (len == 1) { /* If no entry in vbstore, it returns 1 (byte \0) */ + return true; + } else { -+ sscanf(prop, "%llx", &ME_id->spid); ++ sscanf(prop, "%llx", &S3C_id->spid); + kfree(prop); + + prop = vbus_read(VBT_NIL, rootname, "name", &len); + -+ strcpy(ME_id->name, prop); ++ strcpy(S3C_id->name, prop); + kfree(prop); + + prop = vbus_read(VBT_NIL, rootname, "shortdesc", &len); + -+ strcpy(ME_id->shortdesc, prop); ++ strcpy(S3C_id->shortdesc, prop); + kfree(prop); + -+ ME_id->slotID = slotID; ++ S3C_id->slotID = slotID; + } + + return true; @@ -401,23 +401,23 @@ + +/** + * Get a list of all residing MEs in this smart object. -+ * The caller must have allocated an array of elements. ++ * The caller must have allocated an array of elements. + * -+ * The ME state will be used to determine if a ME is residing or not (ME_state_dead). ++ * The S3C state will be used to determine if a S3C is residing or not (S3C_state_dead). + */ -+void get_ME_id_array(ME_id_t *ME_id_array) { ++void get_S3C_id_array(S3C_id_t *S3C_id_array) { + uint32_t slotID; + + /* Empty the array first */ -+ memset(ME_id_array, 0, MAX_DOMAINS * sizeof(ME_id_array)); ++ memset(S3C_id_array, 0, MAX_DOMAINS * sizeof(S3C_id_array)); + + /* Walk through all entries in vbstore regarding MEs */ + + for (slotID = 2; slotID < MAX_DOMAINS; slotID++) -+ get_ME_id(slotID, &ME_id_array[slotID-2]); ++ get_S3C_id(slotID, &S3C_id_array[slotID-2]); + +} -+EXPORT_SYMBOL(get_ME_id_array); ++EXPORT_SYMBOL(get_S3C_id_array); + +/** + * Prepare a XML message which contains the list of MEs with their specific ID information @@ -425,9 +425,9 @@ + * + * + * @return buffer Buffer allocated by the which contains the XML message. Caller must free it. -+ * @param ME_id_array Array of ME_id_t entries (got with get_ME_id_array()) ++ * @param S3C_id_array Array of S3C_id_t entries (got with get_S3C_id_array()) + */ -+char *xml_prepare_id_array(ME_id_t *ME_id_array) { ++char *xml_prepare_id_array(S3C_id_t *S3C_id_array) { + uint32_t pos; + char *__buffer; + char *buffer; /* Output buffer */ @@ -438,28 +438,28 @@ + /* Adding the messages node */ + messages = roxml_add_node(NULL, 0, ROXML_ELM_NODE, "mobile-entities", NULL); + -+ for (pos = 0; pos < MAX_ME_DOMAINS; pos++) { ++ for (pos = 0; pos < MAX_S3C_DOMAINS; pos++) { + -+ if (ME_id_array[pos].state != ME_state_dead) { ++ if (S3C_id_array[pos].state != S3C_state_dead) { + + /* Adding the message itself */ + me = roxml_add_node(messages, 0, ROXML_ELM_NODE, "mobile-entity", NULL); + + /* Add SPID */ -+ sprintf(spid, "%016llx", ME_id_array[pos].spid); ++ sprintf(spid, "%016llx", S3C_id_array[pos].spid); + roxml_add_node(me, 0, ROXML_ATTR_NODE, "spid", spid); + + /* Add the slotID */ -+ sprintf(slotID, "%d", ME_id_array[pos].slotID); ++ sprintf(slotID, "%d", S3C_id_array[pos].slotID); + roxml_add_node(me, 0, ROXML_ATTR_NODE, "slotID", slotID); + + /* Add short name */ + name = roxml_add_node(me, 0, ROXML_ELM_NODE, "name", NULL); -+ roxml_add_node(name, 0, ROXML_TXT_NODE, NULL, ME_id_array[pos].name); ++ roxml_add_node(name, 0, ROXML_TXT_NODE, NULL, S3C_id_array[pos].name); + + /* And the short description */ + shortdesc = roxml_add_node(me, 0, ROXML_ELM_NODE, "description", NULL); -+ roxml_add_node(shortdesc, 0, ROXML_TXT_NODE, NULL, ME_id_array[pos].shortdesc); ++ roxml_add_node(shortdesc, 0, ROXML_TXT_NODE, NULL, S3C_id_array[pos].shortdesc); + + } + diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0074-console.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0074-console.c.patch index a1f546e..a75408f 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0074-console.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0074-console.c.patch @@ -44,7 +44,7 @@ +static int volatile vfb_active = 0; + +/* Provided by vUART backend */ -+void me_cons_sendc(domid_t domid, uint8_t ch); ++void s3c_cons_sendc(domid_t domid, uint8_t ch); + +int avzcons_get_focus(void) +{ @@ -79,13 +79,13 @@ +int avz_switch_console(char ch) +{ + static int switch_code_count = 0; -+ static char *input_str[N_SWITCH_FOCUS] = { "Agency domain", "Agency-RT domain", "ME-1(2)", "ME-2(3)", "ME-3(4)", "ME-4(5)", "ME-5(6)", "Agency AVZ Hypervisor" }; ++ static char *input_str[N_SWITCH_FOCUS] = { "Agency domain", "reserved", "S3C-1(2)", "S3C-2(3)", "S3C-3(4)", "S3C-4(5)", "S3C-5(6)", "Agency AVZ Hypervisor" }; + struct device_node *np; + int active = 0; + u32 focus_max = N_SWITCH_FOCUS - 1; + avz_hyp_t args; + -+#if 0 /* Interactions with RT domain? */ ++#if 0 /* Interactions with reserved domain? */ + int next = 1; +#endif + int next = 2; @@ -94,9 +94,9 @@ + if (np) + of_property_read_u32((const struct device_node *) np, "focus-dom-max", &focus_max); + -+/* Debugging purpose - enabled forces to forward to an ME */ ++/* Debugging purpose - enabled forces to forward to an S3C */ +#if 0 -+ me_cons_sendc(1, ch); ++ s3c_cons_sendc(1, ch); +#endif + + if ((SWITCH_CODE != 0) && (ch == SWITCH_CODE)) { @@ -127,14 +127,14 @@ + case 0: /* Input to the agency */ + return 0; + -+ case 1: /* RT domain */ -+ case 2: /* Input to ME #1 */ -+ case 3: /* Input to ME #2 */ -+ case 4: /* Input to ME #3 */ -+ case 5: /* Input to ME #4 */ -+ case 6: /* Input to ME #5 */ ++ case 1: /* reserved domain */ ++ case 2: /* Input to S3C #1 */ ++ case 3: /* Input to S3C #2 */ ++ case 4: /* Input to S3C #3 */ ++ case 5: /* Input to S3C #4 */ ++ case 6: /* Input to S3C #5 */ +#ifdef CONFIG_VUART_BACKEND -+ me_cons_sendc(avzcons_get_focus(), ch); ++ s3c_cons_sendc(avzcons_get_focus(), ch); +#endif /* CONFIG_VUART_BACKEND */ + return 1; + diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0077-core.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0077-core.c.patch index 1126a0b..2e5e5f6 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0077-core.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0077-core.c.patch @@ -53,21 +53,21 @@ +/** + * @brief Shutdown the capsule in a way it depends on its state. + * -+ * @param ME_slotID ++ * @param S3C_slotID + */ -+static void shutdown_capsule(unsigned int ME_slotID) ++static void shutdown_capsule(unsigned int S3C_slotID) +{ + avz_hyp_t args; + + /* Asynchronous termination of the capsule */ -+ if (get_ME_state(ME_slotID) != ME_state_stopped) -+ do_sync_dom(ME_slotID, DC_SHUTDOWN); ++ if (get_S3C_state(S3C_slotID) != S3C_state_stopped) ++ do_sync_dom(S3C_slotID, DC_SHUTDOWN); + -+ /* Then, final termination of the residual ME */ -+ if ((get_ME_state(ME_slotID) == ME_state_terminated) || -+ (get_ME_state(ME_slotID) == ME_state_stopped)) { -+ args.cmd = AVZ_KILL_ME; -+ args.u.avz_kill_me_args.slotID = ME_slotID; ++ /* Then, final termination of the residual S3C */ ++ if ((get_S3C_state(S3C_slotID) == S3C_state_terminated) || ++ (get_S3C_state(S3C_slotID) == S3C_state_stopped)) { ++ args.cmd = AVZ_KILL_S3C; ++ args.u.avz_kill_me_args.slotID = S3C_slotID; + + avz_hypercall(&args); + } @@ -95,8 +95,8 @@ + } + + switch (cmd) { -+ case AGENCY_IOCTL_GET_ME_ID: -+ args.value = (get_ME_id(args.slotID, (ME_id_t *)args.buffer) ? 0 : -1); ++ case AGENCY_IOCTL_GET_S3C_ID: ++ args.value = (get_S3C_id(args.slotID, (S3C_id_t *)args.buffer) ? 0 : -1); + break; + + case AGENCY_IOCTL_READ_SNAPSHOT: @@ -119,8 +119,8 @@ + shutdown_capsule(args.slotID); + break; + -+ case AGENCY_IOCTL_GET_ME_ID_ARRAY: -+ get_ME_id_array((ME_id_t *)args.buffer); ++ case AGENCY_IOCTL_GET_S3C_ID_ARRAY: ++ get_S3C_id_array((S3C_id_t *)args.buffer); + break; + + default: @@ -217,21 +217,21 @@ + void *unused) +{ + int slotID; -+ ME_desc_t desc; ++ S3C_desc_t desc; + + lprintk("%s: !! Now terminating all Mobile Entities of this smart object...\n", + __func__); + + for (slotID = 2; slotID < MAX_DOMAINS; slotID++) { + /* -+ * Check if the ME slot is used or not in order to not ++ * Check if the S3C slot is used or not in order to not + call shutdown on an empty slot, which would cause an error. + */ + -+ get_ME_desc(slotID, &desc); ++ get_S3C_desc(slotID, &desc); + + if (desc.size > 0) { -+ lprintk("%s: terminating ME %d...\n", __func__, slotID); ++ lprintk("%s: terminating S3C %d...\n", __func__, slotID); + shutdown_capsule(slotID); + } + } @@ -257,7 +257,7 @@ +{ + int rc; + -+ DBG("SOO Migration subsystem registering...\n"); ++ DBG("SOO capsule subsystem registering...\n"); + + soo_sysfs_init(); + @@ -283,7 +283,7 @@ + + capsule_init(); + -+ DBG("SOO Migration subsystem registered...\n"); ++ DBG("SOO capsule subsystem registered...\n"); + + register_reboot_notifier(&agency_reboot_nb); + diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0087-soo_guest_activity.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0087-soo_guest_activity.c.patch index 500f0f1..ccb8248 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0087-soo_guest_activity.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0087-soo_guest_activity.c.patch @@ -74,8 +74,8 @@ +} + +/* -+ * Prepare a remote ME to react to a ping event. -+ * @domID: the target ME ++ * Prepare a remote S3C to react to a ping event. ++ * @domID: the target S3C + */ +void set_dc_event(domid_t domID, dc_event_t dc_event) +{ diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0090-vbstorage.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0090-vbstorage.c.patch index 2375844..6c4103e 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0090-vbstorage.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0090-vbstorage.c.patch @@ -428,7 +428,7 @@ + vbs_store_mkdir("/backend"); + vbs_store_mkdir("/device"); + -+#warning the following entries (domain + directcomm) need to be revisited (see soo/me entries) ++#warning the following entries (domain + directcomm) need to be revisited (see soo/s3c entries) + + vbs_store_mkdir("/domain"); + vbs_store_mkdir("/domain/gnttab"); @@ -440,7 +440,7 @@ + vbs_store_mkdir("/domain/gnttab/5"); + vbs_store_mkdir("/domain/gnttab/6"); + -+ /* Target ME directcomm event channel */ ++ /* Target S3C directcomm event channel */ + vbs_store_mkdir("/soo"); + vbs_store_mkdir("/soo/directcomm"); + vbs_store_mkdir("/soo/directcomm/0"); @@ -451,8 +451,8 @@ + vbs_store_mkdir("/soo/directcomm/5"); + vbs_store_mkdir("/soo/directcomm/6"); + -+ /* Prepare the entries for ME ID information */ -+ vbs_store_mkdir("/soo/me"); ++ /* Prepare the entries for S3C ID information */ ++ vbs_store_mkdir("/soo/s3c"); + + /* Agency backend side of virtual LED device */ + np = of_find_compatible_node(NULL, NULL, "vleds,backend"); diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0091-vbstore.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0091-vbstore.c.patch index b80de25..b7f0be1 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0091-vbstore.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0091-vbstore.c.patch @@ -446,7 +446,7 @@ + DBG("%s: allocating unbound evtchn %d for vbstore shared page on domain: %d (intf = %lx)...\n", __func__, + args.u.avz_evtchn.evtchn_op.u.alloc_unbound.evtchn, i, vbstore_intf[i]); + -+ /* This evtchn will be the remote for all clients, including the agency itself and the ME (using their levtchn). */ ++ /* This evtchn will be the remote for all clients, including the agency itself and the S3C (using their levtchn). */ + avz_shared->dom_desc.u.agency.vbstore_evtchn[i] = args.u.avz_evtchn.evtchn_op.u.alloc_unbound.evtchn; + } + @@ -456,7 +456,7 @@ + /* Bind the vbstore listening event channels */ + for (i = 0; i < MAX_DOMAINS; i++) { + -+ /* Bind IRQ used as event channel to discuss with the ME to the vbstore interrupt handler */ ++ /* Bind IRQ used as event channel to discuss with the S3C to the vbstore interrupt handler */ + DBG("%s: binding evtchn %d to vbstore_interrupt handler..\n", __func__, avz_shared->dom_desc.u.agency.vbstore_evtchn[i]); + + res = bind_evtchn_to_virq_handler(avz_shared->dom_desc.u.agency.vbstore_evtchn[i], diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0093-vbus_backend.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0093-vbus_backend.c.patch index 5bbab32..2e92d0c 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0093-vbus_backend.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0093-vbus_backend.c.patch @@ -150,7 +150,7 @@ + kfree(dir); + + /* Keep the synchronization with the injector */ -+ if (get_ME_state(domid) == ME_state_stopped) ++ if (get_S3C_state(domid) == S3C_state_stopped) + complete(&backend_initialized); + + return err; @@ -285,7 +285,7 @@ +/* + * vbus_suspend_devices + * -+ * Inform all vbus devices that we are preparing to migrate (or some other scenarios requiring ++ * Inform all vbus devices that we are preparing to suspend (or some other scenarios requiring + * temporary suspension of their activities) + * + */ @@ -297,7 +297,7 @@ +/* + * vbus_resume_devices + * -+ * Inform all vbus devices that we are preparing to migrate (or some other scenarios requiring ++ * Inform all vbus devices that we are preparing to suspend (or some other scenarios requiring + * temporary suspension of their activities) + * + */ @@ -308,9 +308,9 @@ + + +/* This function is called from vs_prepare_to_resume() in vbus/vbus_xs.c -+ * after the FSM thread activities in order to setup post-migration vbus and frontend drivers. ++ * after the FSM thread activities in order to setup post-resume vbus and frontend drivers. + */ -+void postmig_setup(void) { ++void postresume_setup(void) { + + /* Nothing at the moment */ + diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0094-vbus.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0094-vbus.c.patch index f4df9f2..c91c6ab 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0094-vbus.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0094-vbus.c.patch @@ -195,7 +195,7 @@ + +/* + * The following function is called either in the backend OR the frontend. -+ * On the backend side, it may run on CPU #0 (non-RT) or CPU #1 if the backend is configured as realtime. ++ * On the backend side, it runs on the agency CPU. + */ +void vbus_otherend_changed(struct vbus_watch *watch) { + struct vbus_device *vdev = container_of(watch, struct vbus_device, otherend_watch); @@ -246,9 +246,9 @@ + if (vdev->resuming) { + + /* -+ * It happens after migration & resume ++ * It happens after resume + * -+ * If we have migrated, we are already in connected state; ++ * If we have resumed, we are already in connected state; + * we have been put in this state during the reconfiguring process. + * + */ @@ -302,12 +302,12 @@ + + vdrv->probe(vdev); + -+ /* Get the state from the otherend to see if we are in a post-migration situation. */ ++ /* Get the state from the otherend to see if we are in a post-resume situation. */ + otherend_state = vbus_read_driver_state(vdev->otherend); + -+ /* If the node is probed after a migration, it means that the frontend will be reconfigured. ++ /* If the node is probed after a resume, it means that the frontend will be reconfigured. + * In this case, the resuming operation can go ahead. -+ * If the ME is not migrated (injected), the node is created and the synchronization will be ++ * If the S3C is freshly injected, the node is created and the synchronization will be + * achieved once the device gets connected. + */ + if (otherend_state == VbusStateInitialising) { @@ -317,7 +317,7 @@ + */ + vbus_switch_state(vdev, VbusStateInitWait); + -+ /* For both RT and non-RT initialization, we wait that the device gets connected */ ++ /* We wait until the device gets connected */ + wait_for_completion(&vdev->sync_backfront); + } + @@ -334,7 +334,7 @@ + DBG("%s", vdev->nodename); + + /* -+ * If the ME is running on a Smart Object which does not offer all the backends matching the ME's frontends, ++ * If the S3C is running on a Smart Object which does not offer all the backends matching the S3C's frontends, + * some frontend related entries may not have been created. We must check here if the entry matching the dev + * to remove exists. + */ @@ -359,7 +359,7 @@ +/* + * Shutdown a device. This function can be called externally, but *not* by the Linux subsystem + * during a reboot operation for instance (because of IRQs off). In this case, force_terminate DC events -+ * will be sent to each running ME during the reboot process. ++ * will be sent to each running S3C during the reboot process. + */ +void vbus_dev_shutdown(struct device *dev) +{ @@ -371,7 +371,7 @@ + dir_exists = vbus_directory_exists(VBT_NIL, vdev->otherend_watch.node, ""); + + /* -+ * If the ME is running on a Smart Object which does not offer all the backends matching the ME's frontends, ++ * If the S3C is running on a Smart Object which does not offer all the backends matching the S3C's frontends, + * some frontend related entries may not have been created. We must check here if the entry matching the dev + * to shutdown exists. + */ @@ -512,7 +512,7 @@ + +/* + * Create a new node and initialize basic structure (vdev). -+ * This function is NOT re-entrant and must be executed in the specific context during injection or post-migration sequence. ++ * This function is NOT re-entrant and must be executed in the specific context during injection or post-resume sequence. + */ +static int vbus_probe_node(struct vbus_type *bus, const char *type, const char *nodename) +{ @@ -568,7 +568,7 @@ + +/******************/ + -+/* Suspend devices which eventually match with a certain root name (specific ME) */ ++/* Suspend devices which eventually match with a certain root name (specific S3C) */ +static int suspend_dev(struct device *dev, void *data) +{ + const struct vbus_driver *vdrv; @@ -668,7 +668,7 @@ + vdev->resuming = 1; + + if (vdev->state != VbusStateSuspended) -+ /* we are in StateInitWait because newly create vbstore entries after migration */ ++ /* we are in StateInitWait because newly create vbstore entries after resume */ + vbus_switch_state(vdev, VbusStateReconfiguring); + else { + DBG("Changing state of %s to resuming\n", vdev->nodename); @@ -813,8 +813,8 @@ + + /* + * Set up the directcomm communication channel that -+ * is used between the different domains, mainly between the agency and MEs, -+ * or the non-realtime and realtime agency. ++ * is used between the different domains, mainly between the agency and the ++ * MEs (capsules). + */ + + for (i = 1; i < MAX_DOMAINS; i++) { @@ -848,9 +848,9 @@ + BUG(); + } + -+ /* Finally, we put the directcomm event channel in vbstore (intended to ME usage) */ ++ /* Finally, we put the directcomm event channel in vbstore (intended to S3C usage) */ + /* Save it in vbstore */ -+ DBG("%s: writing initial vbstore entries for directcomm activities for ME %d ...\n", __func__, i); ++ DBG("%s: writing initial vbstore entries for directcomm activities for S3C %d ...\n", __func__, i); + + vbus_transaction_start(&vbt); + @@ -859,7 +859,7 @@ + + vbus_transaction_end(vbt); + -+ DBG("%s: direct communication set up between Agency and ME %d with event channel: %d irq: %d\n", __func__, i, ++ DBG("%s: direct communication set up between Agency and S3C %d with event channel: %d irq: %d\n", __func__, i, + avz_shared->dom_desc.u.agency.dc_evtchn[i], evtchn); + } + diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0096-vbus_vbstore.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0096-vbus_vbstore.c.patch index dee3578..6d1b84f 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0096-vbus_vbstore.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0096-vbus_vbstore.c.patch @@ -78,7 +78,7 @@ + + struct completion watch_wait; + -+ /* To manage ongoing transactions when the ME must be suspended */ ++ /* To manage ongoing transactions when the S3C must be suspended */ + struct mutex transaction_group_mutex; + + /* Protect watch (de)register against save/restore. */ @@ -923,7 +923,7 @@ + int vbus_irq; + + /* -+ * Bind evtchn for interdomain communication: must be executed from the agency or from a ME. ++ * Bind evtchn for interdomain communication: must be executed from the agency or from a S3C. + */ + + /* dev temporary used to set up event channel used by vbstore. */ diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0126-vlogs.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0126-vlogs.c.patch index 96e8978..3deda2f 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0126-vlogs.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0126-vlogs.c.patch @@ -147,7 +147,7 @@ + DBG(VLOGS_PREFIX "Backend reconfigured: %d\n", vdev->otherend_id); + + /* -+ * Set up a ring (shared page & event channel) between the agency and the ME. ++ * Set up a ring (shared page & event channel) between the agency and the S3C. + */ + + vbus_gather(VBT_NIL, vdev->otherend, "ring-ref", "%lu", diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0128-vfbdev.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0128-vfbdev.c.patch index b8dd15c..79ae33d 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0128-vfbdev.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0128-vfbdev.c.patch @@ -305,7 +305,7 @@ + DBG(VFBDEV_PREFIX "Backend reconfigured: %d\n", vdev->otherend_id); + + /* -+ * Set up a ring (shared page & event channel) between the agency and the ME. ++ * Set up a ring (shared page & event channel) between the agency and the S3C. + */ + + vbus_gather(VBT_NIL, vdev->otherend, "ring-ref", "%lu", diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0130-vinput.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0130-vinput.c.patch index c9f4900..35066c6 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0130-vinput.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0130-vinput.c.patch @@ -66,7 +66,7 @@ + + +/* -+ * Add a new destination for a new ME. ++ * Add a new destination for a new S3C. + */ +static void add_destination(struct vbus_device *vdev_destination) +{ @@ -81,7 +81,7 @@ +} + +/* -+ * Search for a destination related to a specific ME according to its domid. ++ * Search for a destination related to a specific S3C according to its domid. + */ +static struct vbus_device *get_destination(uint32_t domid) +{ @@ -94,7 +94,7 @@ +} + +/* -+ * Remove a destination attached to a specific ME ++ * Remove a destination attached to a specific S3C + */ +static void del_destination(struct vbus_device *vdev_destination) +{ @@ -146,7 +146,7 @@ + * - If the state is not Connected, the character is pushed into a circular buffer that + * will be flushed at the next call to the Connected callback. + */ -+void me_cons_send_input(domid_t domid, struct input_event *event) ++void s3c_cons_send_input(domid_t domid, struct input_event *event) +{ + struct vbus_device *destination; + vinput_priv_t *vinput_priv; @@ -243,7 +243,7 @@ + DBG(VINPUT_PREFIX "Backend reconfigured: %d\n", vdev->otherend_id); + + /* -+ * Set up a ring (shared page & event channel) between the agency and the ME. ++ * Set up a ring (shared page & event channel) between the agency and the S3C. + */ + + vbus_gather(VBT_NIL, vdev->otherend, "ring-ref", "%lu", @@ -296,7 +296,7 @@ + return -EFAULT; + } + -+ me_cons_send_input(vfb_get_focus(), &event); ++ s3c_cons_send_input(vfb_get_focus(), &event); + } + + return len; diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0131-vinput.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0131-vinput.h.patch index 60caf7a..bf237a6 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0131-vinput.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0131-vinput.h.patch @@ -61,6 +61,6 @@ + +} vinput_t; + -+void me_cons_send_input(domid_t domid, struct input_event *event); ++void s3c_cons_send_input(domid_t domid, struct input_event *event); + +#endif /* VINPUT_H */ From 20cae1d2612262a1b515ac6e79e219bb49a7b978 Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Sat, 11 Jul 2026 15:30:18 +0200 Subject: [PATCH 21/52] meta-usr: commit the SOO agency apps in-tree and rename ME->S3C Promote the MICOFE-specific SOO userspace apps (fb_mapper, input_forwarding, emiso_engine, injector, save/restore/melist/shutdown) plus their headers to committed sources under linux/usr/{src,include}, dropping the 51-patch materialization model. src/CMakeLists.txt now carries add_subdirectory(soo); the lvgl CMakeLists patch context is updated accordingly. Rename ME->S3C (and me->s3c, /soo/me->/soo/s3c, Mobile Entity->SO3 Capsule) across the apps and their in-tree headers to match the v6.2.0 kernel uapi (ioctl numbers unchanged). --- .gitignore | 3 - .../0001-CMakeLists.txt.patch | 3 +- .../files/0001-usr-linux-1.0-r0-patches.inc | 56 -- .../0001-usr-linux-1.0-r0/0001-core.h.patch | 63 -- .../0001-usr-linux-1.0-r0/0002-debug.h.patch | 52 -- .../0003-device_access.h.patch | 61 -- .../0004-injector.h.patch | 32 - .../0001-usr-linux-1.0-r0/0005-leds.h.patch | 40 -- .../0006-receive.h.patch | 30 - .../0001-usr-linux-1.0-r0/0007-send.h.patch | 31 - .../0001-usr-linux-1.0-r0/0008-types.h.patch | 29 - .../0009-upgrader.h.patch | 52 -- .../0001-usr-linux-1.0-r0/0010-core.h.patch | 33 -- .../0001-usr-linux-1.0-r0/0011-debug.h.patch | 52 -- .../0001-usr-linux-1.0-r0/0012-soo.h.patch | 101 ---- .../0016-CMakeLists.txt.patch | 19 - .../0001-usr-linux-1.0-r0/0017-cli.cpp.patch | 127 ---- .../0001-usr-linux-1.0-r0/0018-cli.hpp.patch | 53 -- .../0019-CMakeLists.txt.patch | 28 - .../0020-capsule.cpp.patch | 545 ------------------ .../0021-capsule.hpp.patch | 75 --- .../0022-daemon.cpp.patch | 43 -- .../0023-daemon.hpp.patch | 49 -- .../0024-image.cpp.patch | 176 ------ .../0025-image.hpp.patch | 66 --- .../0026-emiso_engine.cpp.patch | 71 --- .../0027-config.hpp.patch | 37 -- .../0028-utils.hpp.patch | 74 --- .../0029-utils.cpp.patch | 117 ---- .../0030-container.cpp.patch | 78 --- .../0031-container.hpp.patch | 428 -------------- .../0032-container_inspect.hpp.patch | 252 -------- .../0033-container_logs.hpp.patch | 72 --- .../0034-image.cpp.patch | 49 -- .../0035-image.hpp.patch | 140 ----- .../0036-image_inspect.hpp.patch | 94 --- .../0037-network.cpp.patch | 41 -- .../0038-network.hpp.patch | 66 --- .../0039-plugins.cpp.patch | 40 -- .../0040-plugins.hpp.patch | 71 --- .../0041-system.cpp.patch | 45 -- .../0042-system.hpp.patch | 239 -------- .../0043-volume.cpp.patch | 41 -- .../0044-volume.hpp.patch | 71 --- .../0045-webserver.cpp.patch | 64 -- .../0046-webserver.hpp.patch | 95 --- .../0047-injector.c.patch | 142 ----- .../0001-usr-linux-1.0-r0/0048-melist.c.patch | 96 --- .../0049-restoreme.c.patch | 79 --- .../0001-usr-linux-1.0-r0/0050-saveme.c.patch | 89 --- .../0051-shutdownme.c.patch | 60 -- .../0052-CMakeLists.txt.patch | 5 - .../0053-fb_mapper.c.patch | 172 ------ .../0054-input_forwarding.c.patch | 247 -------- .../recipes-usr/soo/usr-linux_1.0.bbappend | 29 +- linux/usr/include/core/core.h | 60 ++ linux/usr/include/core/debug.h | 49 ++ linux/usr/include/core/device_access.h | 58 ++ linux/usr/include/core/injector.h | 29 + linux/usr/include/core/leds.h | 37 ++ linux/usr/include/core/receive.h | 27 + linux/usr/include/core/send.h | 28 + linux/usr/include/core/types.h | 26 + linux/usr/include/core/upgrader.h | 49 ++ linux/usr/include/soo/core.h | 30 + linux/usr/include/soo/debug.h | 49 ++ linux/usr/include/soo/uapi/soo.h | 98 ++++ linux/usr/src/CMakeLists.txt | 3 + linux/usr/src/soo/CMakeLists.txt | 16 + linux/usr/src/soo/emiso_engine/CMakeLists.txt | 25 + linux/usr/src/soo/emiso_engine/cli/cli.cpp | 123 ++++ linux/usr/src/soo/emiso_engine/cli/cli.hpp | 50 ++ .../src/soo/emiso_engine/daemon/capsule.cpp | 542 +++++++++++++++++ .../src/soo/emiso_engine/daemon/capsule.hpp | 72 +++ .../src/soo/emiso_engine/daemon/daemon.cpp | 40 ++ .../src/soo/emiso_engine/daemon/daemon.hpp | 46 ++ .../usr/src/soo/emiso_engine/daemon/image.cpp | 173 ++++++ .../usr/src/soo/emiso_engine/daemon/image.hpp | 63 ++ .../usr/src/soo/emiso_engine/emiso_engine.cpp | 68 +++ .../soo/emiso_engine/include/emiso/config.hpp | 34 ++ .../soo/emiso_engine/include/emiso/utils.hpp | 71 +++ linux/usr/src/soo/emiso_engine/utils.cpp | 114 ++++ .../webserver/container/container.cpp | 75 +++ .../webserver/container/container.hpp | 425 ++++++++++++++ .../webserver/container/container_inspect.hpp | 249 ++++++++ .../webserver/container/container_logs.hpp | 69 +++ .../emiso_engine/webserver/image/image.cpp | 46 ++ .../emiso_engine/webserver/image/image.hpp | 137 +++++ .../webserver/image/image_inspect.hpp | 90 +++ .../webserver/network/network.cpp | 38 ++ .../webserver/network/network.hpp | 63 ++ .../webserver/plugins/plugins.cpp | 37 ++ .../webserver/plugins/plugins.hpp | 68 +++ .../emiso_engine/webserver/system/system.cpp | 42 ++ .../emiso_engine/webserver/system/system.hpp | 236 ++++++++ .../emiso_engine/webserver/volume/volume.cpp | 38 ++ .../emiso_engine/webserver/volume/volume.hpp | 68 +++ .../soo/emiso_engine/webserver/webserver.cpp | 61 ++ .../soo/emiso_engine/webserver/webserver.hpp | 92 +++ linux/usr/src/soo/fb_mapper.c | 169 ++++++ linux/usr/src/soo/injector.c | 139 +++++ linux/usr/src/soo/input_forwarding.c | 244 ++++++++ linux/usr/src/soo/melist.c | 93 +++ linux/usr/src/soo/restoreme.c | 76 +++ linux/usr/src/soo/saveme.c | 86 +++ linux/usr/src/soo/shutdownme.c | 57 ++ 106 files changed, 4686 insertions(+), 4915 deletions(-) delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0-patches.inc delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0001-core.h.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0002-debug.h.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0003-device_access.h.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0004-injector.h.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0005-leds.h.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0006-receive.h.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0007-send.h.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0008-types.h.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0009-upgrader.h.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0010-core.h.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0011-debug.h.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0012-soo.h.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0016-CMakeLists.txt.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0017-cli.cpp.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0018-cli.hpp.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0019-CMakeLists.txt.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0020-capsule.cpp.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0021-capsule.hpp.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0022-daemon.cpp.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0023-daemon.hpp.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0024-image.cpp.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0025-image.hpp.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0026-emiso_engine.cpp.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0027-config.hpp.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0028-utils.hpp.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0029-utils.cpp.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0030-container.cpp.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0031-container.hpp.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0032-container_inspect.hpp.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0033-container_logs.hpp.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0034-image.cpp.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0035-image.hpp.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0036-image_inspect.hpp.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0037-network.cpp.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0038-network.hpp.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0039-plugins.cpp.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0040-plugins.hpp.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0041-system.cpp.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0042-system.hpp.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0043-volume.cpp.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0044-volume.hpp.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0045-webserver.cpp.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0046-webserver.hpp.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0047-injector.c.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0048-melist.c.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0049-restoreme.c.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0050-saveme.c.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0051-shutdownme.c.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0052-CMakeLists.txt.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0053-fb_mapper.c.patch delete mode 100644 build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0054-input_forwarding.c.patch create mode 100644 linux/usr/include/core/core.h create mode 100644 linux/usr/include/core/debug.h create mode 100644 linux/usr/include/core/device_access.h create mode 100644 linux/usr/include/core/injector.h create mode 100644 linux/usr/include/core/leds.h create mode 100644 linux/usr/include/core/receive.h create mode 100644 linux/usr/include/core/send.h create mode 100644 linux/usr/include/core/types.h create mode 100644 linux/usr/include/core/upgrader.h create mode 100644 linux/usr/include/soo/core.h create mode 100644 linux/usr/include/soo/debug.h create mode 100644 linux/usr/include/soo/uapi/soo.h create mode 100644 linux/usr/src/soo/CMakeLists.txt create mode 100644 linux/usr/src/soo/emiso_engine/CMakeLists.txt create mode 100644 linux/usr/src/soo/emiso_engine/cli/cli.cpp create mode 100644 linux/usr/src/soo/emiso_engine/cli/cli.hpp create mode 100644 linux/usr/src/soo/emiso_engine/daemon/capsule.cpp create mode 100644 linux/usr/src/soo/emiso_engine/daemon/capsule.hpp create mode 100644 linux/usr/src/soo/emiso_engine/daemon/daemon.cpp create mode 100644 linux/usr/src/soo/emiso_engine/daemon/daemon.hpp create mode 100644 linux/usr/src/soo/emiso_engine/daemon/image.cpp create mode 100644 linux/usr/src/soo/emiso_engine/daemon/image.hpp create mode 100644 linux/usr/src/soo/emiso_engine/emiso_engine.cpp create mode 100644 linux/usr/src/soo/emiso_engine/include/emiso/config.hpp create mode 100644 linux/usr/src/soo/emiso_engine/include/emiso/utils.hpp create mode 100644 linux/usr/src/soo/emiso_engine/utils.cpp create mode 100644 linux/usr/src/soo/emiso_engine/webserver/container/container.cpp create mode 100644 linux/usr/src/soo/emiso_engine/webserver/container/container.hpp create mode 100644 linux/usr/src/soo/emiso_engine/webserver/container/container_inspect.hpp create mode 100644 linux/usr/src/soo/emiso_engine/webserver/container/container_logs.hpp create mode 100644 linux/usr/src/soo/emiso_engine/webserver/image/image.cpp create mode 100644 linux/usr/src/soo/emiso_engine/webserver/image/image.hpp create mode 100644 linux/usr/src/soo/emiso_engine/webserver/image/image_inspect.hpp create mode 100644 linux/usr/src/soo/emiso_engine/webserver/network/network.cpp create mode 100644 linux/usr/src/soo/emiso_engine/webserver/network/network.hpp create mode 100644 linux/usr/src/soo/emiso_engine/webserver/plugins/plugins.cpp create mode 100644 linux/usr/src/soo/emiso_engine/webserver/plugins/plugins.hpp create mode 100644 linux/usr/src/soo/emiso_engine/webserver/system/system.cpp create mode 100644 linux/usr/src/soo/emiso_engine/webserver/system/system.hpp create mode 100644 linux/usr/src/soo/emiso_engine/webserver/volume/volume.cpp create mode 100644 linux/usr/src/soo/emiso_engine/webserver/volume/volume.hpp create mode 100644 linux/usr/src/soo/emiso_engine/webserver/webserver.cpp create mode 100644 linux/usr/src/soo/emiso_engine/webserver/webserver.hpp create mode 100644 linux/usr/src/soo/fb_mapper.c create mode 100644 linux/usr/src/soo/injector.c create mode 100644 linux/usr/src/soo/input_forwarding.c create mode 100644 linux/usr/src/soo/melist.c create mode 100644 linux/usr/src/soo/restoreme.c create mode 100644 linux/usr/src/soo/saveme.c create mode 100644 linux/usr/src/soo/shutdownme.c diff --git a/.gitignore b/.gitignore index a28c5ba..4da2738 100644 --- a/.gitignore +++ b/.gitignore @@ -76,9 +76,6 @@ filesystem/work *.back/ # --- Build-generated / attached at build time (materialized from patch sets / fetch) --- -/linux/usr/include/core/ -/linux/usr/include/soo/ /linux/usr/src/graphic/ -/linux/usr/src/soo/ /linux/usr/src/lvgl/ /filesystem/u-boot.bin diff --git a/build/meta-usr/recipes-usr/lvgl/files/0001-usr-linux-1.0-r0/0001-CMakeLists.txt.patch b/build/meta-usr/recipes-usr/lvgl/files/0001-usr-linux-1.0-r0/0001-CMakeLists.txt.patch index 0779a14..37fd162 100644 --- a/build/meta-usr/recipes-usr/lvgl/files/0001-usr-linux-1.0-r0/0001-CMakeLists.txt.patch +++ b/build/meta-usr/recipes-usr/lvgl/files/0001-usr-linux-1.0-r0/0001-CMakeLists.txt.patch @@ -1,7 +1,8 @@ --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt -@@ -1 +1,3 @@ +@@ -1,2 +1,4 @@ add_subdirectory(examples) + add_subdirectory(soo) +add_subdirectory(lvgl) +add_subdirectory(graphic) diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0-patches.inc b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0-patches.inc deleted file mode 100644 index dcd30de..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0-patches.inc +++ /dev/null @@ -1,56 +0,0 @@ -# Copyright (c) 2025-2026 EDGEMTech SA -# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD - -SOO_URI:append = "\ - file://0020-capsule.cpp.patch \ - file://0040-plugins.hpp.patch \ - file://0039-plugins.cpp.patch \ - file://0006-receive.h.patch \ - file://0002-debug.h.patch \ - file://0038-network.hpp.patch \ - file://0022-daemon.cpp.patch \ - file://0046-webserver.hpp.patch \ - file://0029-utils.cpp.patch \ - file://0051-shutdownme.c.patch \ - file://0017-cli.cpp.patch \ - file://0037-network.cpp.patch \ - file://0007-send.h.patch \ - file://0027-config.hpp.patch \ - file://0023-daemon.hpp.patch \ - file://0028-utils.hpp.patch \ - file://0030-container.cpp.patch \ - file://0036-image_inspect.hpp.patch \ - file://0042-system.hpp.patch \ - file://0016-CMakeLists.txt.patch \ - file://0050-saveme.c.patch \ - file://0001-core.h.patch \ - file://0025-image.hpp.patch \ - file://0048-melist.c.patch \ - file://0026-emiso_engine.cpp.patch \ - file://0019-CMakeLists.txt.patch \ - file://0033-container_logs.hpp.patch \ - file://0035-image.hpp.patch \ - file://0008-types.h.patch \ - file://0004-injector.h.patch \ - file://0047-injector.c.patch \ - file://0021-capsule.hpp.patch \ - file://0003-device_access.h.patch \ - file://0045-webserver.cpp.patch \ - file://0031-container.hpp.patch \ - file://0012-soo.h.patch \ - file://0043-volume.cpp.patch \ - file://0049-restoreme.c.patch \ - file://0044-volume.hpp.patch \ - file://0041-system.cpp.patch \ - file://0011-debug.h.patch \ - file://0034-image.cpp.patch \ - file://0018-cli.hpp.patch \ - file://0032-container_inspect.hpp.patch \ - file://0009-upgrader.h.patch \ - file://0024-image.cpp.patch \ - file://0005-leds.h.patch \ - file://0010-core.h.patch \ - file://0052-CMakeLists.txt.patch \ - file://0053-fb_mapper.c.patch \ - file://0054-input_forwarding.c.patch \ -" diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0001-core.h.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0001-core.h.patch deleted file mode 100644 index 16f874b..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0001-core.h.patch +++ /dev/null @@ -1,63 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/include/core/core.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./include/core/core.h 2025-10-10 17:28:33.584649635 +0200 -@@ -0,0 +1,60 @@ -+/* -+ * Copyright (C) 2014-2019 Daniel Rossier -+ * Copyright (C) 2018-2019 Baptiste Delporte -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#ifndef CORE_H -+#define CORE_H -+ -+#include -+ -+#include -+ -+#define AGENCY_CORE_VERSION "2025.5" -+ -+/* Cycle period express in ms */ -+#define AG_CYCLE_PERIOD 100 -+ -+#define SOO_CORE_DEVICE "/dev/soo/core" -+ -+extern int fd_core; -+extern int fd_dcm; -+ -+/* Arguments of the agency application */ -+extern bool opt_noinject; -+extern bool opt_nosend; -+ -+/* To indicate f the main agency cycle loop is interrupted */ -+extern bool ag_cycle_interrupted; -+ -+int initialize_migration(unsigned int ME_slotID); -+ -+int get_ME_free_slot(size_t ME_size); -+ -+bool get_ME_id(uint32_t slotID, ME_id_t *ME_id); -+ -+void read_ME_snapshot(unsigned int slotID, void **buffer, uint32_t *buffer_size); -+void write_ME_snapshot(unsigned int slotID, unsigned char *ME_buffer); -+ -+void *prepare_ME_slot(unsigned int slotID); -+int finalize_migration(unsigned int slotID); -+ -+void main_loop(int cycle_period); -+ -+void migration_init(void); -+ -+#endif /* CORE_H */ diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0002-debug.h.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0002-debug.h.patch deleted file mode 100644 index 94d5b0d..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0002-debug.h.patch +++ /dev/null @@ -1,52 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/include/core/debug.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./include/core/debug.h 2025-10-10 17:28:33.584702104 +0200 -@@ -0,0 +1,49 @@ -+/* -+ * Copyright (C) 2014-2019 Daniel Rossier -+ * Copyright (C) 2018-2019 Baptiste Delporte -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#ifndef DEBUG_H -+#define DEBUG_H -+ -+#include -+#include -+ -+#ifdef DEBUG -+#undef DBG -+ -+#define DBG(fmt, ...) \ -+ do { \ -+ printf("(user) %s:%d > "fmt, __func__, __LINE__, ##__VA_ARGS__); \ -+ } while (0) -+ -+#define BUG() do { printf("BUG\n"); fflush(stdout); exit(-1); } while (0); -+ -+#define DBG0(...) DBG("%s", ##__VA_ARGS__) -+ -+#else -+ -+#define DBG(fmt, ...) -+#define RTDBG(fmt, ...) -+#define DBG0(...) -+#define DBG_BUFFER(buffer, ...) -+#define DBG_ON__ -+#define DBG_OFF__ -+ -+#endif -+ -+#endif /* DEBUG_H */ diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0003-device_access.h.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0003-device_access.h.patch deleted file mode 100644 index 5e9e78f..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0003-device_access.h.patch +++ /dev/null @@ -1,61 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/include/core/device_access.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./include/core/device_access.h 2025-10-10 17:28:33.584702104 +0200 -@@ -0,0 +1,58 @@ -+ /* -+ * Copyright (C) 2014-2019 Daniel Rossier -+ * Copyright (c) 2018 Baptiste Delporte -+ * Copyright (C) 2019 David Truan -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#ifndef DEVICE_ACCESS_H -+#define DEVICE_ACCESS_H -+ -+#define FILENAME_MAX_LEN 80 -+ -+#define SOO_ME_DIRECTORY "/mnt/ME" -+#define SOO_BOOT_PART "/mnt/boot/" -+#define SOO_ROOTFS_P2 "/mnt/rootfs1/" -+#define SOO_ROOTFS_P4 "/mnt/rootfs2/" -+#define ROOT_PATH "/root/" -+ -+#define ROOTFS1_PART '2' -+#define ROOTFS2_PART '4' -+ -+#define ROOTFS_ARCHIVE_NAME "rootfs.tar" -+#define AGENCY_JSON_NAME "agency.json" -+#define AGENCY_JSON_PATH SOO_BOOT_PART AGENCY_JSON_NAME -+#define ROOT_FLAG_NAME "root_flag" -+#define ROOT_FLAG_PATH SOO_BOOT_PART ROOT_FLAG_NAME -+#define UENV_TXT_NAME "uEnv.txt" -+#define UENV_TXT_PATH SOO_BOOT_PART UENV_TXT_NAME -+ -+#define ITB_NAME "soo.itb" -+ -+#define ITB_PATH SOO_BOOT_PART ITB_NAME -+ -+void agency_inject_ME_from_memory(void); -+void sig_inject_ME_from_memory(int sig); -+ -+void inject_MEs_from_filesystem(void); -+ -+int upgrade_uEnv_txt(char *uEnv_updated, size_t size); -+int upgrade_itb(char *itb_updated, size_t size); -+int upgrade_rootfs(char *rootfs_updated, size_t size); -+ -+void device_access_init(void); -+ -+#endif /* DEVICE_ACCESS_H */ diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0004-injector.h.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0004-injector.h.patch deleted file mode 100644 index b473edf..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0004-injector.h.patch +++ /dev/null @@ -1,32 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/include/core/injector.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./include/core/injector.h 2025-10-10 17:28:33.584702104 +0200 -@@ -0,0 +1,29 @@ -+ -+/* -+ * Copyright (C) 2014-2019 Daniel Rossier -+ * Copyright (C) 2018-2019 Baptiste Delporte -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#ifndef INJECTOR_CORE_H -+#define INJECTOR_CORE_H -+ -+void injector_init(void); -+void inject_from_BT(void); -+ -+void ME_inject(unsigned char *ME_buffer, uint32_t size); -+ -+#endif /* INJECTOR_CORE_H */ diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0005-leds.h.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0005-leds.h.patch deleted file mode 100644 index 31507e7..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0005-leds.h.patch +++ /dev/null @@ -1,40 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/include/core/leds.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./include/core/leds.h 2025-10-10 17:28:33.584702104 +0200 -@@ -0,0 +1,37 @@ -+/* -+ * Copyright (C) 2018-2019 Baptiste Delporte -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#ifndef LEDS_H -+#define LEDS_H -+ -+#include -+ -+#include -+ -+#define SOO_N_LEDS 6 -+ -+#define SOO_LED_SYSFS_PREFIX "/sys/class/leds/led_d" -+#define SOO_LED_SYSFS_SUFFIX "/brightness" -+ -+void led_set(uint32_t id, uint8_t value); -+void led_on(uint32_t id); -+void led_off(uint32_t id); -+ -+void leds_init(void); -+ -+#endif /* LEDS_H */ diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0006-receive.h.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0006-receive.h.patch deleted file mode 100644 index 1a4b570..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0006-receive.h.patch +++ /dev/null @@ -1,30 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/include/core/receive.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./include/core/receive.h 2025-10-10 17:28:33.584702104 +0200 -@@ -0,0 +1,27 @@ -+/* -+ * Copyright (C) 2014-2019 Daniel Rossier -+ * Copyright (C) 2018-2019 Baptiste Delporte -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#ifndef RECEIVE_H -+#define RECEIVE_H -+ -+#include -+ -+void ME_processing_receive(void); -+ -+#endif /* RECEIVE_H */ diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0007-send.h.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0007-send.h.patch deleted file mode 100644 index 65a13f3..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0007-send.h.patch +++ /dev/null @@ -1,31 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/include/core/send.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./include/core/send.h 2025-10-10 17:28:33.584702104 +0200 -@@ -0,0 +1,28 @@ -+/* -+ * Copyright (C) 2014-2019 Daniel Rossier -+ * Copyright (C) 2018-2019 Baptiste Delporte -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#ifndef SEND_H -+#define SEND_H -+ -+#include -+ -+void try_to_send_ME(void); -+void sig_initiate_migration(int sig); -+ -+#endif /* SEND_H */ diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0008-types.h.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0008-types.h.patch deleted file mode 100644 index 3aae65c..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0008-types.h.patch +++ /dev/null @@ -1,29 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/include/core/types.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./include/core/types.h 2025-10-10 17:28:33.584702104 +0200 -@@ -0,0 +1,26 @@ -+/* -+ * Copyright (C) 2014-2019 Daniel Rossier -+ * Copyright (C) 2018-2019 Baptiste Delporte -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#ifndef TYPES_H -+#define TYPES_H -+ -+#define likely(expr) expr -+#define unlikely(expr) expr -+ -+#endif /* TYPES_H */ diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0009-upgrader.h.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0009-upgrader.h.patch deleted file mode 100644 index 7cd8cc8..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0009-upgrader.h.patch +++ /dev/null @@ -1,52 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/include/core/upgrader.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./include/core/upgrader.h 2025-10-10 17:28:33.584702104 +0200 -@@ -0,0 +1,49 @@ -+/* -+ * Copyright (C) 2019 David Truan -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#ifndef UPGRADER_H -+#define UPGRADER_H -+ -+#define UPGRADABLE_COMPONENTS 3 -+#define UPGRADE_POLL_PERIOD_MS 500 -+ -+/** -+ * Image format: | uncompressed size | ITB version | U-boot version | rootfs version | -+ * The payload is composed of the 3 components as follows: for each component. -+ * Each field except the images themself are on 4B unsigned -+ * -+ */ -+#define HEADER_SIZE (4 + 3 * 4) -+ -+typedef enum { -+ ITB, -+ UBOOT, -+ ROOTFS -+} component_type_t; -+ -+/* Used to pass information between the upgarde stages */ -+typedef struct { -+ char *header; -+ size_t compressed_size; -+ char *decompressed_image; -+ unsigned int ME_slotID; -+} upgrader_args_t; -+ -+void upgrader_init(void); -+ -+#endif /* UPGRADER_H */ diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0010-core.h.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0010-core.h.patch deleted file mode 100644 index b0ae3c7..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0010-core.h.patch +++ /dev/null @@ -1,33 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/include/soo/core.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./include/soo/core.h 2025-10-10 17:28:33.584702104 +0200 -@@ -0,0 +1,30 @@ -+/* -+ * Copyright (C) 2014-2019 Daniel Rossier -+ * Copyright (C) 2018-2019 Baptiste Delporte -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#ifndef CORE_H -+#define CORE_H -+ -+#include -+ -+#include -+ -+#define SOO_VERSION "1.0" -+#define SOO_CORE_DEVICE "/dev/soo/core" -+ -+#endif /* CORE_H */ diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0011-debug.h.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0011-debug.h.patch deleted file mode 100644 index 9ea3b5b..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0011-debug.h.patch +++ /dev/null @@ -1,52 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/include/soo/debug.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./include/soo/debug.h 2025-10-10 17:28:33.584815499 +0200 -@@ -0,0 +1,49 @@ -+/* -+ * Copyright (C) 2014-2019 Daniel Rossier -+ * Copyright (C) 2018-2019 Baptiste Delporte -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#ifndef DEBUG_H -+#define DEBUG_H -+ -+#include -+#include -+ -+#ifdef DEBUG -+#undef DBG -+ -+#define DBG(fmt, ...) \ -+ do { \ -+ printf("(user) %s:%d > "fmt, __func__, __LINE__, ##__VA_ARGS__); \ -+ } while (0) -+ -+#define BUG() do { printf("BUG\n"); fflush(stdout); exit(-1); } while (0); -+ -+#define DBG0(...) DBG("%s", ##__VA_ARGS__) -+ -+#else -+ -+#define DBG(fmt, ...) -+#define RTDBG(fmt, ...) -+#define DBG0(...) -+#define DBG_BUFFER(buffer, ...) -+#define DBG_ON__ -+#define DBG_OFF__ -+ -+#endif -+ -+#endif /* DEBUG_H */ diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0012-soo.h.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0012-soo.h.patch deleted file mode 100644 index 4708110..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0012-soo.h.patch +++ /dev/null @@ -1,101 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/include/soo/uapi/soo.h 1970-01-01 01:00:00.000000000 +0100 -+++ ./include/soo/uapi/soo.h 2025-10-10 17:28:33.584815499 +0200 -@@ -0,0 +1,98 @@ -+/* -+ * Copyright (C) 2014-2025 Daniel Rossier -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#ifndef UAPI_SOO_H -+#define UAPI_SOO_H -+ -+#include -+ -+#define MAX_ME_DOMAINS 5 -+ -+/* -+ * ME states: -+ * - ME_state_stopped: Capsule is stopped (right after start or later) -+ * - ME_state_living: ME is full-functional and activated (all frontend devices are consistent) -+ * - ME_state_suspended: ME is suspended before migrating. This state is maintained for the resident ME instance -+ * - ME_state_hibernate: ME is in a state of hibernate snapshot -+ * - ME_state_resuming: ME ready to perform resuming (after recovering) -+ * - ME_state_awakened: ME is just being awakened -+ * - ME_state_terminated: ME has been terminated (by a shutdown) -+ * - ME_state_dead: ME does not exist -+ */ -+typedef enum { -+ ME_state_stopped, -+ ME_state_living, -+ ME_state_suspended, -+ ME_state_hibernate, -+ ME_state_resuming, -+ ME_state_awakened, -+ ME_state_killed, -+ ME_state_terminated, -+ ME_state_dead -+} ME_state_t; -+ -+/* Keep information about slot availability -+ * FREE: the slot is available (no ME) -+ * BUSY: the slot is allocated a ME -+ */ -+typedef enum { ME_SLOT_FREE, ME_SLOT_BUSY } ME_slotState_t; -+ -+/* ME ID related information */ -+#define ME_NAME_SIZE 40 -+#define ME_SHORTDESC_SIZE 1024 -+ -+/* -+ * Definition of ME ID information used by functions which need -+ * to get a list of running MEs with their information. -+ */ -+typedef struct { -+ uint32_t slotID; -+ ME_state_t state; -+ -+ uint64_t spid; -+ -+ char name[ME_NAME_SIZE]; -+ char shortdesc[ME_SHORTDESC_SIZE]; -+} ME_id_t; -+ -+/* -+ * IOCTL commands for migration. -+ * This part is shared between the kernel and user spaces. -+ */ -+ -+/* -+ * IOCTL codes -+ */ -+ -+#define AGENCY_IOCTL_READ_SNAPSHOT _IOWR('S', 1, agency_ioctl_args_t) -+#define AGENCY_IOCTL_WRITE_SNAPSHOT _IOW('S', 2, agency_ioctl_args_t) -+#define AGENCY_IOCTL_SHUTDOWN _IOW('S', 3, agency_ioctl_args_t) -+#define AGENCY_IOCTL_INJECT_CAPSULE _IOWR('S', 4, agency_ioctl_args_t) -+#define AGENCY_IOCTL_START_CAPSULE _IOWR('S', 5, agency_ioctl_args_t) -+#define AGENCY_IOCTL_GET_ME_ID _IOWR('S', 6, agency_ioctl_args_t) -+#define AGENCY_IOCTL_GET_ME_ID_ARRAY _IOR('S', 7, agency_ioctl_args_t) -+ -+/* struct agency_ioctl_args used in IOCTLs */ -+typedef struct agency_ioctl_args { -+ void *buffer; /* IN/OUT */ -+ int slotID; -+ unsigned capsuleID; -+ long value; /* IN/OUT */ -+} agency_ioctl_args_t; -+ -+#endif /* UAPI_SOO_H */ diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0016-CMakeLists.txt.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0016-CMakeLists.txt.patch deleted file mode 100644 index 4e4af54..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0016-CMakeLists.txt.patch +++ /dev/null @@ -1,19 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/CMakeLists.txt 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/CMakeLists.txt 2025-10-10 17:28:33.593542342 +0200 -@@ -0,0 +1,16 @@ -+ -+ -+add_executable(injector injector.c) -+ -+add_executable(saveme saveme.c) -+add_executable(restoreme restoreme.c) -+add_executable(shutdownme shutdownme.c) -+ -+add_executable(melist melist.c) -+add_executable(fb_mapper fb_mapper.c) -+add_executable(input_forwarding input_forwarding.c) -+ -+add_subdirectory(emiso_engine) -+ -+target_link_libraries(saveme zip) -+target_link_libraries(restoreme zip) diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0017-cli.cpp.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0017-cli.cpp.patch deleted file mode 100644 index dc771a5..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0017-cli.cpp.patch +++ /dev/null @@ -1,127 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/emiso_engine/cli/cli.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/emiso_engine/cli/cli.cpp 2025-10-10 17:28:33.593649878 +0200 -@@ -0,0 +1,123 @@ -+/* -+ * Copyright (C) 2023 Jean-Pierre Miceli -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#include -+#include -+ -+#include "cli.hpp" -+ -+#define EMISO_CLI_PROMPT "(emiso)>> " -+ -+namespace emiso { -+ -+Cli::Cli() {} -+ -+Cli::~Cli() {} -+ -+void Cli::splitCmd(std::string const &str, const char delim, std::vector &out) -+{ -+ // create a stream from the string -+ std::stringstream s(str); -+ -+ std::string s2; -+ while (std::getline (s, s2, delim)) { -+ out.push_back(s2); // store the string in s2 -+ } -+} -+ -+ -+// Function to handle the "hello" command -+void Cli::handleHelloCommand() { -+ std::cout << "Hello, World!" << std::endl; -+} -+ -+// Function to handle the "help" command -+void Cli::handleHelpCommand() { -+ std::cout << "Available commands:" << std::endl; -+ std::cout << " hello - Print a greeting" << std::endl; -+ std::cout << " help - Show available commands" << std::endl; -+ std::cout << " exit - Exit the program" << std::endl; -+} -+ -+ -+void Cli::handleImagesCommand(std::vector &tokens) -+{ -+ std::map info; -+ -+ // TODO - Add checks on 'tokens' -+ if (tokens[1] == "info") { -+ _image.info(info); -+ -+ for (auto it = info.begin(); it != info.end(); ++it) { -+ std::string name = it->second.name; -+ size_t size = it->second.size; -+ std::string id = it->second.id; -+ auto date = it->second.date; -+ -+ std::cout << name << std::endl; -+ std::cout << " Size: " << size << std::endl; -+ std::cout << " ID: " << id << std::endl; -+ std::cout << " date: " << date << std::endl; -+ } -+ } else if (tokens[1] == "rm") { -+ // TODO - Add checks on 'tokens[2]' -+ _image.remove(tokens[2]); -+ } else { -+ std::cout << "[ERROR] image cmd '" << tokens[1] << "' is not supported" << std::endl; -+ } -+} -+ -+void Cli::start() -+{ -+ std::cout << "Starting interactive mode" << std::endl; -+ while (true) { -+ char* input = readline(EMISO_CLI_PROMPT); -+ if (!input) { -+ break; // User pressed Ctrl+D (EOF) -+ } -+ -+ std::string command(input); -+ free(input); -+ -+ // Add the command to readline's history -+ if (!command.empty()) { -+ add_history(command.c_str()); -+ } -+ -+ std::vector tokens; -+ Cli::splitCmd(command, ' ', tokens); -+ -+ -+ if (tokens[0] == "hello") { -+ Cli::handleHelloCommand(); -+ } else if (tokens[0] == "help") { -+ Cli::handleHelpCommand(); -+ } else if (tokens[0] == "image") { -+ Cli::handleImagesCommand(tokens); -+ } else if (tokens[0] == "exit") { -+ break; // Exit the program -+ } else { -+ std::cout << "Unknown command. Type 'help' for a list of available commands." << std::endl; -+ } -+ } -+ -+ std::cout << "Stopping interactive mode" << std::endl; -+ -+} -+ -+} // emiso -\ No newline at end of file diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0018-cli.hpp.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0018-cli.hpp.patch deleted file mode 100644 index 6fb87dd..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0018-cli.hpp.patch +++ /dev/null @@ -1,53 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/emiso_engine/cli/cli.hpp 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/emiso_engine/cli/cli.hpp 2025-10-10 17:28:33.593649878 +0200 -@@ -0,0 +1,50 @@ -+/* -+ * Copyright (C) 2023 Jean-Pierre Miceli -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#ifndef EMISO_CLI_H -+#define EMISO_CLI_H -+ -+#include -+#include -+#include -+ -+#include "../daemon/image.hpp" -+ -+namespace emiso { -+ -+ class Cli { -+ public: -+ Cli(); -+ -+ // Destructor -+ ~Cli(); -+ -+ void start(); -+ -+ private: -+ daemon::Image _image; -+ -+ void splitCmd(std::string const &str, const char delim, std::vector &out); -+ -+ void handleHelloCommand(); -+ void handleHelpCommand(); -+ void handleImagesCommand(std::vector &tockens); -+ }; -+} -+ -+#endif // EMISO_CLI_H diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0019-CMakeLists.txt.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0019-CMakeLists.txt.patch deleted file mode 100644 index 013828e..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0019-CMakeLists.txt.patch +++ /dev/null @@ -1,28 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/emiso_engine/CMakeLists.txt 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/emiso_engine/CMakeLists.txt 2025-10-10 17:28:33.593608138 +0200 -@@ -0,0 +1,25 @@ -+project(emiso_engine LANGUAGES C CXX) -+ -+set(CMAKE_CXX_STANDARD 20) -+set(CMAKE_CXX_STANDARD_REQUIRED ON) -+ -+add_executable(${PROJECT_NAME} emiso_engine.cpp -+ utils.cpp -+ webserver/webserver.cpp -+ webserver/system/system.cpp -+ webserver/container/container.cpp -+ webserver/image/image.cpp -+ webserver/network/network.cpp -+ webserver/volume/volume.cpp -+ webserver/plugins/plugins.cpp -+ daemon/image.cpp -+ daemon/capsule.cpp -+ daemon/daemon.cpp -+ #cli/cli.cpp -+) -+ -+target_include_directories(${PROJECT_NAME} PRIVATE include) -+ -+target_link_libraries(${PROJECT_NAME} httpserver jsoncpp readline zip) -+ -+install(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_BINARY_DIR}/bin) diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0020-capsule.cpp.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0020-capsule.cpp.patch deleted file mode 100644 index 787b478..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0020-capsule.cpp.patch +++ /dev/null @@ -1,545 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/emiso_engine/daemon/capsule.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/emiso_engine/daemon/capsule.cpp 2025-10-10 17:28:33.593649878 +0200 -@@ -0,0 +1,542 @@ -+/* -+ * Copyright (C) 2023 Jean-Pierre Miceli -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+ -+#include -+ -+#include -+ -+#include -+ -+#include "capsule.hpp" -+ -+using namespace std; -+ -+// Path where the Capsule images are stored -+#define EMISO_IMAGE_PATH "/mnt/capsules/image/" -+ -+// Path where the Capsule snapshot are stored -+#define EMISO_CAPSULE_CACHE_DIR "/mnt/capsules/snapshot" -+ -+// Path of SOO driver -+#define SOO_CORE_DRV_PATH "/dev/soo/core" -+ -+#define LOG_PREFIX "[EMISO:DAEMON] " -+ -+namespace emiso { -+ -+map Capsule::_capsules; -+unsigned Capsule::_capsuleIdx = 0; -+ -+Capsule::Capsule(){}; -+ -+Capsule::~Capsule(){}; -+ -+/** -+ * @brief Return NOW in epoch format, in seconds -+ * -+ * It is used to set Capsule's creation time -+ * -+ * @return now, since EPOCH, in second -+ */ -+uint64_t Capsule::createdTime() -+{ -+ const auto now = chrono::system_clock::now(); -+ const auto epoch = chrono::duration_cast(now.time_since_epoch()).count(); -+ -+ return epoch; -+} -+ -+ -+/* -+ * @brief Inject a capsule -+ * -+ * @param imageName Name image, without .itb suffix, used to inject the capsule -+ * @return The ID of the create capsule or a negative value in case of error -+ */ -+int Capsule::inject(string imageName, bool start_capsule, unsigned capsuleId) -+{ -+ int fd; -+ int ret; -+ streampos capsuleSize; -+ string filename; -+ char *capsuleBuf; -+ struct agency_ioctl_args args; -+ -+ cout << LOG_PREFIX "Capsule injection from image " << imageName << endl; -+ -+ filename = std::format("{}{}.itb", EMISO_IMAGE_PATH, imageName); -+ -+ ifstream image(filename, ios::in | ios::binary | ios::ate); -+ if (!image.is_open()) { -+ cerr << LOG_PREFIX "Error: Failed to open image file '" << filename << "'" << endl; -+ return EXIT_FAILURE; -+ } -+ -+ capsuleSize = image.tellg(); -+ -+ capsuleBuf = new char[capsuleSize]; -+ -+ image.seekg(0, ios::beg); -+ image.read(capsuleBuf, capsuleSize); -+ image.close(); -+ -+ args.buffer = capsuleBuf; -+ args.value = capsuleSize; -+ args.slotID = -1; /* Wherever */ -+ args.capsuleID = capsuleId; -+ -+ fd = open(SOO_CORE_DRV_PATH, O_RDWR); -+ if (fd < 0) { -+ cerr << "[EMISO:DAEMON] Failing to open /dev soo entry ..." << endl; -+ delete[] capsuleBuf; -+ return EXIT_FAILURE; -+ } -+ -+ /* Inject the capsule */ -+ ret = ioctl(fd, AGENCY_IOCTL_INJECT_CAPSULE, &args); -+ if ((ret < 0) || (args.slotID == -1)) { -+ cerr << "[EMISO:DAEMON] No available ME slot further..." << endl; -+ close(fd); -+ delete[] capsuleBuf; -+ return EXIT_FAILURE; -+ } -+ -+ if (start_capsule) { -+ ioctl(fd, AGENCY_IOCTL_START_CAPSULE, &args); -+ } -+ -+ delete[] capsuleBuf; -+ close(fd); -+ -+ return args.slotID; -+} -+ -+ -+/* -+ * @brief Save a snapshot of a Capsule -+ * -+ * @param slotId The slot ID of the capsule for which to create a snapshot. -+ * @param snapshotName The name of the snapshot -+ * @return negative value in case of error, 0 otherwise -+ */ -+int Capsule::saveSnapshot(int slotId, string snapshotName) -+{ -+ int fd; -+ int ret; -+ struct agency_ioctl_args args; -+ struct zip_t *zip; -+ string filename; -+ -+ cout << LOG_PREFIX "Save Capsule - slot ID: " << slotId << ", name: " << snapshotName << endl; -+ -+ fd = open(SOO_CORE_DRV_PATH, O_RDWR); -+ if (fd < 0) { -+ printf("[EMISO:DAEMON] Failing to open /dev/soo entry ...\n"); -+ return EXIT_FAILURE; -+ } -+ -+ /* Get the size of the snapshot */ -+ args.slotID = slotId; -+ args.value = 0; /* To get the size of the snapshot */ -+ -+ ret = ioctl(fd, AGENCY_IOCTL_READ_SNAPSHOT, &args); -+ if (ret < 0) { -+ printf(LOG_PREFIX "Get the size with IOCTL_READ_SNAPSHOT failed.\n"); -+ close(fd); -+ return EXIT_FAILURE; -+ } -+ -+ args.buffer = new (std::nothrow) char[args.value]; -+ if (args.buffer == NULL) { -+ printf(LOG_PREFIX " %s - malloc failed\n", __func__); -+ close(fd); -+ return EXIT_FAILURE; -+ } -+ -+ ret = ioctl(fd, AGENCY_IOCTL_READ_SNAPSHOT, &args); -+ if (ret < 0) { -+ printf(LOG_PREFIX "Read the snapshot IOCTL_READ_SNAPSHOT failed.\n"); -+ delete[] args.buffer; -+ close(fd); -+ return EXIT_FAILURE; -+ } -+ -+ close(fd); -+ -+ filename = string(EMISO_CAPSULE_CACHE_DIR) + "/" + snapshotName; -+ -+ cout << "Save capsule in: " << filename << endl; -+ -+ /* Compress the snapshot */ -+ zip = zip_open(filename.c_str(), ZIP_DEFAULT_COMPRESSION_LEVEL, 'w'); -+ if (!zip) { -+ printf(LOG_PREFIX "Failed to open the zip file. Is there a bad sync after saving the snapshot?...\n"); -+ perror(""); -+ delete[] args.buffer; -+ close(fd); -+ return EXIT_FAILURE; -+ } -+ zip_entry_open(zip, "me"); -+ zip_entry_write(zip, args.buffer, args.value); -+ zip_entry_close(zip); -+ -+ zip_close(zip); -+ delete[] args.buffer; -+ -+ return 0; -+} -+ -+/* -+ * @brief Restore a Capsule for a snapshot -+ * -+ * @param snapshotName The name of the snapshot -+ * @return The slot ID used for the capsule or a negative value in case of error -+ */ -+int Capsule::restoreSnapshot(string snapshotName) -+{ -+ int fd; -+ int ret; -+ struct agency_ioctl_args args; -+ size_t buffer_size; -+ struct zip_t *zip; -+ string filename; -+ -+ /* Open the channel to the kernel soo submodule. */ -+ fd = open(SOO_CORE_DRV_PATH, O_RDWR); -+ if ((fd < 0)) { -+ printf(LOG_PREFIX "Failed to open soo /dev entry...\n"); -+ return EXIT_FAILURE; -+ } -+ -+ filename = std::string(EMISO_CAPSULE_CACHE_DIR) + "/" + snapshotName; -+ -+ zip = zip_open(filename.c_str(), 0, 'r'); -+ if (!zip) { -+ printf(LOG_PREFIX "Failed to open the zip file. Is there a bad sync after saving the snapshot?...\n"); -+ close(fd); -+ return EXIT_FAILURE; -+ } -+ -+ zip_entry_open(zip, "me"); -+ zip_entry_read(zip, &args.buffer, &buffer_size); -+ zip_entry_close(zip); -+ -+ zip_close(zip); -+ -+ /* Restore the snapshot which is in stated */ -+ cout << LOG_PREFIX "Re-implementing snapshot of size " << buffer_size << " bytes." << endl; -+ args.slotID = -1; -+ ret = ioctl(fd, AGENCY_IOCTL_WRITE_SNAPSHOT, &args); -+ if (ret < 0) { -+ printf("Failed to initialize migration (%d)\n", ret); -+ close(fd); -+ return EXIT_FAILURE; -+ } -+ -+ close(fd); -+ -+ return args.slotID; -+} -+ -+/* -+ * @brief Shutdown a Capsule -+ * -+ * @param slotId The slot ID of the capsule to shutdown. -+ * @return a negative value in case of error, 0 otherwise -+ */ -+int Capsule::shutdown(int slotId) -+{ -+ int fd; -+ int ret; -+ struct agency_ioctl_args args; -+ -+ fd = open(SOO_CORE_DRV_PATH, O_RDWR); -+ if (fd < 0) { -+ printf("[EMISO:DAEMON] Failing to open /dev/soo entry ...\n"); -+ return EXIT_FAILURE; -+ } -+ -+ /* Shutdown the capsule so that it will be removed from the memory */ -+ args.slotID = slotId; -+ -+ ret = ioctl(fd, AGENCY_IOCTL_SHUTDOWN, &args); -+ if (ret < 0) { -+ printf(LOG_PREFIX "Read the snapshot IOCTL_READ_SNAPSHOT failed.\n"); -+ close(fd); -+ return EXIT_FAILURE; -+ } -+ -+ close(fd); -+ -+ return 0; -+} -+ -+/** -+ * @brief Retrieve the info of all the capsules -+ * -+ * @param capsuleList A map which contains the info of all capsules. -+ */ -+void Capsule::info(map &capsuleList) -+{ -+ capsuleList = _capsules; -+} -+ -+ -+/** -+ * @brief Retrieve the info of a specific capsule -+ * -+ * @param id ID of the capsule from which to retrieve the information -+ * @param info The info of the capsule -+ */ -+void Capsule::info(int id, CapsuleInfo &info) -+{ -+ info = _capsules.at(id); -+} -+ -+ -+/** -+ * @brief The create() method of Capsule leads to the injection of a capsule, but -+ * without starting its execution. It will perform a snapshot, write it to -+ * a specific location and shutdown the stopped capsule. -+ * -+ * @param imageName Name image, without .itb suffix, used to create the capsule -+ * @param capsuleName The name of the capsule to create -+ * @return The ID of the create capsule -+ */ -+int Capsule::create(string imageName, string capsuleName) -+{ -+ int slotId; -+ -+ cout << LOG_PREFIX "Create capsule " << capsuleName << " from image " << imageName << endl; -+ -+ // Inject the Capsule -+ slotId = this->inject(imageName, false, _capsuleIdx); -+ -+ // Save the info of the new capsule -+ CapsuleInfo capsule; -+ capsule.id = _capsuleIdx; -+ capsule.name = capsuleName; -+ capsule.state = "created"; -+ capsule.image = imageName; -+ capsule.slotId = slotId; -+ capsule.created = this->createdTime(); -+ -+ _capsules[_capsuleIdx] = capsule; -+ _capsuleIdx++; -+ -+ // Save the snapshot to the capsule cache directory and shutdown it -+ this->saveSnapshot(slotId, capsuleName); -+ -+ // Shutdown the capsule -+ this->shutdown(slotId); -+ -+ // Set the Capsule state -+ _capsules[capsule.id].state = "created"; -+ -+ return capsule.id; -+} -+ -+/** -+ * @brief Start an existing capsule -+ * -+ * Depending in the state of the capsule, it is restored or injected -+ * -+ * @param capsuleName -+ * @param capsuleId -+ * @return -+ */ -+int Capsule::start(unsigned capsuleId) -+{ -+ int ret; -+ string capsuleName = _capsules[capsuleId].name; -+ int slotId; -+ -+ cout << LOG_PREFIX "Start capsule " << capsuleName << endl; -+ -+ if (_capsules[capsuleId].state == "created") { -+ slotId = this->restoreSnapshot(capsuleName); -+ -+ } else if (_capsules[capsuleId].state == "exited") { -+ slotId = this->inject(_capsules[capsuleId].image, true, capsuleId); -+ -+ } else { -+ cerr << "[EMISO:DAEMON] Capsule start failed. The capsule it is not in a correct state (" -+ << _capsules[capsuleId].state << ")" << endl; -+ return -1; -+ } -+ -+ _capsules[capsuleId].state = "running"; -+ _capsules[capsuleId].slotId = slotId; -+ -+ return ret; -+} -+ -+ -+/** -+ * @brief Shutdown a capsule -+ * -+ * @param capsuleId ID of the capsule to shutdown -+ * @return 0 in case of success or a negative value -+ */ -+int Capsule::stop(unsigned capsuleId) -+{ -+ int ret; -+ struct agency_ioctl_args args; -+ -+ ret = this->shutdown(_capsules[capsuleId].slotId); -+ -+ _capsules[capsuleId].state = "exited"; -+ -+ return ret; -+} -+ -+ -+/** -+ * @brief Restart a capsule -+ * -+ * @param capsuleId ID of the capsule to shutdown -+ * @return 0 in case of success or a negative value -+ */ -+int Capsule::restart(unsigned capsuleId) -+{ -+ int ret; -+ -+ auto imageName = _capsules[capsuleId].image; -+ auto capsuleName = _capsules[capsuleId].name; -+ -+ // Stop & remove the capsule -+ ret = this->shutdown(capsuleId); -+ if (ret < 0) -+ return ret; -+ -+ // re-create the capsule -+ ret = this->inject(imageName, true, capsuleId); -+ if (ret < 0) -+ return ret; -+ -+ _capsules[capsuleId].state = "running"; -+ -+ return 0; -+} -+ -+ -+/** -+ * @brief Pause a capsule -+ * -+ * @param capsuleId ID of the capsule to pause -+ * @return 0 in case of success or a negative value -+ */ -+int Capsule::pause(unsigned capsuleId) -+{ -+ int ret; -+ -+ cout << LOG_PREFIX "Pause capsule with ID " << capsuleId << endl; -+ -+ this->saveSnapshot(_capsules[capsuleId].slotId, _capsules[capsuleId].name); -+ -+ this->shutdown(_capsules[capsuleId].slotId); -+ -+ _capsules[capsuleId].state = "paused"; -+ -+ return ret; -+} -+ -+ -+/** -+ * @brief Unpause a capsule -+ * -+ * @param capsuleId ID of the capsule to pause -+ * @return 0 in case of success or a negative value -+ */ -+int Capsule::unpause(unsigned capsuleId) -+{ -+ int ret; -+ -+ ret = this->restoreSnapshot(_capsules[capsuleId].name); -+ _capsules[capsuleId].state = "running"; -+ -+ return ret; -+} -+ -+/** -+ * @brief Remove a capsule -+ * -+ * @param capsuleId ID of the capsule to pause -+ * @return 0 in case of success or a negative value -+ */ -+int Capsule::remove(unsigned capsuleId) -+{ -+ int ret = 0; -+ -+ if (_capsules[capsuleId].state == "running") -+ ret = this->shutdown(_capsules[capsuleId].slotId); -+ -+ if (ret == 0) -+ _capsules.erase(capsuleId); -+ -+ return ret; -+} -+ -+vector Capsule::retrieveLogs(unsigned capsuleId, unsigned lineNr) -+{ -+ vector lines; -+ -+ // Create the file path -+ string fileName = "/var/log/soo/me_" + to_string(capsuleId) + ".log"; -+ -+ cout << "[DEBUG] Logfile name: " << fileName << endl; -+ -+ // Read the file -+ ifstream file(fileName); -+ -+ if (!file.is_open()) { -+ cerr << "Error opening file: " << fileName << endl; -+ return lines; // return empty vector if file couldn't be opened -+ } -+ -+ // Read the whole file -+ if (lineNr == -1) { -+ // Count the number of lines -+ lineNr = count(istreambuf_iterator(file), -+ istreambuf_iterator(), '\n'); -+ -+ -+ // Reset the file stream back to beginning -+ file.clear(); -+ file.seekg(0, ios::beg); -+ } -+ -+ string line; -+ while (getline(file, line) && lineNr-- > 0) { -+ lines.push_back(line); -+ } -+ -+ file.close(); -+ return lines; -+} -+ -+} // namespace emiso diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0021-capsule.hpp.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0021-capsule.hpp.patch deleted file mode 100644 index e718b0e..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0021-capsule.hpp.patch +++ /dev/null @@ -1,75 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/emiso_engine/daemon/capsule.hpp 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/emiso_engine/daemon/capsule.hpp 2025-10-10 17:28:33.593796339 +0200 -@@ -0,0 +1,72 @@ -+/* -+ * Copyright (C) 2023 Jean-Pierre Miceli -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#ifndef EMISO_DAEMON_CAPSULE_H -+#define EMISO_DAEMON_CAPSULE_H -+ -+#include -+#include -+#include -+ -+using namespace std; -+ -+namespace emiso { -+ -+ struct CapsuleInfo { -+ int id; -+ string name; -+ string state; -+ string image; -+ uint64_t created; -+ int slotId; -+ }; -+ -+ class Capsule { -+ -+ public: -+ Capsule(); -+ ~Capsule(); -+ -+ void info(map &capsuleList); -+ void info(int id, CapsuleInfo &info); -+ -+ int create(string imageName, string capsuleName); -+ int start(unsigned capsuleId); -+ int stop(unsigned capsuleId); -+ int restart(unsigned capsuleId); -+ int pause(unsigned capsuleId); -+ int unpause(unsigned capsuleId); -+ int remove(unsigned capsuleId); -+ -+ vector retrieveLogs(unsigned capsuleId, unsigned lineNr); -+ -+ private: -+ uint64_t createdTime(); -+ int inject(string imageName, bool start_capsule, unsigned capsuleId); -+ int saveSnapshot(int slotId, string snapshotName); -+ int restoreSnapshot(string snapshotName); -+ int shutdown(int slotId); -+ -+ // List of the Capsules - running or paused -+ static map _capsules; -+ // Capsule Idx, used with the map -+ static unsigned _capsuleIdx; -+ }; -+} -+ -+#endif // EMISO_DAEMON_CAPSULE_H diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0022-daemon.cpp.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0022-daemon.cpp.patch deleted file mode 100644 index 6350dc1..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0022-daemon.cpp.patch +++ /dev/null @@ -1,43 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/emiso_engine/daemon/daemon.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/emiso_engine/daemon/daemon.cpp 2025-10-10 17:28:33.593796339 +0200 -@@ -0,0 +1,40 @@ -+/* -+ * Copyright (C) 2023 Jean-Pierre Miceli -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#include "daemon.hpp" -+ -+namespace emiso { -+ -+Daemon* Daemon::_daemon = nullptr; -+ -+Daemon::Daemon() {}; -+ -+Daemon::~Daemon() {}; -+ -+ -+Daemon* Daemon::getInstance() -+{ -+ -+ if (_daemon == nullptr) { -+ _daemon = new Daemon(); -+ } -+ -+ return _daemon; -+} -+ -+} // namespace emiso diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0023-daemon.hpp.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0023-daemon.hpp.patch deleted file mode 100644 index d25a54d..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0023-daemon.hpp.patch +++ /dev/null @@ -1,49 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/emiso_engine/daemon/daemon.hpp 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/emiso_engine/daemon/daemon.hpp 2025-10-10 17:28:33.593796339 +0200 -@@ -0,0 +1,46 @@ -+/* -+ * Copyright (C) 2024 Jean-Pierre Miceli -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+ -+#ifndef EMISO_DAEMON_H -+#define EMISO_DAEMON_H -+ -+#include "image.hpp" -+#include "capsule.hpp" -+ -+ -+namespace emiso { -+ -+ class Daemon { -+ -+ public: -+ Image image; -+ Capsule container; -+ -+ static Daemon* getInstance(); -+ -+ private: -+ Daemon(); -+ ~Daemon(); -+ -+ static Daemon* _daemon; -+ }; -+} -+ -+#endif // EMISO_DAEMON_H -+ diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0024-image.cpp.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0024-image.cpp.patch deleted file mode 100644 index 1b77c3e..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0024-image.cpp.patch +++ /dev/null @@ -1,176 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/emiso_engine/daemon/image.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/emiso_engine/daemon/image.cpp 2025-10-10 17:28:33.593796339 +0200 -@@ -0,0 +1,173 @@ -+/* -+ * Copyright (C) 2023 Jean-Pierre Miceli -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#include -+#include -+ -+#include -+#include -+ -+ -+#include "image.hpp" -+ -+// Path where the Capsule images are stored -+#define EMISO_IMAGE_PATH "/mnt/capsules/image/" -+#define EMISO_IMAGE_ID_MODE "md5" -+ -+namespace emiso { -+ -+Image::Image() {}; -+ -+Image::~Image() {}; -+ -+namespace fs = std::filesystem; -+ -+std::string Image::calculateId(const std::string& filePath) -+{ -+ std::ifstream file(filePath, std::ios::binary); -+ if (!file) { -+ std::cerr << "Failed to open file '" << filePath << "'" << std::endl; -+ return ""; -+ } -+ -+ // Create an MD5 hash function -+ std::hash md5Hash; -+ -+ // Read the file content and calculate the MD5 checksum -+ std::stringstream buffer; -+ buffer << file.rdbuf(); -+ std::string fileContent = buffer.str(); -+ std::string id = std::to_string(md5Hash(fileContent)); -+ -+ return id; -+} -+ -+ -+int Image::createdTime(const std::string& filePath) -+{ -+ try { -+ // Check if the file exists and retrieve its status -+ if (fs::exists(filePath)) { -+ fs::file_time_type fileTime = fs::last_write_time(filePath); -+ -+ // Convert file_time_type → system_clock::time_point -+ auto sctp = std::chrono::clock_cast(fileTime); -+ -+ // Get Unix timestamp -+ std::time_t unix_ts = std::chrono::system_clock::to_time_t(sctp); -+ -+ return unix_ts; -+ } else { -+ std::cout << "[WARNING] File '" << filePath << "' does not exist." << std::endl; -+ return -1; -+ } -+ -+ } catch (const std::filesystem::filesystem_error& e) { -+ std::cerr << "[ERROR]: " << e.what() << std::endl; -+ return -1; -+ } -+} -+ -+ -+void Image::info(std::map &imagesList) -+{ -+ // Check if the folder exists -+ if (std::filesystem::exists(EMISO_IMAGE_PATH) && std::filesystem::is_directory(EMISO_IMAGE_PATH)) { -+ // Iterate through the files in the folder -+ for (const auto& entry : std::filesystem::directory_iterator(EMISO_IMAGE_PATH)) { -+ if (std::filesystem::is_regular_file(entry)) { -+ ImageInfo info; -+ -+ info.name = entry.path().filename(); -+ info.size = std::filesystem::file_size(entry); -+ info.date = this->createdTime(EMISO_IMAGE_PATH + info.name); -+ -+ auto id = this->calculateId(EMISO_IMAGE_PATH + info.name); -+ std::string mode = EMISO_IMAGE_ID_MODE; -+ info.id = mode + ":" + id; -+ -+ imagesList[info.name] = info; -+ } -+ } -+ } else { -+ std::cerr << "Folder '" << EMISO_IMAGE_PATH << "' does not exist or is not a directory." << std::endl; -+ } -+} -+ -+int Image::info(std::string name, ImageInfo &info) -+{ -+ bool isID = false; -+ std::string id_orig; -+ -+ // The 'name' parameter can be the image name of the image ID -+ -+ std::cout << "info a image '" << name << "' called" << std::endl; -+ -+ // 1. extracting the "code" from the 'name' -+ auto pos = name.find(':'); -+ if (pos != std::string::npos) { -+ id_orig = name.substr(pos + 1); -+ -+ } else { -+ id_orig = this->calculateId(EMISO_IMAGE_PATH + name + ".itb"); -+ } -+ -+ // == Searching for the image which has this ID == -+ -+ // Iterate through the files in the folder -+ for (const auto& entry : std::filesystem::directory_iterator(EMISO_IMAGE_PATH)) { -+ if (std::filesystem::is_regular_file(entry)) { -+ info.name = entry.path().filename(); -+ auto id = this->calculateId(EMISO_IMAGE_PATH + info.name); -+ -+ if (id == id_orig) { -+ info.size = std::filesystem::file_size(entry); -+ info.date = this->createdTime(EMISO_IMAGE_PATH + info.name); -+ std::string mode = EMISO_IMAGE_ID_MODE; -+ info.id = mode + ":" + id; -+ -+ return 0; -+ } -+ } -+ } -+ -+ // No image found with the same ID as the one in 'image' parameter -+ std::cerr << "[ERROR]: Image '" << name << "' not found" << std::endl; -+ return -1; -+} -+ -+void Image::remove(std::string name) -+{ -+ std::filesystem::path filePath = EMISO_IMAGE_PATH + name; -+ -+ if (std::filesystem::exists(filePath)) { -+ try { -+ // Remove the file -+ std::filesystem::remove(filePath); -+ -+ std::cout << "File removed successfully." << std::endl; -+ } catch (const std::filesystem::filesystem_error& e) { -+ std::cerr << "Error removing file: " << e.what() << std::endl; -+ -+ } -+ } else { -+ std::cout << "[WARNING] File '" << filePath << "' does not exists" << std::endl; -+ } -+} -+ -+} // emiso diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0025-image.hpp.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0025-image.hpp.patch deleted file mode 100644 index 3442ee3..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0025-image.hpp.patch +++ /dev/null @@ -1,66 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/emiso_engine/daemon/image.hpp 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/emiso_engine/daemon/image.hpp 2025-10-10 17:28:33.593796339 +0200 -@@ -0,0 +1,63 @@ -+/* -+ * Copyright (C) 2023 Jean-Pierre Miceli -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#ifndef EMISO_DAEMON_IMAGE_H -+#define EMISO_DAEMON_IMAGE_H -+ -+#include -+#include -+#include -+#include -+ -+namespace emiso { -+// namespace daemon { -+ -+ struct ImageInfo { -+ std::string id; -+ std::string name; -+ size_t size; -+ uint64_t date; -+ }; -+ -+ class Image { -+ -+ public: -+ Image(); -+ ~Image(); -+ -+ // Retrieve information about all the images -+ void info(std::map &imagesList); -+ -+ // Retrieve info about image 'name' -+ // return 0 in case of success, -1 otherwise -+ int info(std::string name, ImageInfo &info); -+ -+ // Remove image 'name' from the disk -+ void remove(std::string name); -+ private: -+ // The ID corresponds to the MD5 checksum -+ std::string calculateId(const std::string& filePath); -+ -+ // Get the date at which the image was created (Unix timestamp) -+ int createdTime(const std::string& filePath); -+ -+ }; -+// } -+} -+ -+#endif // EMISO_DAEMON_IMAGE_H diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0026-emiso_engine.cpp.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0026-emiso_engine.cpp.patch deleted file mode 100644 index abae6e7..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0026-emiso_engine.cpp.patch +++ /dev/null @@ -1,71 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/emiso_engine/emiso_engine.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/emiso_engine/emiso_engine.cpp 2025-10-10 17:28:33.593796339 +0200 -@@ -0,0 +1,68 @@ -+/* -+ * Copyright (C) 2023 Jean-Pierre Miceli -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+// EMISO Engine - Start the engine on port '2375'. It can be started in secure -+// mode (HTTPS/TLS) with '-s' option -+// The interactive mode ('-i' option) starts a cli interface instead of the web -+// server -+ -+#include -+#include -+ -+#include "webserver/webserver.hpp" -+// #include "cli/cli.hpp" -+#include "daemon/daemon.hpp" -+ -+#define SERVER_PORT 2375 -+ -+int main(int argc, char **argv) -+{ -+ int c; -+ bool secure = false; -+ bool interactive = false; -+ -+ // TODO - Use C++ parameter handler lib ! -+ while ((c = getopt(argc, argv, "is")) != EOF) { -+ switch (c) { -+ case 'i': -+ interactive = true; -+ break; -+ case 's': -+ secure = true; -+ break; -+ default: -+ // usage(); -+ exit(1); -+ break; -+ } -+ } -+ -+ emiso::Daemon *daemon = emiso::Daemon::getInstance(); -+ -+// if (interactive) { -+// emiso::Cli cli; -+// cli.start(); -+// -+// } else { -+ // TODO - in interactive mode, also start the webserver ! -+ emiso::WebServer server(SERVER_PORT, secure, daemon); -+ server.start(true); -+// } -+ -+ return 0; -+} diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0027-config.hpp.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0027-config.hpp.patch deleted file mode 100644 index 02bdd95..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0027-config.hpp.patch +++ /dev/null @@ -1,37 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/emiso_engine/include/emiso/config.hpp 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/emiso_engine/include/emiso/config.hpp 2025-10-10 17:28:33.593945536 +0200 -@@ -0,0 +1,34 @@ -+/* -+ * Copyright (C) 2023 Jean-Pierre Miceli -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+/* Basic - Constant configuration for EMISO engine */ -+ -+#ifndef EMISO_CONFIG_H -+#define EMISO_CONFIG_H -+ -+#define EMISO_VERSION "1.0" -+#define EMISO_PLATFORM_NAME "emiso" -+ -+// Webserver configuration -+#define EMISO_WEB_COMP_NAME "engine" -+#define EMISO_WEB_API_VERSION "1.43" -+#define EMISO_WEB_EXPERIMENTAL false -+#define EMISO_WEB_SWARM "inactive" -+ -+#endif // EMISO_CONFIG_H -+ diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0028-utils.hpp.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0028-utils.hpp.patch deleted file mode 100644 index b3a28ad..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0028-utils.hpp.patch +++ /dev/null @@ -1,74 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/emiso_engine/include/emiso/utils.hpp 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/emiso_engine/include/emiso/utils.hpp 2025-10-10 17:28:33.593969054 +0200 -@@ -0,0 +1,71 @@ -+/* -+ * Copyright (C) 2023 Jean-Pierre Miceli -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+/* Provide basic functions for the EMISO engine */ -+ -+#ifndef EMISO_UTILS_H -+#define EMISO_UTILS_H -+ -+#include -+ -+namespace emiso { -+ -+ struct SystemInfo { -+ std::string kernel_version; -+ std::string os; -+ std::string os_version; -+ std::string os_type; -+ std::string arch; -+ }; -+ -+ class Utils { -+ -+ public: -+ static Utils& getInstance() { -+ // Create the instance if it doesn't exist -+ static Utils instance; -+ return instance; -+ } -+ -+ /* Return info in the platform */ -+ SystemInfo getInfo(); -+ -+ // Return the current system time, in RFC 3339 format with nano-seconds -+ std::string getSystemTime(); -+ -+ // Return the Agency UUID of the Smart Object -+ std::string getAgencyUID(); -+ -+ private: -+ SystemInfo _info; -+ -+ Utils(); -+ ~Utils(); -+ -+ // Make copy constructor and assignment operator private to prevent copying -+ Utils(const Utils&) = delete; -+ Utils& operator=(const Utils&) = delete; -+ }; -+ -+} // emiso -+ -+#endif // EMISO_UTILS_H -+ -+ -+ -+ diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0029-utils.cpp.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0029-utils.cpp.patch deleted file mode 100644 index c628c03..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0029-utils.cpp.patch +++ /dev/null @@ -1,117 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/emiso_engine/utils.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/emiso_engine/utils.cpp 2025-10-10 17:28:33.593969054 +0200 -@@ -0,0 +1,114 @@ -+/* -+ * Copyright (C) 2023 Jean-Pierre Miceli -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include -+ -+#define EMISO_OS_RELEASE_PATH "/etc/os-release" -+#define EMISO_AGENCY_UID_PATH "/sys/soo/agencyUID" -+ -+namespace emiso { -+ -+Utils::Utils () -+{ -+ // Retrieve platform info -+ struct utsname unameData; -+ if (uname(&unameData) != -1) { -+ _info.kernel_version = unameData.release; -+ _info.os_type = unameData.sysname; -+ _info.arch = unameData.machine; -+ } -+ -+ // Retrieve OS information -+ std::ifstream osReleaseFile(EMISO_OS_RELEASE_PATH); -+ if (osReleaseFile.is_open()) { -+ std::string line; -+ while (std::getline(osReleaseFile, line)) { -+ if (line.find("PRETTY_NAME=") != std::string::npos) { -+ _info.os = line.substr(13); -+ } -+ if (line.find("VERSION=") != std::string::npos) { -+ _info.os_version = line.substr(8); -+ } -+ } -+ osReleaseFile.close(); -+ } else { -+ std::cerr << "Failed to open /etc/os-release" << std::endl; -+ } -+} -+ -+Utils::~Utils() {} -+ -+SystemInfo Utils::getInfo() -+{ -+ return _info; -+} -+ -+ -+std::string Utils::getSystemTime() -+{ -+ // Get the current time with nanoseconds -+ auto currentTime = std::chrono::system_clock::now(); -+ -+ // Convert to RFC 3339 format with nanoseconds -+ auto timeT = std::chrono::system_clock::to_time_t(currentTime); -+ auto fractionalSeconds = std::chrono::duration_cast(currentTime.time_since_epoch()).count() % 1000000000; -+ struct tm timeinfo; -+ gmtime_r(&timeT, &timeinfo); -+ -+ // Format the date and time -+ char buffer[64]; // Sufficient size for RFC 3339 format -+ strftime(buffer, sizeof(buffer), "%Y-%m-%dT%H:%M:%S", &timeinfo); -+ -+ // Create an output string stream to capture the formatted time -+ std::ostringstream formattedTime; -+ formattedTime << buffer << "." << std::setw(9) << std::setfill('0') << fractionalSeconds << "Z"; -+ -+ // Get the formatted time as a string -+ return formattedTime.str(); -+} -+ -+ -+std::string Utils::getAgencyUID() -+{ -+ std::ifstream sysfsFile(EMISO_AGENCY_UID_PATH); -+ if (!sysfsFile.is_open()) { -+ std::cerr << "Failed to open sysfs file: " << EMISO_AGENCY_UID_PATH << std::endl; -+ // TODO - handle error -+ } -+ -+ std::string fileContent; -+ std::getline(sysfsFile, fileContent); // Read the content of the file -+ -+ sysfsFile.close(); // Close the file -+ -+ if (sysfsFile.fail()) { -+ std::cerr << "Error occurred while reading the sysfs file." << std::endl; -+ // TODO - handle error -+ } -+ -+ return fileContent; -+} -+ -+ -+} // emiso diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0030-container.cpp.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0030-container.cpp.patch deleted file mode 100644 index ba699dc..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0030-container.cpp.patch +++ /dev/null @@ -1,78 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/emiso_engine/webserver/container/container.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/emiso_engine/webserver/container/container.cpp 2025-10-10 17:28:33.594021097 +0200 -@@ -0,0 +1,75 @@ -+/* -+ * Copyright (C) 2023 Jean-Pierre Miceli -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#include "container.hpp" -+ -+namespace emiso { -+ -+ namespace container { -+ -+ ContainerApi::ContainerApi(httpserver::webserver *server, Daemon *daemon) -+ : _server(server) { -+ string path = "/containers"; -+ -+ // Create routes and handlers -+ _listHandler = new ListHandler(daemon); -+ _createHandler = new CreateHandler(daemon); -+ _startHandler = new StartHandler(daemon); -+ _stopHandler = new StopHandler(daemon); -+ _restartHandler = new RestartHandler(daemon); -+ _pauseHandler = new PauseHandler(daemon); -+ _unpauseHandler = new UnpauseHandler(daemon); -+ _removeHandler = new RemoveHandler(daemon); -+ _inspectHandler = new InspectHandler(daemon); -+ _logsHandler = new LogsHandler(daemon); -+ -+ _server->register_resource(path + "/json", _listHandler); -+ _server->register_resource("/v[1-9]+.[0-9]+" + path + "/json", _listHandler); -+ -+ _server->register_resource(path + "/create", _createHandler); -+ _server->register_resource("/v[1-9]+.[0-9]+" + path + "/create", _createHandler); -+ -+ _server->register_resource(path + "/{[a-zA-Z0-9_-]+}/start", _startHandler); -+ _server->register_resource("/v[1-9]+.[0-9]+" +path + "/{[a-zA-Z0-9_-]+}/start", _startHandler); -+ -+ _server->register_resource(path + "/{id|[0-9]+}/stop", _stopHandler); -+ _server->register_resource("/v[1-9]+.[0-9]+" + path + "/{id|[0-9]+}/stop", _stopHandler); -+ -+ _server->register_resource(path + "/{id|[0-9]+}/restart", _restartHandler); -+ _server->register_resource("/v[1-9]+.[0-9]+" + path + "/{id|[0-9]+}/restart", _restartHandler); -+ -+ _server->register_resource(path + "/{id|[0-9]+}/pause", _pauseHandler); -+ _server->register_resource("/v[1-9]+.[0-9]+" + path + "/{id|[0-9]+}/pause", _pauseHandler); -+ -+ _server->register_resource(path + "/{id|[0-9]+}/unpause", _unpauseHandler); -+ _server->register_resource("/v[1-9]+.[0-9]+" + path + "/{id|[0-9]+}/unpause", _unpauseHandler); -+ -+ _server->register_resource(path + "/{id|[0-9]+}", _removeHandler); -+ _server->register_resource("/v[1-9]+.[0-9]+" + path + "/{id|[0-9]+}", _removeHandler); -+ -+ _server->register_resource(path + "/{id|[0-9]+}/json", _inspectHandler); -+ _server->register_resource("/v[1-9]+.[0-9]+" + path + "/{id|[0-9]+}/json", _inspectHandler); -+ -+ _server->register_resource(path + "/{id|[0-9]+}/logs", _logsHandler); -+ _server->register_resource("/v[1-9]+.[0-9]+" + path + "/{id|[0-9]+}/logs", _logsHandler); -+ } -+ -+ ContainerApi::~ContainerApi() {} -+ -+ } -+} diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0031-container.hpp.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0031-container.hpp.patch deleted file mode 100644 index bd4fc6a..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0031-container.hpp.patch +++ /dev/null @@ -1,428 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/emiso_engine/webserver/container/container.hpp 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/emiso_engine/webserver/container/container.hpp 2025-10-10 17:28:33.594049579 +0200 -@@ -0,0 +1,425 @@ -+/* -+ * Copyright (C) 2023 Jean-Pierre Miceli -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#ifndef EMISO_CONTAINER_H -+#define EMISO_CONTAINER_H -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "../../daemon/daemon.hpp" -+ -+#include "container_inspect.hpp" -+#include "container_logs.hpp" -+ -+#define LOG_PREFIX "[EMISO:WEBSERVER] " -+ -+using namespace std; -+ -+namespace emiso { -+namespace container { -+ -+ class ListHandler : public httpserver::http_resource { -+ public: -+ ListHandler(Daemon *daemon) : _daemon(daemon) {}; -+ -+ shared_ptr render_GET(const httpserver::http_request &req) { -+ string payload_str = ""; -+ Json::Value payload_json; -+ -+ cout << LOG_PREFIX "'" << req.get_path() << "' (" << req.get_method() << ") called" << endl; -+ -+ // Retrieve the command args - -+ // only "all" and "filters/name" args are handled -+ bool allArg = false; -+ bool sizeArg = false; -+ string filtersArg = ""; -+ -+ for (const auto &arg : req.get_args()) { -+ if (string(arg.first) == "all") { -+ allArg = (string(arg.second) == "true"); -+ } -+ if (arg.first == "filters") { -+ filtersArg = arg.second; -+ } -+ } -+ -+ vector namesFilter; -+ -+ if (!filtersArg.empty()) { -+ Json::CharReaderBuilder readerBuilder; -+ Json::Value filtersJsonValue; -+ istringstream filtersJsonStream(filtersArg); -+ -+ if (!Json::parseFromStream(readerBuilder, filtersJsonStream, &filtersJsonValue, nullptr)) { -+ // Parsing failed, handle the error as needed -+ cerr << LOG_PREFIX "Error parsing JSON!" << endl; -+ } -+ -+ if (filtersJsonValue.isMember("name")) { -+ for (int i = 0; i < filtersJsonValue["name"].size(); ++i) { -+ namesFilter.push_back(filtersJsonValue["name"][i].asString()); -+ } -+ } -+ } -+ -+ // Retrieve container info -+ map info; -+ -+ _daemon->container.info(info); -+ -+ if (info.empty()) { -+ payload_json = Json::arrayValue; -+ } else { -+ unsigned idx = 0; -+ for (auto it = info.begin(); it != info.end(); ++it) { -+ -+ // == Checks the args passed to the command == -+ -+ // 'all' - if true, return all containers. else only running -+ // containers are returned. -+ if ((!allArg) && (it->second.state != "running")) { -+ // Only return running containers -+ continue; -+ } -+ -+ // 'filters' (only name filter is supported) -+ bool nameFound = false; -+ if (!namesFilter.empty()) { -+ for (const auto &pattern : namesFilter) { -+ regex regexPattern(pattern); -+ if (regex_match("/" + it->second.name, regexPattern)) { -+ nameFound = true; -+ break; -+ } -+ } -+ } else { -+ nameFound = true; -+ } -+ -+ if (!nameFound) { -+ continue; -+ } -+ -+ // Retrieve info about the image used to create the container -+ ImageInfo imageInfo; -+ _daemon->image.info(it->second.image, imageInfo); -+ -+ // == Return info of the container == -+ -+ payload_json[idx]["Id"] = to_string(it->second.id); -+ payload_json[idx]["Names"][0] = "/" + it->second.name; -+ -+ payload_json[idx]["Image"] = it->second.image + ":latest"; -+ payload_json[idx]["ImageID"] = imageInfo.id; -+ payload_json[idx]["Command"] = "/inject"; -+ -+ payload_json[idx]["Created"] = it->second.created; -+ payload_json[idx]["Ports"] = Json::arrayValue; -+ payload_json[idx]["Labels"] = Json::objectValue; -+ payload_json[idx]["State"] = it->second.state; -+ payload_json[idx]["Status"] = it->second.state; -+ -+ // Network setting as the values obtained on the test PC -+ payload_json[idx]["HostConfig"]["NetworkMode"] = "bridge"; -+ payload_json[idx]["NetworkSettings"]["Networks"]["bridge"]["IPAMConfig"] = Json::objectValue; -+ payload_json[idx]["NetworkSettings"]["Networks"]["bridge"]["Links"] = Json::Value::null; -+ payload_json[idx]["NetworkSettings"]["Networks"]["bridge"]["Aliases"] = Json::Value::null; -+ -+ payload_json[idx]["NetworkSettings"]["Networks"]["bridge"]["NetworkID"] = "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812", -+ -+ payload_json[idx]["NetworkSettings"]["Networks"]["bridge"]["EndpointID"] = ""; -+ payload_json[idx]["NetworkSettings"]["Networks"]["bridge"]["Gateway"] = ""; -+ payload_json[idx]["NetworkSettings"]["Networks"]["bridge"]["IPAddress"] = ""; -+ payload_json[idx]["NetworkSettings"]["Networks"]["bridge"]["IPPrefixLen"] = 0; -+ payload_json[idx]["NetworkSettings"]["Networks"]["bridge"]["IPv6Gateway"] = ""; -+ payload_json[idx]["NetworkSettings"]["Networks"]["bridge"]["GlobalIPv6Address"] = ""; -+ payload_json[idx]["NetworkSettings"]["Networks"]["bridge"]["GlobalIPv6PrefixLen"] = 0; -+ payload_json[idx]["NetworkSettings"]["Networks"]["bridge"]["MacAddress"] = ""; -+ payload_json[idx]["NetworkSettings"]["Networks"]["bridge"]["DriverOpts"] = Json::Value::null; -+ payload_json[idx]["Mounts"] = Json::arrayValue; -+ -+ idx++; -+ } -+ } -+ -+ Json::StreamWriterBuilder builder; -+ -+ payload_str = Json::writeString(builder, payload_json); -+ auto response = make_shared(payload_str, -+ httpserver::http::http_utils::http_ok, "application/json"); -+ return response; -+ } -+ -+ private: -+ Daemon *_daemon; -+ }; -+ -+ -+ class CreateHandler : public httpserver::http_resource { -+ public: -+ CreateHandler(Daemon *daemon) : _daemon(daemon) {}; -+ -+ shared_ptr render_POST(const httpserver::http_request &req) { -+ string payload_str = ""; -+ Json::Value payload_json; -+ int containerId; -+ string containerName; -+ -+ cout << LOG_PREFIX "'" << req.get_path() << "' (" << req.get_method() << ") called" << endl; -+ -+ // Extract info from body -+ const string requestBody = string(req.get_content()); -+ -+ // Retrieve the 'name' from request args -+ for (const auto &arg : req.get_args()) { -+ if (string(arg.first) == "name") { -+ containerName = string(arg.second); -+ } -+ } -+ -+ Json::Value jsonData; -+ Json::Reader jsonReader; -+ -+ if (!jsonReader.parse(requestBody, jsonData)) { -+ cout << "Failed to parse requestBody" << endl; -+ // JSON parsing error -+ // Return error message -+ } -+ -+ string imageName = jsonData["Image"].asString(); -+ -+ // Remove the image version of the name -+ size_t colonPosition = imageName.find(':'); -+ imageName = imageName.substr(0, colonPosition); -+ -+ cout << LOG_PREFIX "Create container '" << containerName << "' based on '" << imageName << "' name" << endl; -+ -+ unsigned id = _daemon->container.create(imageName, containerName); -+ cout << " Container ID: " << id << endl; -+ -+ // build the response -+ payload_json["Id"] = std::to_string(id); -+ payload_json["Warnings"] = Json::arrayValue; -+ -+ Json::StreamWriterBuilder builder; -+ payload_str = Json::writeString(builder, payload_json); -+ -+ auto response = make_shared(payload_str, -+ httpserver::http::http_utils::http_created, "application/json"); -+ return response; -+ } -+ -+ private: -+ Daemon *_daemon; -+ }; -+ -+ class StartHandler : public httpserver::http_resource { -+ public: -+ StartHandler(Daemon *daemon) : _daemon(daemon) {}; -+ -+ shared_ptr render_POST(const httpserver::http_request &req) { -+ string payload_str = ""; -+ Json::Value payload_json; -+ -+ cout << LOG_PREFIX << "'" << req.get_path() << "' (" << req.get_method() << ") called" << endl; -+ -+ // Extract info from body -+ const string requestBody = string(req.get_content()); -+ -+ string path = string(req.get_path()); -+ smatch match; -+ regex rgx("(/v[0-9]+.[0-9]+)?/containers/([^/]+)/start"); -+ -+ unsigned containerId; -+ if (regex_match(path, match, rgx)) { -+ // containerName = match[2]; -+ containerId = std::stoi(match[2].str()); -+ } -+ -+ cout << LOG_PREFIX "Start container based on '" << containerId << "' ID" << endl; -+ -+ // == Retrieve container ID from the request path == -+ //int containerId = __cxx11::stoi(req.get_arg("id")); -+ -+ _daemon->container.start(containerId); -+ -+ auto response = make_shared(payload_str, -+ httpserver::http::http_utils::http_no_content, "application/json"); -+ return response; -+ } -+ -+ private: -+ Daemon *_daemon; -+ }; -+ -+ class StopHandler : public httpserver::http_resource { -+ public: -+ StopHandler(Daemon *daemon) : _daemon(daemon) {}; -+ -+ shared_ptr render_POST(const httpserver::http_request &req) { -+ string payload_str = ""; -+ Json::Value payload_json; -+ -+ cout << "[WEBERVER] '" << req.get_path() << "' (" << req.get_method() << ") called" << endl; -+ -+ // == Retrieve container ID from the request path == -+ int containerId = __cxx11::stoi(req.get_arg("id")); -+ -+ _daemon->container.stop(containerId); -+ -+ auto response = make_shared(payload_str, -+ httpserver::http::http_utils::http_no_content, "application/json"); -+ return response; -+ } -+ -+ private: -+ Daemon *_daemon; -+ }; -+ -+ -+ class RestartHandler : public httpserver::http_resource { -+ public: -+ RestartHandler(Daemon *daemon) : _daemon(daemon) {}; -+ -+ shared_ptr render_POST(const httpserver::http_request &req) { -+ string payload_str = ""; -+ Json::Value payload_json; -+ -+ cout << "[WEBERVER] '" << req.get_path() << "' (" << req.get_method() << ") called" << endl; -+ -+ // == Retrieve container ID from the request path == -+ int containerId = stoi(req.get_arg("id")); -+ -+ _daemon->container.restart(containerId); -+ -+ auto response = make_shared(payload_str, -+ httpserver::http::http_utils::http_no_content, "application/json"); -+ return response; -+ } -+ -+ private: -+ Daemon *_daemon; -+ }; -+ -+ class PauseHandler : public httpserver::http_resource { -+ public: -+ PauseHandler(Daemon *daemon) : _daemon(daemon) {}; -+ -+ shared_ptr render_POST(const httpserver::http_request &req) { -+ string payload_str = ""; -+ Json::Value payload_json; -+ -+ cout << "[WEBERVER] '" << req.get_path() << "' (" << req.get_method() << ") called" << endl; -+ -+ // == Retrieve container ID from the request path == -+ int containerId = __cxx11::stoi(req.get_arg("id")); -+ -+ _daemon->container.pause(containerId); -+ -+ auto response = make_shared(payload_str, -+ httpserver::http::http_utils::http_no_content, "application/json"); -+ return response; -+ } -+ -+ private: -+ Daemon *_daemon; -+ -+ }; -+ -+ class UnpauseHandler : public httpserver::http_resource { -+ public: -+ UnpauseHandler(Daemon *daemon) : _daemon(daemon) {}; -+ -+ shared_ptr render_POST(const httpserver::http_request &req) { -+ string payload_str = ""; -+ Json::Value payload_json; -+ -+ cout << "[WEBERVER] '" << req.get_path() << "' (" << req.get_method() << ") called" << endl; -+ -+ // == Retrieve container ID from the request path == -+ int containerId = __cxx11::stoi(req.get_arg("id")); -+ -+ _daemon->container.unpause(containerId); -+ -+ auto response = make_shared(payload_str, -+ httpserver::http::http_utils::http_no_content, "application/json"); -+ return response; -+ } -+ -+ private: -+ Daemon *_daemon; -+ }; -+ -+ -+ class RemoveHandler : public httpserver::http_resource { -+ public: -+ RemoveHandler(Daemon *daemon) : _daemon(daemon) {}; -+ -+ shared_ptr render_DELETE(const httpserver::http_request &req) { -+ string payload_str = ""; -+ Json::Value payload_json; -+ -+ cout << "[WEBERVER] '" << req.get_path() << "' (" << req.get_method() << ") called" << endl; -+ -+ // == Retrieve container ID from the request path == -+ int containerId = __cxx11::stoi(req.get_arg("id")); -+ -+ _daemon->container.remove(containerId); -+ -+ auto response = make_shared(payload_str, -+ httpserver::http::http_utils::http_no_content, "application/json"); -+ return response; -+ } -+ -+ private: -+ Daemon *_daemon; -+ }; -+ -+ class ContainerApi { -+ public: -+ // Constructor -+ ContainerApi(httpserver::webserver *server, Daemon *daemon); -+ -+ // Destructor -+ ~ContainerApi(); -+ -+ private: -+ httpserver::webserver *_server; -+ -+ // Handler for the different 'container' routes -+ ListHandler *_listHandler; -+ CreateHandler *_createHandler; -+ StartHandler *_startHandler; -+ StopHandler *_stopHandler; -+ PauseHandler *_pauseHandler; -+ UnpauseHandler *_unpauseHandler; -+ RestartHandler *_restartHandler; -+ RemoveHandler *_removeHandler; -+ InspectHandler *_inspectHandler; -+ LogsHandler *_logsHandler; -+ }; -+ -+} // container -+} // emiso -+ -+#endif /* EMISO_CONTAINER_H */ diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0032-container_inspect.hpp.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0032-container_inspect.hpp.patch deleted file mode 100644 index a008bf8..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0032-container_inspect.hpp.patch +++ /dev/null @@ -1,252 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/emiso_engine/webserver/container/container_inspect.hpp 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/emiso_engine/webserver/container/container_inspect.hpp 2025-10-10 17:28:33.594049579 +0200 -@@ -0,0 +1,249 @@ -+/* -+ * Copyright (C) 2023 Jean-Pierre Miceli -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#ifndef EMISO_CONTAINER_INSPECT_H -+#define EMISO_CONTAINER_INSPECT_H -+ -+#define LOG_PREFIX "[EMISO:WEBSERVER] " -+ -+namespace emiso { -+namespace container { -+ -+class InspectHandler : public httpserver::http_resource { -+ public: -+ InspectHandler(Daemon *daemon) : _daemon(daemon){}; -+ -+ std::shared_ptr render_GET(const httpserver::http_request &req) { -+ std::string payload_str = ""; -+ Json::Value payloadJson; -+ -+ cout << LOG_PREFIX "'" << req.get_path() << "' (" << req.get_method() << ") called" << endl; -+ -+ // == Retrieve container ID from the request path == -+ int containerId = stoi(req.get_arg("id")); -+ -+ CapsuleInfo info; -+ ImageInfo imageInfo; -+ -+ _daemon->container.info(containerId, info); -+ -+ _daemon->image.info(info.image, imageInfo); -+ -+ std::tm *ptm; -+ char createdDate[32]; -+ char startedDate[32]; -+ // char endDate[32]; -+ -+ ptm = std::localtime((const long int *) &info.created); -+ std::strftime(createdDate, 32, "%Y-%m-%dT%H:%M:%SZ", ptm); -+ -+ // TODO = add start time in container info -+ uint64_t tmp = info.created + 10; -+ ptm = std::localtime((const long int *) &tmp); -+ std::strftime(startedDate, 32, "%Y-%m-%dT%H:%M:%SZ", ptm); -+ -+ // ptm = std::localtime((const long int*)&info.created + 500); -+ // std::strftime(endDate, 32, "%Y-%M-%dT%H.%M.%S", ptm); -+ -+ // == Build the response message == -+ payloadJson["Id"] = std::to_string(containerId); -+ payloadJson["Created"] = createdDate; -+ payloadJson["Path"] = "/inject"; -+ payloadJson["Args"] = Json::arrayValue; -+ payloadJson["State"]["Status"] = info.state; -+ payloadJson["State"]["Running"] = (info.state == "running") ? true : false; -+ payloadJson["State"]["Paused"] = (info.state == "paused") ? true : false; -+ payloadJson["State"]["Restarting"] = (info.state == "restarting") ? true : false; -+ payloadJson["State"]["OOMKilled"] = false; -+ payloadJson["State"]["Dead"] = (info.state == "dead") ? true : false; -+ payloadJson["State"]["Pid"] = 0; -+ payloadJson["State"]["ExitCode"] = 0; -+ payloadJson["State"]["Error"] = ""; -+ payloadJson["State"]["StartedAt"] = createdDate; // to update -+ payloadJson["State"]["FinishedAt"] = ""; -+ payloadJson["State"]["Health"] = Json::nullValue; -+ payloadJson["Image"] = imageInfo.id; -+ payloadJson["ResolvConfPath"] = -+ "/var/lib/docker/containers/ed856fa2c435daac513a0eff537018034fd0ce2843d84eae4dbfd22203bd10de/resolv.conf"; -+ payloadJson["HostnamePath"] = -+ "/var/lib/docker/containers/ed856fa2c435daac513a0eff537018034fd0ce2843d84eae4dbfd22203bd10de/hostname"; -+ payloadJson["HostsPath"] = -+ "/var/lib/docker/containers/ed856fa2c435daac513a0eff537018034fd0ce2843d84eae4dbfd22203bd10de/hosts"; -+ payloadJson["LogPath"] = -+ "/var/lib/docker/containers/ed856fa2c435daac513a0eff537018034fd0ce2843d84eae4dbfd22203bd10de/" -+ "ed856fa2c435daac513a0eff537018034fd0ce2843d84eae4dbfd22203bd10de-json.log"; -+ payloadJson["Name"] = "/" + info.name; -+ payloadJson["RestartCount"] = 0; -+ payloadJson["Driver"] = "overlay2"; -+ payloadJson["Platform"] = "linux"; -+ payloadJson["MountLabel"] = ""; -+ payloadJson["ProcessLabel"] = ""; -+ payloadJson["AppArmorProfile"] = ""; -+ payloadJson["ExecIDs"] = Json::nullValue; -+ payloadJson["HostConfig"]["Binds"] = Json::nullValue; -+ payloadJson["HostConfig"]["ContainerIDFile"] = ""; -+ payloadJson["HostConfig"]["LogConfig"]["Type"] = "json-file"; -+ payloadJson["HostConfig"]["LogConfig"]["Config"] = Json::objectValue; -+ payloadJson["HostConfig"]["LogConfig"]["NetworkMode"] = "default"; -+ payloadJson["HostConfig"]["LogConfig"]["PortBindings"] = Json::objectValue; -+ payloadJson["HostConfig"]["RestartPolicy"]["Name"] = "no"; -+ payloadJson["HostConfig"]["RestartPolicy"]["MaximumRetryCount"] = 0; -+ payloadJson["HostConfig"]["AutoRemove"] = false; -+ payloadJson["HostConfig"]["VolumeDriver"] = ""; -+ payloadJson["HostConfig"]["VolumesFrom"] = Json::nullValue; -+ payloadJson["HostConfig"]["ConsoleSize"][0] = 24; -+ payloadJson["HostConfig"]["ConsoleSize"][0] = 80; -+ payloadJson["HostConfig"]["CapAdd"] = Json::nullValue; -+ payloadJson["HostConfig"]["CapDrop"] = Json::nullValue; -+ payloadJson["HostConfig"]["CgroupnsMode"] = "host"; -+ payloadJson["HostConfig"]["Dns"] = Json::arrayValue; -+ payloadJson["HostConfig"]["DnsOptions"] = Json::arrayValue; -+ payloadJson["HostConfig"]["DnsSearch"] = Json::arrayValue; -+ payloadJson["HostConfig"]["ExtraHosts"] = Json::nullValue; -+ payloadJson["HostConfig"]["GroupAdd"] = Json::nullValue; -+ payloadJson["HostConfig"]["IpcMode"] = "private"; -+ payloadJson["HostConfig"]["Cgroup"] = ""; -+ payloadJson["HostConfig"]["Links"] = Json::nullValue; -+ payloadJson["HostConfig"]["OomScoreAdj"] = 0; -+ payloadJson["HostConfig"]["PidMode"] = ""; -+ payloadJson["HostConfig"]["Privileged"] = false; -+ payloadJson["HostConfig"]["PublishAllPorts"] = false; -+ payloadJson["HostConfig"]["ReadonlyRootfs"] = false; -+ payloadJson["HostConfig"]["SecurityOpt"] = Json::nullValue; -+ payloadJson["HostConfig"]["UTSMode"] = ""; -+ payloadJson["HostConfig"]["UsernsMode"] = ""; -+ payloadJson["HostConfig"]["ShmSize"] = 67108864; -+ payloadJson["HostConfig"]["Runtime"] = "runc"; -+ payloadJson["HostConfig"]["Isolation"] = ""; -+ payloadJson["HostConfig"]["CpuShares"] = 0; -+ payloadJson["HostConfig"]["Memory"] = 0; -+ payloadJson["HostConfig"]["NanoCpus"] = 0; -+ payloadJson["HostConfig"]["CgroupParent"] = ""; -+ payloadJson["HostConfig"]["BlkioWeight"] = 0; -+ payloadJson["HostConfig"]["BlkioWeightDevice"] = Json::arrayValue; -+ payloadJson["HostConfig"]["BlkioDeviceReadBps"] = Json::arrayValue; -+ payloadJson["HostConfig"]["BlkioDeviceWriteBps"] = Json::arrayValue; -+ payloadJson["HostConfig"]["BlkioDeviceReadIOps"] = Json::arrayValue; -+ payloadJson["HostConfig"]["BlkioDeviceWriteIOps"] = Json::arrayValue; -+ payloadJson["HostConfig"]["CpuPeriod"] = 0; -+ payloadJson["HostConfig"]["CpuQuota"] = 0; -+ payloadJson["HostConfig"]["CpuRealtimePeriod"] = 0; -+ payloadJson["HostConfig"]["CpuRealtimeRuntime"] = 0; -+ payloadJson["HostConfig"]["CpusetCpus"] = ""; -+ payloadJson["HostConfig"]["CpusetMems"] = ""; -+ payloadJson["HostConfig"]["Devices"] = Json::arrayValue; -+ payloadJson["HostConfig"]["DeviceCgroupRules"] = Json::nullValue; -+ payloadJson["HostConfig"]["DeviceRequests"] = Json::nullValue; -+ payloadJson["HostConfig"]["MemoryReservation"] = 0; -+ payloadJson["HostConfig"]["MemorySwap"] = 0; -+ payloadJson["HostConfig"]["MemorySwappiness"] = Json::nullValue; -+ payloadJson["HostConfig"]["OomKillDisable"] = Json::nullValue; -+ payloadJson["HostConfig"]["PidsLimit"] = Json::nullValue; -+ payloadJson["HostConfig"]["Ulimits"] = Json::nullValue; -+ payloadJson["HostConfig"]["CpuCount"] = 0; -+ payloadJson["HostConfig"]["CpuPercent"] = 0; -+ payloadJson["HostConfig"]["IOMaximumIOps"] = 0; -+ payloadJson["HostConfig"]["IOMaximumBandwidth"] = 0; -+ payloadJson["HostConfig"]["MaskedPaths"][0] = "/proc/asound"; -+ payloadJson["HostConfig"]["MaskedPaths"][1] = "/proc/acpi"; -+ payloadJson["HostConfig"]["MaskedPaths"][2] = "/proc/kcore"; -+ payloadJson["HostConfig"]["MaskedPaths"][3] = "/proc/keys"; -+ payloadJson["HostConfig"]["MaskedPaths"][4] = "/proc/latency_stats"; -+ payloadJson["HostConfig"]["MaskedPaths"][5] = "/proc/timer_list"; -+ payloadJson["HostConfig"]["MaskedPaths"][6] = "/proc/timer_stats"; -+ payloadJson["HostConfig"]["MaskedPaths"][7] = "/proc/sched_debug"; -+ payloadJson["HostConfig"]["MaskedPaths"][8] = "/proc/scsi"; -+ payloadJson["HostConfig"]["MaskedPaths"][9] = "/sys/firmware"; -+ payloadJson["HostConfig"]["ReadonlyPaths"][0] = "/proc/bus"; -+ payloadJson["HostConfig"]["ReadonlyPaths"][1] = "/proc/fs"; -+ payloadJson["HostConfig"]["ReadonlyPaths"][2] = "/proc/irq"; -+ payloadJson["HostConfig"]["ReadonlyPaths"][3] = "/proc/sys"; -+ payloadJson["HostConfig"]["ReadonlyPaths"][4] = "/proc/sysrq-trigger"; -+ payloadJson["GraphDriver"]["Data"]["LowerDir"] = -+ "/var/lib/docker/overlay2/5132a5d000dc493f64e1076a4fbefcfd6d04705bb52590b639668d9d82c6652f-init/diff:/var/" -+ "lib/docker/overlay2/0ffcf17c5b7310dcbced19f13a63e8b7566325eaabf34ded9bc67b7c56057fa2/diff"; -+ payloadJson["GraphDriver"]["Data"]["MergedDir"] = "/etc/emiso/merged"; -+ payloadJson["GraphDriver"]["Data"]["UpperDir"] = "/etc/emiso/diff"; -+ payloadJson["GraphDriver"]["Data"]["WorkDir"] = "/etc/emiso/work"; -+ payloadJson["GraphDriver"]["Name"] = "overlay2"; -+ payloadJson["Mounts"] = Json::arrayValue; -+ payloadJson["Config"]["Hostname"] = "ed856fa2c435"; -+ payloadJson["Config"]["Domainname"] = ""; -+ payloadJson["Config"]["User"] = ""; -+ payloadJson["Config"]["AttachStdin"] = false; -+ payloadJson["Config"]["AttachStdout"] = true; -+ payloadJson["Config"]["AttachStderr"] = true; -+ payloadJson["Config"]["Tty"] = false; -+ payloadJson["Config"]["OpenStdin"] = false; -+ payloadJson["Config"]["StdinOnce"] = false; -+ payloadJson["Config"]["Env"][0] = "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"; -+ payloadJson["Config"]["Cmd"][0] = ""; -+ payloadJson["Config"]["Image"] = info.image; -+ payloadJson["Config"]["Volumes"] = Json::nullValue; -+ payloadJson["Config"]["WorkingDir"] = ""; -+ payloadJson["Config"]["Entrypoint"] = Json::nullValue; -+ payloadJson["Config"]["OnBuild"] = Json::nullValue; -+ payloadJson["Config"]["Labels"] = Json::objectValue; -+ payloadJson["NetworkSettings"]["Bridge"] = ""; -+ payloadJson["NetworkSettings"]["SandboxID"] = -+ "a7c9c2fe37e94ade66a9969d7070fe5d3e894753bb20fe14953692074af9ef00"; -+ payloadJson["NetworkSettings"]["HairpinMode"] = false; -+ payloadJson["NetworkSettings"]["LinkLocalIPv6Address"] = ""; -+ payloadJson["NetworkSettings"]["LinkLocalIPv6PrefixLen"] = 0; -+ payloadJson["NetworkSettings"]["Ports"] = Json::objectValue; -+ payloadJson["NetworkSettings"]["SandboxKey"] = "/var/run/docker/netns/a7c9c2fe37e9"; -+ payloadJson["NetworkSettings"]["SecondaryIPAddresses"] = Json::nullValue; -+ payloadJson["NetworkSettings"]["SecondaryIPv6Addresses"] = Json::nullValue; -+ payloadJson["NetworkSettings"]["EndpointID"] = ""; -+ payloadJson["NetworkSettings"]["Gateway"] = ""; -+ payloadJson["NetworkSettings"]["GlobalIPv6Address"] = ""; -+ payloadJson["NetworkSettings"]["GlobalIPv6PrefixLen"] = 0; -+ payloadJson["NetworkSettings"]["IPAddress"] = ""; -+ payloadJson["NetworkSettings"]["IPPrefixLen"] = 0; -+ payloadJson["NetworkSettings"]["IPv6Gateway"] = ""; -+ payloadJson["NetworkSettings"]["MacAddress"] = ""; -+ payloadJson["NetworkSettings"]["Networks"]["bridge"]["IPAMConfig"] = Json::nullValue; -+ payloadJson["NetworkSettings"]["Networks"]["bridge"]["Links"] = Json::nullValue; -+ payloadJson["NetworkSettings"]["Networks"]["bridge"]["Aliases"] = Json::nullValue; -+ payloadJson["NetworkSettings"]["Networks"]["bridge"]["NetworkID"] = -+ "1cacb396f2c32029fe35d73d8d061575bc69baadc15c1cc8fa596aa2ac3c1eaa"; -+ payloadJson["NetworkSettings"]["Networks"]["bridge"]["EndpointID"] = ""; -+ payloadJson["NetworkSettings"]["Networks"]["bridge"]["Gateway"] = ""; -+ payloadJson["NetworkSettings"]["Networks"]["bridge"]["IPAddress"] = ""; -+ payloadJson["NetworkSettings"]["Networks"]["bridge"]["IPPrefixLen"] = 0; -+ payloadJson["NetworkSettings"]["Networks"]["bridge"]["IPv6Gateway"] = ""; -+ payloadJson["NetworkSettings"]["Networks"]["bridge"]["GlobalIPv6Address"] = ""; -+ payloadJson["NetworkSettings"]["Networks"]["bridge"]["GlobalIPv6PrefixLen"] = 0; -+ payloadJson["NetworkSettings"]["Networks"]["bridge"]["MacAddress"] = ""; -+ payloadJson["NetworkSettings"]["Networks"]["bridge"]["DriverOpts"] = Json::nullValue; -+ -+ Json::StreamWriterBuilder builder; -+ payload_str = Json::writeString(builder, payloadJson); -+ auto response = std::make_shared( -+ payload_str, httpserver::http::http_utils::http_ok, "application/json"); -+ return response; -+ } -+ -+ private: -+ Daemon *_daemon; -+}; -+ -+} // namespace container -+} // namespace emiso -+ -+#endif /* EMISO_CONTAINER_INSPECT_H */ diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0033-container_logs.hpp.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0033-container_logs.hpp.patch deleted file mode 100644 index a99c243..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0033-container_logs.hpp.patch +++ /dev/null @@ -1,72 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/emiso_engine/webserver/container/container_logs.hpp 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/emiso_engine/webserver/container/container_logs.hpp 2025-10-10 17:28:33.594049579 +0200 -@@ -0,0 +1,69 @@ -+/* -+ * Copyright (C) 2024 Jean-Pierre Miceli -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#ifndef EMISO_CONTAINER_LOGS_H -+#define EMISO_CONTAINER_LOGS_H -+ -+namespace emiso { -+namespace container { -+ -+class LogsHandler : public httpserver::http_resource { -+ public: -+ LogsHandler(Daemon *daemon) : _daemon(daemon) {}; -+ -+ std::shared_ptr render_GET(const httpserver::http_request &req) { -+ int lineNr = -1; -+ -+ std::cout << "[WEBERVER] '" << std::string(req.get_path()) << "' (" << std::string(req.get_method()) << ") called" << std::endl; -+ -+ // == Retrieve container ID from the request path == -+ int containerId = std::__cxx11::stoi(req.get_arg("id")); -+ std::cout << "container ID: " << containerId << std::endl; -+ -+ // == Retrieve QUERY params == -+ for (const auto& arg : req.get_args()) { -+ std::cout << "param: " << std::string(arg.first) << ", value: " << std::string(arg.second) << std::endl; -+ -+ // Retrieve 'tail' parameter - if present -+ if (std::string(arg.first) == "tail") { -+ lineNr = stoi(arg.second); -+ } -+ } -+ -+ std::vector lines; -+ lines = _daemon->container.retrieveLogs(containerId, lineNr); -+ -+ std::string message; -+ for (int i = 0; i < lines.size(); i++) { -+ message += lines[i] + "\n"; -+ } -+ -+ auto response = std::make_shared(message, -+ httpserver::http::http_utils::http_ok, "application/json"); -+ return response; -+ } -+ -+ private: -+ Daemon *_daemon; -+ }; -+ -+ -+} // container -+} // emiso -+ -+#endif // EMISO_CONTAINER_LOGS_H diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0034-image.cpp.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0034-image.cpp.patch deleted file mode 100644 index e5665f3..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0034-image.cpp.patch +++ /dev/null @@ -1,49 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/emiso_engine/webserver/image/image.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/emiso_engine/webserver/image/image.cpp 2025-10-10 17:28:33.594049579 +0200 -@@ -0,0 +1,46 @@ -+/* -+ * Copyright (C) 2023 Jean-Pierre Miceli -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#include "image.hpp" -+ -+namespace emiso { -+ -+ namespace image { -+ -+ ImageApi::ImageApi(httpserver::webserver *server, Daemon *daemon) -+ : _server(server) { -+ std::string path = "/images"; -+ -+ // Create routes and handlers -+ _listHandler = new ListHandler(daemon); -+ _historyHandler = new HistoryHandler(daemon); -+ _inspectHandler = new InspectHandler(daemon); -+ -+ _server->register_resource(path + "/json", _listHandler); -+ _server->register_resource("/v[1-9]+.[0-9]+" + path + "/json", _listHandler); -+ -+ _server->register_resource(path + "/{[a-zA-Z0-9_-]+}/history", _listHandler); -+ _server->register_resource("/v[1-9]+.[0-9]+" + path + "/{[a-zA-Z0-9_-]+}/history", _listHandler); -+ -+ _server->register_resource(path + "/{[a-zA-Z0-9_-]+}/json", _inspectHandler); -+ _server->register_resource("/v[1-9]+.[0-9]+" + path + "/{[a-zA-Z0-9_-]+}/json", _inspectHandler); -+ } -+ -+ ImageApi::~ImageApi() {} -+ } -+} diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0035-image.hpp.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0035-image.hpp.patch deleted file mode 100644 index 2237094..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0035-image.hpp.patch +++ /dev/null @@ -1,140 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/emiso_engine/webserver/image/image.hpp 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/emiso_engine/webserver/image/image.hpp 2025-10-10 17:28:33.594158860 +0200 -@@ -0,0 +1,137 @@ -+/* -+ * Copyright (C) 2023 Jean-Pierre Miceli -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#ifndef EMISO_IMAGE_H -+#define EMISO_IMAGE_H -+ -+#include -+#include -+#include -+ -+#include "../../daemon/image.hpp" -+#include "../../daemon/daemon.hpp" -+ -+#include "image_inspect.hpp" -+ -+namespace emiso { -+namespace image { -+ -+ class ListHandler : public httpserver::http_resource { -+ public: -+ ListHandler(Daemon *daemon) : _daemon(daemon) {}; -+ -+ std::shared_ptr render_GET(const httpserver::http_request &req) { -+ std::string payload_str = ""; -+ Json::Value payload_json; -+ -+ std::cout << "[WEBERVER] '" << std::string(req.get_path()) << "' (" << std::string(req.get_method()) << ") called" << std::endl; -+ -+ // Retrieve image info -+ std::map info; -+ _daemon->image.info(info); -+ -+ unsigned idx = 0; -+ for (auto it = info.begin(); it != info.end(); ++it) { -+ -+ payload_json[idx]["Id"] = it->second.id; -+ payload_json[idx]["ParentId"] = ""; -+ payload_json[idx]["RepoTags"][0] = it->second.name + ":latest"; -+ payload_json[idx]["Created"] = it->second.date; -+ payload_json[idx]["Size"] = it->second.size; -+ payload_json[idx]["SharedSize"] = -1; // Value not set or calculated -+ payload_json[idx]["Containers"] = -1; // Value not set or calculated -+ payload_json[idx]["Labels"] = Json::Value::null; -+ -+ idx++; -+ } -+ -+ Json::StreamWriterBuilder builder; -+ payload_str = Json::writeString(builder, payload_json); -+ -+ auto response = std::make_shared(payload_str, -+ httpserver::http::http_utils::http_ok, "application/json"); -+ return response; -+ } -+ -+ private: -+ // daemon::Image _image; -+ Daemon *_daemon; -+ -+ }; -+ -+ -+ class HistoryHandler : public httpserver::http_resource { -+ public: -+ HistoryHandler(Daemon *daemon) : _daemon(daemon) {}; -+ -+ std::shared_ptr render_GET(const httpserver::http_request &req) { -+ std::cout << "[WEBERVER] '" << std::string(req.get_path()) << "' (" << std::string(req.get_method()) << ") called" << std::endl; -+ -+ std::string payload_str = ""; -+ Json::Value payload_json; -+ -+ // Retrieve image info -+ std::map info; -+ _daemon->image.info(info); -+ -+ unsigned idx = 0; -+ for (auto it = info.begin(); it != info.end(); ++it) { -+ -+ payload_json[idx]["Id"] = it->second.id; -+ payload_json[idx]["Created"] = it->second.date; -+ payload_json[idx]["CreatedBy"] = "Micofe"; -+ payload_json[idx]["Tags"] = Json::arrayValue; -+ payload_json[idx]["Size"] = it->second.size; -+ payload_json[idx]["Comment"] = ""; -+ -+ idx++; -+ } -+ -+ Json::StreamWriterBuilder builder; -+ payload_str = Json::writeString(builder, payload_json); -+ -+ auto response = std::make_shared(payload_str, -+ httpserver::http::http_utils::http_ok, "application/json"); -+ return response; -+ } -+ -+ private: -+ // daemon::Image _image; -+ Daemon *_daemon; -+ }; -+ -+ class ImageApi { -+ public: -+ // Constructor -+ ImageApi(httpserver::webserver *server, Daemon *daemon); -+ -+ // Destructor -+ ~ImageApi(); -+ -+ private: -+ httpserver::webserver *_server; -+ -+ // Handler for the different 'list' routes -+ ListHandler *_listHandler; -+ HistoryHandler *_historyHandler; -+ InspectHandler *_inspectHandler; -+ }; -+} // image -+} // emiso -+ -+#endif /* EMISO_IMAGE_H */ diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0036-image_inspect.hpp.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0036-image_inspect.hpp.patch deleted file mode 100644 index dd49603..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0036-image_inspect.hpp.patch +++ /dev/null @@ -1,94 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/emiso_engine/webserver/image/image_inspect.hpp 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/emiso_engine/webserver/image/image_inspect.hpp 2025-10-10 17:28:33.594158860 +0200 -@@ -0,0 +1,90 @@ -+/* -+ * Copyright (C) 2023 Jean-Pierre Miceli -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#ifndef EMISO_INSPECT_IMAGE_H -+#define EMISO_INSPECT_IMAGE_H -+ -+#include -+#include -+#include -+ -+#include "../../daemon/image.hpp" -+#include "../../daemon/daemon.hpp" -+ -+namespace emiso { -+namespace image { -+ -+ class InspectHandler : public httpserver::http_resource { -+ public: -+ InspectHandler(Daemon *daemon) : _daemon(daemon){}; -+ -+ std::shared_ptr render_GET(const httpserver::http_request &req) { -+ std::string payload_str = ""; -+ Json::Value payload_json; -+ int error; -+ -+ std::cout << "[WEBERVER] '" << std::string(req.get_path()) << "' (" << std::string(req.get_method()) << ") called" << std::endl; -+ -+ // Retrieve the image 'name' form the path (the 'name' correspond -+ // here to the image ID) -+ string path = string(req.get_path()); -+ smatch match; -+ regex rgx("(/v[0-9]+.[0-9]+)?/images/([a-zA-Z0-9_:-]+)/json"); -+ -+ string imageName; -+ if (regex_match(path, match, rgx)) { -+ imageName = match[2]; -+ -+ // The name/id has been found - get the image info -+ ImageInfo info; -+ int ret = _daemon->image.info(imageName, info); -+ -+ if (ret == 0) { -+ payload_json["Id"] = info.id; -+ payload_json["Created"] = info.date; -+ payload_json["Size"] = info.size; -+ payload_json["Created"] = info.date; -+ payload_json["RepoTags"][0] = info.name + ":latest"; -+ -+ Json::StreamWriterBuilder builder; -+ payload_str = Json::writeString(builder, payload_json); -+ error = httpserver::http::http_utils::http_ok; -+ } else { -+ payload_str = "Image '" + imageName + "' not found"; -+ error = httpserver::http::http_utils::http_not_found; -+ } -+ } else { -+ // The name/id has not been found - error -+ payload_str = "Server Error - Failed to extract the image name from the path"; -+ error = httpserver::http::http_utils::http_internal_server_error; -+ } -+ -+ auto response = std::make_shared(payload_str, -+ error, "application/json"); -+ -+ return response; -+ } -+ -+ private: -+ Daemon *_daemon; -+ }; -+ -+} // image -+} // emiso -+ -+#endif // EMISO_INSPECT_IMAGE_H -\ No newline at end of file diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0037-network.cpp.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0037-network.cpp.patch deleted file mode 100644 index dcde72a..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0037-network.cpp.patch +++ /dev/null @@ -1,41 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/emiso_engine/webserver/network/network.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/emiso_engine/webserver/network/network.cpp 2025-10-10 17:28:33.594158860 +0200 -@@ -0,0 +1,38 @@ -+/* -+ * Copyright (C) 2023 Jean-Pierre Miceli -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#include "network.hpp" -+ -+namespace emiso { -+ -+ namespace network { -+ -+ NetworkApi::NetworkApi(httpserver::webserver *server) -+ : _server(server) { -+ std::string path = "/networks"; -+ -+ // Create routes and handlers -+ _listHandler = new ListHandler(); -+ -+ _server->register_resource(path, _listHandler); -+ _server->register_resource("/v[1-9]+.[0-9]+" + path, _listHandler); -+ } -+ -+ NetworkApi::~NetworkApi() {} -+ } -+} diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0038-network.hpp.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0038-network.hpp.patch deleted file mode 100644 index 9a8fe09..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0038-network.hpp.patch +++ /dev/null @@ -1,66 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/emiso_engine/webserver/network/network.hpp 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/emiso_engine/webserver/network/network.hpp 2025-10-10 17:28:33.594220426 +0200 -@@ -0,0 +1,63 @@ -+/* -+ * Copyright (C) 2023 Jean-Pierre Miceli -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#ifndef EMISO_NETWORK_H -+#define EMISO_NETWORK_H -+ -+#include -+#include -+#include -+ -+namespace emiso { -+ -+ namespace network { -+ -+ class ListHandler : public httpserver::http_resource { -+ public: -+ -+ // In emiso, network is not supported --> return an empty list ! -+ std::shared_ptr render_GET(const httpserver::http_request &req) { -+ std::string payload_str = "[]"; -+ -+ std::cout << "[WEBERVER] '" << req.get_path() << "' (" << req.get_method() << ") called" << std::endl; -+ -+ auto response = std::make_shared(payload_str, -+ httpserver::http::http_utils::http_ok, "application/json"); -+ return response; -+ } -+ }; -+ -+ class NetworkApi { -+ public: -+ // Constructor -+ NetworkApi(httpserver::webserver *server); -+ -+ // Destructor -+ ~NetworkApi(); -+ -+ private: -+ httpserver::webserver *_server; -+ -+ // Handler for the different 'list' routes -+ ListHandler *_listHandler; -+ -+ }; -+ } -+} -+ -+#endif /* EMISO_NETWORK_H */ diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0039-plugins.cpp.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0039-plugins.cpp.patch deleted file mode 100644 index 1958ddc..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0039-plugins.cpp.patch +++ /dev/null @@ -1,40 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/emiso_engine/webserver/plugins/plugins.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/emiso_engine/webserver/plugins/plugins.cpp 2025-10-10 17:28:33.594220426 +0200 -@@ -0,0 +1,37 @@ -+/* -+ * Copyright (C) 2023 Jean-Pierre Miceli -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#include "plugins.hpp" -+ -+namespace emiso { -+namespace plugins { -+ -+ PluginsApi::PluginsApi(httpserver::webserver *server): _server(server) { -+ std::string path = "/plugins"; -+ -+ // Create routes and handlers -+ _listHandler = new ListHandler(); -+ -+ _server->register_resource(path, _listHandler); -+ _server->register_resource("/v[1-9]+.[0-9]+" + path, _listHandler); -+ } -+ -+ PluginsApi::~PluginsApi() {} -+ -+} // plugins -+} // emiso diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0040-plugins.hpp.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0040-plugins.hpp.patch deleted file mode 100644 index 73bc118..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0040-plugins.hpp.patch +++ /dev/null @@ -1,71 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/emiso_engine/webserver/plugins/plugins.hpp 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/emiso_engine/webserver/plugins/plugins.hpp 2025-10-10 17:28:33.594256882 +0200 -@@ -0,0 +1,68 @@ -+/* -+ * Copyright (C) 2023 Jean-Pierre Miceli -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#ifndef EMISO_PLUGINS_H -+#define EMISO_PLUGINS_H -+ -+#include -+#include -+#include -+ -+namespace emiso { -+namespace plugins { -+ -+ class ListHandler : public httpserver::http_resource { -+ public: -+ -+ std::shared_ptr render_GET(const httpserver::http_request &req) { -+ std::cout << "[WEBERVER] '" << req.get_path() << "' (" << req.get_method() << ") called" << std::endl; -+ -+ std::string payload_str = ""; -+ Json::Value payload_json; -+ -+ payload_json = Json::arrayValue; // empty array -+ -+ Json::StreamWriterBuilder builder; -+ payload_str = Json::writeString(builder, payload_json); -+ -+ auto response = std::make_shared(payload_str, -+ httpserver::http::http_utils::http_ok, "application/json"); -+ return response; -+ } -+ }; -+ -+ class PluginsApi { -+ public: -+ // Constructor -+ PluginsApi(httpserver::webserver *server); -+ -+ // Destructor -+ ~PluginsApi(); -+ -+ private: -+ httpserver::webserver *_server; -+ -+ // Handler for the different 'list' routes -+ ListHandler *_listHandler; -+ -+ }; -+ -+} // plugins -+} // emiso -+ -+#endif /* EMISO_PLUGINS_H */ diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0041-system.cpp.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0041-system.cpp.patch deleted file mode 100644 index a21cd7e..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0041-system.cpp.patch +++ /dev/null @@ -1,45 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/emiso_engine/webserver/system/system.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/emiso_engine/webserver/system/system.cpp 2025-10-10 17:28:33.594256882 +0200 -@@ -0,0 +1,42 @@ -+/* -+ * Copyright (C) 2023 Jean-Pierre Miceli -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#include "system.hpp" -+ -+namespace emiso { -+ namespace system { -+ -+ SytemApi::SytemApi(httpserver::webserver *server, Daemon *daemon) -+ : _server(server) { -+ -+ // Create routes and handlers -+ _pinghandler = new PingHandler(); -+ _sysInfoHandler = new SysInfoHandler(daemon); -+ _getVersionHandler = new GetVersionHandler(); -+ -+ _server->register_resource("/_ping", _pinghandler); -+ _server->register_resource("/v[1-9]+.[0-9]+/_ping", _pinghandler); -+ _server->register_resource("/v[1-9]+.[0-9]+/info", _sysInfoHandler); -+ _server->register_resource("/info", _sysInfoHandler); -+ _server->register_resource("/version", _getVersionHandler); -+ _server->register_resource("/v[1-9]+.[0-9]+/version", _getVersionHandler); -+ } -+ -+ SytemApi::~SytemApi() {} -+ } -+} diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0042-system.hpp.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0042-system.hpp.patch deleted file mode 100644 index 9089fa0..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0042-system.hpp.patch +++ /dev/null @@ -1,239 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/emiso_engine/webserver/system/system.hpp 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/emiso_engine/webserver/system/system.hpp 2025-10-10 17:28:33.594295771 +0200 -@@ -0,0 +1,236 @@ -+/* -+ * Copyright (C) 2023 Jean-Pierre Miceli -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#ifndef EMISO_SYSTEM_H -+#define EMISO_SYSTEM_H -+ -+#include -+#include -+#include -+ -+#include -+#include -+ -+#include "../../daemon/image.hpp" -+#include "../../daemon/capsule.hpp" -+#include "../../daemon/daemon.hpp" -+ -+namespace emiso { -+ namespace system { -+ -+ class PingHandler : public httpserver::http_resource { -+ public: -+ -+ std::shared_ptr render_GET(const httpserver::http_request &req) { -+ std::cout << "[WEBERVER] '" << std::string(req.get_path()) << "' (" << std::string(req.get_method()) << ") called" << std::endl; -+ -+ // Respond is a simple 'OK' -+ auto response = std::make_shared("OK"); -+ return response; -+ } -+ -+ std::shared_ptr render_HEAD(const httpserver::http_request &req) { -+ std::cout << "[WEBERVER] '" << std::string(req.get_path()) << "' (" << std::string(req.get_method()) << ") called" << std::endl; -+ -+ auto response = std::shared_ptr(new httpserver::string_response("")); -+ -+ response->with_header("Api-Version", EMISO_WEB_API_VERSION); -+ response->with_header("Builder-Version", EMISO_VERSION); -+ if (EMISO_WEB_EXPERIMENTAL) -+ response->with_header("Docker-Experimental", "true"); -+ else -+ response->with_header("Docker-Experimental", "false"); -+ response->with_header("Swarm", EMISO_WEB_SWARM); -+ response->with_header("Cache-Control", "no-cache, no-store, must-revalidate"); -+ response->with_header("Pragma", "no-cache"); -+ -+ return response; -+ } -+ }; -+ -+ class SysInfoHandler : public httpserver::http_resource { -+ public: -+ SysInfoHandler(Daemon *daemon) : _daemon(daemon) {}; -+ -+ std::shared_ptr render_GET(const httpserver::http_request &req) { -+ std::cout << "[WEBERVER] '" << std::string(req.get_path()) << "' (" << std::string(req.get_method()) << ") called" << std::endl; -+ -+ std::string payload_str = ""; -+ Json::Value payload_json; -+ Utils& utils = Utils::getInstance(); -+ auto config = utils.getInfo(); -+ // daemon::Image image; -+ std::map info; -+ std::map capsuleInfo; -+ -+ // Retrieve images info -+ _daemon->image.info(info); -+ auto image_nr = info.size(); -+ -+ // Retrieve container info -+ _daemon->container.info(capsuleInfo); -+ auto containerNr = capsuleInfo.size(); -+ -+ payload_json["ID"] = utils.getAgencyUID(); -+ payload_json["Containers"] = containerNr; // To update next -+ payload_json["ContainersRunning"] = containerNr; // To update next -+ payload_json["ContainersPaused"] = 0; // To update next -+ payload_json["ContainersStopped"] = 0; // To update next -+ payload_json["Images"] = image_nr; // To update next -+ -+ // WARNING - hardcoded values got from Docker answer of JMI PC -+ payload_json["Driver"] = "overlay2"; -+ payload_json["DriverStatus"][0].append("Backing Filesystem"); -+ payload_json["DriverStatus"][0].append("extfs"); -+ payload_json["DriverStatus"][1].append("Supports d_type"); -+ payload_json["DriverStatus"][1].append("true"); -+ payload_json["DriverStatus"][2].append("Using metacopy"); -+ payload_json["DriverStatus"][2].append("false"); -+ payload_json["DriverStatus"][3].append("Native Overlay Diff"); -+ payload_json["DriverStatus"][3].append("true"); -+ payload_json["DriverStatus"][4].append("userxattr"); -+ payload_json["DriverStatus"][4].append("false"); -+ -+ payload_json["DockerRootDir"] = "/var/lib/docker"; // default value on Linux -+ payload_json["Plugins"] = Json::objectValue; -+ -+ // Set these values to false as not supported/handled by emiso -+ payload_json["MemoryLimit"] = false; -+ payload_json["SwapLimit"] = false; -+ payload_json["CpuCfsPeriod"] = false; -+ payload_json["CpuCfsQuota"] = false; -+ payload_json["CPUShares"] = false; -+ payload_json["CPUSet"] = false; -+ payload_json["PidsLimit"] = false; -+ payload_json["OomKillDisable"] = false; -+ payload_json["IPv4Forwarding"] = false; -+ payload_json["BridgeNfIptables"] = false; -+ payload_json["BridgeNfIp6tables"] = false; -+ payload_json["Debug"] = false; -+ -+ payload_json["SystemTime"] = utils.getSystemTime(); -+ payload_json["LoggingDriver"] = "json-file"; // WARNING - hardcoded values got from Docker answer of JMI PC -+ payload_json["CgroupDriver"] = "none"; -+ payload_json["CgroupVersion"] = "1"; // Default docker value -+ payload_json["NEventsListener"] = 0; -+ -+ payload_json["KernelVersion"] = config.kernel_version; -+ payload_json["OperatingSystem"] = config.os; -+ payload_json["OSVersion"] = config.os_version; -+ payload_json["OSType"] = config.os_type; -+ payload_json["Architecture"] = config.arch; -+ -+ payload_json["NCPU"] = 1; // Get info from Agency ? -+ payload_json["MemTotal"] = 536870912; // Get info from Agency ? -+ payload_json["IndexServerAddress"] = "https://index.docker.io/v1/"; -+ payload_json["RegistryConfig"] = Json::objectValue; -+ payload_json["GenericResources"] = Json::arrayValue; -+ -+ payload_json["HttpProxy"] = ""; // use 'HTTP_PROXY' env variable -+ payload_json["HttpsProxy"] = ""; // use 'HTTPS_PROXY' env variable -+ payload_json["NoProxy"] = ""; // use 'NO_PROXY' env variable -+ payload_json["Name"] = "agency"; // Host name -+ payload_json["Labels"] = Json::arrayValue; -+ payload_json["ExperimentalBuild"] = EMISO_WEB_EXPERIMENTAL; -+ payload_json["ServerVersion"] = "28.3.3"; -+ payload_json["DefaultRuntime"] = ""; -+ -+ payload_json["Swarm"]["NodeID"] = ""; -+ payload_json["Swarm"]["NodeAddr"] = ""; -+ payload_json["Swarm"]["LocalNodeState"] = "inactive"; -+ payload_json["Swarm"]["ControlAvailable"] = false; -+ payload_json["Swarm"]["Error"] = ""; -+ payload_json["Swarm"]["RemoteManagers"] = Json::Value::null; -+ -+ payload_json["LiveRestoreEnabled"] = false; -+ payload_json["Isolation"] = "VT"; // TODO - platform specific -+ payload_json["SecurityOptions"] = Json::arrayValue; -+ -+ Json::StreamWriterBuilder builder; -+ payload_str = Json::writeString(builder, payload_json); -+ -+ auto response = std::make_shared(payload_str, -+ httpserver::http::http_utils::http_ok, "application/json"); -+ return response; -+ } -+ private: -+ Daemon *_daemon; -+ }; -+ -+ class GetVersionHandler : public httpserver::http_resource { -+ public: -+ -+ std::shared_ptr render_GET(const httpserver::http_request &req) { -+ std::cout << "[WEBERVER] '" << std::string(req.get_path()) << "' (" << std::string(req.get_method()) << ") called" << std::endl; -+ -+ std::string payload_str = ""; -+ Json::Value payload_json; -+ Utils& utils = Utils::getInstance(); -+ int response_code = httpserver::http::http_utils::http_ok; -+ -+ auto config = utils.getInfo(); -+ -+ payload_json["Platform"]["name"] = EMISO_PLATFORM_NAME; -+ payload_json["Components"][0]["name"] = EMISO_WEB_COMP_NAME; -+ payload_json["Components"][0]["version"] = EMISO_VERSION; -+ payload_json["Version"] = EMISO_VERSION; -+ payload_json["ApiVersion"] = EMISO_WEB_API_VERSION; -+ payload_json["MinAPIVersion"] = EMISO_WEB_API_VERSION; -+ -+ // Get info directly from the system -+ payload_json["Os"] = config.os_type; -+ payload_json["Arch"] = config.arch; -+ payload_json["KernelVersion"] = config.kernel_version; -+ -+ payload_json["Experimental"] = EMISO_WEB_EXPERIMENTAL; -+ -+ // not implemented yet ! -+ // payload_json["GitCommit"] -+ // payload_json["GoVersion"] -+ // payload_json["BuildTime"] -+ -+ Json::StreamWriterBuilder builder; -+ payload_str = Json::writeString(builder, payload_json); -+ -+ auto response = std::make_shared(payload_str, -+ response_code, "application/json"); -+ return response; -+ } -+ }; -+ -+ -+ class SytemApi { -+ public: -+ // Constructor -+ SytemApi(httpserver::webserver *server, Daemon *daemon); -+ -+ // Destructor -+ ~SytemApi(); -+ -+ private: -+ httpserver::webserver *_server; -+ -+ // Handler for the different routes -+ PingHandler *_pinghandler; -+ SysInfoHandler *_sysInfoHandler; -+ GetVersionHandler *_getVersionHandler; -+ }; -+ } -+} -+ -+#endif /* EMISO_SYSTEM_H */ diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0043-volume.cpp.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0043-volume.cpp.patch deleted file mode 100644 index a6a8ab5..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0043-volume.cpp.patch +++ /dev/null @@ -1,41 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/emiso_engine/webserver/volume/volume.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/emiso_engine/webserver/volume/volume.cpp 2025-10-10 17:28:33.594295771 +0200 -@@ -0,0 +1,38 @@ -+/* -+ * Copyright (C) 2023 Jean-Pierre Miceli -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#include "volume.hpp" -+ -+namespace emiso { -+ -+ namespace volume { -+ -+ VolumeApi::VolumeApi(httpserver::webserver *server) -+ : _server(server) { -+ std::string path = "/volumes"; -+ -+ // Create routes and handlers -+ _listHandler = new ListHandler(); -+ -+ _server->register_resource(path, _listHandler); -+ _server->register_resource("/v[1-9]+.[0-9]+" + path, _listHandler); -+ } -+ -+ VolumeApi::~VolumeApi() {} -+ } -+} diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0044-volume.hpp.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0044-volume.hpp.patch deleted file mode 100644 index a7c1dc5..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0044-volume.hpp.patch +++ /dev/null @@ -1,71 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/emiso_engine/webserver/volume/volume.hpp 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/emiso_engine/webserver/volume/volume.hpp 2025-10-10 17:28:33.594328500 +0200 -@@ -0,0 +1,68 @@ -+/* -+ * Copyright (C) 2023 Jean-Pierre Miceli -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#ifndef EMISO_VOLUME_H -+#define EMISO_VOLUME_H -+ -+#include -+#include -+#include -+ -+namespace emiso { -+ -+ namespace volume { -+ -+ class ListHandler : public httpserver::http_resource { -+ public: -+ -+ std::shared_ptr render_GET(const httpserver::http_request &req) { -+ std::cout << "[WEBERVER] '" << req.get_path() << "' (" << req.get_method() << ") called" << std::endl; -+ -+ std::string payload_str = ""; -+ Json::Value payload_json; -+ -+ payload_json["Volumes"] = Json::arrayValue; // empty array -+ -+ Json::StreamWriterBuilder builder; -+ payload_str = Json::writeString(builder, payload_json); -+ -+ auto response = std::make_shared(payload_str, -+ httpserver::http::http_utils::http_ok, "application/json"); -+ return response; -+ } -+ }; -+ -+ class VolumeApi { -+ public: -+ // Constructor -+ VolumeApi(httpserver::webserver *server); -+ -+ // Destructor -+ ~VolumeApi(); -+ -+ private: -+ httpserver::webserver *_server; -+ -+ // Handler for the different 'list' routes -+ ListHandler *_listHandler; -+ -+ }; -+ } -+} -+ -+#endif /* EMISO_VOLUME_H */ diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0045-webserver.cpp.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0045-webserver.cpp.patch deleted file mode 100644 index 9de19dc..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0045-webserver.cpp.patch +++ /dev/null @@ -1,64 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/emiso_engine/webserver/webserver.cpp 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/emiso_engine/webserver/webserver.cpp 2025-10-10 17:28:33.594328500 +0200 -@@ -0,0 +1,61 @@ -+/* -+ * Copyright (C) 2023 Jean-Pierre Miceli -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#include -+ -+#include "webserver.hpp" -+ -+namespace emiso { -+ -+ WebServer::WebServer(int port, bool secure, Daemon *daemon) -+ : _port(port), _secure(secure) { -+ -+ // Use builder to define webserver configuration options -+ httpserver::create_webserver cw = httpserver::create_webserver(_port); -+ if (secure) -+ cw.use_ssl().https_mem_key("key.pem").https_mem_cert("cert.pem"); -+ -+ // Create webserver using the configured options -+ _server = new httpserver::webserver(cw); -+ -+ // Registration of the different APIs -+ _system = new system::SytemApi(_server, daemon); -+ _container = new container::ContainerApi(_server, daemon); -+ _image = new image::ImageApi(_server, daemon); -+ _network = new network::NetworkApi(_server); -+ _volume = new volume::VolumeApi(_server); -+ _plugins = new plugins::PluginsApi(_server); -+ -+ // Create the default path - it responds to all paths -+ _defaultHandler = new DefaultHandler(); -+ _server->register_resource("^/.*$", _defaultHandler); -+ } -+ -+ WebServer:: ~WebServer() {} -+ -+ void WebServer::start(bool blocking) -+ { -+ // Start the server -+ std::cout << "Server started on port " << _port; -+ if (_secure) -+ std::cout << " (HTTPS/TLS mode ON)"; -+ std::cout << std::endl; -+ -+ _server->start(blocking); -+ } -+} diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0046-webserver.hpp.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0046-webserver.hpp.patch deleted file mode 100644 index 3c19004..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0046-webserver.hpp.patch +++ /dev/null @@ -1,95 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/emiso_engine/webserver/webserver.hpp 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/emiso_engine/webserver/webserver.hpp 2025-10-10 17:28:33.594328500 +0200 -@@ -0,0 +1,92 @@ -+/* -+ * Copyright (C) 2023 Jean-Pierre Miceli -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#ifndef EMISO_WEBSERVER_H -+#define EMISO_WEBSERVER_H -+ -+#include -+ -+#include "system/system.hpp" -+#include "container/container.hpp" -+#include "image/image.hpp" -+#include "network/network.hpp" -+#include "volume/volume.hpp" -+#include "plugins/plugins.hpp" -+#include "../daemon/daemon.hpp" -+ -+#define LOG_PREFIX "[EMISO:WEBSERVER] " -+ -+// DefaultHandler - used to print info for all paths not already registered to the -+// server -+class DefaultHandler : public httpserver::http_resource { -+public: -+ std::shared_ptr render(const httpserver::http_request& req) { -+ -+ std::cout << LOG_PREFIX "End-point not implemented" << std::endl; -+ std::cout << "\tPath: " << req.get_path() << std::endl; -+ std::cout << "\tMethod: " << req.get_method() << std::endl; -+ std::cout << "\tHeaders:" << std::endl; -+ for (const auto& header : req.get_headers()) { -+ std::cout << "\t\t" << header.first << ": " << header.second << std::endl; -+ } -+ std::cout << "\tBody: " << req.get_content() << std::endl; -+ -+ // Respond with a simple message -+ std::string message = "Path '" + std::string(req.get_path()) + "' not implemented\n"; -+ -+ auto response = std::make_shared(message); -+ return response; -+ } -+}; -+ -+namespace emiso { -+ -+ class WebServer { -+ public: -+ // Constructor -+ WebServer(int port, bool secure, Daemon *daemon); -+ -+ // Destructor -+ ~WebServer(); -+ -+ // Start the server -+ void start(bool blocking = false); -+ -+ // Stop the server -+ // void stop(); -+ -+ private: -+ int _port; -+ bool _secure; -+ httpserver::webserver *_server; -+ -+ // Different services -+ system::SytemApi *_system; -+ container::ContainerApi *_container; -+ image::ImageApi *_image; -+ network::NetworkApi *_network; -+ volume::VolumeApi *_volume; -+ plugins::PluginsApi *_plugins; -+ -+ // Default handler - not registered routes -+ DefaultHandler *_defaultHandler; -+ -+ }; -+} -+ -+#endif /* EMISO_WEBSERVER_H */ diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0047-injector.c.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0047-injector.c.patch deleted file mode 100644 index e34752b..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0047-injector.c.patch +++ /dev/null @@ -1,142 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/injector.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/injector.c 2025-10-10 17:28:33.594328500 +0200 -@@ -0,0 +1,139 @@ -+/* -+ * Copyright (C) 2016-2022 Daniel Rossier -+ * Copyright (C) January 2018 Baptiste Delporte -+ * Copyright (C) 2019-2022 David Truan -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#if 0 -+#define DEBUG -+#endif -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include -+#include -+ -+#include -+#include -+ -+ -+ /** -+ * @brief Injector performs loading of a capsule and start its execution. -+ * -+ * @param argc -+ * @param argv -+ * @return int -+ */ -+int main(int argc, char *argv[]) { -+ int fd_migration, fd, ret; -+ int nread, ME_size; -+ void *ME_buffer; -+ struct stat filestat; -+ struct agency_ioctl_args args; -+ bool hold_capsule = false; -+ int opt; -+ -+ // Parse command-line options -+ while ((opt = getopt(argc, argv, "s")) != -1) { -+ switch (opt) { -+ case 's': -+ hold_capsule = true; -+ break; -+ default: -+ fprintf(stderr, "Usage: %s [-s] \n", argv[0]); -+ exit(EXIT_FAILURE); -+ } -+ } -+ -+ if (optind >= argc) { -+ fprintf(stderr, "Expected ME file path after options\n"); -+ exit(EXIT_FAILURE); -+ } -+ -+ char *me_file_path = argv[optind]; -+ -+ printf("SOO ME injector (Smart Object Oriented based virtualization framework).\n"); -+ printf("Version: %s\n", SOO_VERSION); -+ -+ fd_migration = open(SOO_CORE_DEVICE, O_RDWR); -+ if (fd_migration < 0) { -+ printf("Failed to open device: " SOO_CORE_DEVICE " (%d)\n", fd_migration); -+ exit(EXIT_FAILURE); -+ } -+ -+ stat(me_file_path, &filestat); -+ -+ fd = open(me_file_path, O_RDONLY); -+ if (fd < 0) { -+ perror(me_file_path); -+ printf("%s not found.\n", me_file_path); -+ exit(EXIT_FAILURE); -+ } -+ -+ ME_size = filestat.st_size; -+ -+ /* Allocate the ME buffer */ -+ ME_buffer = malloc(ME_size); -+ assert(ME_buffer != NULL); -+ -+ DBG("agency_core: size to read from sd : %d, buffer address : 0x%08lx\n", ME_size, (unsigned long) ME_buffer); -+ -+ /* Read the ME content */ -+ nread = read(fd, ME_buffer, ME_size); -+ if (nread < 0) { -+ printf("Error when reading the ME\n"); -+ exit(EXIT_FAILURE); -+ } -+ -+ /* Inject the capsule */ -+ args.buffer = ME_buffer; -+ args.value = ME_size; -+ args.slotID = -1; /* Wherever */ -+ -+ if ((ret = ioctl(fd_migration, AGENCY_IOCTL_INJECT_CAPSULE, &args)) < 0) { -+ printf("Failed to inject ME (%d)\n", ret); -+ exit(EXIT_FAILURE); -+ } -+ -+ if (args.slotID == -1) { -+ printf("No available ME slot further...\n"); -+ exit(EXIT_FAILURE); -+ } -+ -+ if (!hold_capsule) { -+ ioctl(fd_migration, AGENCY_IOCTL_START_CAPSULE, &args); -+ } -+ -+ close(fd); -+ -+ free(ME_buffer); -+ -+ return 0; -+} -+ diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0048-melist.c.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0048-melist.c.patch deleted file mode 100644 index c901ec6..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0048-melist.c.patch +++ /dev/null @@ -1,96 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/melist.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/melist.c 2025-10-10 17:28:33.594328500 +0200 -@@ -0,0 +1,93 @@ -+/* -+ * Copyright (C) 2018 Baptiste Delporte -+ * Copyright (C) 2019-2021 Daniel Rossier -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+ -+#include -+ -+const char *ME_state_str(int state) { -+ -+ switch (state) { -+ case ME_state_stopped: -+ return "ME_state_stopped"; -+ case ME_state_living: -+ return "ME_state_living"; -+ case ME_state_suspended: -+ return "ME_state_suspended"; -+ case ME_state_hibernate: -+ return "ME_state_hibernate"; -+ case ME_state_resuming: -+ return "ME_state_resuming"; -+ case ME_state_awakened: -+ return "ME_state_awakened"; -+ case ME_state_killed: -+ return "ME_state_killed"; -+ case ME_state_terminated: -+ return "ME_state_terminated"; -+ case ME_state_dead: -+ return "ME_state_dead"; -+ } -+ -+ return "(n/a)"; -+} -+ -+/** -+ * Main entry point of the Agency core subsystem. -+ */ -+int main(int argc, char *argv[]) { -+ int i, fd_core; -+ ME_id_t id_array[MAX_ME_DOMAINS]; -+ agency_ioctl_args_t agency_ioctl_args; -+ -+ printf("*** SOO - Mobile Entity ID Retrieval ***\n\n"); -+ -+ fd_core = open("/dev/soo/core", O_RDWR); -+ assert(fd_core > 0); -+ -+ /* Prepare to terminate the running ME (dom #2) */ -+ printf("*** List of residing Mobile Entities: \n"); -+ -+ agency_ioctl_args.buffer = &id_array; -+ ioctl(fd_core, AGENCY_IOCTL_GET_ME_ID_ARRAY, (unsigned long) &agency_ioctl_args); -+ -+ for (i = 0; i < MAX_ME_DOMAINS; i++) { -+ if (id_array[i].state == ME_state_dead) -+ printf(" slot %d -> empty\n", i+2); -+ else { -+ printf(" slot %d -> spid: %" PRIx64 " name: %s state: %s\n", i+2, -+ id_array[i].spid, id_array[i].name, -+ ME_state_str(id_array[i].state)); -+ -+ printf(" Short description: %s\n", id_array[i].shortdesc); -+ } -+ } -+ -+ printf("done.\n"); -+ -+ close(fd_core); -+ -+ return 0; -+} diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0049-restoreme.c.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0049-restoreme.c.patch deleted file mode 100644 index 58af786..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0049-restoreme.c.patch +++ /dev/null @@ -1,79 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/restoreme.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/restoreme.c 2025-10-10 17:28:33.594328500 +0200 -@@ -0,0 +1,76 @@ -+/* -+ * Copyright (C) 2014-2020 Daniel Rossier -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+ -+#include -+ -+#include -+ -+int fd_core; -+ -+int main(int argc, char *argv[]) { -+ struct agency_ioctl_args args; -+ size_t buffer_size; -+ struct zip_t *zip; -+ -+ printf("*** SOO - Mobile Entity snapshot restorer ***\n"); -+ -+ if (argc != 2) { -+ printf("## Usage is : restoreme where is the file containing the ME snapshot.\n"); -+ exit(-1); -+ } -+ -+ printf("** Now reading the ME snapshot.\n"); -+ -+ fd_core = open("/dev/soo/core", O_RDWR); -+ assert(fd_core > 0); -+ -+ /* Uncompress the saved snapshot */ -+ zip = zip_open(argv[1], 0, 'r'); -+ -+ if (!zip) { -+ printf("Failed to open the zip file. Is there a bad sync after saving the snapshot?...\n"); -+ perror(""); -+ return EXIT_FAILURE; -+ } -+ -+ zip_entry_open(zip, "me"); -+ zip_entry_read(zip, &args.buffer, &buffer_size); -+ zip_entry_close(zip); -+ -+ zip_close(zip); -+ -+ printf(" ** ME memory re-implantation and resuming the capsule.\n"); -+ -+ args.slotID = -1; -+ ioctl(fd_core, AGENCY_IOCTL_WRITE_SNAPSHOT, &args); -+ -+ close(fd_core); -+ -+ printf(" ** ME successfully restored and resumed...\n"); -+ -+ return 0; -+} diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0050-saveme.c.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0050-saveme.c.patch deleted file mode 100644 index b94add3..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0050-saveme.c.patch +++ /dev/null @@ -1,89 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/saveme.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/saveme.c 2025-10-10 17:28:33.594328500 +0200 -@@ -0,0 +1,86 @@ -+/* -+ * Copyright (C) 2014-2025 Daniel Rossier -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include -+ -+#include -+ -+#include -+ -+int fd_core; -+ -+int main(int argc, char *argv[]) { -+ int ret; -+ struct zip_t *zip; -+ struct agency_ioctl_args args; -+ -+ printf("*** SOO - Mobile Entity snapshot saver ***\n"); -+ -+ if (argc != 2) { -+ printf("## Usage is : saveme where is the file containing the ME snapshot.\n"); -+ exit(-1); -+ } -+ -+ printf("** Now taking the memory snapshot.\n"); -+ -+ fd_core = open("/dev/soo/core", O_RDWR); -+ assert(fd_core > 0); -+ -+ args.slotID = 2; -+ args.value = 0; /* To get the size of the snapshot */ -+ -+ /* Get the size of the snapshot */ -+ ret = ioctl(fd_core, AGENCY_IOCTL_READ_SNAPSHOT, &args); -+ assert(ret == 0); -+ -+ /* The use of %zu formatter enables to print a size_t variable regardless the underlying architecture. */ -+ printf(" * Size of the snapshot: %zu bytes.\n", args.value); -+ -+ /* Get the snapshot */ -+ args.buffer = malloc(args.value); -+ assert(args.buffer != NULL); -+ -+ /* Get the size of the snapshot */ -+ ret = ioctl(fd_core, AGENCY_IOCTL_READ_SNAPSHOT, &args); -+ assert(ret == 0); -+ -+ printf(" * Saving to the file..."); -+ fflush(stdout); -+ -+ /* Compress the snapshot */ -+ zip = zip_open(argv[1], ZIP_DEFAULT_COMPRESSION_LEVEL, 'w'); -+ -+ zip_entry_open(zip, "me"); -+ zip_entry_write(zip, args.buffer, args.value); -+ zip_entry_close(zip); -+ -+ zip_close(zip); -+ -+ close(fd_core); -+ -+ printf("done.\n\n"); -+ printf(" * snapshot saved successfully\n"); -+ -+ return 0; -+} diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0051-shutdownme.c.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0051-shutdownme.c.patch deleted file mode 100644 index 565a523..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0051-shutdownme.c.patch +++ /dev/null @@ -1,60 +0,0 @@ ---- /home/rossierd/soo/micofe/build/tmp/work/usr-linux-1.0-r0/usr-linux-1.0/src/soo/shutdownme.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/shutdownme.c 2025-10-10 17:28:33.594328500 +0200 -@@ -0,0 +1,57 @@ -+/* -+ * Copyright (C) 2014-2020 Daniel Rossier -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include -+ -+#include -+ -+int main(int argc, char *argv[]) { -+ int fd_core; -+ agency_ioctl_args_t agency_ioctl_args; -+ -+ printf("*** SOO - Mobile Entity shutdown ***\n"); -+ -+ if (argc != 2) { -+ printf("## Usage is : shutdownme \n"); -+ exit(-1); -+ } -+ -+ printf("** Perform a shutdown of ME #%d (slotID %d)...", atoi(argv[1]), atoi(argv[1])+1); -+ fflush(stdout); -+ -+ fd_core = open("/dev/soo/core", O_RDWR); -+ assert(fd_core > 0); -+ -+ /* Prepare to terminate the running ME (dom #2) */ -+ -+ agency_ioctl_args.slotID = atoi(argv[1]) + 1; -+ -+ ioctl(fd_core, AGENCY_IOCTL_SHUTDOWN, &agency_ioctl_args); -+ -+ printf("done.\n"); -+ -+ close(fd_core); -+ -+ return 0; -+} diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0052-CMakeLists.txt.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0052-CMakeLists.txt.patch deleted file mode 100644 index 8687ea7..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0052-CMakeLists.txt.patch +++ /dev/null @@ -1,5 +0,0 @@ ---- a/src/CMakeLists.txt -+++ b/src/CMakeLists.txt -@@ -1 +1,2 @@ - add_subdirectory(examples) -+add_subdirectory(soo) diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0053-fb_mapper.c.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0053-fb_mapper.c.patch deleted file mode 100644 index b5e993c..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0053-fb_mapper.c.patch +++ /dev/null @@ -1,172 +0,0 @@ ---- ./src/soo/fb_mapper.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/fb_mapper.c 2026-01-10 17:28:33.594328500 +0200 -@@ -0,0 +1,169 @@ -+/* -+ * Copyright (C) 2026 Clément Dieperink -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#define FB_DEV "/dev/fb0" -+#define SYSFS_BASE_PATH "/sys/soo/backend/vfbdev" -+ -+#define USECONDS 1000000 -+#define FPS 30 -+ -+static char *get_info_and_mmap(int fd, struct fb_fix_screeninfo *finfo, -+ struct fb_var_screeninfo *vinfo, -+ size_t *screen_size) -+{ -+ char *fb_ptr; -+ -+ /* Make sure that the display is on.*/ -+ if (ioctl(fd, FBIOBLANK, FB_BLANK_UNBLANK) != 0) { -+ perror("ioctl(FBIOBLANK)"); -+ /* Don't return. Some framebuffer drivers like efifb or simplefb don't implement FBIOBLANK.*/ -+ } -+ -+ /* Get fixed screen information*/ -+ if (ioctl(fd, FBIOGET_FSCREENINFO, finfo) == -1) { -+ perror("Error reading fixed information"); -+ return NULL; -+ } -+ -+ /* Get variable screen information*/ -+ if (ioctl(fd, FBIOGET_VSCREENINFO, vinfo) == -1) { -+ perror("Error reading variable information"); -+ return NULL; -+ } -+ -+ *screen_size = vinfo->yres * finfo->line_length; -+ -+ /* Map the device to memory*/ -+ fb_ptr = (char *)mmap(0, *screen_size, PROT_READ | PROT_WRITE, -+ MAP_SHARED, fd, 0); -+ if (fb_ptr == MAP_FAILED) { -+ perror("Error: failed to map framebuffer device to memory"); -+ return NULL; -+ } -+ -+ for (size_t i = 0; i < *screen_size; i++) { -+ fb_ptr[i] = 0xff; -+ } -+ -+ return fb_ptr; -+} -+ -+static int write_sysfs(char *property, size_t value) -+{ -+ char tmp[256]; -+ size_t str_size; -+ int fd; -+ -+ printf("Setting %s to 0x%lX", property, value); -+ -+ snprintf(tmp, sizeof(tmp), SYSFS_BASE_PATH "/%s", property); -+ -+ fd = open(tmp, O_RDWR); -+ if (fd == -1) { -+ fprintf(stderr, "Error: couldn't open %s: %s", property, -+ strerror(errno)); -+ return -1; -+ } -+ -+ str_size = snprintf(tmp, sizeof(tmp), "%lx\n", value); -+ if (write(fd, tmp, str_size + 1) == 0) { -+ fprintf(stderr, "Error: couldn't write %s: %s", property, -+ strerror(errno)); -+ return -1; -+ } -+ -+ close(fd); -+ -+ return 0; -+} -+ -+int main(int argc, char *argv[]) -+{ -+ int fd; -+ struct fb_fix_screeninfo finfo; -+ struct fb_var_screeninfo vinfo; -+ char *fb_ptr; -+ size_t screen_size; -+ -+ /* Open and map the framebuffer */ -+ fd = open(FB_DEV, O_RDWR); -+ if (fd == -1) { -+ perror("Couldn't open " FB_DEV "\n"); -+ return EXIT_FAILURE; -+ } -+ -+ fb_ptr = get_info_and_mmap(fd, &finfo, &vinfo, &screen_size); -+ if (fb_ptr == NULL) { -+ return EXIT_FAILURE; -+ } -+ -+ /* Write all sysfs information */ -+ if (write_sysfs("vfbdev_hres", vinfo.xres) < 0) { -+ return EXIT_FAILURE; -+ } -+ -+ if (write_sysfs("vfbdev_vres", vinfo.yres) < 0) { -+ return EXIT_FAILURE; -+ } -+ -+ if (write_sysfs("vfbdev_bpp", vinfo.bits_per_pixel) < 0) { -+ return EXIT_FAILURE; -+ } -+ -+ if (write_sysfs("vfbdev_addr", (uint64_t)fb_ptr) < 0) { -+ return EXIT_FAILURE; -+ } -+ -+ if (write_sysfs("vfbdev_size", screen_size) < 0) { -+ return EXIT_FAILURE; -+ } -+ -+ if (write_sysfs("vfbdev_pid", getpid()) < 0) { -+ return EXIT_FAILURE; -+ } -+ -+ /* Periodically update the display */ -+ while (1) { -+ usleep(USECONDS / FPS); -+ -+ if (ioctl(fd, FBIOPAN_DISPLAY, &vinfo) == -1) { -+ /* Fallback to force the update */ -+ vinfo.activate = FB_ACTIVATE_NOW | FB_ACTIVATE_FORCE; -+ if (ioctl(fd, FBIOPUT_VSCREENINFO, &vinfo) == -1) { -+ perror("Error while updating the FB"); -+ } -+ } -+ } -+ -+ munmap(fb_ptr, screen_size); -+ close(fd); -+ -+ return EXIT_SUCCESS; -+} -+ diff --git a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0054-input_forwarding.c.patch b/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0054-input_forwarding.c.patch deleted file mode 100644 index 75c5b71..0000000 --- a/build/meta-usr/recipes-usr/soo/files/0001-usr-linux-1.0-r0/0054-input_forwarding.c.patch +++ /dev/null @@ -1,247 +0,0 @@ ---- ./src/soo/input_forwarding.c 1970-01-01 01:00:00.000000000 +0100 -+++ ./src/soo/input_forwarding.c 2026-01-10 17:28:33.594328500 +0200 -@@ -0,0 +1,244 @@ -+/* -+ * Copyright (C) 2026 Clément Dieperink -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -+ * -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#define VINPUT_DEV "/dev/vinput" -+#define INPUT_PATH "/dev/input" -+#define MAX_INPUT_PER_READ 10 -+ -+#define INPUT_CAPABITLIES_ABS "/sys/class/input/%s/device/capabilities/abs" -+ -+struct input_info { -+ int has_abs; -+ struct input_absinfo absinfo_x; -+ struct input_absinfo absinfo_y; -+}; -+ -+static struct pollfd *input_devices = NULL; -+static struct input_info *input_info = NULL; -+static size_t input_count = 0; -+ -+static int vinput_fd; -+ -+static void open_input(char *path) -+{ -+ int fd, ret; -+ struct pollfd *tmp_input_devices; -+ struct input_info *tmp_input_info; -+ char full_path[256]; -+ -+ if (strncmp(path, "event", 5) != 0) -+ return; -+ -+ snprintf(full_path, sizeof(full_path), INPUT_PATH "/%s", path); -+ -+ fd = open(full_path, O_RDWR); -+ if (fd == -1) { -+ fprintf(stderr, "%s: Couldnt open file %s\n", strerror(errno), -+ full_path); -+ return; -+ } -+ -+ /* Resizes arrays */ -+ input_count++; -+ tmp_input_devices = reallocarray(input_devices, input_count, -+ sizeof(input_devices[0])); -+ if (tmp_input_devices == NULL) { -+ input_count--; -+ close(fd); -+ perror("Couldn't allocate memory to add new device"); -+ return; -+ } -+ -+ tmp_input_info = -+ reallocarray(input_info, input_count, sizeof(input_info[0])); -+ if (tmp_input_info == NULL) { -+ /* Don't free up newly allocated input_devices entry. -+ * Futur reallocarray will ensure that we get at most one empty entry -+ * in input_devices. */ -+ input_count--; -+ close(fd); -+ perror("Couldn't allocate memory to add new device"); -+ return; -+ } -+ -+ /* Setup poll information */ -+ input_devices = tmp_input_devices; -+ input_devices[input_count - 1] = (struct pollfd){ -+ .fd = fd, -+ .events = POLLIN, -+ }; -+ -+ /* Read absolute information */ -+ input_info = tmp_input_info; -+ input_info[input_count - 1].has_abs = 0; -+ -+ ret = ioctl(fd, EVIOCGABS(ABS_X), -+ &(input_info[input_count - 1].absinfo_x)); -+ if (ret < 0) { -+ return; -+ } -+ -+ ret = ioctl(fd, EVIOCGABS(ABS_Y), -+ &(input_info[input_count - 1].absinfo_y)); -+ if (ret < 0) { -+ return; -+ } -+ -+ /* We got both ABS X and Y information, input is a valid absolute */ -+ input_info[input_count - 1].has_abs = 1; -+ -+ printf("Found absolute input %s with maximum X:%d Y:%d\n", path, -+ input_info[input_count - 1].absinfo_x.maximum, -+ input_info[input_count - 1].absinfo_y.maximum); -+} -+ -+static void scan_inputs(void) -+{ -+ DIR *dir; -+ struct dirent *ent; -+ char path[512]; -+ int i; -+ int ret; -+ -+ for (i = 0; i < input_count; i++) { -+ close(input_devices->fd); -+ } -+ free(input_devices); -+ free(input_info); -+ input_count = 0; -+ -+ dir = opendir(INPUT_PATH); -+ if (dir == NULL) { -+ perror("Couldn't open directory " INPUT_PATH); -+ return; -+ } -+ -+ while ((ent = readdir(dir)) != NULL) { -+ open_input(ent->d_name); -+ } -+} -+ -+static size_t abs_convert(size_t value, struct input_absinfo *absinfo) -+{ -+ return (value * 10000) / absinfo->maximum; -+} -+ -+static int read_input(size_t idx) -+{ -+ ssize_t read_size, write_size; -+ struct input_event events[MAX_INPUT_PER_READ]; -+ size_t ev_i; -+ -+ read_size = read(input_devices[idx].fd, &events, sizeof(events)); -+ if (read_size < 0) { -+ fprintf(stderr, "%s: Couldnt read file %lu\n", strerror(errno), -+ idx); -+ return -1; -+ } -+ -+ if ((read_size % sizeof(events[0])) != 0) { -+ printf("Read size isn't a multiple of structure size %ld, %ld\n", -+ read_size, sizeof(events[0])); -+ return -1; -+ } -+ -+ /* If input is absolute, convert value to be in range 0-10000, as expected by capsules */ -+ if (input_info[idx].has_abs) { -+ for (ev_i = 0; ev_i < (read_size / sizeof(events[0])); ev_i++) { -+ if (events[ev_i].type != EV_ABS) -+ continue; -+ -+ if (events[ev_i].code == ABS_X) { -+ events[ev_i].value = -+ abs_convert(events[ev_i].value, -+ &input_info[idx].absinfo_x); -+ } -+ -+ if (events[ev_i].code == ABS_Y) { -+ events[ev_i].value = -+ abs_convert(events[ev_i].value, -+ &input_info[idx].absinfo_y); -+ } -+ } -+ } -+ -+ write_size = write(vinput_fd, &events, read_size); -+ if (write_size != read_size) { -+ printf("Not all event wrote\n"); -+ return -1; -+ } -+ -+ return 0; -+} -+ -+int main(int argc, char *argv[]) -+{ -+ int ready; -+ size_t i; -+ -+ vinput_fd = open(VINPUT_DEV, O_WRONLY); -+ if (vinput_fd == -1) { -+ perror("Couldn't open " VINPUT_DEV); -+ return EXIT_FAILURE; -+ } -+ -+ scan_inputs(); -+ -+ while (1) { -+ ready = poll(input_devices, input_count, -1); -+ if (ready == -1) { -+ perror("Couldn't poll files"); -+ return EXIT_FAILURE; -+ } -+ -+ for (i = 0; i < input_count; i++) { -+ if (!input_devices[i].revents) { -+ continue; -+ } -+ -+ if (!(input_devices[i].revents & POLLIN)) { -+ printf("Got not POLLIN for %d\n", i); -+ return EXIT_FAILURE; -+ } -+ -+ if (read_input(i) < 0) { -+ return EXIT_FAILURE; -+ } -+ } -+ } -+ -+ close(vinput_fd); -+ for (i = 0; i < input_count; i++) { -+ close(input_devices->fd); -+ } -+ free(input_devices); -+ free(input_info); -+ -+ return EXIT_SUCCESS; -+} diff --git a/build/meta-usr/recipes-usr/soo/usr-linux_1.0.bbappend b/build/meta-usr/recipes-usr/soo/usr-linux_1.0.bbappend index 2a0da47..fedd89a 100644 --- a/build/meta-usr/recipes-usr/soo/usr-linux_1.0.bbappend +++ b/build/meta-usr/recipes-usr/soo/usr-linux_1.0.bbappend @@ -5,20 +5,18 @@ SUMMARY = "Add-ons for SOO user space environment" DESCRIPTION = "Additional applications are used to manage SO3 capsules" LICENSE = "GPLv2" -SRC_URI += " ${@ d.expand(d.getVar('SOO_URI') or '') \ - if 'soo' in (d.getVar('OVERRIDES') or '').split(':') else '' }" - -# These patches bring soo usr apps -FILESPATH:prepend = "${THISDIR}/../soo/files/0001-${PF}:" +# The SOO agency apps (src/soo, include/soo, include/core) are committed +# in-tree under linux/usr and built in place — no patch materialization. +# src/CMakeLists.txt permanently carries add_subdirectory(soo). Only the +# install step (staging the built binaries into the deploy dir) remains, +# gated on the :soo override. -require files/0001-${PF}-patches.inc - # Installing usr apps mean to move the binary and all files which need to # be copied to the rootfs. Be aware that it is a deploy directory and not # the rootfs itself; this is achieved with the do_deploy task (by the bsp recipe) do_install_apps:append () { - + if echo ":${OVERRIDES}:" | grep -q ":soo"; then usr_do_install_file_root "${IB_TARGET}/build/src/soo/injector" usr_do_install_file_root "${IB_TARGET}/build/src/soo/restoreme" @@ -32,18 +30,3 @@ do_install_apps:append () { usr_do_install_file_root "${IB_TARGET}/build/src/soo/emiso_engine/emiso_engine" fi } - -do_clean:append() { - if echo ":${OVERRIDES}:" | grep -q ":soo"; then - - rm -rf ${IB_TARGET}/src/soo - rm -rf ${IB_TARGET}/include/soo - rm -rf ${IB_TARGET}/include/core - - rm -rf ${S} - - [ -f ${IB_TARGET}.back/src/CMakeLists.txt ] && \ - cp ${IB_TARGET}.back/src/CMakeLists.txt ${IB_TARGET}/src/ || true - - fi -} diff --git a/linux/usr/include/core/core.h b/linux/usr/include/core/core.h new file mode 100644 index 0000000..b59e607 --- /dev/null +++ b/linux/usr/include/core/core.h @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2014-2019 Daniel Rossier + * Copyright (C) 2018-2019 Baptiste Delporte + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef CORE_H +#define CORE_H + +#include + +#include + +#define AGENCY_CORE_VERSION "2025.5" + +/* Cycle period express in ms */ +#define AG_CYCLE_PERIOD 100 + +#define SOO_CORE_DEVICE "/dev/soo/core" + +extern int fd_core; +extern int fd_dcm; + +/* Arguments of the agency application */ +extern bool opt_noinject; +extern bool opt_nosend; + +/* To indicate f the main agency cycle loop is interrupted */ +extern bool ag_cycle_interrupted; + +int initialize_migration(unsigned int S3C_slotID); + +int get_S3C_free_slot(size_t S3C_size); + +bool get_S3C_id(uint32_t slotID, S3C_id_t *S3C_id); + +void read_S3C_snapshot(unsigned int slotID, void **buffer, uint32_t *buffer_size); +void write_S3C_snapshot(unsigned int slotID, unsigned char *S3C_buffer); + +void *prepare_S3C_slot(unsigned int slotID); +int finalize_migration(unsigned int slotID); + +void main_loop(int cycle_period); + +void migration_init(void); + +#endif /* CORE_H */ diff --git a/linux/usr/include/core/debug.h b/linux/usr/include/core/debug.h new file mode 100644 index 0000000..58a22b3 --- /dev/null +++ b/linux/usr/include/core/debug.h @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2014-2019 Daniel Rossier + * Copyright (C) 2018-2019 Baptiste Delporte + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef DEBUG_H +#define DEBUG_H + +#include +#include + +#ifdef DEBUG +#undef DBG + +#define DBG(fmt, ...) \ + do { \ + printf("(user) %s:%d > "fmt, __func__, __LINE__, ##__VA_ARGS__); \ + } while (0) + +#define BUG() do { printf("BUG\n"); fflush(stdout); exit(-1); } while (0); + +#define DBG0(...) DBG("%s", ##__VA_ARGS__) + +#else + +#define DBG(fmt, ...) +#define RTDBG(fmt, ...) +#define DBG0(...) +#define DBG_BUFFER(buffer, ...) +#define DBG_ON__ +#define DBG_OFF__ + +#endif + +#endif /* DEBUG_H */ diff --git a/linux/usr/include/core/device_access.h b/linux/usr/include/core/device_access.h new file mode 100644 index 0000000..9c32fab --- /dev/null +++ b/linux/usr/include/core/device_access.h @@ -0,0 +1,58 @@ + /* + * Copyright (C) 2014-2019 Daniel Rossier + * Copyright (c) 2018 Baptiste Delporte + * Copyright (C) 2019 David Truan + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef DEVICE_ACCESS_H +#define DEVICE_ACCESS_H + +#define FILENAME_MAX_LEN 80 + +#define SOO_S3C_DIRECTORY "/mnt/ME" +#define SOO_BOOT_PART "/mnt/boot/" +#define SOO_ROOTFS_P2 "/mnt/rootfs1/" +#define SOO_ROOTFS_P4 "/mnt/rootfs2/" +#define ROOT_PATH "/root/" + +#define ROOTFS1_PART '2' +#define ROOTFS2_PART '4' + +#define ROOTFS_ARCHIVE_NAME "rootfs.tar" +#define AGENCY_JSON_NAME "agency.json" +#define AGENCY_JSON_PATH SOO_BOOT_PART AGENCY_JSON_NAME +#define ROOT_FLAG_NAME "root_flag" +#define ROOT_FLAG_PATH SOO_BOOT_PART ROOT_FLAG_NAME +#define UENV_TXT_NAME "uEnv.txt" +#define UENV_TXT_PATH SOO_BOOT_PART UENV_TXT_NAME + +#define ITB_NAME "soo.itb" + +#define ITB_PATH SOO_BOOT_PART ITB_NAME + +void agency_inject_S3C_from_memory(void); +void sig_inject_S3C_from_memory(int sig); + +void inject_MEs_from_filesystem(void); + +int upgrade_uEnv_txt(char *uEnv_updated, size_t size); +int upgrade_itb(char *itb_updated, size_t size); +int upgrade_rootfs(char *rootfs_updated, size_t size); + +void device_access_init(void); + +#endif /* DEVICE_ACCESS_H */ diff --git a/linux/usr/include/core/injector.h b/linux/usr/include/core/injector.h new file mode 100644 index 0000000..4fb161b --- /dev/null +++ b/linux/usr/include/core/injector.h @@ -0,0 +1,29 @@ + +/* + * Copyright (C) 2014-2019 Daniel Rossier + * Copyright (C) 2018-2019 Baptiste Delporte + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef INJECTOR_CORE_H +#define INJECTOR_CORE_H + +void injector_init(void); +void inject_from_BT(void); + +void S3C_inject(unsigned char *S3C_buffer, uint32_t size); + +#endif /* INJECTOR_CORE_H */ diff --git a/linux/usr/include/core/leds.h b/linux/usr/include/core/leds.h new file mode 100644 index 0000000..47ff820 --- /dev/null +++ b/linux/usr/include/core/leds.h @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2018-2019 Baptiste Delporte + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef LEDS_H +#define LEDS_H + +#include + +#include + +#define SOO_N_LEDS 6 + +#define SOO_LED_SYSFS_PREFIX "/sys/class/leds/led_d" +#define SOO_LED_SYSFS_SUFFIX "/brightness" + +void led_set(uint32_t id, uint8_t value); +void led_on(uint32_t id); +void led_off(uint32_t id); + +void leds_init(void); + +#endif /* LEDS_H */ diff --git a/linux/usr/include/core/receive.h b/linux/usr/include/core/receive.h new file mode 100644 index 0000000..33d09bf --- /dev/null +++ b/linux/usr/include/core/receive.h @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2014-2019 Daniel Rossier + * Copyright (C) 2018-2019 Baptiste Delporte + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef RECEIVE_H +#define RECEIVE_H + +#include + +void S3C_processing_receive(void); + +#endif /* RECEIVE_H */ diff --git a/linux/usr/include/core/send.h b/linux/usr/include/core/send.h new file mode 100644 index 0000000..e042729 --- /dev/null +++ b/linux/usr/include/core/send.h @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2014-2019 Daniel Rossier + * Copyright (C) 2018-2019 Baptiste Delporte + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef SEND_H +#define SEND_H + +#include + +void try_to_send_ME(void); +void sig_initiate_migration(int sig); + +#endif /* SEND_H */ diff --git a/linux/usr/include/core/types.h b/linux/usr/include/core/types.h new file mode 100644 index 0000000..00a01ea --- /dev/null +++ b/linux/usr/include/core/types.h @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2014-2019 Daniel Rossier + * Copyright (C) 2018-2019 Baptiste Delporte + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef TYPES_H +#define TYPES_H + +#define likely(expr) expr +#define unlikely(expr) expr + +#endif /* TYPES_H */ diff --git a/linux/usr/include/core/upgrader.h b/linux/usr/include/core/upgrader.h new file mode 100644 index 0000000..4ee32c2 --- /dev/null +++ b/linux/usr/include/core/upgrader.h @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2019 David Truan + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef UPGRADER_H +#define UPGRADER_H + +#define UPGRADABLE_COMPONENTS 3 +#define UPGRADE_POLL_PERIOD_MS 500 + +/** + * Image format: | uncompressed size | ITB version | U-boot version | rootfs version | + * The payload is composed of the 3 components as follows: for each component. + * Each field except the images themself are on 4B unsigned + * + */ +#define HEADER_SIZE (4 + 3 * 4) + +typedef enum { + ITB, + UBOOT, + ROOTFS +} component_type_t; + +/* Used to pass information between the upgarde stages */ +typedef struct { + char *header; + size_t compressed_size; + char *decompressed_image; + unsigned int S3C_slotID; +} upgrader_args_t; + +void upgrader_init(void); + +#endif /* UPGRADER_H */ diff --git a/linux/usr/include/soo/core.h b/linux/usr/include/soo/core.h new file mode 100644 index 0000000..276fe6d --- /dev/null +++ b/linux/usr/include/soo/core.h @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2014-2019 Daniel Rossier + * Copyright (C) 2018-2019 Baptiste Delporte + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef CORE_H +#define CORE_H + +#include + +#include + +#define SOO_VERSION "1.0" +#define SOO_CORE_DEVICE "/dev/soo/core" + +#endif /* CORE_H */ diff --git a/linux/usr/include/soo/debug.h b/linux/usr/include/soo/debug.h new file mode 100644 index 0000000..58a22b3 --- /dev/null +++ b/linux/usr/include/soo/debug.h @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2014-2019 Daniel Rossier + * Copyright (C) 2018-2019 Baptiste Delporte + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef DEBUG_H +#define DEBUG_H + +#include +#include + +#ifdef DEBUG +#undef DBG + +#define DBG(fmt, ...) \ + do { \ + printf("(user) %s:%d > "fmt, __func__, __LINE__, ##__VA_ARGS__); \ + } while (0) + +#define BUG() do { printf("BUG\n"); fflush(stdout); exit(-1); } while (0); + +#define DBG0(...) DBG("%s", ##__VA_ARGS__) + +#else + +#define DBG(fmt, ...) +#define RTDBG(fmt, ...) +#define DBG0(...) +#define DBG_BUFFER(buffer, ...) +#define DBG_ON__ +#define DBG_OFF__ + +#endif + +#endif /* DEBUG_H */ diff --git a/linux/usr/include/soo/uapi/soo.h b/linux/usr/include/soo/uapi/soo.h new file mode 100644 index 0000000..90bf274 --- /dev/null +++ b/linux/usr/include/soo/uapi/soo.h @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2014-2025 Daniel Rossier + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef UAPI_SOO_H +#define UAPI_SOO_H + +#include + +#define MAX_S3C_DOMAINS 5 + +/* + * ME states: + * - S3C_state_stopped: Capsule is stopped (right after start or later) + * - S3C_state_living: ME is full-functional and activated (all frontend devices are consistent) + * - S3C_state_suspended: ME is suspended before migrating. This state is maintained for the resident ME instance + * - S3C_state_hibernate: ME is in a state of hibernate snapshot + * - S3C_state_resuming: ME ready to perform resuming (after recovering) + * - S3C_state_awakened: ME is just being awakened + * - S3C_state_terminated: ME has been terminated (by a shutdown) + * - S3C_state_dead: ME does not exist + */ +typedef enum { + S3C_state_stopped, + S3C_state_living, + S3C_state_suspended, + S3C_state_hibernate, + S3C_state_resuming, + S3C_state_awakened, + S3C_state_killed, + S3C_state_terminated, + S3C_state_dead +} S3C_state_t; + +/* Keep information about slot availability + * FREE: the slot is available (no ME) + * BUSY: the slot is allocated a ME + */ +typedef enum { S3C_SLOT_FREE, S3C_SLOT_BUSY } S3C_slotState_t; + +/* ME ID related information */ +#define S3C_NAME_SIZE 40 +#define S3C_SHORTDESC_SIZE 1024 + +/* + * Definition of ME ID information used by functions which need + * to get a list of running MEs with their information. + */ +typedef struct { + uint32_t slotID; + S3C_state_t state; + + uint64_t spid; + + char name[S3C_NAME_SIZE]; + char shortdesc[S3C_SHORTDESC_SIZE]; +} S3C_id_t; + +/* + * IOCTL commands for migration. + * This part is shared between the kernel and user spaces. + */ + +/* + * IOCTL codes + */ + +#define AGENCY_IOCTL_READ_SNAPSHOT _IOWR('S', 1, agency_ioctl_args_t) +#define AGENCY_IOCTL_WRITE_SNAPSHOT _IOW('S', 2, agency_ioctl_args_t) +#define AGENCY_IOCTL_SHUTDOWN _IOW('S', 3, agency_ioctl_args_t) +#define AGENCY_IOCTL_INJECT_CAPSULE _IOWR('S', 4, agency_ioctl_args_t) +#define AGENCY_IOCTL_START_CAPSULE _IOWR('S', 5, agency_ioctl_args_t) +#define AGENCY_IOCTL_GET_S3C_ID _IOWR('S', 6, agency_ioctl_args_t) +#define AGENCY_IOCTL_GET_S3C_ID_ARRAY _IOR('S', 7, agency_ioctl_args_t) + +/* struct agency_ioctl_args used in IOCTLs */ +typedef struct agency_ioctl_args { + void *buffer; /* IN/OUT */ + int slotID; + unsigned capsuleID; + long value; /* IN/OUT */ +} agency_ioctl_args_t; + +#endif /* UAPI_SOO_H */ diff --git a/linux/usr/src/CMakeLists.txt b/linux/usr/src/CMakeLists.txt index 2d2cfee..2a87cd3 100644 --- a/linux/usr/src/CMakeLists.txt +++ b/linux/usr/src/CMakeLists.txt @@ -1 +1,4 @@ add_subdirectory(examples) +add_subdirectory(soo) +add_subdirectory(lvgl) +add_subdirectory(graphic) diff --git a/linux/usr/src/soo/CMakeLists.txt b/linux/usr/src/soo/CMakeLists.txt new file mode 100644 index 0000000..c36590d --- /dev/null +++ b/linux/usr/src/soo/CMakeLists.txt @@ -0,0 +1,16 @@ + + +add_executable(injector injector.c) + +add_executable(saveme saveme.c) +add_executable(restoreme restoreme.c) +add_executable(shutdownme shutdownme.c) + +add_executable(melist melist.c) +add_executable(fb_mapper fb_mapper.c) +add_executable(input_forwarding input_forwarding.c) + +add_subdirectory(emiso_engine) + +target_link_libraries(saveme zip) +target_link_libraries(restoreme zip) diff --git a/linux/usr/src/soo/emiso_engine/CMakeLists.txt b/linux/usr/src/soo/emiso_engine/CMakeLists.txt new file mode 100644 index 0000000..9b762fb --- /dev/null +++ b/linux/usr/src/soo/emiso_engine/CMakeLists.txt @@ -0,0 +1,25 @@ +project(emiso_engine LANGUAGES C CXX) + +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +add_executable(${PROJECT_NAME} emiso_engine.cpp + utils.cpp + webserver/webserver.cpp + webserver/system/system.cpp + webserver/container/container.cpp + webserver/image/image.cpp + webserver/network/network.cpp + webserver/volume/volume.cpp + webserver/plugins/plugins.cpp + daemon/image.cpp + daemon/capsule.cpp + daemon/daemon.cpp + #cli/cli.cpp +) + +target_include_directories(${PROJECT_NAME} PRIVATE include) + +target_link_libraries(${PROJECT_NAME} httpserver jsoncpp readline zip) + +install(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_BINARY_DIR}/bin) diff --git a/linux/usr/src/soo/emiso_engine/cli/cli.cpp b/linux/usr/src/soo/emiso_engine/cli/cli.cpp new file mode 100644 index 0000000..7eb513f --- /dev/null +++ b/linux/usr/src/soo/emiso_engine/cli/cli.cpp @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2023 Jean-Pierre Miceli + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include +#include + +#include "cli.hpp" + +#define EMISO_CLI_PROMPT "(emiso)>> " + +namespace emiso { + +Cli::Cli() {} + +Cli::~Cli() {} + +void Cli::splitCmd(std::string const &str, const char delim, std::vector &out) +{ + // create a stream from the string + std::stringstream s(str); + + std::string s2; + while (std::getline (s, s2, delim)) { + out.push_back(s2); // store the string in s2 + } +} + + +// Function to handle the "hello" command +void Cli::handleHelloCommand() { + std::cout << "Hello, World!" << std::endl; +} + +// Function to handle the "help" command +void Cli::handleHelpCommand() { + std::cout << "Available commands:" << std::endl; + std::cout << " hello - Print a greeting" << std::endl; + std::cout << " help - Show available commands" << std::endl; + std::cout << " exit - Exit the program" << std::endl; +} + + +void Cli::handleImagesCommand(std::vector &tokens) +{ + std::map info; + + // TODO - Add checks on 'tokens' + if (tokens[1] == "info") { + _image.info(info); + + for (auto it = info.begin(); it != info.end(); ++it) { + std::string name = it->second.name; + size_t size = it->second.size; + std::string id = it->second.id; + auto date = it->second.date; + + std::cout << name << std::endl; + std::cout << " Size: " << size << std::endl; + std::cout << " ID: " << id << std::endl; + std::cout << " date: " << date << std::endl; + } + } else if (tokens[1] == "rm") { + // TODO - Add checks on 'tokens[2]' + _image.remove(tokens[2]); + } else { + std::cout << "[ERROR] image cmd '" << tokens[1] << "' is not supported" << std::endl; + } +} + +void Cli::start() +{ + std::cout << "Starting interactive mode" << std::endl; + while (true) { + char* input = readline(EMISO_CLI_PROMPT); + if (!input) { + break; // User pressed Ctrl+D (EOF) + } + + std::string command(input); + free(input); + + // Add the command to readline's history + if (!command.empty()) { + add_history(command.c_str()); + } + + std::vector tokens; + Cli::splitCmd(command, ' ', tokens); + + + if (tokens[0] == "hello") { + Cli::handleHelloCommand(); + } else if (tokens[0] == "help") { + Cli::handleHelpCommand(); + } else if (tokens[0] == "image") { + Cli::handleImagesCommand(tokens); + } else if (tokens[0] == "exit") { + break; // Exit the program + } else { + std::cout << "Unknown command. Type 'help' for a list of available commands." << std::endl; + } + } + + std::cout << "Stopping interactive mode" << std::endl; + +} + +} // emiso \ No newline at end of file diff --git a/linux/usr/src/soo/emiso_engine/cli/cli.hpp b/linux/usr/src/soo/emiso_engine/cli/cli.hpp new file mode 100644 index 0000000..2eee2a8 --- /dev/null +++ b/linux/usr/src/soo/emiso_engine/cli/cli.hpp @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2023 Jean-Pierre Miceli + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef EMISO_CLI_H +#define EMISO_CLI_H + +#include +#include +#include + +#include "../daemon/image.hpp" + +namespace emiso { + + class Cli { + public: + Cli(); + + // Destructor + ~Cli(); + + void start(); + + private: + daemon::Image _image; + + void splitCmd(std::string const &str, const char delim, std::vector &out); + + void handleHelloCommand(); + void handleHelpCommand(); + void handleImagesCommand(std::vector &tockens); + }; +} + +#endif // EMISO_CLI_H diff --git a/linux/usr/src/soo/emiso_engine/daemon/capsule.cpp b/linux/usr/src/soo/emiso_engine/daemon/capsule.cpp new file mode 100644 index 0000000..1399def --- /dev/null +++ b/linux/usr/src/soo/emiso_engine/daemon/capsule.cpp @@ -0,0 +1,542 @@ +/* + * Copyright (C) 2023 Jean-Pierre Miceli + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include + +#include + +#include "capsule.hpp" + +using namespace std; + +// Path where the Capsule images are stored +#define EMISO_IMAGE_PATH "/mnt/capsules/image/" + +// Path where the Capsule snapshot are stored +#define EMISO_CAPSULE_CACHE_DIR "/mnt/capsules/snapshot" + +// Path of SOO driver +#define SOO_CORE_DRV_PATH "/dev/soo/core" + +#define LOG_PREFIX "[EMISO:DAEMON] " + +namespace emiso { + +map Capsule::_capsules; +unsigned Capsule::_capsuleIdx = 0; + +Capsule::Capsule(){}; + +Capsule::~Capsule(){}; + +/** + * @brief Return NOW in epoch format, in seconds + * + * It is used to set Capsule's creation time + * + * @return now, since EPOCH, in second + */ +uint64_t Capsule::createdTime() +{ + const auto now = chrono::system_clock::now(); + const auto epoch = chrono::duration_cast(now.time_since_epoch()).count(); + + return epoch; +} + + +/* + * @brief Inject a capsule + * + * @param imageName Name image, without .itb suffix, used to inject the capsule + * @return The ID of the create capsule or a negative value in case of error + */ +int Capsule::inject(string imageName, bool start_capsule, unsigned capsuleId) +{ + int fd; + int ret; + streampos capsuleSize; + string filename; + char *capsuleBuf; + struct agency_ioctl_args args; + + cout << LOG_PREFIX "Capsule injection from image " << imageName << endl; + + filename = std::format("{}{}.itb", EMISO_IMAGE_PATH, imageName); + + ifstream image(filename, ios::in | ios::binary | ios::ate); + if (!image.is_open()) { + cerr << LOG_PREFIX "Error: Failed to open image file '" << filename << "'" << endl; + return EXIT_FAILURE; + } + + capsuleSize = image.tellg(); + + capsuleBuf = new char[capsuleSize]; + + image.seekg(0, ios::beg); + image.read(capsuleBuf, capsuleSize); + image.close(); + + args.buffer = capsuleBuf; + args.value = capsuleSize; + args.slotID = -1; /* Wherever */ + args.capsuleID = capsuleId; + + fd = open(SOO_CORE_DRV_PATH, O_RDWR); + if (fd < 0) { + cerr << "[EMISO:DAEMON] Failing to open /dev soo entry ..." << endl; + delete[] capsuleBuf; + return EXIT_FAILURE; + } + + /* Inject the capsule */ + ret = ioctl(fd, AGENCY_IOCTL_INJECT_CAPSULE, &args); + if ((ret < 0) || (args.slotID == -1)) { + cerr << "[EMISO:DAEMON] No available ME slot further..." << endl; + close(fd); + delete[] capsuleBuf; + return EXIT_FAILURE; + } + + if (start_capsule) { + ioctl(fd, AGENCY_IOCTL_START_CAPSULE, &args); + } + + delete[] capsuleBuf; + close(fd); + + return args.slotID; +} + + +/* + * @brief Save a snapshot of a Capsule + * + * @param slotId The slot ID of the capsule for which to create a snapshot. + * @param snapshotName The name of the snapshot + * @return negative value in case of error, 0 otherwise + */ +int Capsule::saveSnapshot(int slotId, string snapshotName) +{ + int fd; + int ret; + struct agency_ioctl_args args; + struct zip_t *zip; + string filename; + + cout << LOG_PREFIX "Save Capsule - slot ID: " << slotId << ", name: " << snapshotName << endl; + + fd = open(SOO_CORE_DRV_PATH, O_RDWR); + if (fd < 0) { + printf("[EMISO:DAEMON] Failing to open /dev/soo entry ...\n"); + return EXIT_FAILURE; + } + + /* Get the size of the snapshot */ + args.slotID = slotId; + args.value = 0; /* To get the size of the snapshot */ + + ret = ioctl(fd, AGENCY_IOCTL_READ_SNAPSHOT, &args); + if (ret < 0) { + printf(LOG_PREFIX "Get the size with IOCTL_READ_SNAPSHOT failed.\n"); + close(fd); + return EXIT_FAILURE; + } + + args.buffer = new (std::nothrow) char[args.value]; + if (args.buffer == NULL) { + printf(LOG_PREFIX " %s - malloc failed\n", __func__); + close(fd); + return EXIT_FAILURE; + } + + ret = ioctl(fd, AGENCY_IOCTL_READ_SNAPSHOT, &args); + if (ret < 0) { + printf(LOG_PREFIX "Read the snapshot IOCTL_READ_SNAPSHOT failed.\n"); + delete[] args.buffer; + close(fd); + return EXIT_FAILURE; + } + + close(fd); + + filename = string(EMISO_CAPSULE_CACHE_DIR) + "/" + snapshotName; + + cout << "Save capsule in: " << filename << endl; + + /* Compress the snapshot */ + zip = zip_open(filename.c_str(), ZIP_DEFAULT_COMPRESSION_LEVEL, 'w'); + if (!zip) { + printf(LOG_PREFIX "Failed to open the zip file. Is there a bad sync after saving the snapshot?...\n"); + perror(""); + delete[] args.buffer; + close(fd); + return EXIT_FAILURE; + } + zip_entry_open(zip, "me"); + zip_entry_write(zip, args.buffer, args.value); + zip_entry_close(zip); + + zip_close(zip); + delete[] args.buffer; + + return 0; +} + +/* + * @brief Restore a Capsule for a snapshot + * + * @param snapshotName The name of the snapshot + * @return The slot ID used for the capsule or a negative value in case of error + */ +int Capsule::restoreSnapshot(string snapshotName) +{ + int fd; + int ret; + struct agency_ioctl_args args; + size_t buffer_size; + struct zip_t *zip; + string filename; + + /* Open the channel to the kernel soo submodule. */ + fd = open(SOO_CORE_DRV_PATH, O_RDWR); + if ((fd < 0)) { + printf(LOG_PREFIX "Failed to open soo /dev entry...\n"); + return EXIT_FAILURE; + } + + filename = std::string(EMISO_CAPSULE_CACHE_DIR) + "/" + snapshotName; + + zip = zip_open(filename.c_str(), 0, 'r'); + if (!zip) { + printf(LOG_PREFIX "Failed to open the zip file. Is there a bad sync after saving the snapshot?...\n"); + close(fd); + return EXIT_FAILURE; + } + + zip_entry_open(zip, "me"); + zip_entry_read(zip, &args.buffer, &buffer_size); + zip_entry_close(zip); + + zip_close(zip); + + /* Restore the snapshot which is in stated */ + cout << LOG_PREFIX "Re-implementing snapshot of size " << buffer_size << " bytes." << endl; + args.slotID = -1; + ret = ioctl(fd, AGENCY_IOCTL_WRITE_SNAPSHOT, &args); + if (ret < 0) { + printf("Failed to initialize migration (%d)\n", ret); + close(fd); + return EXIT_FAILURE; + } + + close(fd); + + return args.slotID; +} + +/* + * @brief Shutdown a Capsule + * + * @param slotId The slot ID of the capsule to shutdown. + * @return a negative value in case of error, 0 otherwise + */ +int Capsule::shutdown(int slotId) +{ + int fd; + int ret; + struct agency_ioctl_args args; + + fd = open(SOO_CORE_DRV_PATH, O_RDWR); + if (fd < 0) { + printf("[EMISO:DAEMON] Failing to open /dev/soo entry ...\n"); + return EXIT_FAILURE; + } + + /* Shutdown the capsule so that it will be removed from the memory */ + args.slotID = slotId; + + ret = ioctl(fd, AGENCY_IOCTL_SHUTDOWN, &args); + if (ret < 0) { + printf(LOG_PREFIX "Read the snapshot IOCTL_READ_SNAPSHOT failed.\n"); + close(fd); + return EXIT_FAILURE; + } + + close(fd); + + return 0; +} + +/** + * @brief Retrieve the info of all the capsules + * + * @param capsuleList A map which contains the info of all capsules. + */ +void Capsule::info(map &capsuleList) +{ + capsuleList = _capsules; +} + + +/** + * @brief Retrieve the info of a specific capsule + * + * @param id ID of the capsule from which to retrieve the information + * @param info The info of the capsule + */ +void Capsule::info(int id, CapsuleInfo &info) +{ + info = _capsules.at(id); +} + + +/** + * @brief The create() method of Capsule leads to the injection of a capsule, but + * without starting its execution. It will perform a snapshot, write it to + * a specific location and shutdown the stopped capsule. + * + * @param imageName Name image, without .itb suffix, used to create the capsule + * @param capsuleName The name of the capsule to create + * @return The ID of the create capsule + */ +int Capsule::create(string imageName, string capsuleName) +{ + int slotId; + + cout << LOG_PREFIX "Create capsule " << capsuleName << " from image " << imageName << endl; + + // Inject the Capsule + slotId = this->inject(imageName, false, _capsuleIdx); + + // Save the info of the new capsule + CapsuleInfo capsule; + capsule.id = _capsuleIdx; + capsule.name = capsuleName; + capsule.state = "created"; + capsule.image = imageName; + capsule.slotId = slotId; + capsule.created = this->createdTime(); + + _capsules[_capsuleIdx] = capsule; + _capsuleIdx++; + + // Save the snapshot to the capsule cache directory and shutdown it + this->saveSnapshot(slotId, capsuleName); + + // Shutdown the capsule + this->shutdown(slotId); + + // Set the Capsule state + _capsules[capsule.id].state = "created"; + + return capsule.id; +} + +/** + * @brief Start an existing capsule + * + * Depending in the state of the capsule, it is restored or injected + * + * @param capsuleName + * @param capsuleId + * @return + */ +int Capsule::start(unsigned capsuleId) +{ + int ret; + string capsuleName = _capsules[capsuleId].name; + int slotId; + + cout << LOG_PREFIX "Start capsule " << capsuleName << endl; + + if (_capsules[capsuleId].state == "created") { + slotId = this->restoreSnapshot(capsuleName); + + } else if (_capsules[capsuleId].state == "exited") { + slotId = this->inject(_capsules[capsuleId].image, true, capsuleId); + + } else { + cerr << "[EMISO:DAEMON] Capsule start failed. The capsule it is not in a correct state (" + << _capsules[capsuleId].state << ")" << endl; + return -1; + } + + _capsules[capsuleId].state = "running"; + _capsules[capsuleId].slotId = slotId; + + return ret; +} + + +/** + * @brief Shutdown a capsule + * + * @param capsuleId ID of the capsule to shutdown + * @return 0 in case of success or a negative value + */ +int Capsule::stop(unsigned capsuleId) +{ + int ret; + struct agency_ioctl_args args; + + ret = this->shutdown(_capsules[capsuleId].slotId); + + _capsules[capsuleId].state = "exited"; + + return ret; +} + + +/** + * @brief Restart a capsule + * + * @param capsuleId ID of the capsule to shutdown + * @return 0 in case of success or a negative value + */ +int Capsule::restart(unsigned capsuleId) +{ + int ret; + + auto imageName = _capsules[capsuleId].image; + auto capsuleName = _capsules[capsuleId].name; + + // Stop & remove the capsule + ret = this->shutdown(capsuleId); + if (ret < 0) + return ret; + + // re-create the capsule + ret = this->inject(imageName, true, capsuleId); + if (ret < 0) + return ret; + + _capsules[capsuleId].state = "running"; + + return 0; +} + + +/** + * @brief Pause a capsule + * + * @param capsuleId ID of the capsule to pause + * @return 0 in case of success or a negative value + */ +int Capsule::pause(unsigned capsuleId) +{ + int ret; + + cout << LOG_PREFIX "Pause capsule with ID " << capsuleId << endl; + + this->saveSnapshot(_capsules[capsuleId].slotId, _capsules[capsuleId].name); + + this->shutdown(_capsules[capsuleId].slotId); + + _capsules[capsuleId].state = "paused"; + + return ret; +} + + +/** + * @brief Unpause a capsule + * + * @param capsuleId ID of the capsule to pause + * @return 0 in case of success or a negative value + */ +int Capsule::unpause(unsigned capsuleId) +{ + int ret; + + ret = this->restoreSnapshot(_capsules[capsuleId].name); + _capsules[capsuleId].state = "running"; + + return ret; +} + +/** + * @brief Remove a capsule + * + * @param capsuleId ID of the capsule to pause + * @return 0 in case of success or a negative value + */ +int Capsule::remove(unsigned capsuleId) +{ + int ret = 0; + + if (_capsules[capsuleId].state == "running") + ret = this->shutdown(_capsules[capsuleId].slotId); + + if (ret == 0) + _capsules.erase(capsuleId); + + return ret; +} + +vector Capsule::retrieveLogs(unsigned capsuleId, unsigned lineNr) +{ + vector lines; + + // Create the file path + string fileName = "/var/log/soo/s3c_" + to_string(capsuleId) + ".log"; + + cout << "[DEBUG] Logfile name: " << fileName << endl; + + // Read the file + ifstream file(fileName); + + if (!file.is_open()) { + cerr << "Error opening file: " << fileName << endl; + return lines; // return empty vector if file couldn't be opened + } + + // Read the whole file + if (lineNr == -1) { + // Count the number of lines + lineNr = count(istreambuf_iterator(file), + istreambuf_iterator(), '\n'); + + + // Reset the file stream back to beginning + file.clear(); + file.seekg(0, ios::beg); + } + + string line; + while (getline(file, line) && lineNr-- > 0) { + lines.push_back(line); + } + + file.close(); + return lines; +} + +} // namespace emiso diff --git a/linux/usr/src/soo/emiso_engine/daemon/capsule.hpp b/linux/usr/src/soo/emiso_engine/daemon/capsule.hpp new file mode 100644 index 0000000..13627b6 --- /dev/null +++ b/linux/usr/src/soo/emiso_engine/daemon/capsule.hpp @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2023 Jean-Pierre Miceli + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef EMISO_DAEMON_CAPSULE_H +#define EMISO_DAEMON_CAPSULE_H + +#include +#include +#include + +using namespace std; + +namespace emiso { + + struct CapsuleInfo { + int id; + string name; + string state; + string image; + uint64_t created; + int slotId; + }; + + class Capsule { + + public: + Capsule(); + ~Capsule(); + + void info(map &capsuleList); + void info(int id, CapsuleInfo &info); + + int create(string imageName, string capsuleName); + int start(unsigned capsuleId); + int stop(unsigned capsuleId); + int restart(unsigned capsuleId); + int pause(unsigned capsuleId); + int unpause(unsigned capsuleId); + int remove(unsigned capsuleId); + + vector retrieveLogs(unsigned capsuleId, unsigned lineNr); + + private: + uint64_t createdTime(); + int inject(string imageName, bool start_capsule, unsigned capsuleId); + int saveSnapshot(int slotId, string snapshotName); + int restoreSnapshot(string snapshotName); + int shutdown(int slotId); + + // List of the Capsules - running or paused + static map _capsules; + // Capsule Idx, used with the map + static unsigned _capsuleIdx; + }; +} + +#endif // EMISO_DAEMON_CAPSULE_H diff --git a/linux/usr/src/soo/emiso_engine/daemon/daemon.cpp b/linux/usr/src/soo/emiso_engine/daemon/daemon.cpp new file mode 100644 index 0000000..7477e10 --- /dev/null +++ b/linux/usr/src/soo/emiso_engine/daemon/daemon.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2023 Jean-Pierre Miceli + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "daemon.hpp" + +namespace emiso { + +Daemon* Daemon::_daemon = nullptr; + +Daemon::Daemon() {}; + +Daemon::~Daemon() {}; + + +Daemon* Daemon::getInstance() +{ + + if (_daemon == nullptr) { + _daemon = new Daemon(); + } + + return _daemon; +} + +} // namespace emiso diff --git a/linux/usr/src/soo/emiso_engine/daemon/daemon.hpp b/linux/usr/src/soo/emiso_engine/daemon/daemon.hpp new file mode 100644 index 0000000..f820574 --- /dev/null +++ b/linux/usr/src/soo/emiso_engine/daemon/daemon.hpp @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2024 Jean-Pierre Miceli + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + + +#ifndef EMISO_DAEMON_H +#define EMISO_DAEMON_H + +#include "image.hpp" +#include "capsule.hpp" + + +namespace emiso { + + class Daemon { + + public: + Image image; + Capsule container; + + static Daemon* getInstance(); + + private: + Daemon(); + ~Daemon(); + + static Daemon* _daemon; + }; +} + +#endif // EMISO_DAEMON_H + diff --git a/linux/usr/src/soo/emiso_engine/daemon/image.cpp b/linux/usr/src/soo/emiso_engine/daemon/image.cpp new file mode 100644 index 0000000..b5e8cb9 --- /dev/null +++ b/linux/usr/src/soo/emiso_engine/daemon/image.cpp @@ -0,0 +1,173 @@ +/* + * Copyright (C) 2023 Jean-Pierre Miceli + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include +#include + +#include +#include + + +#include "image.hpp" + +// Path where the Capsule images are stored +#define EMISO_IMAGE_PATH "/mnt/capsules/image/" +#define EMISO_IMAGE_ID_MODE "md5" + +namespace emiso { + +Image::Image() {}; + +Image::~Image() {}; + +namespace fs = std::filesystem; + +std::string Image::calculateId(const std::string& filePath) +{ + std::ifstream file(filePath, std::ios::binary); + if (!file) { + std::cerr << "Failed to open file '" << filePath << "'" << std::endl; + return ""; + } + + // Create an MD5 hash function + std::hash md5Hash; + + // Read the file content and calculate the MD5 checksum + std::stringstream buffer; + buffer << file.rdbuf(); + std::string fileContent = buffer.str(); + std::string id = std::to_string(md5Hash(fileContent)); + + return id; +} + + +int Image::createdTime(const std::string& filePath) +{ + try { + // Check if the file exists and retrieve its status + if (fs::exists(filePath)) { + fs::file_time_type fileTime = fs::last_write_time(filePath); + + // Convert file_time_type → system_clock::time_point + auto sctp = std::chrono::clock_cast(fileTime); + + // Get Unix timestamp + std::time_t unix_ts = std::chrono::system_clock::to_time_t(sctp); + + return unix_ts; + } else { + std::cout << "[WARNING] File '" << filePath << "' does not exist." << std::endl; + return -1; + } + + } catch (const std::filesystem::filesystem_error& e) { + std::cerr << "[ERROR]: " << e.what() << std::endl; + return -1; + } +} + + +void Image::info(std::map &imagesList) +{ + // Check if the folder exists + if (std::filesystem::exists(EMISO_IMAGE_PATH) && std::filesystem::is_directory(EMISO_IMAGE_PATH)) { + // Iterate through the files in the folder + for (const auto& entry : std::filesystem::directory_iterator(EMISO_IMAGE_PATH)) { + if (std::filesystem::is_regular_file(entry)) { + ImageInfo info; + + info.name = entry.path().filename(); + info.size = std::filesystem::file_size(entry); + info.date = this->createdTime(EMISO_IMAGE_PATH + info.name); + + auto id = this->calculateId(EMISO_IMAGE_PATH + info.name); + std::string mode = EMISO_IMAGE_ID_MODE; + info.id = mode + ":" + id; + + imagesList[info.name] = info; + } + } + } else { + std::cerr << "Folder '" << EMISO_IMAGE_PATH << "' does not exist or is not a directory." << std::endl; + } +} + +int Image::info(std::string name, ImageInfo &info) +{ + bool isID = false; + std::string id_orig; + + // The 'name' parameter can be the image name of the image ID + + std::cout << "info a image '" << name << "' called" << std::endl; + + // 1. extracting the "code" from the 'name' + auto pos = name.find(':'); + if (pos != std::string::npos) { + id_orig = name.substr(pos + 1); + + } else { + id_orig = this->calculateId(EMISO_IMAGE_PATH + name + ".itb"); + } + + // == Searching for the image which has this ID == + + // Iterate through the files in the folder + for (const auto& entry : std::filesystem::directory_iterator(EMISO_IMAGE_PATH)) { + if (std::filesystem::is_regular_file(entry)) { + info.name = entry.path().filename(); + auto id = this->calculateId(EMISO_IMAGE_PATH + info.name); + + if (id == id_orig) { + info.size = std::filesystem::file_size(entry); + info.date = this->createdTime(EMISO_IMAGE_PATH + info.name); + std::string mode = EMISO_IMAGE_ID_MODE; + info.id = mode + ":" + id; + + return 0; + } + } + } + + // No image found with the same ID as the one in 'image' parameter + std::cerr << "[ERROR]: Image '" << name << "' not found" << std::endl; + return -1; +} + +void Image::remove(std::string name) +{ + std::filesystem::path filePath = EMISO_IMAGE_PATH + name; + + if (std::filesystem::exists(filePath)) { + try { + // Remove the file + std::filesystem::remove(filePath); + + std::cout << "File removed successfully." << std::endl; + } catch (const std::filesystem::filesystem_error& e) { + std::cerr << "Error removing file: " << e.what() << std::endl; + + } + } else { + std::cout << "[WARNING] File '" << filePath << "' does not exists" << std::endl; + } +} + +} // emiso diff --git a/linux/usr/src/soo/emiso_engine/daemon/image.hpp b/linux/usr/src/soo/emiso_engine/daemon/image.hpp new file mode 100644 index 0000000..eedc597 --- /dev/null +++ b/linux/usr/src/soo/emiso_engine/daemon/image.hpp @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2023 Jean-Pierre Miceli + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef EMISO_DAEMON_IMAGE_H +#define EMISO_DAEMON_IMAGE_H + +#include +#include +#include +#include + +namespace emiso { +// namespace daemon { + + struct ImageInfo { + std::string id; + std::string name; + size_t size; + uint64_t date; + }; + + class Image { + + public: + Image(); + ~Image(); + + // Retrieve information about all the images + void info(std::map &imagesList); + + // Retrieve info about image 'name' + // return 0 in case of success, -1 otherwise + int info(std::string name, ImageInfo &info); + + // Remove image 'name' from the disk + void remove(std::string name); + private: + // The ID corresponds to the MD5 checksum + std::string calculateId(const std::string& filePath); + + // Get the date at which the image was created (Unix timestamp) + int createdTime(const std::string& filePath); + + }; +// } +} + +#endif // EMISO_DAEMON_IMAGE_H diff --git a/linux/usr/src/soo/emiso_engine/emiso_engine.cpp b/linux/usr/src/soo/emiso_engine/emiso_engine.cpp new file mode 100644 index 0000000..d87e154 --- /dev/null +++ b/linux/usr/src/soo/emiso_engine/emiso_engine.cpp @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2023 Jean-Pierre Miceli + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +// EMISO Engine - Start the engine on port '2375'. It can be started in secure +// mode (HTTPS/TLS) with '-s' option +// The interactive mode ('-i' option) starts a cli interface instead of the web +// server + +#include +#include + +#include "webserver/webserver.hpp" +// #include "cli/cli.hpp" +#include "daemon/daemon.hpp" + +#define SERVER_PORT 2375 + +int main(int argc, char **argv) +{ + int c; + bool secure = false; + bool interactive = false; + + // TODO - Use C++ parameter handler lib ! + while ((c = getopt(argc, argv, "is")) != EOF) { + switch (c) { + case 'i': + interactive = true; + break; + case 's': + secure = true; + break; + default: + // usage(); + exit(1); + break; + } + } + + emiso::Daemon *daemon = emiso::Daemon::getInstance(); + +// if (interactive) { +// emiso::Cli cli; +// cli.start(); +// +// } else { + // TODO - in interactive mode, also start the webserver ! + emiso::WebServer server(SERVER_PORT, secure, daemon); + server.start(true); +// } + + return 0; +} diff --git a/linux/usr/src/soo/emiso_engine/include/emiso/config.hpp b/linux/usr/src/soo/emiso_engine/include/emiso/config.hpp new file mode 100644 index 0000000..a1e4ac5 --- /dev/null +++ b/linux/usr/src/soo/emiso_engine/include/emiso/config.hpp @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2023 Jean-Pierre Miceli + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* Basic - Constant configuration for EMISO engine */ + +#ifndef EMISO_CONFIG_H +#define EMISO_CONFIG_H + +#define EMISO_VERSION "1.0" +#define EMISO_PLATFORM_NAME "emiso" + +// Webserver configuration +#define EMISO_WEB_COMP_NAME "engine" +#define EMISO_WEB_API_VERSION "1.43" +#define EMISO_WEB_EXPERIMENTAL false +#define EMISO_WEB_SWARM "inactive" + +#endif // EMISO_CONFIG_H + diff --git a/linux/usr/src/soo/emiso_engine/include/emiso/utils.hpp b/linux/usr/src/soo/emiso_engine/include/emiso/utils.hpp new file mode 100644 index 0000000..1f1759f --- /dev/null +++ b/linux/usr/src/soo/emiso_engine/include/emiso/utils.hpp @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2023 Jean-Pierre Miceli + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* Provide basic functions for the EMISO engine */ + +#ifndef EMISO_UTILS_H +#define EMISO_UTILS_H + +#include + +namespace emiso { + + struct SystemInfo { + std::string kernel_version; + std::string os; + std::string os_version; + std::string os_type; + std::string arch; + }; + + class Utils { + + public: + static Utils& getInstance() { + // Create the instance if it doesn't exist + static Utils instance; + return instance; + } + + /* Return info in the platform */ + SystemInfo getInfo(); + + // Return the current system time, in RFC 3339 format with nano-seconds + std::string getSystemTime(); + + // Return the Agency UUID of the Smart Object + std::string getAgencyUID(); + + private: + SystemInfo _info; + + Utils(); + ~Utils(); + + // Make copy constructor and assignment operator private to prevent copying + Utils(const Utils&) = delete; + Utils& operator=(const Utils&) = delete; + }; + +} // emiso + +#endif // EMISO_UTILS_H + + + + diff --git a/linux/usr/src/soo/emiso_engine/utils.cpp b/linux/usr/src/soo/emiso_engine/utils.cpp new file mode 100644 index 0000000..3383e2a --- /dev/null +++ b/linux/usr/src/soo/emiso_engine/utils.cpp @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2023 Jean-Pierre Miceli + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include +#include +#include +#include +#include + +#include + +#define EMISO_OS_RELEASE_PATH "/etc/os-release" +#define EMISO_AGENCY_UID_PATH "/sys/soo/agencyUID" + +namespace emiso { + +Utils::Utils () +{ + // Retrieve platform info + struct utsname unameData; + if (uname(&unameData) != -1) { + _info.kernel_version = unameData.release; + _info.os_type = unameData.sysname; + _info.arch = unameData.machine; + } + + // Retrieve OS information + std::ifstream osReleaseFile(EMISO_OS_RELEASE_PATH); + if (osReleaseFile.is_open()) { + std::string line; + while (std::getline(osReleaseFile, line)) { + if (line.find("PRETTY_NAME=") != std::string::npos) { + _info.os = line.substr(13); + } + if (line.find("VERSION=") != std::string::npos) { + _info.os_version = line.substr(8); + } + } + osReleaseFile.close(); + } else { + std::cerr << "Failed to open /etc/os-release" << std::endl; + } +} + +Utils::~Utils() {} + +SystemInfo Utils::getInfo() +{ + return _info; +} + + +std::string Utils::getSystemTime() +{ + // Get the current time with nanoseconds + auto currentTime = std::chrono::system_clock::now(); + + // Convert to RFC 3339 format with nanoseconds + auto timeT = std::chrono::system_clock::to_time_t(currentTime); + auto fractionalSeconds = std::chrono::duration_cast(currentTime.time_since_epoch()).count() % 1000000000; + struct tm timeinfo; + gmtime_r(&timeT, &timeinfo); + + // Format the date and time + char buffer[64]; // Sufficient size for RFC 3339 format + strftime(buffer, sizeof(buffer), "%Y-%m-%dT%H:%M:%S", &timeinfo); + + // Create an output string stream to capture the formatted time + std::ostringstream formattedTime; + formattedTime << buffer << "." << std::setw(9) << std::setfill('0') << fractionalSeconds << "Z"; + + // Get the formatted time as a string + return formattedTime.str(); +} + + +std::string Utils::getAgencyUID() +{ + std::ifstream sysfsFile(EMISO_AGENCY_UID_PATH); + if (!sysfsFile.is_open()) { + std::cerr << "Failed to open sysfs file: " << EMISO_AGENCY_UID_PATH << std::endl; + // TODO - handle error + } + + std::string fileContent; + std::getline(sysfsFile, fileContent); // Read the content of the file + + sysfsFile.close(); // Close the file + + if (sysfsFile.fail()) { + std::cerr << "Error occurred while reading the sysfs file." << std::endl; + // TODO - handle error + } + + return fileContent; +} + + +} // emiso diff --git a/linux/usr/src/soo/emiso_engine/webserver/container/container.cpp b/linux/usr/src/soo/emiso_engine/webserver/container/container.cpp new file mode 100644 index 0000000..3d03bc4 --- /dev/null +++ b/linux/usr/src/soo/emiso_engine/webserver/container/container.cpp @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2023 Jean-Pierre Miceli + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "container.hpp" + +namespace emiso { + + namespace container { + + ContainerApi::ContainerApi(httpserver::webserver *server, Daemon *daemon) + : _server(server) { + string path = "/containers"; + + // Create routes and handlers + _listHandler = new ListHandler(daemon); + _createHandler = new CreateHandler(daemon); + _startHandler = new StartHandler(daemon); + _stopHandler = new StopHandler(daemon); + _restartHandler = new RestartHandler(daemon); + _pauseHandler = new PauseHandler(daemon); + _unpauseHandler = new UnpauseHandler(daemon); + _removeHandler = new RemoveHandler(daemon); + _inspectHandler = new InspectHandler(daemon); + _logsHandler = new LogsHandler(daemon); + + _server->register_resource(path + "/json", _listHandler); + _server->register_resource("/v[1-9]+.[0-9]+" + path + "/json", _listHandler); + + _server->register_resource(path + "/create", _createHandler); + _server->register_resource("/v[1-9]+.[0-9]+" + path + "/create", _createHandler); + + _server->register_resource(path + "/{[a-zA-Z0-9_-]+}/start", _startHandler); + _server->register_resource("/v[1-9]+.[0-9]+" +path + "/{[a-zA-Z0-9_-]+}/start", _startHandler); + + _server->register_resource(path + "/{id|[0-9]+}/stop", _stopHandler); + _server->register_resource("/v[1-9]+.[0-9]+" + path + "/{id|[0-9]+}/stop", _stopHandler); + + _server->register_resource(path + "/{id|[0-9]+}/restart", _restartHandler); + _server->register_resource("/v[1-9]+.[0-9]+" + path + "/{id|[0-9]+}/restart", _restartHandler); + + _server->register_resource(path + "/{id|[0-9]+}/pause", _pauseHandler); + _server->register_resource("/v[1-9]+.[0-9]+" + path + "/{id|[0-9]+}/pause", _pauseHandler); + + _server->register_resource(path + "/{id|[0-9]+}/unpause", _unpauseHandler); + _server->register_resource("/v[1-9]+.[0-9]+" + path + "/{id|[0-9]+}/unpause", _unpauseHandler); + + _server->register_resource(path + "/{id|[0-9]+}", _removeHandler); + _server->register_resource("/v[1-9]+.[0-9]+" + path + "/{id|[0-9]+}", _removeHandler); + + _server->register_resource(path + "/{id|[0-9]+}/json", _inspectHandler); + _server->register_resource("/v[1-9]+.[0-9]+" + path + "/{id|[0-9]+}/json", _inspectHandler); + + _server->register_resource(path + "/{id|[0-9]+}/logs", _logsHandler); + _server->register_resource("/v[1-9]+.[0-9]+" + path + "/{id|[0-9]+}/logs", _logsHandler); + } + + ContainerApi::~ContainerApi() {} + + } +} diff --git a/linux/usr/src/soo/emiso_engine/webserver/container/container.hpp b/linux/usr/src/soo/emiso_engine/webserver/container/container.hpp new file mode 100644 index 0000000..4be2857 --- /dev/null +++ b/linux/usr/src/soo/emiso_engine/webserver/container/container.hpp @@ -0,0 +1,425 @@ +/* + * Copyright (C) 2023 Jean-Pierre Miceli + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef EMISO_CONTAINER_H +#define EMISO_CONTAINER_H + +#include +#include +#include +#include +#include +#include + +#include "../../daemon/daemon.hpp" + +#include "container_inspect.hpp" +#include "container_logs.hpp" + +#define LOG_PREFIX "[EMISO:WEBSERVER] " + +using namespace std; + +namespace emiso { +namespace container { + + class ListHandler : public httpserver::http_resource { + public: + ListHandler(Daemon *daemon) : _daemon(daemon) {}; + + shared_ptr render_GET(const httpserver::http_request &req) { + string payload_str = ""; + Json::Value payload_json; + + cout << LOG_PREFIX "'" << req.get_path() << "' (" << req.get_method() << ") called" << endl; + + // Retrieve the command args - + // only "all" and "filters/name" args are handled + bool allArg = false; + bool sizeArg = false; + string filtersArg = ""; + + for (const auto &arg : req.get_args()) { + if (string(arg.first) == "all") { + allArg = (string(arg.second) == "true"); + } + if (arg.first == "filters") { + filtersArg = arg.second; + } + } + + vector namesFilter; + + if (!filtersArg.empty()) { + Json::CharReaderBuilder readerBuilder; + Json::Value filtersJsonValue; + istringstream filtersJsonStream(filtersArg); + + if (!Json::parseFromStream(readerBuilder, filtersJsonStream, &filtersJsonValue, nullptr)) { + // Parsing failed, handle the error as needed + cerr << LOG_PREFIX "Error parsing JSON!" << endl; + } + + if (filtersJsonValue.isMember("name")) { + for (int i = 0; i < filtersJsonValue["name"].size(); ++i) { + namesFilter.push_back(filtersJsonValue["name"][i].asString()); + } + } + } + + // Retrieve container info + map info; + + _daemon->container.info(info); + + if (info.empty()) { + payload_json = Json::arrayValue; + } else { + unsigned idx = 0; + for (auto it = info.begin(); it != info.end(); ++it) { + + // == Checks the args passed to the command == + + // 'all' - if true, return all containers. else only running + // containers are returned. + if ((!allArg) && (it->second.state != "running")) { + // Only return running containers + continue; + } + + // 'filters' (only name filter is supported) + bool nameFound = false; + if (!namesFilter.empty()) { + for (const auto &pattern : namesFilter) { + regex regexPattern(pattern); + if (regex_match("/" + it->second.name, regexPattern)) { + nameFound = true; + break; + } + } + } else { + nameFound = true; + } + + if (!nameFound) { + continue; + } + + // Retrieve info about the image used to create the container + ImageInfo imageInfo; + _daemon->image.info(it->second.image, imageInfo); + + // == Return info of the container == + + payload_json[idx]["Id"] = to_string(it->second.id); + payload_json[idx]["Names"][0] = "/" + it->second.name; + + payload_json[idx]["Image"] = it->second.image + ":latest"; + payload_json[idx]["ImageID"] = imageInfo.id; + payload_json[idx]["Command"] = "/inject"; + + payload_json[idx]["Created"] = it->second.created; + payload_json[idx]["Ports"] = Json::arrayValue; + payload_json[idx]["Labels"] = Json::objectValue; + payload_json[idx]["State"] = it->second.state; + payload_json[idx]["Status"] = it->second.state; + + // Network setting as the values obtained on the test PC + payload_json[idx]["HostConfig"]["NetworkMode"] = "bridge"; + payload_json[idx]["NetworkSettings"]["Networks"]["bridge"]["IPAMConfig"] = Json::objectValue; + payload_json[idx]["NetworkSettings"]["Networks"]["bridge"]["Links"] = Json::Value::null; + payload_json[idx]["NetworkSettings"]["Networks"]["bridge"]["Aliases"] = Json::Value::null; + + payload_json[idx]["NetworkSettings"]["Networks"]["bridge"]["NetworkID"] = "7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812", + + payload_json[idx]["NetworkSettings"]["Networks"]["bridge"]["EndpointID"] = ""; + payload_json[idx]["NetworkSettings"]["Networks"]["bridge"]["Gateway"] = ""; + payload_json[idx]["NetworkSettings"]["Networks"]["bridge"]["IPAddress"] = ""; + payload_json[idx]["NetworkSettings"]["Networks"]["bridge"]["IPPrefixLen"] = 0; + payload_json[idx]["NetworkSettings"]["Networks"]["bridge"]["IPv6Gateway"] = ""; + payload_json[idx]["NetworkSettings"]["Networks"]["bridge"]["GlobalIPv6Address"] = ""; + payload_json[idx]["NetworkSettings"]["Networks"]["bridge"]["GlobalIPv6PrefixLen"] = 0; + payload_json[idx]["NetworkSettings"]["Networks"]["bridge"]["MacAddress"] = ""; + payload_json[idx]["NetworkSettings"]["Networks"]["bridge"]["DriverOpts"] = Json::Value::null; + payload_json[idx]["Mounts"] = Json::arrayValue; + + idx++; + } + } + + Json::StreamWriterBuilder builder; + + payload_str = Json::writeString(builder, payload_json); + auto response = make_shared(payload_str, + httpserver::http::http_utils::http_ok, "application/json"); + return response; + } + + private: + Daemon *_daemon; + }; + + + class CreateHandler : public httpserver::http_resource { + public: + CreateHandler(Daemon *daemon) : _daemon(daemon) {}; + + shared_ptr render_POST(const httpserver::http_request &req) { + string payload_str = ""; + Json::Value payload_json; + int containerId; + string containerName; + + cout << LOG_PREFIX "'" << req.get_path() << "' (" << req.get_method() << ") called" << endl; + + // Extract info from body + const string requestBody = string(req.get_content()); + + // Retrieve the 'name' from request args + for (const auto &arg : req.get_args()) { + if (string(arg.first) == "name") { + containerName = string(arg.second); + } + } + + Json::Value jsonData; + Json::Reader jsonReader; + + if (!jsonReader.parse(requestBody, jsonData)) { + cout << "Failed to parse requestBody" << endl; + // JSON parsing error + // Return error message + } + + string imageName = jsonData["Image"].asString(); + + // Remove the image version of the name + size_t colonPosition = imageName.find(':'); + imageName = imageName.substr(0, colonPosition); + + cout << LOG_PREFIX "Create container '" << containerName << "' based on '" << imageName << "' name" << endl; + + unsigned id = _daemon->container.create(imageName, containerName); + cout << " Container ID: " << id << endl; + + // build the response + payload_json["Id"] = std::to_string(id); + payload_json["Warnings"] = Json::arrayValue; + + Json::StreamWriterBuilder builder; + payload_str = Json::writeString(builder, payload_json); + + auto response = make_shared(payload_str, + httpserver::http::http_utils::http_created, "application/json"); + return response; + } + + private: + Daemon *_daemon; + }; + + class StartHandler : public httpserver::http_resource { + public: + StartHandler(Daemon *daemon) : _daemon(daemon) {}; + + shared_ptr render_POST(const httpserver::http_request &req) { + string payload_str = ""; + Json::Value payload_json; + + cout << LOG_PREFIX << "'" << req.get_path() << "' (" << req.get_method() << ") called" << endl; + + // Extract info from body + const string requestBody = string(req.get_content()); + + string path = string(req.get_path()); + smatch match; + regex rgx("(/v[0-9]+.[0-9]+)?/containers/([^/]+)/start"); + + unsigned containerId; + if (regex_match(path, match, rgx)) { + // containerName = match[2]; + containerId = std::stoi(match[2].str()); + } + + cout << LOG_PREFIX "Start container based on '" << containerId << "' ID" << endl; + + // == Retrieve container ID from the request path == + //int containerId = __cxx11::stoi(req.get_arg("id")); + + _daemon->container.start(containerId); + + auto response = make_shared(payload_str, + httpserver::http::http_utils::http_no_content, "application/json"); + return response; + } + + private: + Daemon *_daemon; + }; + + class StopHandler : public httpserver::http_resource { + public: + StopHandler(Daemon *daemon) : _daemon(daemon) {}; + + shared_ptr render_POST(const httpserver::http_request &req) { + string payload_str = ""; + Json::Value payload_json; + + cout << "[WEBERVER] '" << req.get_path() << "' (" << req.get_method() << ") called" << endl; + + // == Retrieve container ID from the request path == + int containerId = __cxx11::stoi(req.get_arg("id")); + + _daemon->container.stop(containerId); + + auto response = make_shared(payload_str, + httpserver::http::http_utils::http_no_content, "application/json"); + return response; + } + + private: + Daemon *_daemon; + }; + + + class RestartHandler : public httpserver::http_resource { + public: + RestartHandler(Daemon *daemon) : _daemon(daemon) {}; + + shared_ptr render_POST(const httpserver::http_request &req) { + string payload_str = ""; + Json::Value payload_json; + + cout << "[WEBERVER] '" << req.get_path() << "' (" << req.get_method() << ") called" << endl; + + // == Retrieve container ID from the request path == + int containerId = stoi(req.get_arg("id")); + + _daemon->container.restart(containerId); + + auto response = make_shared(payload_str, + httpserver::http::http_utils::http_no_content, "application/json"); + return response; + } + + private: + Daemon *_daemon; + }; + + class PauseHandler : public httpserver::http_resource { + public: + PauseHandler(Daemon *daemon) : _daemon(daemon) {}; + + shared_ptr render_POST(const httpserver::http_request &req) { + string payload_str = ""; + Json::Value payload_json; + + cout << "[WEBERVER] '" << req.get_path() << "' (" << req.get_method() << ") called" << endl; + + // == Retrieve container ID from the request path == + int containerId = __cxx11::stoi(req.get_arg("id")); + + _daemon->container.pause(containerId); + + auto response = make_shared(payload_str, + httpserver::http::http_utils::http_no_content, "application/json"); + return response; + } + + private: + Daemon *_daemon; + + }; + + class UnpauseHandler : public httpserver::http_resource { + public: + UnpauseHandler(Daemon *daemon) : _daemon(daemon) {}; + + shared_ptr render_POST(const httpserver::http_request &req) { + string payload_str = ""; + Json::Value payload_json; + + cout << "[WEBERVER] '" << req.get_path() << "' (" << req.get_method() << ") called" << endl; + + // == Retrieve container ID from the request path == + int containerId = __cxx11::stoi(req.get_arg("id")); + + _daemon->container.unpause(containerId); + + auto response = make_shared(payload_str, + httpserver::http::http_utils::http_no_content, "application/json"); + return response; + } + + private: + Daemon *_daemon; + }; + + + class RemoveHandler : public httpserver::http_resource { + public: + RemoveHandler(Daemon *daemon) : _daemon(daemon) {}; + + shared_ptr render_DELETE(const httpserver::http_request &req) { + string payload_str = ""; + Json::Value payload_json; + + cout << "[WEBERVER] '" << req.get_path() << "' (" << req.get_method() << ") called" << endl; + + // == Retrieve container ID from the request path == + int containerId = __cxx11::stoi(req.get_arg("id")); + + _daemon->container.remove(containerId); + + auto response = make_shared(payload_str, + httpserver::http::http_utils::http_no_content, "application/json"); + return response; + } + + private: + Daemon *_daemon; + }; + + class ContainerApi { + public: + // Constructor + ContainerApi(httpserver::webserver *server, Daemon *daemon); + + // Destructor + ~ContainerApi(); + + private: + httpserver::webserver *_server; + + // Handler for the different 'container' routes + ListHandler *_listHandler; + CreateHandler *_createHandler; + StartHandler *_startHandler; + StopHandler *_stopHandler; + PauseHandler *_pauseHandler; + UnpauseHandler *_unpauseHandler; + RestartHandler *_restartHandler; + RemoveHandler *_removeHandler; + InspectHandler *_inspectHandler; + LogsHandler *_logsHandler; + }; + +} // container +} // emiso + +#endif /* EMISO_CONTAINER_H */ diff --git a/linux/usr/src/soo/emiso_engine/webserver/container/container_inspect.hpp b/linux/usr/src/soo/emiso_engine/webserver/container/container_inspect.hpp new file mode 100644 index 0000000..97d5774 --- /dev/null +++ b/linux/usr/src/soo/emiso_engine/webserver/container/container_inspect.hpp @@ -0,0 +1,249 @@ +/* + * Copyright (C) 2023 Jean-Pierre Miceli + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef EMISO_CONTAINER_INSPECT_H +#define EMISO_CONTAINER_INSPECT_H + +#define LOG_PREFIX "[EMISO:WEBSERVER] " + +namespace emiso { +namespace container { + +class InspectHandler : public httpserver::http_resource { + public: + InspectHandler(Daemon *daemon) : _daemon(daemon){}; + + std::shared_ptr render_GET(const httpserver::http_request &req) { + std::string payload_str = ""; + Json::Value payloadJson; + + cout << LOG_PREFIX "'" << req.get_path() << "' (" << req.get_method() << ") called" << endl; + + // == Retrieve container ID from the request path == + int containerId = stoi(req.get_arg("id")); + + CapsuleInfo info; + ImageInfo imageInfo; + + _daemon->container.info(containerId, info); + + _daemon->image.info(info.image, imageInfo); + + std::tm *ptm; + char createdDate[32]; + char startedDate[32]; + // char endDate[32]; + + ptm = std::localtime((const long int *) &info.created); + std::strftime(createdDate, 32, "%Y-%m-%dT%H:%M:%SZ", ptm); + + // TODO = add start time in container info + uint64_t tmp = info.created + 10; + ptm = std::localtime((const long int *) &tmp); + std::strftime(startedDate, 32, "%Y-%m-%dT%H:%M:%SZ", ptm); + + // ptm = std::localtime((const long int*)&info.created + 500); + // std::strftime(endDate, 32, "%Y-%M-%dT%H.%M.%S", ptm); + + // == Build the response message == + payloadJson["Id"] = std::to_string(containerId); + payloadJson["Created"] = createdDate; + payloadJson["Path"] = "/inject"; + payloadJson["Args"] = Json::arrayValue; + payloadJson["State"]["Status"] = info.state; + payloadJson["State"]["Running"] = (info.state == "running") ? true : false; + payloadJson["State"]["Paused"] = (info.state == "paused") ? true : false; + payloadJson["State"]["Restarting"] = (info.state == "restarting") ? true : false; + payloadJson["State"]["OOMKilled"] = false; + payloadJson["State"]["Dead"] = (info.state == "dead") ? true : false; + payloadJson["State"]["Pid"] = 0; + payloadJson["State"]["ExitCode"] = 0; + payloadJson["State"]["Error"] = ""; + payloadJson["State"]["StartedAt"] = createdDate; // to update + payloadJson["State"]["FinishedAt"] = ""; + payloadJson["State"]["Health"] = Json::nullValue; + payloadJson["Image"] = imageInfo.id; + payloadJson["ResolvConfPath"] = + "/var/lib/docker/containers/ed856fa2c435daac513a0eff537018034fd0ce2843d84eae4dbfd22203bd10de/resolv.conf"; + payloadJson["HostnamePath"] = + "/var/lib/docker/containers/ed856fa2c435daac513a0eff537018034fd0ce2843d84eae4dbfd22203bd10de/hostname"; + payloadJson["HostsPath"] = + "/var/lib/docker/containers/ed856fa2c435daac513a0eff537018034fd0ce2843d84eae4dbfd22203bd10de/hosts"; + payloadJson["LogPath"] = + "/var/lib/docker/containers/ed856fa2c435daac513a0eff537018034fd0ce2843d84eae4dbfd22203bd10de/" + "ed856fa2c435daac513a0eff537018034fd0ce2843d84eae4dbfd22203bd10de-json.log"; + payloadJson["Name"] = "/" + info.name; + payloadJson["RestartCount"] = 0; + payloadJson["Driver"] = "overlay2"; + payloadJson["Platform"] = "linux"; + payloadJson["MountLabel"] = ""; + payloadJson["ProcessLabel"] = ""; + payloadJson["AppArmorProfile"] = ""; + payloadJson["ExecIDs"] = Json::nullValue; + payloadJson["HostConfig"]["Binds"] = Json::nullValue; + payloadJson["HostConfig"]["ContainerIDFile"] = ""; + payloadJson["HostConfig"]["LogConfig"]["Type"] = "json-file"; + payloadJson["HostConfig"]["LogConfig"]["Config"] = Json::objectValue; + payloadJson["HostConfig"]["LogConfig"]["NetworkMode"] = "default"; + payloadJson["HostConfig"]["LogConfig"]["PortBindings"] = Json::objectValue; + payloadJson["HostConfig"]["RestartPolicy"]["Name"] = "no"; + payloadJson["HostConfig"]["RestartPolicy"]["MaximumRetryCount"] = 0; + payloadJson["HostConfig"]["AutoRemove"] = false; + payloadJson["HostConfig"]["VolumeDriver"] = ""; + payloadJson["HostConfig"]["VolumesFrom"] = Json::nullValue; + payloadJson["HostConfig"]["ConsoleSize"][0] = 24; + payloadJson["HostConfig"]["ConsoleSize"][0] = 80; + payloadJson["HostConfig"]["CapAdd"] = Json::nullValue; + payloadJson["HostConfig"]["CapDrop"] = Json::nullValue; + payloadJson["HostConfig"]["CgroupnsMode"] = "host"; + payloadJson["HostConfig"]["Dns"] = Json::arrayValue; + payloadJson["HostConfig"]["DnsOptions"] = Json::arrayValue; + payloadJson["HostConfig"]["DnsSearch"] = Json::arrayValue; + payloadJson["HostConfig"]["ExtraHosts"] = Json::nullValue; + payloadJson["HostConfig"]["GroupAdd"] = Json::nullValue; + payloadJson["HostConfig"]["IpcMode"] = "private"; + payloadJson["HostConfig"]["Cgroup"] = ""; + payloadJson["HostConfig"]["Links"] = Json::nullValue; + payloadJson["HostConfig"]["OomScoreAdj"] = 0; + payloadJson["HostConfig"]["PidMode"] = ""; + payloadJson["HostConfig"]["Privileged"] = false; + payloadJson["HostConfig"]["PublishAllPorts"] = false; + payloadJson["HostConfig"]["ReadonlyRootfs"] = false; + payloadJson["HostConfig"]["SecurityOpt"] = Json::nullValue; + payloadJson["HostConfig"]["UTSMode"] = ""; + payloadJson["HostConfig"]["UsernsMode"] = ""; + payloadJson["HostConfig"]["ShmSize"] = 67108864; + payloadJson["HostConfig"]["Runtime"] = "runc"; + payloadJson["HostConfig"]["Isolation"] = ""; + payloadJson["HostConfig"]["CpuShares"] = 0; + payloadJson["HostConfig"]["Memory"] = 0; + payloadJson["HostConfig"]["NanoCpus"] = 0; + payloadJson["HostConfig"]["CgroupParent"] = ""; + payloadJson["HostConfig"]["BlkioWeight"] = 0; + payloadJson["HostConfig"]["BlkioWeightDevice"] = Json::arrayValue; + payloadJson["HostConfig"]["BlkioDeviceReadBps"] = Json::arrayValue; + payloadJson["HostConfig"]["BlkioDeviceWriteBps"] = Json::arrayValue; + payloadJson["HostConfig"]["BlkioDeviceReadIOps"] = Json::arrayValue; + payloadJson["HostConfig"]["BlkioDeviceWriteIOps"] = Json::arrayValue; + payloadJson["HostConfig"]["CpuPeriod"] = 0; + payloadJson["HostConfig"]["CpuQuota"] = 0; + payloadJson["HostConfig"]["CpuRealtimePeriod"] = 0; + payloadJson["HostConfig"]["CpuRealtimeRuntime"] = 0; + payloadJson["HostConfig"]["CpusetCpus"] = ""; + payloadJson["HostConfig"]["CpusetMems"] = ""; + payloadJson["HostConfig"]["Devices"] = Json::arrayValue; + payloadJson["HostConfig"]["DeviceCgroupRules"] = Json::nullValue; + payloadJson["HostConfig"]["DeviceRequests"] = Json::nullValue; + payloadJson["HostConfig"]["MemoryReservation"] = 0; + payloadJson["HostConfig"]["MemorySwap"] = 0; + payloadJson["HostConfig"]["MemorySwappiness"] = Json::nullValue; + payloadJson["HostConfig"]["OomKillDisable"] = Json::nullValue; + payloadJson["HostConfig"]["PidsLimit"] = Json::nullValue; + payloadJson["HostConfig"]["Ulimits"] = Json::nullValue; + payloadJson["HostConfig"]["CpuCount"] = 0; + payloadJson["HostConfig"]["CpuPercent"] = 0; + payloadJson["HostConfig"]["IOMaximumIOps"] = 0; + payloadJson["HostConfig"]["IOMaximumBandwidth"] = 0; + payloadJson["HostConfig"]["MaskedPaths"][0] = "/proc/asound"; + payloadJson["HostConfig"]["MaskedPaths"][1] = "/proc/acpi"; + payloadJson["HostConfig"]["MaskedPaths"][2] = "/proc/kcore"; + payloadJson["HostConfig"]["MaskedPaths"][3] = "/proc/keys"; + payloadJson["HostConfig"]["MaskedPaths"][4] = "/proc/latency_stats"; + payloadJson["HostConfig"]["MaskedPaths"][5] = "/proc/timer_list"; + payloadJson["HostConfig"]["MaskedPaths"][6] = "/proc/timer_stats"; + payloadJson["HostConfig"]["MaskedPaths"][7] = "/proc/sched_debug"; + payloadJson["HostConfig"]["MaskedPaths"][8] = "/proc/scsi"; + payloadJson["HostConfig"]["MaskedPaths"][9] = "/sys/firmware"; + payloadJson["HostConfig"]["ReadonlyPaths"][0] = "/proc/bus"; + payloadJson["HostConfig"]["ReadonlyPaths"][1] = "/proc/fs"; + payloadJson["HostConfig"]["ReadonlyPaths"][2] = "/proc/irq"; + payloadJson["HostConfig"]["ReadonlyPaths"][3] = "/proc/sys"; + payloadJson["HostConfig"]["ReadonlyPaths"][4] = "/proc/sysrq-trigger"; + payloadJson["GraphDriver"]["Data"]["LowerDir"] = + "/var/lib/docker/overlay2/5132a5d000dc493f64e1076a4fbefcfd6d04705bb52590b639668d9d82c6652f-init/diff:/var/" + "lib/docker/overlay2/0ffcf17c5b7310dcbced19f13a63e8b7566325eaabf34ded9bc67b7c56057fa2/diff"; + payloadJson["GraphDriver"]["Data"]["MergedDir"] = "/etc/emiso/merged"; + payloadJson["GraphDriver"]["Data"]["UpperDir"] = "/etc/emiso/diff"; + payloadJson["GraphDriver"]["Data"]["WorkDir"] = "/etc/emiso/work"; + payloadJson["GraphDriver"]["Name"] = "overlay2"; + payloadJson["Mounts"] = Json::arrayValue; + payloadJson["Config"]["Hostname"] = "ed856fa2c435"; + payloadJson["Config"]["Domainname"] = ""; + payloadJson["Config"]["User"] = ""; + payloadJson["Config"]["AttachStdin"] = false; + payloadJson["Config"]["AttachStdout"] = true; + payloadJson["Config"]["AttachStderr"] = true; + payloadJson["Config"]["Tty"] = false; + payloadJson["Config"]["OpenStdin"] = false; + payloadJson["Config"]["StdinOnce"] = false; + payloadJson["Config"]["Env"][0] = "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"; + payloadJson["Config"]["Cmd"][0] = ""; + payloadJson["Config"]["Image"] = info.image; + payloadJson["Config"]["Volumes"] = Json::nullValue; + payloadJson["Config"]["WorkingDir"] = ""; + payloadJson["Config"]["Entrypoint"] = Json::nullValue; + payloadJson["Config"]["OnBuild"] = Json::nullValue; + payloadJson["Config"]["Labels"] = Json::objectValue; + payloadJson["NetworkSettings"]["Bridge"] = ""; + payloadJson["NetworkSettings"]["SandboxID"] = + "a7c9c2fe37e94ade66a9969d7070fe5d3e894753bb20fe14953692074af9ef00"; + payloadJson["NetworkSettings"]["HairpinMode"] = false; + payloadJson["NetworkSettings"]["LinkLocalIPv6Address"] = ""; + payloadJson["NetworkSettings"]["LinkLocalIPv6PrefixLen"] = 0; + payloadJson["NetworkSettings"]["Ports"] = Json::objectValue; + payloadJson["NetworkSettings"]["SandboxKey"] = "/var/run/docker/netns/a7c9c2fe37e9"; + payloadJson["NetworkSettings"]["SecondaryIPAddresses"] = Json::nullValue; + payloadJson["NetworkSettings"]["SecondaryIPv6Addresses"] = Json::nullValue; + payloadJson["NetworkSettings"]["EndpointID"] = ""; + payloadJson["NetworkSettings"]["Gateway"] = ""; + payloadJson["NetworkSettings"]["GlobalIPv6Address"] = ""; + payloadJson["NetworkSettings"]["GlobalIPv6PrefixLen"] = 0; + payloadJson["NetworkSettings"]["IPAddress"] = ""; + payloadJson["NetworkSettings"]["IPPrefixLen"] = 0; + payloadJson["NetworkSettings"]["IPv6Gateway"] = ""; + payloadJson["NetworkSettings"]["MacAddress"] = ""; + payloadJson["NetworkSettings"]["Networks"]["bridge"]["IPAMConfig"] = Json::nullValue; + payloadJson["NetworkSettings"]["Networks"]["bridge"]["Links"] = Json::nullValue; + payloadJson["NetworkSettings"]["Networks"]["bridge"]["Aliases"] = Json::nullValue; + payloadJson["NetworkSettings"]["Networks"]["bridge"]["NetworkID"] = + "1cacb396f2c32029fe35d73d8d061575bc69baadc15c1cc8fa596aa2ac3c1eaa"; + payloadJson["NetworkSettings"]["Networks"]["bridge"]["EndpointID"] = ""; + payloadJson["NetworkSettings"]["Networks"]["bridge"]["Gateway"] = ""; + payloadJson["NetworkSettings"]["Networks"]["bridge"]["IPAddress"] = ""; + payloadJson["NetworkSettings"]["Networks"]["bridge"]["IPPrefixLen"] = 0; + payloadJson["NetworkSettings"]["Networks"]["bridge"]["IPv6Gateway"] = ""; + payloadJson["NetworkSettings"]["Networks"]["bridge"]["GlobalIPv6Address"] = ""; + payloadJson["NetworkSettings"]["Networks"]["bridge"]["GlobalIPv6PrefixLen"] = 0; + payloadJson["NetworkSettings"]["Networks"]["bridge"]["MacAddress"] = ""; + payloadJson["NetworkSettings"]["Networks"]["bridge"]["DriverOpts"] = Json::nullValue; + + Json::StreamWriterBuilder builder; + payload_str = Json::writeString(builder, payloadJson); + auto response = std::make_shared( + payload_str, httpserver::http::http_utils::http_ok, "application/json"); + return response; + } + + private: + Daemon *_daemon; +}; + +} // namespace container +} // namespace emiso + +#endif /* EMISO_CONTAINER_INSPECT_H */ diff --git a/linux/usr/src/soo/emiso_engine/webserver/container/container_logs.hpp b/linux/usr/src/soo/emiso_engine/webserver/container/container_logs.hpp new file mode 100644 index 0000000..56f5d78 --- /dev/null +++ b/linux/usr/src/soo/emiso_engine/webserver/container/container_logs.hpp @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2024 Jean-Pierre Miceli + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef EMISO_CONTAINER_LOGS_H +#define EMISO_CONTAINER_LOGS_H + +namespace emiso { +namespace container { + +class LogsHandler : public httpserver::http_resource { + public: + LogsHandler(Daemon *daemon) : _daemon(daemon) {}; + + std::shared_ptr render_GET(const httpserver::http_request &req) { + int lineNr = -1; + + std::cout << "[WEBERVER] '" << std::string(req.get_path()) << "' (" << std::string(req.get_method()) << ") called" << std::endl; + + // == Retrieve container ID from the request path == + int containerId = std::__cxx11::stoi(req.get_arg("id")); + std::cout << "container ID: " << containerId << std::endl; + + // == Retrieve QUERY params == + for (const auto& arg : req.get_args()) { + std::cout << "param: " << std::string(arg.first) << ", value: " << std::string(arg.second) << std::endl; + + // Retrieve 'tail' parameter - if present + if (std::string(arg.first) == "tail") { + lineNr = stoi(arg.second); + } + } + + std::vector lines; + lines = _daemon->container.retrieveLogs(containerId, lineNr); + + std::string message; + for (int i = 0; i < lines.size(); i++) { + message += lines[i] + "\n"; + } + + auto response = std::make_shared(message, + httpserver::http::http_utils::http_ok, "application/json"); + return response; + } + + private: + Daemon *_daemon; + }; + + +} // container +} // emiso + +#endif // EMISO_CONTAINER_LOGS_H diff --git a/linux/usr/src/soo/emiso_engine/webserver/image/image.cpp b/linux/usr/src/soo/emiso_engine/webserver/image/image.cpp new file mode 100644 index 0000000..3ddd8e3 --- /dev/null +++ b/linux/usr/src/soo/emiso_engine/webserver/image/image.cpp @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2023 Jean-Pierre Miceli + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "image.hpp" + +namespace emiso { + + namespace image { + + ImageApi::ImageApi(httpserver::webserver *server, Daemon *daemon) + : _server(server) { + std::string path = "/images"; + + // Create routes and handlers + _listHandler = new ListHandler(daemon); + _historyHandler = new HistoryHandler(daemon); + _inspectHandler = new InspectHandler(daemon); + + _server->register_resource(path + "/json", _listHandler); + _server->register_resource("/v[1-9]+.[0-9]+" + path + "/json", _listHandler); + + _server->register_resource(path + "/{[a-zA-Z0-9_-]+}/history", _listHandler); + _server->register_resource("/v[1-9]+.[0-9]+" + path + "/{[a-zA-Z0-9_-]+}/history", _listHandler); + + _server->register_resource(path + "/{[a-zA-Z0-9_-]+}/json", _inspectHandler); + _server->register_resource("/v[1-9]+.[0-9]+" + path + "/{[a-zA-Z0-9_-]+}/json", _inspectHandler); + } + + ImageApi::~ImageApi() {} + } +} diff --git a/linux/usr/src/soo/emiso_engine/webserver/image/image.hpp b/linux/usr/src/soo/emiso_engine/webserver/image/image.hpp new file mode 100644 index 0000000..f80dd98 --- /dev/null +++ b/linux/usr/src/soo/emiso_engine/webserver/image/image.hpp @@ -0,0 +1,137 @@ +/* + * Copyright (C) 2023 Jean-Pierre Miceli + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef EMISO_IMAGE_H +#define EMISO_IMAGE_H + +#include +#include +#include + +#include "../../daemon/image.hpp" +#include "../../daemon/daemon.hpp" + +#include "image_inspect.hpp" + +namespace emiso { +namespace image { + + class ListHandler : public httpserver::http_resource { + public: + ListHandler(Daemon *daemon) : _daemon(daemon) {}; + + std::shared_ptr render_GET(const httpserver::http_request &req) { + std::string payload_str = ""; + Json::Value payload_json; + + std::cout << "[WEBERVER] '" << std::string(req.get_path()) << "' (" << std::string(req.get_method()) << ") called" << std::endl; + + // Retrieve image info + std::map info; + _daemon->image.info(info); + + unsigned idx = 0; + for (auto it = info.begin(); it != info.end(); ++it) { + + payload_json[idx]["Id"] = it->second.id; + payload_json[idx]["ParentId"] = ""; + payload_json[idx]["RepoTags"][0] = it->second.name + ":latest"; + payload_json[idx]["Created"] = it->second.date; + payload_json[idx]["Size"] = it->second.size; + payload_json[idx]["SharedSize"] = -1; // Value not set or calculated + payload_json[idx]["Containers"] = -1; // Value not set or calculated + payload_json[idx]["Labels"] = Json::Value::null; + + idx++; + } + + Json::StreamWriterBuilder builder; + payload_str = Json::writeString(builder, payload_json); + + auto response = std::make_shared(payload_str, + httpserver::http::http_utils::http_ok, "application/json"); + return response; + } + + private: + // daemon::Image _image; + Daemon *_daemon; + + }; + + + class HistoryHandler : public httpserver::http_resource { + public: + HistoryHandler(Daemon *daemon) : _daemon(daemon) {}; + + std::shared_ptr render_GET(const httpserver::http_request &req) { + std::cout << "[WEBERVER] '" << std::string(req.get_path()) << "' (" << std::string(req.get_method()) << ") called" << std::endl; + + std::string payload_str = ""; + Json::Value payload_json; + + // Retrieve image info + std::map info; + _daemon->image.info(info); + + unsigned idx = 0; + for (auto it = info.begin(); it != info.end(); ++it) { + + payload_json[idx]["Id"] = it->second.id; + payload_json[idx]["Created"] = it->second.date; + payload_json[idx]["CreatedBy"] = "Micofe"; + payload_json[idx]["Tags"] = Json::arrayValue; + payload_json[idx]["Size"] = it->second.size; + payload_json[idx]["Comment"] = ""; + + idx++; + } + + Json::StreamWriterBuilder builder; + payload_str = Json::writeString(builder, payload_json); + + auto response = std::make_shared(payload_str, + httpserver::http::http_utils::http_ok, "application/json"); + return response; + } + + private: + // daemon::Image _image; + Daemon *_daemon; + }; + + class ImageApi { + public: + // Constructor + ImageApi(httpserver::webserver *server, Daemon *daemon); + + // Destructor + ~ImageApi(); + + private: + httpserver::webserver *_server; + + // Handler for the different 'list' routes + ListHandler *_listHandler; + HistoryHandler *_historyHandler; + InspectHandler *_inspectHandler; + }; +} // image +} // emiso + +#endif /* EMISO_IMAGE_H */ diff --git a/linux/usr/src/soo/emiso_engine/webserver/image/image_inspect.hpp b/linux/usr/src/soo/emiso_engine/webserver/image/image_inspect.hpp new file mode 100644 index 0000000..5e8a4e9 --- /dev/null +++ b/linux/usr/src/soo/emiso_engine/webserver/image/image_inspect.hpp @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2023 Jean-Pierre Miceli + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef EMISO_INSPECT_IMAGE_H +#define EMISO_INSPECT_IMAGE_H + +#include +#include +#include + +#include "../../daemon/image.hpp" +#include "../../daemon/daemon.hpp" + +namespace emiso { +namespace image { + + class InspectHandler : public httpserver::http_resource { + public: + InspectHandler(Daemon *daemon) : _daemon(daemon){}; + + std::shared_ptr render_GET(const httpserver::http_request &req) { + std::string payload_str = ""; + Json::Value payload_json; + int error; + + std::cout << "[WEBERVER] '" << std::string(req.get_path()) << "' (" << std::string(req.get_method()) << ") called" << std::endl; + + // Retrieve the image 'name' form the path (the 'name' correspond + // here to the image ID) + string path = string(req.get_path()); + smatch match; + regex rgx("(/v[0-9]+.[0-9]+)?/images/([a-zA-Z0-9_:-]+)/json"); + + string imageName; + if (regex_match(path, match, rgx)) { + imageName = match[2]; + + // The name/id has been found - get the image info + ImageInfo info; + int ret = _daemon->image.info(imageName, info); + + if (ret == 0) { + payload_json["Id"] = info.id; + payload_json["Created"] = info.date; + payload_json["Size"] = info.size; + payload_json["Created"] = info.date; + payload_json["RepoTags"][0] = info.name + ":latest"; + + Json::StreamWriterBuilder builder; + payload_str = Json::writeString(builder, payload_json); + error = httpserver::http::http_utils::http_ok; + } else { + payload_str = "Image '" + imageName + "' not found"; + error = httpserver::http::http_utils::http_not_found; + } + } else { + // The name/id has not been found - error + payload_str = "Server Error - Failed to extract the image name from the path"; + error = httpserver::http::http_utils::http_internal_server_error; + } + + auto response = std::make_shared(payload_str, + error, "application/json"); + + return response; + } + + private: + Daemon *_daemon; + }; + +} // image +} // emiso + +#endif // EMISO_INSPECT_IMAGE_H \ No newline at end of file diff --git a/linux/usr/src/soo/emiso_engine/webserver/network/network.cpp b/linux/usr/src/soo/emiso_engine/webserver/network/network.cpp new file mode 100644 index 0000000..52d72ee --- /dev/null +++ b/linux/usr/src/soo/emiso_engine/webserver/network/network.cpp @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2023 Jean-Pierre Miceli + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "network.hpp" + +namespace emiso { + + namespace network { + + NetworkApi::NetworkApi(httpserver::webserver *server) + : _server(server) { + std::string path = "/networks"; + + // Create routes and handlers + _listHandler = new ListHandler(); + + _server->register_resource(path, _listHandler); + _server->register_resource("/v[1-9]+.[0-9]+" + path, _listHandler); + } + + NetworkApi::~NetworkApi() {} + } +} diff --git a/linux/usr/src/soo/emiso_engine/webserver/network/network.hpp b/linux/usr/src/soo/emiso_engine/webserver/network/network.hpp new file mode 100644 index 0000000..e418679 --- /dev/null +++ b/linux/usr/src/soo/emiso_engine/webserver/network/network.hpp @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2023 Jean-Pierre Miceli + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef EMISO_NETWORK_H +#define EMISO_NETWORK_H + +#include +#include +#include + +namespace emiso { + + namespace network { + + class ListHandler : public httpserver::http_resource { + public: + + // In emiso, network is not supported --> return an empty list ! + std::shared_ptr render_GET(const httpserver::http_request &req) { + std::string payload_str = "[]"; + + std::cout << "[WEBERVER] '" << req.get_path() << "' (" << req.get_method() << ") called" << std::endl; + + auto response = std::make_shared(payload_str, + httpserver::http::http_utils::http_ok, "application/json"); + return response; + } + }; + + class NetworkApi { + public: + // Constructor + NetworkApi(httpserver::webserver *server); + + // Destructor + ~NetworkApi(); + + private: + httpserver::webserver *_server; + + // Handler for the different 'list' routes + ListHandler *_listHandler; + + }; + } +} + +#endif /* EMISO_NETWORK_H */ diff --git a/linux/usr/src/soo/emiso_engine/webserver/plugins/plugins.cpp b/linux/usr/src/soo/emiso_engine/webserver/plugins/plugins.cpp new file mode 100644 index 0000000..998237a --- /dev/null +++ b/linux/usr/src/soo/emiso_engine/webserver/plugins/plugins.cpp @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2023 Jean-Pierre Miceli + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "plugins.hpp" + +namespace emiso { +namespace plugins { + + PluginsApi::PluginsApi(httpserver::webserver *server): _server(server) { + std::string path = "/plugins"; + + // Create routes and handlers + _listHandler = new ListHandler(); + + _server->register_resource(path, _listHandler); + _server->register_resource("/v[1-9]+.[0-9]+" + path, _listHandler); + } + + PluginsApi::~PluginsApi() {} + +} // plugins +} // emiso diff --git a/linux/usr/src/soo/emiso_engine/webserver/plugins/plugins.hpp b/linux/usr/src/soo/emiso_engine/webserver/plugins/plugins.hpp new file mode 100644 index 0000000..b5e46c5 --- /dev/null +++ b/linux/usr/src/soo/emiso_engine/webserver/plugins/plugins.hpp @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2023 Jean-Pierre Miceli + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef EMISO_PLUGINS_H +#define EMISO_PLUGINS_H + +#include +#include +#include + +namespace emiso { +namespace plugins { + + class ListHandler : public httpserver::http_resource { + public: + + std::shared_ptr render_GET(const httpserver::http_request &req) { + std::cout << "[WEBERVER] '" << req.get_path() << "' (" << req.get_method() << ") called" << std::endl; + + std::string payload_str = ""; + Json::Value payload_json; + + payload_json = Json::arrayValue; // empty array + + Json::StreamWriterBuilder builder; + payload_str = Json::writeString(builder, payload_json); + + auto response = std::make_shared(payload_str, + httpserver::http::http_utils::http_ok, "application/json"); + return response; + } + }; + + class PluginsApi { + public: + // Constructor + PluginsApi(httpserver::webserver *server); + + // Destructor + ~PluginsApi(); + + private: + httpserver::webserver *_server; + + // Handler for the different 'list' routes + ListHandler *_listHandler; + + }; + +} // plugins +} // emiso + +#endif /* EMISO_PLUGINS_H */ diff --git a/linux/usr/src/soo/emiso_engine/webserver/system/system.cpp b/linux/usr/src/soo/emiso_engine/webserver/system/system.cpp new file mode 100644 index 0000000..211ed8c --- /dev/null +++ b/linux/usr/src/soo/emiso_engine/webserver/system/system.cpp @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2023 Jean-Pierre Miceli + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "system.hpp" + +namespace emiso { + namespace system { + + SytemApi::SytemApi(httpserver::webserver *server, Daemon *daemon) + : _server(server) { + + // Create routes and handlers + _pinghandler = new PingHandler(); + _sysInfoHandler = new SysInfoHandler(daemon); + _getVersionHandler = new GetVersionHandler(); + + _server->register_resource("/_ping", _pinghandler); + _server->register_resource("/v[1-9]+.[0-9]+/_ping", _pinghandler); + _server->register_resource("/v[1-9]+.[0-9]+/info", _sysInfoHandler); + _server->register_resource("/info", _sysInfoHandler); + _server->register_resource("/version", _getVersionHandler); + _server->register_resource("/v[1-9]+.[0-9]+/version", _getVersionHandler); + } + + SytemApi::~SytemApi() {} + } +} diff --git a/linux/usr/src/soo/emiso_engine/webserver/system/system.hpp b/linux/usr/src/soo/emiso_engine/webserver/system/system.hpp new file mode 100644 index 0000000..be15f17 --- /dev/null +++ b/linux/usr/src/soo/emiso_engine/webserver/system/system.hpp @@ -0,0 +1,236 @@ +/* + * Copyright (C) 2023 Jean-Pierre Miceli + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef EMISO_SYSTEM_H +#define EMISO_SYSTEM_H + +#include +#include +#include + +#include +#include + +#include "../../daemon/image.hpp" +#include "../../daemon/capsule.hpp" +#include "../../daemon/daemon.hpp" + +namespace emiso { + namespace system { + + class PingHandler : public httpserver::http_resource { + public: + + std::shared_ptr render_GET(const httpserver::http_request &req) { + std::cout << "[WEBERVER] '" << std::string(req.get_path()) << "' (" << std::string(req.get_method()) << ") called" << std::endl; + + // Respond is a simple 'OK' + auto response = std::make_shared("OK"); + return response; + } + + std::shared_ptr render_HEAD(const httpserver::http_request &req) { + std::cout << "[WEBERVER] '" << std::string(req.get_path()) << "' (" << std::string(req.get_method()) << ") called" << std::endl; + + auto response = std::shared_ptr(new httpserver::string_response("")); + + response->with_header("Api-Version", EMISO_WEB_API_VERSION); + response->with_header("Builder-Version", EMISO_VERSION); + if (EMISO_WEB_EXPERIMENTAL) + response->with_header("Docker-Experimental", "true"); + else + response->with_header("Docker-Experimental", "false"); + response->with_header("Swarm", EMISO_WEB_SWARM); + response->with_header("Cache-Control", "no-cache, no-store, must-revalidate"); + response->with_header("Pragma", "no-cache"); + + return response; + } + }; + + class SysInfoHandler : public httpserver::http_resource { + public: + SysInfoHandler(Daemon *daemon) : _daemon(daemon) {}; + + std::shared_ptr render_GET(const httpserver::http_request &req) { + std::cout << "[WEBERVER] '" << std::string(req.get_path()) << "' (" << std::string(req.get_method()) << ") called" << std::endl; + + std::string payload_str = ""; + Json::Value payload_json; + Utils& utils = Utils::getInstance(); + auto config = utils.getInfo(); + // daemon::Image image; + std::map info; + std::map capsuleInfo; + + // Retrieve images info + _daemon->image.info(info); + auto image_nr = info.size(); + + // Retrieve container info + _daemon->container.info(capsuleInfo); + auto containerNr = capsuleInfo.size(); + + payload_json["ID"] = utils.getAgencyUID(); + payload_json["Containers"] = containerNr; // To update next + payload_json["ContainersRunning"] = containerNr; // To update next + payload_json["ContainersPaused"] = 0; // To update next + payload_json["ContainersStopped"] = 0; // To update next + payload_json["Images"] = image_nr; // To update next + + // WARNING - hardcoded values got from Docker answer of JMI PC + payload_json["Driver"] = "overlay2"; + payload_json["DriverStatus"][0].append("Backing Filesystem"); + payload_json["DriverStatus"][0].append("extfs"); + payload_json["DriverStatus"][1].append("Supports d_type"); + payload_json["DriverStatus"][1].append("true"); + payload_json["DriverStatus"][2].append("Using metacopy"); + payload_json["DriverStatus"][2].append("false"); + payload_json["DriverStatus"][3].append("Native Overlay Diff"); + payload_json["DriverStatus"][3].append("true"); + payload_json["DriverStatus"][4].append("userxattr"); + payload_json["DriverStatus"][4].append("false"); + + payload_json["DockerRootDir"] = "/var/lib/docker"; // default value on Linux + payload_json["Plugins"] = Json::objectValue; + + // Set these values to false as not supported/handled by emiso + payload_json["MemoryLimit"] = false; + payload_json["SwapLimit"] = false; + payload_json["CpuCfsPeriod"] = false; + payload_json["CpuCfsQuota"] = false; + payload_json["CPUShares"] = false; + payload_json["CPUSet"] = false; + payload_json["PidsLimit"] = false; + payload_json["OomKillDisable"] = false; + payload_json["IPv4Forwarding"] = false; + payload_json["BridgeNfIptables"] = false; + payload_json["BridgeNfIp6tables"] = false; + payload_json["Debug"] = false; + + payload_json["SystemTime"] = utils.getSystemTime(); + payload_json["LoggingDriver"] = "json-file"; // WARNING - hardcoded values got from Docker answer of JMI PC + payload_json["CgroupDriver"] = "none"; + payload_json["CgroupVersion"] = "1"; // Default docker value + payload_json["NEventsListener"] = 0; + + payload_json["KernelVersion"] = config.kernel_version; + payload_json["OperatingSystem"] = config.os; + payload_json["OSVersion"] = config.os_version; + payload_json["OSType"] = config.os_type; + payload_json["Architecture"] = config.arch; + + payload_json["NCPU"] = 1; // Get info from Agency ? + payload_json["MemTotal"] = 536870912; // Get info from Agency ? + payload_json["IndexServerAddress"] = "https://index.docker.io/v1/"; + payload_json["RegistryConfig"] = Json::objectValue; + payload_json["GenericResources"] = Json::arrayValue; + + payload_json["HttpProxy"] = ""; // use 'HTTP_PROXY' env variable + payload_json["HttpsProxy"] = ""; // use 'HTTPS_PROXY' env variable + payload_json["NoProxy"] = ""; // use 'NO_PROXY' env variable + payload_json["Name"] = "agency"; // Host name + payload_json["Labels"] = Json::arrayValue; + payload_json["ExperimentalBuild"] = EMISO_WEB_EXPERIMENTAL; + payload_json["ServerVersion"] = "28.3.3"; + payload_json["DefaultRuntime"] = ""; + + payload_json["Swarm"]["NodeID"] = ""; + payload_json["Swarm"]["NodeAddr"] = ""; + payload_json["Swarm"]["LocalNodeState"] = "inactive"; + payload_json["Swarm"]["ControlAvailable"] = false; + payload_json["Swarm"]["Error"] = ""; + payload_json["Swarm"]["RemoteManagers"] = Json::Value::null; + + payload_json["LiveRestoreEnabled"] = false; + payload_json["Isolation"] = "VT"; // TODO - platform specific + payload_json["SecurityOptions"] = Json::arrayValue; + + Json::StreamWriterBuilder builder; + payload_str = Json::writeString(builder, payload_json); + + auto response = std::make_shared(payload_str, + httpserver::http::http_utils::http_ok, "application/json"); + return response; + } + private: + Daemon *_daemon; + }; + + class GetVersionHandler : public httpserver::http_resource { + public: + + std::shared_ptr render_GET(const httpserver::http_request &req) { + std::cout << "[WEBERVER] '" << std::string(req.get_path()) << "' (" << std::string(req.get_method()) << ") called" << std::endl; + + std::string payload_str = ""; + Json::Value payload_json; + Utils& utils = Utils::getInstance(); + int response_code = httpserver::http::http_utils::http_ok; + + auto config = utils.getInfo(); + + payload_json["Platform"]["name"] = EMISO_PLATFORM_NAME; + payload_json["Components"][0]["name"] = EMISO_WEB_COMP_NAME; + payload_json["Components"][0]["version"] = EMISO_VERSION; + payload_json["Version"] = EMISO_VERSION; + payload_json["ApiVersion"] = EMISO_WEB_API_VERSION; + payload_json["MinAPIVersion"] = EMISO_WEB_API_VERSION; + + // Get info directly from the system + payload_json["Os"] = config.os_type; + payload_json["Arch"] = config.arch; + payload_json["KernelVersion"] = config.kernel_version; + + payload_json["Experimental"] = EMISO_WEB_EXPERIMENTAL; + + // not implemented yet ! + // payload_json["GitCommit"] + // payload_json["GoVersion"] + // payload_json["BuildTime"] + + Json::StreamWriterBuilder builder; + payload_str = Json::writeString(builder, payload_json); + + auto response = std::make_shared(payload_str, + response_code, "application/json"); + return response; + } + }; + + + class SytemApi { + public: + // Constructor + SytemApi(httpserver::webserver *server, Daemon *daemon); + + // Destructor + ~SytemApi(); + + private: + httpserver::webserver *_server; + + // Handler for the different routes + PingHandler *_pinghandler; + SysInfoHandler *_sysInfoHandler; + GetVersionHandler *_getVersionHandler; + }; + } +} + +#endif /* EMISO_SYSTEM_H */ diff --git a/linux/usr/src/soo/emiso_engine/webserver/volume/volume.cpp b/linux/usr/src/soo/emiso_engine/webserver/volume/volume.cpp new file mode 100644 index 0000000..8b8f11a --- /dev/null +++ b/linux/usr/src/soo/emiso_engine/webserver/volume/volume.cpp @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2023 Jean-Pierre Miceli + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "volume.hpp" + +namespace emiso { + + namespace volume { + + VolumeApi::VolumeApi(httpserver::webserver *server) + : _server(server) { + std::string path = "/volumes"; + + // Create routes and handlers + _listHandler = new ListHandler(); + + _server->register_resource(path, _listHandler); + _server->register_resource("/v[1-9]+.[0-9]+" + path, _listHandler); + } + + VolumeApi::~VolumeApi() {} + } +} diff --git a/linux/usr/src/soo/emiso_engine/webserver/volume/volume.hpp b/linux/usr/src/soo/emiso_engine/webserver/volume/volume.hpp new file mode 100644 index 0000000..2f69d91 --- /dev/null +++ b/linux/usr/src/soo/emiso_engine/webserver/volume/volume.hpp @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2023 Jean-Pierre Miceli + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef EMISO_VOLUME_H +#define EMISO_VOLUME_H + +#include +#include +#include + +namespace emiso { + + namespace volume { + + class ListHandler : public httpserver::http_resource { + public: + + std::shared_ptr render_GET(const httpserver::http_request &req) { + std::cout << "[WEBERVER] '" << req.get_path() << "' (" << req.get_method() << ") called" << std::endl; + + std::string payload_str = ""; + Json::Value payload_json; + + payload_json["Volumes"] = Json::arrayValue; // empty array + + Json::StreamWriterBuilder builder; + payload_str = Json::writeString(builder, payload_json); + + auto response = std::make_shared(payload_str, + httpserver::http::http_utils::http_ok, "application/json"); + return response; + } + }; + + class VolumeApi { + public: + // Constructor + VolumeApi(httpserver::webserver *server); + + // Destructor + ~VolumeApi(); + + private: + httpserver::webserver *_server; + + // Handler for the different 'list' routes + ListHandler *_listHandler; + + }; + } +} + +#endif /* EMISO_VOLUME_H */ diff --git a/linux/usr/src/soo/emiso_engine/webserver/webserver.cpp b/linux/usr/src/soo/emiso_engine/webserver/webserver.cpp new file mode 100644 index 0000000..a0d99d8 --- /dev/null +++ b/linux/usr/src/soo/emiso_engine/webserver/webserver.cpp @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2023 Jean-Pierre Miceli + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include + +#include "webserver.hpp" + +namespace emiso { + + WebServer::WebServer(int port, bool secure, Daemon *daemon) + : _port(port), _secure(secure) { + + // Use builder to define webserver configuration options + httpserver::create_webserver cw = httpserver::create_webserver(_port); + if (secure) + cw.use_ssl().https_mem_key("key.pem").https_mem_cert("cert.pem"); + + // Create webserver using the configured options + _server = new httpserver::webserver(cw); + + // Registration of the different APIs + _system = new system::SytemApi(_server, daemon); + _container = new container::ContainerApi(_server, daemon); + _image = new image::ImageApi(_server, daemon); + _network = new network::NetworkApi(_server); + _volume = new volume::VolumeApi(_server); + _plugins = new plugins::PluginsApi(_server); + + // Create the default path - it responds to all paths + _defaultHandler = new DefaultHandler(); + _server->register_resource("^/.*$", _defaultHandler); + } + + WebServer:: ~WebServer() {} + + void WebServer::start(bool blocking) + { + // Start the server + std::cout << "Server started on port " << _port; + if (_secure) + std::cout << " (HTTPS/TLS mode ON)"; + std::cout << std::endl; + + _server->start(blocking); + } +} diff --git a/linux/usr/src/soo/emiso_engine/webserver/webserver.hpp b/linux/usr/src/soo/emiso_engine/webserver/webserver.hpp new file mode 100644 index 0000000..8af01ea --- /dev/null +++ b/linux/usr/src/soo/emiso_engine/webserver/webserver.hpp @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2023 Jean-Pierre Miceli + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef EMISO_WEBSERVER_H +#define EMISO_WEBSERVER_H + +#include + +#include "system/system.hpp" +#include "container/container.hpp" +#include "image/image.hpp" +#include "network/network.hpp" +#include "volume/volume.hpp" +#include "plugins/plugins.hpp" +#include "../daemon/daemon.hpp" + +#define LOG_PREFIX "[EMISO:WEBSERVER] " + +// DefaultHandler - used to print info for all paths not already registered to the +// server +class DefaultHandler : public httpserver::http_resource { +public: + std::shared_ptr render(const httpserver::http_request& req) { + + std::cout << LOG_PREFIX "End-point not implemented" << std::endl; + std::cout << "\tPath: " << req.get_path() << std::endl; + std::cout << "\tMethod: " << req.get_method() << std::endl; + std::cout << "\tHeaders:" << std::endl; + for (const auto& header : req.get_headers()) { + std::cout << "\t\t" << header.first << ": " << header.second << std::endl; + } + std::cout << "\tBody: " << req.get_content() << std::endl; + + // Respond with a simple message + std::string message = "Path '" + std::string(req.get_path()) + "' not implemented\n"; + + auto response = std::make_shared(message); + return response; + } +}; + +namespace emiso { + + class WebServer { + public: + // Constructor + WebServer(int port, bool secure, Daemon *daemon); + + // Destructor + ~WebServer(); + + // Start the server + void start(bool blocking = false); + + // Stop the server + // void stop(); + + private: + int _port; + bool _secure; + httpserver::webserver *_server; + + // Different services + system::SytemApi *_system; + container::ContainerApi *_container; + image::ImageApi *_image; + network::NetworkApi *_network; + volume::VolumeApi *_volume; + plugins::PluginsApi *_plugins; + + // Default handler - not registered routes + DefaultHandler *_defaultHandler; + + }; +} + +#endif /* EMISO_WEBSERVER_H */ diff --git a/linux/usr/src/soo/fb_mapper.c b/linux/usr/src/soo/fb_mapper.c new file mode 100644 index 0000000..44a16a8 --- /dev/null +++ b/linux/usr/src/soo/fb_mapper.c @@ -0,0 +1,169 @@ +/* + * Copyright (C) 2026 Clément Dieperink + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define FB_DEV "/dev/fb0" +#define SYSFS_BASE_PATH "/sys/soo/backend/vfbdev" + +#define USECONDS 1000000 +#define FPS 30 + +static char *get_info_and_mmap(int fd, struct fb_fix_screeninfo *finfo, + struct fb_var_screeninfo *vinfo, + size_t *screen_size) +{ + char *fb_ptr; + + /* Make sure that the display is on.*/ + if (ioctl(fd, FBIOBLANK, FB_BLANK_UNBLANK) != 0) { + perror("ioctl(FBIOBLANK)"); + /* Don't return. Some framebuffer drivers like efifb or simplefb don't implement FBIOBLANK.*/ + } + + /* Get fixed screen information*/ + if (ioctl(fd, FBIOGET_FSCREENINFO, finfo) == -1) { + perror("Error reading fixed information"); + return NULL; + } + + /* Get variable screen information*/ + if (ioctl(fd, FBIOGET_VSCREENINFO, vinfo) == -1) { + perror("Error reading variable information"); + return NULL; + } + + *screen_size = vinfo->yres * finfo->line_length; + + /* Map the device to memory*/ + fb_ptr = (char *)mmap(0, *screen_size, PROT_READ | PROT_WRITE, + MAP_SHARED, fd, 0); + if (fb_ptr == MAP_FAILED) { + perror("Error: failed to map framebuffer device to memory"); + return NULL; + } + + for (size_t i = 0; i < *screen_size; i++) { + fb_ptr[i] = 0xff; + } + + return fb_ptr; +} + +static int write_sysfs(char *property, size_t value) +{ + char tmp[256]; + size_t str_size; + int fd; + + printf("Setting %s to 0x%lX", property, value); + + snprintf(tmp, sizeof(tmp), SYSFS_BASE_PATH "/%s", property); + + fd = open(tmp, O_RDWR); + if (fd == -1) { + fprintf(stderr, "Error: couldn't open %s: %s", property, + strerror(errno)); + return -1; + } + + str_size = snprintf(tmp, sizeof(tmp), "%lx\n", value); + if (write(fd, tmp, str_size + 1) == 0) { + fprintf(stderr, "Error: couldn't write %s: %s", property, + strerror(errno)); + return -1; + } + + close(fd); + + return 0; +} + +int main(int argc, char *argv[]) +{ + int fd; + struct fb_fix_screeninfo finfo; + struct fb_var_screeninfo vinfo; + char *fb_ptr; + size_t screen_size; + + /* Open and map the framebuffer */ + fd = open(FB_DEV, O_RDWR); + if (fd == -1) { + perror("Couldn't open " FB_DEV "\n"); + return EXIT_FAILURE; + } + + fb_ptr = get_info_and_mmap(fd, &finfo, &vinfo, &screen_size); + if (fb_ptr == NULL) { + return EXIT_FAILURE; + } + + /* Write all sysfs information */ + if (write_sysfs("vfbdev_hres", vinfo.xres) < 0) { + return EXIT_FAILURE; + } + + if (write_sysfs("vfbdev_vres", vinfo.yres) < 0) { + return EXIT_FAILURE; + } + + if (write_sysfs("vfbdev_bpp", vinfo.bits_per_pixel) < 0) { + return EXIT_FAILURE; + } + + if (write_sysfs("vfbdev_addr", (uint64_t)fb_ptr) < 0) { + return EXIT_FAILURE; + } + + if (write_sysfs("vfbdev_size", screen_size) < 0) { + return EXIT_FAILURE; + } + + if (write_sysfs("vfbdev_pid", getpid()) < 0) { + return EXIT_FAILURE; + } + + /* Periodically update the display */ + while (1) { + usleep(USECONDS / FPS); + + if (ioctl(fd, FBIOPAN_DISPLAY, &vinfo) == -1) { + /* Fallback to force the update */ + vinfo.activate = FB_ACTIVATE_NOW | FB_ACTIVATE_FORCE; + if (ioctl(fd, FBIOPUT_VSCREENINFO, &vinfo) == -1) { + perror("Error while updating the FB"); + } + } + } + + munmap(fb_ptr, screen_size); + close(fd); + + return EXIT_SUCCESS; +} + diff --git a/linux/usr/src/soo/injector.c b/linux/usr/src/soo/injector.c new file mode 100644 index 0000000..6963f04 --- /dev/null +++ b/linux/usr/src/soo/injector.c @@ -0,0 +1,139 @@ +/* + * Copyright (C) 2016-2022 Daniel Rossier + * Copyright (C) January 2018 Baptiste Delporte + * Copyright (C) 2019-2022 David Truan + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#if 0 +#define DEBUG +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + + + /** + * @brief Injector performs loading of a capsule and start its execution. + * + * @param argc + * @param argv + * @return int + */ +int main(int argc, char *argv[]) { + int fd_migration, fd, ret; + int nread, S3C_size; + void *S3C_buffer; + struct stat filestat; + struct agency_ioctl_args args; + bool hold_capsule = false; + int opt; + + // Parse command-line options + while ((opt = getopt(argc, argv, "s")) != -1) { + switch (opt) { + case 's': + hold_capsule = true; + break; + default: + fprintf(stderr, "Usage: %s [-s] \n", argv[0]); + exit(EXIT_FAILURE); + } + } + + if (optind >= argc) { + fprintf(stderr, "Expected ME file path after options\n"); + exit(EXIT_FAILURE); + } + + char *s3c_file_path = argv[optind]; + + printf("SOO ME injector (Smart Object Oriented based virtualization framework).\n"); + printf("Version: %s\n", SOO_VERSION); + + fd_migration = open(SOO_CORE_DEVICE, O_RDWR); + if (fd_migration < 0) { + printf("Failed to open device: " SOO_CORE_DEVICE " (%d)\n", fd_migration); + exit(EXIT_FAILURE); + } + + stat(s3c_file_path, &filestat); + + fd = open(s3c_file_path, O_RDONLY); + if (fd < 0) { + perror(s3c_file_path); + printf("%s not found.\n", s3c_file_path); + exit(EXIT_FAILURE); + } + + S3C_size = filestat.st_size; + + /* Allocate the ME buffer */ + S3C_buffer = malloc(S3C_size); + assert(S3C_buffer != NULL); + + DBG("agency_core: size to read from sd : %d, buffer address : 0x%08lx\n", S3C_size, (unsigned long) S3C_buffer); + + /* Read the ME content */ + nread = read(fd, S3C_buffer, S3C_size); + if (nread < 0) { + printf("Error when reading the ME\n"); + exit(EXIT_FAILURE); + } + + /* Inject the capsule */ + args.buffer = S3C_buffer; + args.value = S3C_size; + args.slotID = -1; /* Wherever */ + + if ((ret = ioctl(fd_migration, AGENCY_IOCTL_INJECT_CAPSULE, &args)) < 0) { + printf("Failed to inject ME (%d)\n", ret); + exit(EXIT_FAILURE); + } + + if (args.slotID == -1) { + printf("No available ME slot further...\n"); + exit(EXIT_FAILURE); + } + + if (!hold_capsule) { + ioctl(fd_migration, AGENCY_IOCTL_START_CAPSULE, &args); + } + + close(fd); + + free(S3C_buffer); + + return 0; +} + diff --git a/linux/usr/src/soo/input_forwarding.c b/linux/usr/src/soo/input_forwarding.c new file mode 100644 index 0000000..429c42f --- /dev/null +++ b/linux/usr/src/soo/input_forwarding.c @@ -0,0 +1,244 @@ +/* + * Copyright (C) 2026 Clément Dieperink + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define VINPUT_DEV "/dev/vinput" +#define INPUT_PATH "/dev/input" +#define MAX_INPUT_PER_READ 10 + +#define INPUT_CAPABITLIES_ABS "/sys/class/input/%s/device/capabilities/abs" + +struct input_info { + int has_abs; + struct input_absinfo absinfo_x; + struct input_absinfo absinfo_y; +}; + +static struct pollfd *input_devices = NULL; +static struct input_info *input_info = NULL; +static size_t input_count = 0; + +static int vinput_fd; + +static void open_input(char *path) +{ + int fd, ret; + struct pollfd *tmp_input_devices; + struct input_info *tmp_input_info; + char full_path[256]; + + if (strncmp(path, "event", 5) != 0) + return; + + snprintf(full_path, sizeof(full_path), INPUT_PATH "/%s", path); + + fd = open(full_path, O_RDWR); + if (fd == -1) { + fprintf(stderr, "%s: Couldnt open file %s\n", strerror(errno), + full_path); + return; + } + + /* Resizes arrays */ + input_count++; + tmp_input_devices = reallocarray(input_devices, input_count, + sizeof(input_devices[0])); + if (tmp_input_devices == NULL) { + input_count--; + close(fd); + perror("Couldn't allocate memory to add new device"); + return; + } + + tmp_input_info = + reallocarray(input_info, input_count, sizeof(input_info[0])); + if (tmp_input_info == NULL) { + /* Don't free up newly allocated input_devices entry. + * Futur reallocarray will ensure that we get at most one empty entry + * in input_devices. */ + input_count--; + close(fd); + perror("Couldn't allocate memory to add new device"); + return; + } + + /* Setup poll information */ + input_devices = tmp_input_devices; + input_devices[input_count - 1] = (struct pollfd){ + .fd = fd, + .events = POLLIN, + }; + + /* Read absolute information */ + input_info = tmp_input_info; + input_info[input_count - 1].has_abs = 0; + + ret = ioctl(fd, EVIOCGABS(ABS_X), + &(input_info[input_count - 1].absinfo_x)); + if (ret < 0) { + return; + } + + ret = ioctl(fd, EVIOCGABS(ABS_Y), + &(input_info[input_count - 1].absinfo_y)); + if (ret < 0) { + return; + } + + /* We got both ABS X and Y information, input is a valid absolute */ + input_info[input_count - 1].has_abs = 1; + + printf("Found absolute input %s with maximum X:%d Y:%d\n", path, + input_info[input_count - 1].absinfo_x.maximum, + input_info[input_count - 1].absinfo_y.maximum); +} + +static void scan_inputs(void) +{ + DIR *dir; + struct dirent *ent; + char path[512]; + int i; + int ret; + + for (i = 0; i < input_count; i++) { + close(input_devices->fd); + } + free(input_devices); + free(input_info); + input_count = 0; + + dir = opendir(INPUT_PATH); + if (dir == NULL) { + perror("Couldn't open directory " INPUT_PATH); + return; + } + + while ((ent = readdir(dir)) != NULL) { + open_input(ent->d_name); + } +} + +static size_t abs_convert(size_t value, struct input_absinfo *absinfo) +{ + return (value * 10000) / absinfo->maximum; +} + +static int read_input(size_t idx) +{ + ssize_t read_size, write_size; + struct input_event events[MAX_INPUT_PER_READ]; + size_t ev_i; + + read_size = read(input_devices[idx].fd, &events, sizeof(events)); + if (read_size < 0) { + fprintf(stderr, "%s: Couldnt read file %lu\n", strerror(errno), + idx); + return -1; + } + + if ((read_size % sizeof(events[0])) != 0) { + printf("Read size isn't a multiple of structure size %ld, %ld\n", + read_size, sizeof(events[0])); + return -1; + } + + /* If input is absolute, convert value to be in range 0-10000, as expected by capsules */ + if (input_info[idx].has_abs) { + for (ev_i = 0; ev_i < (read_size / sizeof(events[0])); ev_i++) { + if (events[ev_i].type != EV_ABS) + continue; + + if (events[ev_i].code == ABS_X) { + events[ev_i].value = + abs_convert(events[ev_i].value, + &input_info[idx].absinfo_x); + } + + if (events[ev_i].code == ABS_Y) { + events[ev_i].value = + abs_convert(events[ev_i].value, + &input_info[idx].absinfo_y); + } + } + } + + write_size = write(vinput_fd, &events, read_size); + if (write_size != read_size) { + printf("Not all event wrote\n"); + return -1; + } + + return 0; +} + +int main(int argc, char *argv[]) +{ + int ready; + size_t i; + + vinput_fd = open(VINPUT_DEV, O_WRONLY); + if (vinput_fd == -1) { + perror("Couldn't open " VINPUT_DEV); + return EXIT_FAILURE; + } + + scan_inputs(); + + while (1) { + ready = poll(input_devices, input_count, -1); + if (ready == -1) { + perror("Couldn't poll files"); + return EXIT_FAILURE; + } + + for (i = 0; i < input_count; i++) { + if (!input_devices[i].revents) { + continue; + } + + if (!(input_devices[i].revents & POLLIN)) { + printf("Got not POLLIN for %d\n", i); + return EXIT_FAILURE; + } + + if (read_input(i) < 0) { + return EXIT_FAILURE; + } + } + } + + close(vinput_fd); + for (i = 0; i < input_count; i++) { + close(input_devices->fd); + } + free(input_devices); + free(input_info); + + return EXIT_SUCCESS; +} diff --git a/linux/usr/src/soo/melist.c b/linux/usr/src/soo/melist.c new file mode 100644 index 0000000..7caeb04 --- /dev/null +++ b/linux/usr/src/soo/melist.c @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2018 Baptiste Delporte + * Copyright (C) 2019-2021 Daniel Rossier + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include +#include +#include +#include +#include +#include + +#include + +#include + +const char *S3C_state_str(int state) { + + switch (state) { + case S3C_state_stopped: + return "S3C_state_stopped"; + case S3C_state_living: + return "S3C_state_living"; + case S3C_state_suspended: + return "S3C_state_suspended"; + case S3C_state_hibernate: + return "S3C_state_hibernate"; + case S3C_state_resuming: + return "S3C_state_resuming"; + case S3C_state_awakened: + return "S3C_state_awakened"; + case S3C_state_killed: + return "S3C_state_killed"; + case S3C_state_terminated: + return "S3C_state_terminated"; + case S3C_state_dead: + return "S3C_state_dead"; + } + + return "(n/a)"; +} + +/** + * Main entry point of the Agency core subsystem. + */ +int main(int argc, char *argv[]) { + int i, fd_core; + S3C_id_t id_array[MAX_S3C_DOMAINS]; + agency_ioctl_args_t agency_ioctl_args; + + printf("*** SOO - SO3 Capsule ID Retrieval ***\n\n"); + + fd_core = open("/dev/soo/core", O_RDWR); + assert(fd_core > 0); + + /* Prepare to terminate the running ME (dom #2) */ + printf("*** List of residing SO3 Capsules: \n"); + + agency_ioctl_args.buffer = &id_array; + ioctl(fd_core, AGENCY_IOCTL_GET_S3C_ID_ARRAY, (unsigned long) &agency_ioctl_args); + + for (i = 0; i < MAX_S3C_DOMAINS; i++) { + if (id_array[i].state == S3C_state_dead) + printf(" slot %d -> empty\n", i+2); + else { + printf(" slot %d -> spid: %" PRIx64 " name: %s state: %s\n", i+2, + id_array[i].spid, id_array[i].name, + S3C_state_str(id_array[i].state)); + + printf(" Short description: %s\n", id_array[i].shortdesc); + } + } + + printf("done.\n"); + + close(fd_core); + + return 0; +} diff --git a/linux/usr/src/soo/restoreme.c b/linux/usr/src/soo/restoreme.c new file mode 100644 index 0000000..ede8654 --- /dev/null +++ b/linux/usr/src/soo/restoreme.c @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2014-2020 Daniel Rossier + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include + +int fd_core; + +int main(int argc, char *argv[]) { + struct agency_ioctl_args args; + size_t buffer_size; + struct zip_t *zip; + + printf("*** SOO - SO3 Capsule snapshot restorer ***\n"); + + if (argc != 2) { + printf("## Usage is : restoreme where is the file containing the ME snapshot.\n"); + exit(-1); + } + + printf("** Now reading the ME snapshot.\n"); + + fd_core = open("/dev/soo/core", O_RDWR); + assert(fd_core > 0); + + /* Uncompress the saved snapshot */ + zip = zip_open(argv[1], 0, 'r'); + + if (!zip) { + printf("Failed to open the zip file. Is there a bad sync after saving the snapshot?...\n"); + perror(""); + return EXIT_FAILURE; + } + + zip_entry_open(zip, "me"); + zip_entry_read(zip, &args.buffer, &buffer_size); + zip_entry_close(zip); + + zip_close(zip); + + printf(" ** ME memory re-implantation and resuming the capsule.\n"); + + args.slotID = -1; + ioctl(fd_core, AGENCY_IOCTL_WRITE_SNAPSHOT, &args); + + close(fd_core); + + printf(" ** ME successfully restored and resumed...\n"); + + return 0; +} diff --git a/linux/usr/src/soo/saveme.c b/linux/usr/src/soo/saveme.c new file mode 100644 index 0000000..ceb9bec --- /dev/null +++ b/linux/usr/src/soo/saveme.c @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2014-2025 Daniel Rossier + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include +#include +#include +#include +#include + +#include + +#include + +#include + +int fd_core; + +int main(int argc, char *argv[]) { + int ret; + struct zip_t *zip; + struct agency_ioctl_args args; + + printf("*** SOO - SO3 Capsule snapshot saver ***\n"); + + if (argc != 2) { + printf("## Usage is : saveme where is the file containing the ME snapshot.\n"); + exit(-1); + } + + printf("** Now taking the memory snapshot.\n"); + + fd_core = open("/dev/soo/core", O_RDWR); + assert(fd_core > 0); + + args.slotID = 2; + args.value = 0; /* To get the size of the snapshot */ + + /* Get the size of the snapshot */ + ret = ioctl(fd_core, AGENCY_IOCTL_READ_SNAPSHOT, &args); + assert(ret == 0); + + /* The use of %zu formatter enables to print a size_t variable regardless the underlying architecture. */ + printf(" * Size of the snapshot: %zu bytes.\n", args.value); + + /* Get the snapshot */ + args.buffer = malloc(args.value); + assert(args.buffer != NULL); + + /* Get the size of the snapshot */ + ret = ioctl(fd_core, AGENCY_IOCTL_READ_SNAPSHOT, &args); + assert(ret == 0); + + printf(" * Saving to the file..."); + fflush(stdout); + + /* Compress the snapshot */ + zip = zip_open(argv[1], ZIP_DEFAULT_COMPRESSION_LEVEL, 'w'); + + zip_entry_open(zip, "me"); + zip_entry_write(zip, args.buffer, args.value); + zip_entry_close(zip); + + zip_close(zip); + + close(fd_core); + + printf("done.\n\n"); + printf(" * snapshot saved successfully\n"); + + return 0; +} diff --git a/linux/usr/src/soo/shutdownme.c b/linux/usr/src/soo/shutdownme.c new file mode 100644 index 0000000..e041f18 --- /dev/null +++ b/linux/usr/src/soo/shutdownme.c @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2014-2020 Daniel Rossier + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include +#include +#include +#include +#include + +#include + +#include + +int main(int argc, char *argv[]) { + int fd_core; + agency_ioctl_args_t agency_ioctl_args; + + printf("*** SOO - SO3 Capsule shutdown ***\n"); + + if (argc != 2) { + printf("## Usage is : shutdownme \n"); + exit(-1); + } + + printf("** Perform a shutdown of ME #%d (slotID %d)...", atoi(argv[1]), atoi(argv[1])+1); + fflush(stdout); + + fd_core = open("/dev/soo/core", O_RDWR); + assert(fd_core > 0); + + /* Prepare to terminate the running ME (dom #2) */ + + agency_ioctl_args.slotID = atoi(argv[1]) + 1; + + ioctl(fd_core, AGENCY_IOCTL_SHUTDOWN, &agency_ioctl_args); + + printf("done.\n"); + + close(fd_core); + + return 0; +} From 8373e0c14f1a629d219a03d3cfd750c8b55f8160 Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Sat, 11 Jul 2026 15:30:39 +0200 Subject: [PATCH 22/52] meta-usr: create lib/lvgl before copying LVGL in usr-so3 Since SO3 v6.2.0 the fetched so3/usr no longer ships a lib/lvgl subdir (LVGL is fetched separately), so retrieve_usr_dir does not create it and the copy failed with 'No such file or directory'. os.makedirs it first. --- build/meta-usr/recipes-usr/lvgl/usr-so3_1.0.bbappend | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/build/meta-usr/recipes-usr/lvgl/usr-so3_1.0.bbappend b/build/meta-usr/recipes-usr/lvgl/usr-so3_1.0.bbappend index 3be41b0..3ef5485 100644 --- a/build/meta-usr/recipes-usr/lvgl/usr-so3_1.0.bbappend +++ b/build/meta-usr/recipes-usr/lvgl/usr-so3_1.0.bbappend @@ -33,7 +33,12 @@ python do_handle_fetch_git() { target_dir = d.getVar('S') dst_dir = os.path.join(target_dir, 'lib', 'lvgl') - + + # Since SO3 v6.2.0 the fetched so3/usr no longer ships lib/lvgl (LVGL is + # fetched separately, not a submodule), so retrieve_usr_dir does not create + # it — create the destination before copying into it. + os.makedirs(dst_dir, exist_ok=True) + # Fetch the submodules using full path # Copy everything except .git, preserving symlinks/metadata cmd = ( From a0a624ad4ee5bd9403edce99a58483d93a4ff0f4 Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Sat, 11 Jul 2026 15:30:39 +0200 Subject: [PATCH 23/52] meta-bsp: render the capsule ITS from a layer template SO3 v6.2.0 moved the ITS out of the fetched so3/target tree into layer templates. Ship virt64_capsule.its as a template under the bsp-capsules layer and render it (sed-expand IB_SO3_PATH/IB_ROOTFS_PATH to absolute paths, mirroring so3's bsp_render_its) into IB_ITB_PATH before mkimage. Define IB_SO3_PATH in the recipe (it does not inherit so3). --- .../recipes-bsp/capsule/bsp-capsules_1.0.0.bb | 46 +++++++++-- .../capsule/files/its/virt64_capsule.its | 78 +++++++++++++++++++ 2 files changed, 117 insertions(+), 7 deletions(-) create mode 100644 build/meta-bsp/recipes-bsp/capsule/files/its/virt64_capsule.its diff --git a/build/meta-bsp/recipes-bsp/capsule/bsp-capsules_1.0.0.bb b/build/meta-bsp/recipes-bsp/capsule/bsp-capsules_1.0.0.bb index 8c6102b..40ebcee 100644 --- a/build/meta-bsp/recipes-bsp/capsule/bsp-capsules_1.0.0.bb +++ b/build/meta-bsp/recipes-bsp/capsule/bsp-capsules_1.0.0.bb @@ -20,6 +20,10 @@ inherit bsp # stop matching. See usr-so3_1.0.bb for the full rationale. OVERRIDES:append = ":so3" +# bsp-capsules does not `inherit so3`, so IB_SO3_PATH (defined in so3.bbclass) +# is unset here — define it so the capsule ITS render resolves so3.bin/dtb. +IB_SO3_PATH ?= "${IB_DIR}/so3" + do_configure[noexec] = "1" do_attach_infrabase[noexec] = "1" @@ -37,27 +41,55 @@ addtask do_build def __do_platform_deploy(d): import os - import subprocess + import subprocess + + # FOLLOW-UP (deferred): auto-place the capsule ITB into the booted image. + # The ITB must land on the agency's storage p2 (/mnt/capsules/image), but a + # standalone `deploy.sh bsp-capsules` does not mount the real sdcard here, so + # this copy currently misses the booted image. For now place it by hand: + # loop-mount filesystem/work/sdcard.img. p2, cp so3/target/ + # virt64_capsule.itb into mnt/capsules/image/, umount. + # A proper fix must mount/populate the real sdcard p2 (a bitbake shared- + # namespace / parse-cache issue blocked wiring it into this task). capsule_path = d.getVar('IB_FILESYSTEM_PATH') + "/p2/mnt/capsules/image" itb_path = d.getVar('IB_ITB_PATH') + "/" + d.getVar('IB_TARGET_ITS') + ".itb" if not os.path.isfile(itb_path): bb.fatal(itb_path + " is missing ...") - + subprocess.run(['mkdir', '-p', capsule_path]) subprocess.run(['cp', itb_path, capsule_path]) +# Capture the layer's ITS-template dir at PARSE time (${THISDIR} re-expands to +# the base recipe dir at task generation). Since SO3 v6.2.0 the capsule ITS is +# no longer shipped as a static file in the fetched so3/target tree — it lives +# here as a template and is rendered into ${IB_ITB_PATH} at build time. +IB_ITS_SRC := "${THISDIR}/files/its" + +# Render an ITS template from IB_ITS_SRC into IB_ITB_PATH, expanding the +# ${IB_*_PATH} placeholders to absolute build paths. The sed patterns use char +# classes ([$][{]...[}]) so bitbake leaves them untouched and only the +# replacement side is expanded. Mirrors so3's bsp_render_its. + +bsp_render_its() { + mkdir -p "${IB_ITB_PATH}" + sed -e "s|[$][{]IB_SO3_PATH[}]|${IB_SO3_PATH}|g" \ + -e "s|[$][{]IB_ROOTFS_PATH[}]|${IB_ROOTFS_PATH}|g" \ + -e "s|[$][{]IB_PLATFORM[}]|${IB_PLATFORM}|g" \ + "${IB_ITS_SRC}/$1.its" > "${IB_ITB_PATH}/$1.its" +} + do_itb[nostamp] = "1" do_itb[depends] = "usr-so3:do_deploy" do_itb () { - if [ ! -f ${IB_ITB_PATH}/${IB_TARGET_ITS}.its ]; then - bbfatal "No corresponding ITS found for container ${IB_TARGET_ITS}" - else - mkimage -f ${IB_ITB_PATH}/${IB_TARGET_ITS}.its ${IB_ITB_PATH}/${IB_TARGET_ITS}.itb + if [ ! -f ${IB_ITS_SRC}/${IB_TARGET_ITS}.its ]; then + bbfatal "No ITS template found at ${IB_ITS_SRC}/${IB_TARGET_ITS}.its" fi - + + bsp_render_its ${IB_TARGET_ITS} + mkimage -f ${IB_ITB_PATH}/${IB_TARGET_ITS}.its ${IB_ITB_PATH}/${IB_TARGET_ITS}.itb } do_deploy[depends] = "usr-so3:do_deploy" diff --git a/build/meta-bsp/recipes-bsp/capsule/files/its/virt64_capsule.its b/build/meta-bsp/recipes-bsp/capsule/files/its/virt64_capsule.its new file mode 100644 index 0000000..d0dd197 --- /dev/null +++ b/build/meta-bsp/recipes-bsp/capsule/files/its/virt64_capsule.its @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2020-2026 REDS Institute, HEIG-VD + * Author: Daniel Rossier + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +/* + * SO3 capsule ITB template for virt64. The ${IB_*_PATH} placeholders are + * expanded to absolute build paths by bsp_render_its (bsp-capsules do_itb) + * before mkimage, so this template is machine-independent while the rendered + * ITS in ${IB_ITB_PATH} carries resolved /incbin paths. + */ + +/dts-v1/; + +/ { + description = "SO3 capsule components for virt64 (armv8) environment"; + + images { + + so3 { + description = "SO3 OS kernel"; + data = /incbin/("${IB_SO3_PATH}/so3/so3.bin"); + type = "guest"; + arch = "arm64"; + os = "linux"; + compression = "none"; + load = <0x41080000>; + entry = <0x41080000>; + }; + + fdt { + description = "Flattened Device Tree blob"; + data = /incbin/("${IB_SO3_PATH}/so3/dts/virt64_capsule.dtb"); + type = "flat_dt"; + arch = "arm64"; + compression = "none"; + load = <0x43000000>; + }; + + ramfs { + description = "SO3 environment minimal rootfs"; + data = /incbin/("${IB_ROOTFS_PATH}/rootfs.fat"); + type = "ramdisk"; + arch = "arm64"; + os = "linux"; + compression = "none"; + load = <0x43500000>; + }; + }; + + configurations { + default = "so3_ramfs"; + + so3_ramfs { + description = "SO3 kernel image including device tree"; + kernel = "so3"; + fdt = "fdt"; + ramdisk = "ramfs"; + }; + + so3_mmc { + description = "SO3 kernel image including device tree"; + kernel = "so3"; + fdt = "fdt"; + }; + }; + +}; From a3fa63f2bcf8da3cc571df90727c43dae7f0f47d Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Sat, 11 Jul 2026 15:30:39 +0200 Subject: [PATCH 24/52] scripts: adopt the SO3 v6.2.0 positional CLI and align socle scripts build.sh/deploy.sh switch from the -a/-x 2-mode to so3's positional CLI (build.sh , -x optional, -c clean). Adopt the v6.2.0 socle scripts (bblayers/mount/umount/setup_*/sudo_session/st.sh/...) plus initrd_pack.sh and check-format.sh, keeping the MICOFE double-attribution header. env.sh drops the stale meta-torizon from IB_AUX_LAYERS. --- env.sh | 2 +- scripts/build.sh | 103 +++++++++++---------------------- scripts/check-format.sh | 61 +++++++++++++++++++ scripts/common/bblayers.sh | 9 ++- scripts/common/initrd_pack.sh | 74 +++++++++++++++++++++++ scripts/common/setup_env.sh | 0 scripts/common/sudo_session.sh | 0 scripts/deploy.sh | 61 ++++++++----------- scripts/mount.sh | 10 ++++ scripts/st.sh | 20 +++---- scripts/umount.sh | 10 ++++ 11 files changed, 232 insertions(+), 118 deletions(-) create mode 100755 scripts/check-format.sh create mode 100755 scripts/common/initrd_pack.sh mode change 100644 => 100755 scripts/common/setup_env.sh mode change 100644 => 100755 scripts/common/sudo_session.sh diff --git a/env.sh b/env.sh index eb092ee..334cff0 100755 --- a/env.sh +++ b/env.sh @@ -21,7 +21,7 @@ export BBPATH=$BUILDDIR PATH="$PWD/scripts:$BUILDDIR/bitbake/bin:$PATH" # Specify auxiliary layers for the -x component opt -export IB_AUX_LAYERS="meta-usr meta-torizon meta-so3 meta-qemu meta-atf" +export IB_AUX_LAYERS="meta-usr meta-so3 meta-qemu meta-atf" # TODO: It would be nice to test for the presence of such and # such compiler in meta-bsp diff --git a/scripts/build.sh b/scripts/build.sh index 2faa0de..777eae7 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -10,7 +10,6 @@ # Copyright (c) 2014-2026 REDS Institute, HEIG-VD # Copyright (c) 2023-2026 EDGEMTech -# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD progname=$(basename $0) @@ -24,7 +23,7 @@ progname=$(basename $0) pr_usage() { printf "Infrabase build script\n\n" - printf "Usage: $progname [-h] [-l] [-a|-x] [-c] [-v]\n" + printf "Usage: $progname [-h] [-l] [-c] [-v] [-x] \n" } pr_help() @@ -32,19 +31,19 @@ pr_help() printf "\nAvailable options:\n" printf " -h Print this help\n" - printf " -l List available recipes (BSPs and components)\n" - printf " -a Build a full BSP (kernel, uboot, rootfs, usr)\n" - printf " -x Build a single recipe (component, tool, kernel,\n" - printf " uboot, rootfs, filesystem, ...)\n" - printf " -c Clean (combine with -a/-x to clean then rebuild)\n" + printf " -l List all available recipes (BSPs and components)\n" + printf " -x Build a recipe. -x is optional: the recipe may be\n" + printf " given as a bare argument. A BSP recipe (e.g.\n" + printf " bsp-linux) pulls its whole dependency tree; a\n" + printf " component (uboot, rootfs, ...) builds just itself.\n" + printf " -c Clean the recipe first, then rebuild\n" printf " -v Emit verbose build logs\n\n" printf "Examples: \n\n" - printf "$progname -l Print all recipes\n" - printf "$progname -l -a Print all BSP recipes\n" - printf "$progname -x uboot Build u-boot\n" + printf "$progname -l List all recipes\n" + printf "$progname uboot Build u-boot\n" printf "$progname -x usr-so3 Build the SO3 user space\n" - printf "$progname -a bsp-so3 Build the full SO3 BSP\n" - printf "$progname -v -a bsp-so3 -c Clean and rebuild the BSP, verbose\n" + printf "$progname bsp-so3 Build the full SO3 BSP\n" + printf "$progname -v -c bsp-so3 Clean and rebuild the BSP, verbose\n" } if test $# -eq 0 @@ -57,7 +56,6 @@ fi . ./scripts/common/bblayers.sh . ./scripts/common/sudo_session.sh -layernames='' recipename='' dolist=0 dobuild=0 @@ -65,7 +63,9 @@ doclean=0 optverbose=0 rootprivs=0 -while getopts "achlvx" o; do +# Options first, then the recipe as a positional argument. -x is accepted +# for explicitness/symmetry but is optional (`build.sh bsp-linux` works). +while getopts "chlvx" o; do case "$o" in l) dolist=1 @@ -76,51 +76,12 @@ while getopts "achlvx" o; do pr_help exit ;; - a) - if ! test -n "$2" - then - # List all recipes in 'meta-bsp' - layernames="meta-bsp" - else - recipename="$2" - dobuild=1 - # do_build is pure compilation for most BSPs, so `-a` needs - # NO privileges. The privileged rootfs loop-mount lives in - # usr-*:do_deploy, which a BSP pulls in via do_itb. Whether - # that happens at *build* time depends on how the recipe - # wires do_itb: - # - bsp-so3 / bsp-capsules: `do_itb before do_deploy` only - # -> do_build is privilege-free; the mount happens in - # deploy.sh. `build.sh -a` must NOT prompt for sudo. - # - bsp-linux: `do_itb before do_build` (so `-a` also - # produces the .itb) -> do_build DOES pull the mount and - # needs root at build time. - # Only open a sudo session for the recipes that actually need - # it at build time (extend this match if more are added). - case "$recipename" in - bsp-linux*) rootprivs=1 ;; - esac - fi - ;; - x) - if test -n "$2" - then - recipename="$2" - dobuild=1 - # Some recipes need root at build time (loop-mount / - # losetup / mkfs). Open a sudo session for them, mirroring - # the -a detection. Extend this match if more are added. - case "$recipename" in - bsp-linux*|filesystem) rootprivs=1 ;; - esac - else - layernames="$IB_AUX_LAYERS" - fi - ;; c) - recipename="$2" doclean=1 ;; + x) + # Optional "build this recipe" marker; the recipe is positional. + ;; v) optverbose=1 ;; @@ -130,29 +91,35 @@ while getopts "achlvx" o; do ;; esac done +shift $((OPTIND - 1)) +recipename="$1" + +if test -n "$recipename" +then + dobuild=1 + # Some recipes need root at build time (loop-mount / losetup / mkfs / + # cpio -id). Open a sudo session for them. bsp-linux pulls the rootfs + # mount at build time (do_itb before do_build); filesystem creates the + # image. Extend this match if more are added. + case "$recipename" in + bsp-linux*|filesystem) rootprivs=1 ;; + esac +fi show_env "$recipename" -if test -z $recipename && test $dolist -eq 0 +if test -z "$recipename" && test $dolist -eq 0 then printf "Error: Please specify recipe name\n\n" pr_usage exit 1 fi -# The user is willing to list available recipes -# dolist action is available for component options - +# List all available recipes (BSPs and components). if test $dolist -eq 1 then - if test -z "$layernames" - then - printf "Listing ALL available recipes:\n" - else - printf "Listing recipes in layer(s): $layernames\n" - fi - - available_recipes "$layernames" + printf "Listing ALL available recipes:\n" + available_recipes "" exit fi diff --git a/scripts/check-format.sh b/scripts/check-format.sh new file mode 100755 index 0000000..74b5fca --- /dev/null +++ b/scripts/check-format.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env bash +# +# check-format.sh — run the CI clang-format style check locally. +# +# Mirrors .github/workflows/style.yml exactly: clang-format 19 over so3/so3 +# (excluding *.S) and so3/usr (excluding the vendored / generated trees), on +# git-TRACKED files only — just like the CI's actions/checkout (so generated +# build artefacts such as the kconfig parser are naturally ignored). +# +# Usage: +# scripts/check-format.sh # report files that need formatting (exit 1 if any) +# scripts/check-format.sh --fix # reformat the offending files in place +# +set -euo pipefail + +cd "$(git rev-parse --show-toplevel)" + +FIX=0 +[ "${1:-}" = "--fix" ] && FIX=1 + +# Prefer clang-format-19 (the version the CI pins); fall back with a warning. +CF="" +for c in clang-format-19 clang-format; do + command -v "$c" >/dev/null 2>&1 && { CF="$c"; break; } +done +[ -n "$CF" ] || { echo "error: clang-format not found (install clang-format-19)" >&2; exit 2; } +ver="$("$CF" --version | grep -oE '[0-9]+' | head -1)" +[ "$ver" = "19" ] || echo "warning: using $CF (v$ver); the CI uses clang-format 19 — results may differ" >&2 + +# C/C++/Protobuf extensions — the jidicula/clang-format-action default set. +ext_re='\.(c|h|C|H|cpp|hpp|cc|hh|cxx|hxx|cu|cuh|proto)$' + +fail=0 + +# check_path (the two style.yml matrix entries) +check_path() { + local path="$1" exclude="$2" f + while IFS= read -r f; do + [[ "$f" =~ $ext_re ]] || continue + [ -n "$exclude" ] && [[ "$f" =~ $exclude ]] && continue + if [ "$FIX" -eq 1 ]; then + "$CF" -i "$f" + elif ! "$CF" --dry-run --Werror "$f" >/dev/null 2>&1; then + echo "FAIL: $f" + fail=1 + fi + done < <(git ls-files "$path") +} + +check_path "so3/so3" '\.S$' +check_path "so3/usr" '(micropython|libxml2|usr/lib/linux|lvgl|lv_)' + +if [ "$FIX" -eq 1 ]; then + echo "clang-format: reformatted in place ($CF)" +elif [ "$fail" -eq 0 ]; then + echo "clang-format: all clean ✓ ($CF)" +else + echo + echo "clang-format violations above. Fix with: scripts/check-format.sh --fix" + exit 1 +fi diff --git a/scripts/common/bblayers.sh b/scripts/common/bblayers.sh index 6d71cef..f2c2ad7 100755 --- a/scripts/common/bblayers.sh +++ b/scripts/common/bblayers.sh @@ -30,8 +30,13 @@ show_env() { _platform= if test -n "$BUILDDIR" && test -r "$BUILDDIR/conf/local.conf"; then - _platform=$(grep "^IB_PLATFORM" "$BUILDDIR/conf/local.conf" \ - | head -1 | sed -n 's/.*"\([^"]*\)".*/\1/p') + # Report the EFFECTIVE platform. bitbake uses last-assignment-wins, + # and an image build may append "IB_PLATFORM = ..." after the + # "IB_PLATFORM ?= ..." default (e.g. the lv_perf Dockerfiles), so + # take the last plain (non-override) assignment, not the first. + _platform=$(grep -E "^IB_PLATFORM[[:space:]]*[?:]?=" "$BUILDDIR/conf/local.conf" \ + | grep -v "^IB_PLATFORM:" \ + | tail -1 | sed -n 's/.*"\([^"]*\)".*/\1/p') fi printf '%s root=%s platform=%s\n' \ diff --git a/scripts/common/initrd_pack.sh b/scripts/common/initrd_pack.sh new file mode 100755 index 0000000..d75afc6 --- /dev/null +++ b/scripts/common/initrd_pack.sh @@ -0,0 +1,74 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD +# +# Helpers for the `-i`/`initrd` option of mount.sh / umount.sh. +# +# A cpio archive is not a block image, so there is nothing to losetup + +# mount. "Mounting" the initrd means extracting board//initrd.cpio +# into a working tree the user can edit; "unmounting" repacks that tree +# back into initrd.cpio. Both run under fakeroot so the archive keeps its +# root ownership / modes without needing real root — the fake-ownership DB +# is saved on mount and replayed on umount. +# +# Expects env.sh already sourced (IB_ROOT_DIR, BUILDDIR exported). + +# Resolve the target platform from the active (uncommented) IB_PLATFORM in +# local.conf — same source of truth as the build. An explicit arg still +# overrides it; virt64 is the last-resort fallback. +_initrd_platform() { + if [ -n "$1" ]; then echo "$1"; return; fi + _p=$(sed -n 's/^[[:space:]]*IB_PLATFORM[[:space:]]*?\{0,1\}=[[:space:]]*"\([^"]*\)".*/\1/p' \ + "$BUILDDIR/conf/local.conf" 2>/dev/null | tail -1) + [ -n "$_p" ] && echo "$_p" || echo virt64 +} + +# Set _IRD_SRC / _IRD_WORK / _IRD_LINK / _IRD_STATE for the resolved +# platform. Mirrors the partition-mount convention (fs_arm_common.bbclass): +# content extracted under filesystem/work/p1, with a top-level convenience +# symlink filesystem/p1 -> work/p1 that lands straight on the content. +_initrd_paths() { + _plat=$(_initrd_platform "$1") + _IRD_SRC="$IB_ROOT_DIR/build/meta-rootfs/recipes-rootfs/linux/files/board/$_plat/initrd.cpio" + _IRD_WORK="$IB_ROOT_DIR/filesystem/work/p1" + _IRD_LINK="$IB_ROOT_DIR/filesystem/p1" + _IRD_STATE="$IB_ROOT_DIR/filesystem/work/p1.fakeroot" +} + +initrd_mount() { + command -v fakeroot >/dev/null 2>&1 || { echo "fakeroot not installed" >&2; return 1; } + _initrd_paths "$1" + [ -f "$_IRD_SRC" ] || { echo "no initrd.cpio for '$_plat': $_IRD_SRC" >&2; return 1; } + if mountpoint -q "$_IRD_WORK" 2>/dev/null; then + echo "a partition is mounted at $_IRD_WORK — umount.sh first" >&2 + return 1 + fi + if [ -d "$_IRD_WORK" ]; then + echo "already mounted at $_IRD_WORK — umount.sh -i first" >&2 + return 1 + fi + mkdir -p "$_IRD_WORK" + rm -f "$_IRD_STATE" + ( cd "$_IRD_WORK" && fakeroot -s "$_IRD_STATE" sh -c "cpio -idm --quiet < '$_IRD_SRC'" ) || return 1 + ln -sfn "$_IRD_WORK" "$_IRD_LINK" + echo "initrd.cpio ($_plat) extracted; reach it directly via:" + echo " $_IRD_LINK" + echo "edit it, then repack with: umount.sh -i" +} + +initrd_umount() { + command -v fakeroot >/dev/null 2>&1 || { echo "fakeroot not installed" >&2; return 1; } + _initrd_paths "$1" + [ -d "$_IRD_WORK" ] || { echo "not mounted: $_IRD_WORK" >&2; return 1; } + if [ -f "$_IRD_STATE" ]; then + ( cd "$_IRD_WORK" && fakeroot -i "$_IRD_STATE" -s "$_IRD_STATE" \ + sh -c "find . | sort | cpio -o -H newc --quiet > '$_IRD_SRC.tmp'" ) || return 1 + else + echo "warning: no fakeroot state, ownership may be wrong" >&2 + ( cd "$_IRD_WORK" && fakeroot \ + sh -c "find . | sort | cpio -o -H newc --quiet > '$_IRD_SRC.tmp'" ) || return 1 + fi + mv "$_IRD_SRC.tmp" "$_IRD_SRC" + rm -rf "$_IRD_WORK" "$_IRD_STATE" + [ -L "$_IRD_LINK" ] && rm -f "$_IRD_LINK" + echo "repacked $_plat initrd.cpio ($(wc -c < "$_IRD_SRC") bytes); unmounted" +} diff --git a/scripts/common/setup_env.sh b/scripts/common/setup_env.sh old mode 100644 new mode 100755 diff --git a/scripts/common/sudo_session.sh b/scripts/common/sudo_session.sh old mode 100644 new mode 100755 diff --git a/scripts/deploy.sh b/scripts/deploy.sh index ca4b086..aac547e 100755 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -9,7 +9,6 @@ # Copyright (c) 2014-2026 REDS Institute, HEIG-VD # Copyright (c) 2023-2026 EDGEMTech -# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD progname=$(basename $0) @@ -21,22 +20,23 @@ progname=$(basename $0) pr_usage() { printf "Infrabase deployment script\n\n" - printf "Usage: $progname [-h] [-l] [-a|-x] [-v] ... \n" + printf "Usage: $progname [-h] [-l] [-v] [-x] \n" } pr_help() { printf "\nAvailable options:\n" printf " -h Print this help\n" - printf " -l List available recipes per layer or globally\n" - printf " -a Deploy a full BSP (rootfs, kernel, uboot, usr, ITB)\n" - printf " -x Deploy a single recipe (component, uboot, rootfs, usr, ...)\n" + printf " -l List all deployable recipes\n" + printf " -x Deploy a recipe. -x is optional: the recipe may be\n" + printf " given as a bare argument. A BSP recipe (e.g. bsp-so3)\n" + printf " deploys the full image; a component (usr-so3, ...)\n" + printf " deploys just its own part.\n" printf " -v Emit logs during deployment\n" printf "Examples: \n\n" - printf "$progname -l -a List all deployable BSP recipes\n" - printf "$progname -l -x List all deployable components\n" - printf "$progname -x usr-so3 Deploy the SO3 user space into the rootfs\n" - printf "$progname -a bsp-so3 -v Deploy the full SO3 BSP with verbose logs\n" + printf "$progname -l List all deployable recipes\n" + printf "$progname usr-so3 Deploy the SO3 user space into the rootfs\n" + printf "$progname -v bsp-so3 Deploy the full SO3 BSP with verbose logs\n" } if test $# -eq 0 @@ -50,12 +50,13 @@ fi . ./scripts/common/sudo_session.sh recipename='' -layernames='' optverbose=0 dolist=0 dodeploy=0 -while getopts "ahlvx" o; do +# Options first, then the recipe as a positional argument. -x is accepted +# for explicitness/symmetry but is optional (`deploy.sh bsp-so3` works). +while getopts "hlvx" o; do case "$o" in h) # Help summary @@ -63,25 +64,8 @@ while getopts "ahlvx" o; do pr_help exit ;; - a) - if ! test -n "$2" - then - layernames="meta-bsp" - else - recipename="$2" - deploytask="do_deploy" - dodeploy=1 - fi - ;; x) - if ! test -n "$2" - then - layernames="$IB_AUX_LAYERS" - else - recipename="$2" - deploytask="do_deploy" - dodeploy=1 - fi + # Optional "deploy this recipe" marker; the recipe is positional. ;; l) dolist=1 @@ -95,10 +79,18 @@ while getopts "ahlvx" o; do ;; esac done +shift $((OPTIND - 1)) +recipename="$1" + +if test -n "$recipename" +then + deploytask="do_deploy" + dodeploy=1 +fi show_env "$recipename" -if test -z $recipename && test $dolist -eq 0 +if test -z "$recipename" && test $dolist -eq 0 then printf "Error: please specify a recipe name\n\n" pr_usage @@ -110,14 +102,9 @@ fi if test $dolist -eq 1 then - if test -z "$layernames" - then - echo "Listing ALL available deployable recipes:" - else - echo "Listing available deployable recipes in layer(s): $layernames" - fi + echo "Listing ALL available deployable recipes:" - recipes=$(available_recipes "$layernames") + recipes=$(available_recipes "") for r in $recipes do diff --git a/scripts/mount.sh b/scripts/mount.sh index ad47a03..96329cb 100755 --- a/scripts/mount.sh +++ b/scripts/mount.sh @@ -11,6 +11,16 @@ # source env.sh — prompting the user first if the parent shell points # at a different tree. See scripts/common/setup_env.sh for details. . "$(cd "$(dirname "$(command -v -- "$0")")" && pwd)/common/setup_env.sh" + +# `mount.sh -i [platform]` extracts board//initrd.cpio for editing +# instead of loop-mounting the sdcard partitions (no sudo / bitbake needed). +if [ "$1" = "-i" ] || [ "$1" = "initrd" ]; then + shift + . ./scripts/common/initrd_pack.sh + initrd_mount "$1" + exit $? +fi + . ./scripts/common/sudo_session.sh sudo_session_start || exit 1 diff --git a/scripts/st.sh b/scripts/st.sh index 3758c76..e5b5040 100755 --- a/scripts/st.sh +++ b/scripts/st.sh @@ -39,11 +39,11 @@ launch_qemu() { fi done < build/conf/local.conf - # Detect an AVZ boot from the selected (uncommented) ITS. AVZ is an EL2 - # hypervisor, so QEMU must expose EL2 (virtualization=on); a standalone - # SO3 / plain Linux boots at EL1. Either context can be the AVZ guest: - # * SO3 on AVZ -> IB_TARGET_ITS:so3: = _avz - # * Linux agency on AVZ-> IB_TARGET_ITS:linux: = _avz (MICOFE) + # Detect an AVZ boot from the selected (uncommented) ITS. Both the so3 + # and the linux ITS must be checked: with the Linux agency + SO3 capsules + # the so3 ITS is _capsule while the boot image is the linux one + # (IB_TARGET_ITS:linux = _avz). AVZ is an EL2 hypervisor, so QEMU + # must expose EL2 (virtualization=on); a standalone SO3 boots at EL1. SO3_ITS=$(grep -E "^IB_TARGET_ITS:so3:${IB_PLATFORM}\b" build/conf/local.conf | awk -F'"' '{print $2}' | tail -1) LINUX_ITS=$(grep -E "^IB_TARGET_ITS:linux:${IB_PLATFORM}\b" build/conf/local.conf | awk -F'"' '{print $2}' | tail -1) @@ -76,12 +76,12 @@ launch_qemu() { MACHINE_OPT="-M virt,virtualization=on,gic-version=2,secure=on" BOOT_OPT="-drive if=pflash,format=raw,file=filesystem/flash0.img" elif [[ "$SO3_ITS" == *avz* || "$LINUX_ITS" == *avz* ]]; then - # AVZ via the ITS (SO3 guest or Linux agency), no ATF: AVZ is an EL2 - # hypervisor, so QEMU must expose EL2 (virtualization=on). The U-Boot - # here is virt64_defconfig (FIP/EL2-aware), so it runs fine at EL2 and - # hands off to AVZ at EL2. Without this, AVZ faults on its first EL2 + # AVZ via the ITS, no ATF: AVZ is an EL2 hypervisor, so QEMU + # must expose EL2 (virtualization=on). The U-Boot here is + # virt64_defconfig (FIP/EL2-aware), so it runs fine at EL2 and hands + # off to AVZ at EL2. Without this, AVZ faults on its first EL2 # system-register access (Synchronous Abort -> reset). - echo "AVZ guest (so3=$SO3_ITS linux=$LINUX_ITS) — enabling EL2 (virtualization=on)" + echo "AVZ guest (so3 ITS=$SO3_ITS, linux ITS=$LINUX_ITS) — enabling EL2 (virtualization=on)" MACHINE_OPT="-M virt,gic-version=2,virtualization=on" BOOT_OPT="-kernel u-boot/u-boot" else diff --git a/scripts/umount.sh b/scripts/umount.sh index 8ede3be..886ee8d 100755 --- a/scripts/umount.sh +++ b/scripts/umount.sh @@ -11,6 +11,16 @@ # source env.sh — prompting the user first if the parent shell points # at a different tree. See scripts/common/setup_env.sh for details. . "$(cd "$(dirname "$(command -v -- "$0")")" && pwd)/common/setup_env.sh" + +# `umount.sh -i [platform]` repacks the tree extracted by `mount.sh -i` +# back into board//initrd.cpio (no sudo / bitbake needed). +if [ "$1" = "-i" ] || [ "$1" = "initrd" ]; then + shift + . ./scripts/common/initrd_pack.sh + initrd_umount "$1" + exit $? +fi + . ./scripts/common/sudo_session.sh sudo_session_start || exit 1 From 493a63590c5f454e7fc4cc8a5919456154bbf052 Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Sat, 11 Jul 2026 15:31:09 +0200 Subject: [PATCH 25/52] meta-rootfs: create /dev/soo/core via a SysVinit S30soo script The soo core driver registers char major 126 but does not create the node; the agency boots SysVinit (no systemd/udev) so the systemd soo.service never runs. Create /dev/soo/core at boot for the capsule management apps (injector, melist, ...). --- .../common/rootfs_overlay/etc/init.d/S30soo | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100755 build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/init.d/S30soo diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/init.d/S30soo b/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/init.d/S30soo new file mode 100755 index 0000000..14826dc --- /dev/null +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/init.d/S30soo @@ -0,0 +1,23 @@ +#!/bin/sh +# +# Create the SOO core device node used by the capsule management +# applications (injector, melist, saveme, ...). The soo core driver +# registers char major 126 (soo/core) but does not create the node +# itself, and this agency boots with SysVinit (no systemd, no udev) +# so it must be created here. + +case "$1" in +start) + if [ ! -c /dev/soo/core ]; then + mkdir -p /dev/soo + mknod /dev/soo/core c 126 0 + fi + ;; +stop) ;; +*) + echo "Usage: $0 {start|stop}" + exit 1 + ;; +esac + +exit 0 From 22fb1c1fbe41d7284e23cab133c6bd367e0a15c5 Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Sat, 11 Jul 2026 16:04:35 +0200 Subject: [PATCH 26/52] meta-bsp/meta-uboot: adopt the SO3 v6.2.0 ITS render model and guest-boot Align both layers wholesale on v6.2.0: shared do_render_its in bsp.bbclass renders layer ITS templates (recipes-bsp/{linux,so3}/files/ its) into the gitignored /images, replacing the committed linux/target ITS and the local bsp-capsules render added earlier; bsp-capsules do_deploy now escalates the p2 copy (utils_sudo, check). IB_GUEST_SUFFIX replaces IB_AVZ_GUEST for the 2-ITB agency boot and IB_RAMFS_SOURCE="initrd" (local.conf) replaces the do_prepare_initrd noexec hack for the 2-stage rootfs. meta-uboot picks up the e1c-boot -> guest-boot rename (guest_boot.c patches, uEnv callers). Drop the stale pre-split rpi4/standalone ITS and the legacy linux/target build scripts (recoverable from history). --- .gitignore | 4 + build/conf/local.conf | 8 ++ build/meta-bsp/classes/bsp.bbclass | 109 +++++++++++++-- .../recipes-bsp/bsp/files/bsp_arm_common.inc | 11 +- .../bsp/files/bsp_verdin-imx8mp.inc | 12 +- .../recipes-bsp/bsp/files/bsp_virt64.inc | 4 +- .../bsp/verdin-imx8mp/boot_avz.scr.txt | 4 +- .../recipes-bsp/capsule/bsp-capsules_1.0.0.bb | 50 ++----- .../recipes-bsp/linux/bsp-linux_1.0.bb | 130 ++++++++++-------- .../recipes-bsp/linux/files/its/rpi4.its | 42 +++--- .../recipes-bsp/linux/files/its/virt32.its | 91 ++++++++++++ .../linux/files/its}/virt32_avz.its | 10 +- .../linux/files/its}/virt32_standalone.its | 10 +- .../recipes-bsp/linux/files/its/virt64.its | 86 ++++++++++++ .../linux/files/its/virt64_avz.its | 70 ++++++++++ .../linux/files/its/virt64_linux_guest.its | 63 +++++++++ .../linux/files/uEnv_virt64_avz.txt | 25 ++-- .../meta-bsp/recipes-bsp/so3/bsp-so3_1.0.0.bb | 16 ++- .../recipes-bsp/so3/files/its/rpi4_64_avz.its | 53 +++++++ .../so3/files/its/rpi4_64_capsule.its | 75 ++++++++++ .../recipes-bsp/so3/files/its/rpi4_64_so3.its | 70 ++++++++++ .../so3/files/its/rpi4_64_so3_guest.its | 63 +++++++++ .../so3/files/its/verdin_imx8mp_avz.its | 53 +++++++ .../so3/files/its/verdin_imx8mp_so3.its | 67 +++++++++ .../so3/files/its/verdin_imx8mp_so3_guest.its | 64 +++++++++ .../so3/files/its/virt32_lvperf.its | 70 ++++++++++ .../recipes-bsp/so3/files/its/virt32_so3.its | 70 ++++++++++ .../recipes-bsp/so3/files/its}/virt64_avz.its | 11 +- .../files/its/virt64_capsule.its | 43 +++--- .../so3/files/its/virt64_lvperf.its | 70 ++++++++++ .../recipes-bsp/so3/files/its/virt64_so3.its | 74 ++++++++++ .../so3/files/its/virt64_so3_guest.its | 63 +++++++++ .../so3/files/uEnv_rpi4_64_avz.txt | 4 +- .../recipes-bsp/so3/files/uEnv_virt64_avz.txt | 4 +- .../files/0001-uboot-2022.04-r0-patches.inc | 2 +- ...c_boot.c.patch => 0008-guest_boot.c.patch} | 89 ++++++------ .../0001-uboot-2022.04-r0/0009-Kconfig.patch | 6 +- .../0001-uboot-2022.04-r0/0010-Makefile.patch | 2 +- .../0019-virt64_defconfig.patch | 2 +- .../files/0001-uboot-2024.07-r0-patches.inc | 2 +- .../0001-uboot-2024.07-r0/0070-Kconfig.patch | 6 +- .../0001-uboot-2024.07-r0/0071-Makefile.patch | 2 +- .../0072-verdin-imx8mp_defconfig.patch | 2 +- ...c_boot.c.patch => 0073-guest_boot.c.patch} | 87 ++++++------ .../recipes-uboot/uboot/uboot_2022.04.bb | 9 +- linux/target/build.sh | 30 ---- linux/target/mkuboot.sh | 32 ----- linux/target/rpi4_64_avz.its | 96 ------------- linux/target/rpi4_64_linux.its | 75 ---------- linux/target/virt32.its | 1 - linux/target/virt64.its | 1 - linux/target/virt64_linux_guest.its | 68 --------- 52 files changed, 1499 insertions(+), 612 deletions(-) rename linux/target/virt64_standalone.its => build/meta-bsp/recipes-bsp/linux/files/its/rpi4.its (59%) create mode 100644 build/meta-bsp/recipes-bsp/linux/files/its/virt32.its rename {linux/target => build/meta-bsp/recipes-bsp/linux/files/its}/virt32_avz.its (85%) rename {linux/target => build/meta-bsp/recipes-bsp/linux/files/its}/virt32_standalone.its (86%) create mode 100644 build/meta-bsp/recipes-bsp/linux/files/its/virt64.its create mode 100644 build/meta-bsp/recipes-bsp/linux/files/its/virt64_avz.its create mode 100644 build/meta-bsp/recipes-bsp/linux/files/its/virt64_linux_guest.its create mode 100644 build/meta-bsp/recipes-bsp/so3/files/its/rpi4_64_avz.its create mode 100644 build/meta-bsp/recipes-bsp/so3/files/its/rpi4_64_capsule.its create mode 100644 build/meta-bsp/recipes-bsp/so3/files/its/rpi4_64_so3.its create mode 100644 build/meta-bsp/recipes-bsp/so3/files/its/rpi4_64_so3_guest.its create mode 100644 build/meta-bsp/recipes-bsp/so3/files/its/verdin_imx8mp_avz.its create mode 100644 build/meta-bsp/recipes-bsp/so3/files/its/verdin_imx8mp_so3.its create mode 100644 build/meta-bsp/recipes-bsp/so3/files/its/verdin_imx8mp_so3_guest.its create mode 100644 build/meta-bsp/recipes-bsp/so3/files/its/virt32_lvperf.its create mode 100644 build/meta-bsp/recipes-bsp/so3/files/its/virt32_so3.its rename {linux/target => build/meta-bsp/recipes-bsp/so3/files/its}/virt64_avz.its (72%) rename build/meta-bsp/recipes-bsp/{capsule => so3}/files/its/virt64_capsule.its (67%) create mode 100644 build/meta-bsp/recipes-bsp/so3/files/its/virt64_lvperf.its create mode 100644 build/meta-bsp/recipes-bsp/so3/files/its/virt64_so3.its create mode 100644 build/meta-bsp/recipes-bsp/so3/files/its/virt64_so3_guest.its rename build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/{0008-e1c_boot.c.patch => 0008-guest_boot.c.patch} (57%) rename build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/{0073-e1c_boot.c.patch => 0073-guest_boot.c.patch} (58%) delete mode 100755 linux/target/build.sh delete mode 100755 linux/target/mkuboot.sh delete mode 100644 linux/target/rpi4_64_avz.its delete mode 100644 linux/target/rpi4_64_linux.its delete mode 120000 linux/target/virt32.its delete mode 120000 linux/target/virt64.its delete mode 100644 linux/target/virt64_linux_guest.its diff --git a/.gitignore b/.gitignore index 4da2738..325d281 100644 --- a/.gitignore +++ b/.gitignore @@ -79,3 +79,7 @@ filesystem/work /linux/usr/src/graphic/ /linux/usr/src/lvgl/ /filesystem/u-boot.bin + +# Rendered ITS + .itb output (do_render_its), regenerated each build +linux/images/ +so3/images/ diff --git a/build/conf/local.conf b/build/conf/local.conf index 8c75ba4..20b0fa8 100644 --- a/build/conf/local.conf +++ b/build/conf/local.conf @@ -270,3 +270,11 @@ BB_WARN_ONLY = "true" # EXTRA_OVERRIDES .= ":lvgl" EXTRA_OVERRIDES .= ":lvgl:soo" + +# Which cpio becomes the ITB-embedded ramfs (do_prepare_initrd): +# "rootfs" - the full buildroot rootfs.cpio (run-from-RAM). +# "initrd" - the static git-tracked board//initrd.cpio +# (small busybox ramfs); p2 still gets the full rootfs. +# MICOFE uses the 2-stage boot: small ramdisk then switch_root to p2. +# IB_RAMFS_SOURCE = "rootfs" +IB_RAMFS_SOURCE = "initrd" diff --git a/build/meta-bsp/classes/bsp.bbclass b/build/meta-bsp/classes/bsp.bbclass index 02271cb..67f01be 100644 --- a/build/meta-bsp/classes/bsp.bbclass +++ b/build/meta-bsp/classes/bsp.bbclass @@ -15,10 +15,106 @@ IB_BSP_PATH = "${IB_DIR}/build/meta-bsp/recipes-bsp/bsp" IB_ATF_PATH = "${IB_DIR}/atf" IB_OPTEE_PATH = "${IB_DIR}/atf/optee" -# Path to the ITB files +# ITB build/output directory (gitignored). The ITS *sources* live in each +# BSP recipe's files/its/ (IB_ITS_SRC) and reference the component trees via +# ${IB_*_PATH} variables; do_itb renders them here (bsp_render_its) before +# mkimage and writes the resulting .itb here too. +IB_ITB_PATH:so3 = "${IB_DIR}/so3/images" +IB_ITB_PATH:linux = "${IB_DIR}/linux/images" + +# Component tree locations referenced from the ITS templates. Provided here +# (?=) so every BSP recipe can render any ITS regardless of which classes it +# inherits; the real definitions in so3/avz/linux .bbclass take precedence. +IB_SO3_PATH ?= "${IB_DIR}/so3" +IB_AVZ_PATH ?= "${IB_DIR}/avz" +IB_LINUX_PATH ?= "${IB_DIR}/linux/linux" + +# AVZ two-ITB boot: the guest ITB basename is + +# this suffix. SO3 guests use _so3_guest (default); the Linux agency overrides +# it to _linux_guest in bsp-linux. +IB_GUEST_SUFFIX ?= "_so3_guest" + +# Which cpio feeds the embedded ramfs (the initrd.cpio.gz that the ITS +# /incbin/'s into the guest ITB). Both modes run-from-RAM; only the source +# differs: +# "rootfs" (default) - the freshly built board//rootfs.cpio (~30 MB, +# full buildroot rootfs). p2 holds the same content. +# "initrd" - the static, git-tracked board//initrd.cpio +# (small busybox ramfs). p2 still receives the full +# rootfs.cpio; the kernel just boots the small initrd. +# Override per build in conf/local.conf, e.g. IB_RAMFS_SOURCE = "initrd". +IB_RAMFS_SOURCE ?= "rootfs" + +# Render an ITS template from IB_ITS_SRC into IB_ITB_PATH, expanding the +# ${IB_*_PATH} / ${IB_PLATFORM} placeholders to absolute build paths. The sed +# patterns use char classes ([$][{]...[}]) so bitbake leaves them untouched +# and only the replacement side is expanded. +bsp_render_its() { + mkdir -p "${IB_ITB_PATH}" + sed -e "s|[$][{]IB_SO3_PATH[}]|${IB_SO3_PATH}|g" \ + -e "s|[$][{]IB_AVZ_PATH[}]|${IB_AVZ_PATH}|g" \ + -e "s|[$][{]IB_LINUX_PATH[}]|${IB_LINUX_PATH}|g" \ + -e "s|[$][{]IB_ROOTFS_PATH[}]|${IB_ROOTFS_PATH}|g" \ + -e "s|[$][{]IB_PLATFORM[}]|${IB_PLATFORM}|g" \ + "${IB_ITS_SRC}/$1.its" > "${IB_ITB_PATH}/$1.its" +} -IB_ITB_PATH:so3 = "${IB_DIR}/so3/target" -IB_ITB_PATH:linux = "${IB_DIR}/linux/target" +# Default ITS source dir for the generic (AVZ / bare linux) templates. The +# Linux-agency BSP (bsp-linux) renders from here; bsp-so3 / bsp-capsules +# override IB_ITS_SRC to their own files/its. +IB_ITS_SRC ?= "${IB_DIR}/build/meta-bsp/recipes-bsp/linux/files/its" + +# Python counterpart of bsp_render_its, used by do_render_its below. Renders +# IB_ITS_SRC/.its into IB_ITB_PATH, expanding the same placeholders. +# Returns False (a no-op) when IB_ITS_SRC has no .its template, so +# callers can offer a superset of candidate names and let missing ones skip. + +def bsp_render_its_py(d, name): + import os + src = os.path.join(d.getVar('IB_ITS_SRC') or '', name + '.its') + if not os.path.isfile(src): + return False + repl = { + '${IB_SO3_PATH}': d.getVar('IB_SO3_PATH') or '', + '${IB_AVZ_PATH}': d.getVar('IB_AVZ_PATH') or '', + '${IB_LINUX_PATH}': d.getVar('IB_LINUX_PATH') or '', + '${IB_ROOTFS_PATH}': d.getVar('IB_ROOTFS_PATH') or '', + '${IB_PLATFORM}': d.getVar('IB_PLATFORM') or '', + } + with open(src) as f: + text = f.read() + for k, v in repl.items(): + text = text.replace(k, v) + dst_dir = d.getVar('IB_ITB_PATH') + os.makedirs(dst_dir, exist_ok=True) + with open(os.path.join(dst_dir, name + '.its'), 'w') as f: + f.write(text) + return True + +# Generic ITS render step, shared by EVERY BSP recipe (bsp-so3, bsp-linux, +# bsp-capsules) and their per-platform do_itb includes. Renders all the +# generic (placeholder) ITS a do_itb may mkimage — bare (IB_PLATFORM), the +# AVZ ITB (IB_TARGET_ITS) and, for the two-ITB AVZ case, the guest — from +# IB_ITS_SRC into IB_ITB_PATH, ONCE, before do_itb. Doing it here (not inline +# in each do_itb) means adding a platform or variant never needs to re-add +# render calls; bsp_render_its_py just skips the names that have no template. +# do_itb then only reads + mkimage's. + +python do_render_its() { + plat = d.getVar('IB_PLATFORM') or '' + target_its = d.getVar('IB_TARGET_ITS') or '' + suffix = d.getVar('IB_GUEST_SUFFIX') or '_so3_guest' + names = [plat, target_its] + if target_its.endswith('_avz'): + names.append(target_its[:-len('_avz')] + suffix) + seen = set() + for n in names: + if n and n not in seen: + seen.add(n) + bsp_render_its_py(d, n) +} +do_render_its[nostamp] = "1" +addtask do_render_its before do_itb # This is the uEnv.txt file related to U-boot depending on the BSP IB_UENV = "${FILE_DIRNAME}/files/uEnv_${IB_PLATFORM}.txt" @@ -35,7 +131,7 @@ inherit filesystem # # Per-platform bootloader assembly lives in bsp_.inc as # __do_platform_boot_chain(d). The AVZ ITB build is generic: mkimage on -# ${IB_DIR}/linux/target/${IB_PLATFORM}_avz.its. +# ${IB_DIR}/linux/images/${IB_PLATFORM}_avz.its. # Boot-chain dependencies gate on IB_BOOT_CHAIN: # "uboot" → only u-boot (no ATF, OP-TEE, AVZ pulled in) @@ -64,10 +160,7 @@ python () { python do_deploy_boot_chain () { plat = d.getVar('IB_PLATFORM') or '?' - # Empty IB_BOOT_CHAIN is the valid "bare U-Boot" mode (treated as "uboot" - # in __do_platform_boot_chain) — label it so the log doesn't read like a - # misconfiguration. - chain = d.getVar('IB_BOOT_CHAIN') or 'uboot (bare)' + chain = d.getVar('IB_BOOT_CHAIN') or '?' bb.plain(f"Deploy boot chain for platform {plat} (chain={chain})") try: diff --git a/build/meta-bsp/recipes-bsp/bsp/files/bsp_arm_common.inc b/build/meta-bsp/recipes-bsp/bsp/files/bsp_arm_common.inc index 1666abe..27fe7f5 100644 --- a/build/meta-bsp/recipes-bsp/bsp/files/bsp_arm_common.inc +++ b/build/meta-bsp/recipes-bsp/bsp/files/bsp_arm_common.inc @@ -6,7 +6,7 @@ # Two deployment shapes, selected by the chosen ITS: # * AVZ two-ITB boot (IB_TARGET_ITS ends in "_avz"): stage the AVZ ITB # (_avz.itb) AND the SO3 guest ITB (_guest.itb) plus the -# uEnv__avz.txt that loads both and jumps via U-Boot's e1c-boot +# uEnv__avz.txt that loads both and jumps via U-Boot's guest-boot # command (AVZ FIT in x0, guest ITB in x1). The guest ITB is derived # from IB_TARGET_ITS: _so3_guest.itb. # * Single-ITB bootm (any other ITS): the standalone SO3 / Linux image. @@ -20,14 +20,13 @@ def __deploy_arm_common(d): plat = d.getVar('IB_PLATFORM') its = d.getVar('IB_TARGET_ITS') or "" IB_UENV = d.getVar("IB_UENV") - # Kind of x1 guest in the AVZ two-ITB boot: "so3_guest" (bsp-so3) or - # "linux_guest" (bsp-linux agency). Set per recipe; default so3_guest. - guest_kind = d.getVar('IB_AVZ_GUEST') or "so3_guest" if its.endswith("_avz"): - # Two-ITB AVZ boot. + # Two-ITB AVZ boot. The guest ITB basename is OS-specific + # (_so3_guest for SO3, _linux_guest for the Linux agency). + guest_suffix = d.getVar('IB_GUEST_SUFFIX') or "_so3_guest" avz_itb = f"{itb_dir}/{its}.itb" - guest_itb = f"{itb_dir}/{its[:-len('_avz')]}_{guest_kind}.itb" + guest_itb = f"{itb_dir}/{its[:-len('_avz')]}{guest_suffix}.itb" avz_uenv = os.path.join(os.path.dirname(IB_UENV), f"uEnv_{plat}_avz.txt") for f in (avz_itb, guest_itb, avz_uenv): diff --git a/build/meta-bsp/recipes-bsp/bsp/files/bsp_verdin-imx8mp.inc b/build/meta-bsp/recipes-bsp/bsp/files/bsp_verdin-imx8mp.inc index 058d381..b8938c3 100644 --- a/build/meta-bsp/recipes-bsp/bsp/files/bsp_verdin-imx8mp.inc +++ b/build/meta-bsp/recipes-bsp/bsp/files/bsp_verdin-imx8mp.inc @@ -1,9 +1,9 @@ # Copyright (c) 2026 EDGEMTech SA # Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD # -# Toradex Verdin iMX8MP platform glue for SO3-as-an-AVZ-guest, kept independent -# of Torizon and the e1c capsules (edgem1 keeps the verdin BSP in meta-e1c; this -# is the capsule-free equivalent). +# Toradex Verdin iMX8MP platform glue for SO3-as-an-AVZ-guest. It runs no +# TorizonOS / capsule userspace; the Toradex TEZI image is fetched only to +# obtain the imx-boot firmware (see __fetch_torizon_tezi_image below). # # Boot image: do_itb (bsp-so3) mkimage's two ITBs — the AVZ ITB # (verdin_imx8mp_avz.its = AVZ + avz_dt) and the SO3 guest ITB @@ -13,13 +13,13 @@ # # Deploy: assemble a Toradex TEZI image set (the official base image provides # image.json + the partition layout; we replace imx-boot with our flash.bin and -# add a boot.scr that loads both ITBs and jumps via the e1c-boot U-Boot command). +# add a boot.scr that loads both ITBs and jumps via the guest-boot U-Boot command). # For SO3 standalone (non-AVZ ITS) a single ITB is staged and bootm'd instead. # No capsule / OSTree rootfs — SO3's rootfs rides inside the guest ITB. # Path to the SO3 boot scripts and the U-Boot bootcmd that sources them. # boot.scr.txt single-ITB bootm (SO3 standalone) -# boot_avz.scr.txt two-ITB AVZ boot (AVZ ITB + SO3 guest ITB via e1c-boot) +# boot_avz.scr.txt two-ITB AVZ boot (AVZ ITB + SO3 guest ITB via guest-boot) IB_VERDIN_BOOTSCR = "${IB_DIR}/build/meta-bsp/recipes-bsp/bsp/verdin-imx8mp/boot.scr.txt" IB_VERDIN_BOOTSCR_AVZ = "${IB_DIR}/build/meta-bsp/recipes-bsp/bsp/verdin-imx8mp/boot_avz.scr.txt" IB_VERDIN_BOOTCMD = "mmc dev 2; ext4load mmc 2:1 0x48200000 /boot.scr; source 0x48200000" @@ -136,7 +136,7 @@ def __do_platform_deploy(d): # Our firmware, boot script and ITB(s). # * AVZ two-ITB boot (ITS ends in "_avz"): stage the AVZ ITB as # boot_avz.itb and the SO3 guest ITB (derived _so3_guest) - # as boot_guest.itb; boot_avz.scr.txt loads both and jumps via e1c-boot. + # as boot_guest.itb; boot_avz.scr.txt loads both and jumps via guest-boot. # * Single-ITB bootm (any other ITS): stage it as boot.itb. subprocess.run(['cp', flashbin, f"{staging}/imx-boot"], check=True) diff --git a/build/meta-bsp/recipes-bsp/bsp/files/bsp_virt64.inc b/build/meta-bsp/recipes-bsp/bsp/files/bsp_virt64.inc index 76a2ecd..de39d91 100644 --- a/build/meta-bsp/recipes-bsp/bsp/files/bsp_virt64.inc +++ b/build/meta-bsp/recipes-bsp/bsp/files/bsp_virt64.inc @@ -4,8 +4,8 @@ # virt64 (QEMU armv8) platform glue. The ITB and uEnv.txt are copied onto # the boot partition (p1) by __deploy_arm_common (bsp_arm_common.inc). # __do_platform_boot_chain assembles the optional ATF/OP-TEE firmware -# (flash0.img) — generic, shared across products (so3 + edgem1); the -# capsule/OSTree specifics stay in the e1c layer. +# (flash0.img) — generic and product-agnostic. Any capsule/OSTree +# specifics live in a downstream layer, not here. require bsp_arm_common.inc diff --git a/build/meta-bsp/recipes-bsp/bsp/verdin-imx8mp/boot_avz.scr.txt b/build/meta-bsp/recipes-bsp/bsp/verdin-imx8mp/boot_avz.scr.txt index 1538616..98911ee 100644 --- a/build/meta-bsp/recipes-bsp/bsp/verdin-imx8mp/boot_avz.scr.txt +++ b/build/meta-bsp/recipes-bsp/bsp/verdin-imx8mp/boot_avz.scr.txt @@ -2,7 +2,7 @@ # # Loads the AVZ ITB and the SO3 guest ITB to staging addresses (above the # 0x40080000-0x50c00000 sub-image extraction range), then jumps via the -# e1c-boot U-Boot command which passes the AVZ FIT in x0 and the guest ITB +# guest-boot U-Boot command which passes the AVZ FIT in x0 and the guest ITB # in x1. AVZ extracts its sub-images (AVZ -> 0x40080000, avz_dt) and its # loadAgency() loads the SO3 guest (-> 0x48000000, dtb, rootfs.fat) from x1. @@ -13,4 +13,4 @@ env set guest_addr 0x90000000 ext4load mmc 2:1 ${avz_addr} /boot_avz.itb ext4load mmc 2:1 ${guest_addr} /boot_guest.itb -e1c-boot ${avz_addr} ${guest_addr} +guest-boot ${avz_addr} ${guest_addr} diff --git a/build/meta-bsp/recipes-bsp/capsule/bsp-capsules_1.0.0.bb b/build/meta-bsp/recipes-bsp/capsule/bsp-capsules_1.0.0.bb index 40ebcee..75e278b 100644 --- a/build/meta-bsp/recipes-bsp/capsule/bsp-capsules_1.0.0.bb +++ b/build/meta-bsp/recipes-bsp/capsule/bsp-capsules_1.0.0.bb @@ -15,15 +15,14 @@ inherit uboot inherit logging inherit bsp +# Capsules reuse the SO3 ITS templates (e.g. _capsule.its) +IB_ITS_SRC = "${THISDIR}/../so3/files/its" + # :append (not +=) so no space is inserted before ":so3" — otherwise the # preceding CPU token parses as "arm "/"aarch64 " and : overrides # stop matching. See usr-so3_1.0.bb for the full rationale. OVERRIDES:append = ":so3" -# bsp-capsules does not `inherit so3`, so IB_SO3_PATH (defined in so3.bbclass) -# is unset here — define it so the capsule ITS render resolves so3.bin/dtb. -IB_SO3_PATH ?= "${IB_DIR}/so3" - do_configure[noexec] = "1" do_attach_infrabase[noexec] = "1" @@ -41,16 +40,6 @@ addtask do_build def __do_platform_deploy(d): import os - import subprocess - - # FOLLOW-UP (deferred): auto-place the capsule ITB into the booted image. - # The ITB must land on the agency's storage p2 (/mnt/capsules/image), but a - # standalone `deploy.sh bsp-capsules` does not mount the real sdcard here, so - # this copy currently misses the booted image. For now place it by hand: - # loop-mount filesystem/work/sdcard.img. p2, cp so3/target/ - # virt64_capsule.itb into mnt/capsules/image/, umount. - # A proper fix must mount/populate the real sdcard p2 (a bitbake shared- - # namespace / parse-cache issue blocked wiring it into this task). capsule_path = d.getVar('IB_FILESYSTEM_PATH') + "/p2/mnt/capsules/image" itb_path = d.getVar('IB_ITB_PATH') + "/" + d.getVar('IB_TARGET_ITS') + ".itb" @@ -58,38 +47,21 @@ def __do_platform_deploy(d): if not os.path.isfile(itb_path): bb.fatal(itb_path + " is missing ...") - subprocess.run(['mkdir', '-p', capsule_path]) - subprocess.run(['cp', itb_path, capsule_path]) - -# Capture the layer's ITS-template dir at PARSE time (${THISDIR} re-expands to -# the base recipe dir at task generation). Since SO3 v6.2.0 the capsule ITS is -# no longer shipped as a static file in the fetched so3/target tree — it lives -# here as a template and is rendered into ${IB_ITB_PATH} at build time. -IB_ITS_SRC := "${THISDIR}/files/its" - -# Render an ITS template from IB_ITS_SRC into IB_ITB_PATH, expanding the -# ${IB_*_PATH} placeholders to absolute build paths. The sed patterns use char -# classes ([$][{]...[}]) so bitbake leaves them untouched and only the -# replacement side is expanded. Mirrors so3's bsp_render_its. - -bsp_render_its() { - mkdir -p "${IB_ITB_PATH}" - sed -e "s|[$][{]IB_SO3_PATH[}]|${IB_SO3_PATH}|g" \ - -e "s|[$][{]IB_ROOTFS_PATH[}]|${IB_ROOTFS_PATH}|g" \ - -e "s|[$][{]IB_PLATFORM[}]|${IB_PLATFORM}|g" \ - "${IB_ITS_SRC}/$1.its" > "${IB_ITB_PATH}/$1.its" -} + # The p2 rootfs is extracted as root, so any write into it must be + # escalated (bitbake itself runs unprivileged) and must fail loudly. + utils_sudo(['mkdir', '-p', capsule_path], check=True) + utils_sudo(['cp', itb_path, capsule_path], check=True) do_itb[nostamp] = "1" do_itb[depends] = "usr-so3:do_deploy" do_itb () { - if [ ! -f ${IB_ITS_SRC}/${IB_TARGET_ITS}.its ]; then - bbfatal "No ITS template found at ${IB_ITS_SRC}/${IB_TARGET_ITS}.its" + # ITS rendered into IB_ITB_PATH by the shared do_render_its (before do_itb). + if [ ! -f ${IB_ITB_PATH}/${IB_TARGET_ITS}.its ]; then + bbfatal "No corresponding ITS found for container ${IB_TARGET_ITS}" fi - - bsp_render_its ${IB_TARGET_ITS} mkimage -f ${IB_ITB_PATH}/${IB_TARGET_ITS}.its ${IB_ITB_PATH}/${IB_TARGET_ITS}.itb + } do_deploy[depends] = "usr-so3:do_deploy" diff --git a/build/meta-bsp/recipes-bsp/linux/bsp-linux_1.0.bb b/build/meta-bsp/recipes-bsp/linux/bsp-linux_1.0.bb index 6e6cf6b..e81a245 100644 --- a/build/meta-bsp/recipes-bsp/linux/bsp-linux_1.0.bb +++ b/build/meta-bsp/recipes-bsp/linux/bsp-linux_1.0.bb @@ -18,14 +18,14 @@ inherit bsp inherit uboot inherit atf -OVERRIDES += ":linux" +# ITS templates live in the layer (rendered into IB_ITB_PATH by do_itb) +IB_ITS_SRC = "${THISDIR}/files/its" + +# AVZ two-ITB boot: the Linux agency guest ITB is _linux_guest.itb +# (the AVZ ITB carries only the hypervisor, like the SO3 case). +IB_GUEST_SUFFIX = "_linux_guest" -# Kind of guest carried by the second (x1) ITB in the AVZ two-ITB boot. -# For bsp-linux the guest is the Linux agency (Linux runs as the AVZ -# agency hosting the SO3 capsules) -> _avz pairs with -# _linux_guest. bsp-so3 keeps the default "so3_guest". The shared -# deploy (__deploy_arm_common) reads this to locate the guest ITB. -IB_AVZ_GUEST = "linux_guest" +OVERRIDES += ":linux" COMPATIBLE_PLATFORM = "virt32|virt64|rpi4_64" @@ -51,52 +51,43 @@ do_itb[nostamp] = "1" do_itb () { - # Build the selected ITB from its ITS (AVZ ITB for the *_avz target, - # or a plain single ITB otherwise). Mirrors bsp-so3:do_itb. + # ITS are rendered into IB_ITB_PATH by the shared do_render_its (before + # do_itb); this task only mkimage's them. The boot shape is selected by + # the ITS name (mirroring bsp-so3 and __deploy_arm_common), NOT by + # IB_BOOT_CHAIN — AVZ boots fine on the bare U-Boot chain (EL2 via + # QEMU virtualization=on), ATF/OP-TEE is an independent choice. if [ ! -f ${IB_ITB_PATH}/${IB_TARGET_ITS}.its ]; then bbfatal "No corresponding ITS found (${IB_TARGET_ITS})" fi mkimage -f ${IB_ITB_PATH}/${IB_TARGET_ITS}.its ${IB_ITB_PATH}/${IB_TARGET_ITS}.itb - # AVZ boot uses a SEPARATE guest ITB loaded alongside the AVZ ITB by - # the e1c-boot U-Boot command (AVZ FIT in x0, guest ITB in x1). For - # bsp-linux the guest is the Linux agency: _avz -> _linux_guest - # (IB_AVZ_GUEST). Deriving from IB_TARGET_ITS keeps the underscore - # naming on hyphenated platforms (e.g. verdin-imx8mp). - # NB: assign IB_TARGET_ITS to a shell var before the ${var%_avz} - # parameter expansion — bitbake does not pass ${IB_TARGET_ITS%_avz} - # through to the shell (it resolves the literal ${...} itself), so the - # strip must run on a real shell variable. - its="${IB_TARGET_ITS}" - case "$its" in + # AVZ boot uses a SEPARATE guest ITB (loaded alongside the AVZ ITB by + # the guest-boot U-Boot command). The guest ITS (_avz -> + + # IB_GUEST_SUFFIX) is rendered by do_render_its. + case "${IB_TARGET_ITS}" in *_avz) - guest_its="${its%_avz}_${IB_AVZ_GUEST}" - if [ -f ${IB_ITB_PATH}/${guest_its}.its ]; then - mkimage -f ${IB_ITB_PATH}/${guest_its}.its ${IB_ITB_PATH}/${guest_its}.itb - else - bbfatal "No guest ITS found at ${IB_ITB_PATH}/${guest_its}.its" + guest_its="$(echo "${IB_TARGET_ITS}" | sed 's/_avz$//')${IB_GUEST_SUFFIX}" + if [ ! -f ${IB_ITB_PATH}/${guest_its}.its ]; then + bbfatal "No Linux guest ITS found (${guest_its})" fi + mkimage -f ${IB_ITB_PATH}/${guest_its}.its ${IB_ITB_PATH}/${guest_its}.itb ;; esac } -# do_prepare_initrd: gzip rootfs.cpio (produced by usr-linux:do_deploy) -# into initrd.cpio.gz so do_itb /incbin/'s it. Lived in the FC capsule -# bbappend originally; moved here so bare bsp-linux (no capsule layer -# loaded) still gets a fresh initrd in the bare ITB. The FC bbappend's -# do_inject_kernel_modules still runs before this, editing rootfs.cpio -# in place — the content-hash guard below picks up the new content and -# regenerates initrd.cpio.gz. - -# MICOFE uses a 2-stage rootfs (NOT the so3/edgem1 full-initramfs model): -# the committed REDS minimal ramdisk (meta-rootfs .../files/board/${IB_PLATFORM}/ -# initrd.cpio, ~6 MB) is bundled in the guest ITS and switch_root's to the -# full agency rootfs on /dev/vda2 (p2, deployed by rootfs-linux). So this -# task is DISABLED: regenerating initrd.cpio from the ~96 MB rootfs.cpio -# (shutil.copy2 below) would clobber the ramdisk and overflow the p1 FAT -# boot partition. (Future option: repurpose this task to assemble/refresh -# the ramdisk instead of committing it as a static file.) -do_prepare_initrd[noexec] = "1" +# do_prepare_initrd: gzip the selected cpio into initrd.cpio.gz so do_itb +# /incbin/'s it. Lived in the FC capsule bbappend originally; moved here so +# bare bsp-linux (no capsule layer loaded) still gets a fresh initrd in the +# bare ITB. The FC bbappend's do_inject_kernel_modules still runs before +# this, editing rootfs.cpio in place — the content-hash guard below picks +# up the new content and regenerates initrd.cpio.gz. +# +# IB_RAMFS_SOURCE selects which cpio becomes the embedded ramfs (default in +# bsp.bbclass): +# "rootfs" - board//rootfs.cpio, the freshly built full rootfs. +# "initrd" - board//initrd.cpio, a static git-tracked busybox ramfs. +# Either way the result is gzipped straight into initrd.cpio.gz; we never +# overwrite the (now meaningful) static initrd.cpio. do_prepare_initrd[nostamp] = "1" do_prepare_initrd[depends] = "usr-linux:do_deploy" @@ -109,25 +100,35 @@ python do_prepare_initrd () { IB_ROOTFS_PATH = d.getVar('IB_ROOTFS_PATH') IB_PLATFORM = d.getVar('IB_PLATFORM') + ramfs_source = (d.getVar('IB_RAMFS_SOURCE') or "rootfs").strip() board_dir = os.path.join(IB_ROOTFS_PATH, "board", IB_PLATFORM) - src = os.path.join(board_dir, "rootfs.cpio") - initrd = os.path.join(board_dir, "initrd.cpio") - initrd_gz = initrd + ".gz" - src_hash_file = src + ".sha256" + initrd_gz = os.path.join(board_dir, "initrd.cpio.gz") + + if ramfs_source == "rootfs": + src = os.path.join(board_dir, "rootfs.cpio") + elif ramfs_source == "initrd": + src = os.path.join(board_dir, "initrd.cpio") + else: + bb.fatal("IB_RAMFS_SOURCE must be 'rootfs' or 'initrd', got '{}'".format(ramfs_source)) if not os.path.exists(src): - bb.fatal("rootfs.cpio not found: {}".format(src)) + bb.fatal("ramfs source not found: {} (IB_RAMFS_SOURCE={})".format(src, ramfs_source)) - # Content hash instead of mtime: __do_rootfs_umount always rewrites - # rootfs.cpio with a fresh mtime even when content is unchanged, so - # mtime would force false rebuilds. sha256 fixes both directions. + # Guard against rebuilds. Content hash instead of mtime: __do_rootfs_umount + # always rewrites rootfs.cpio with a fresh mtime even when content is + # unchanged, so mtime would force false rebuilds. The mode is folded into + # the stored value so toggling IB_RAMFS_SOURCE always invalidates the gz, + # even if the new source happens to hash to a previously seen value. h = hashlib.sha256() with open(src, 'rb') as f: for chunk in iter(lambda: f.read(65536), b''): h.update(chunk) - current_hash = h.hexdigest() + current_hash = "{}:{}".format(ramfs_source, h.hexdigest()) + + # Single mode-aware guard file, decoupled from the source filename. + src_hash_file = initrd_gz + ".srchash" if os.path.exists(initrd_gz) and os.path.exists(src_hash_file): with open(src_hash_file, 'r') as f: @@ -136,9 +137,9 @@ python do_prepare_initrd () { bb.plain("initrd.cpio.gz is up to date, skipping") return - bb.plain("Prepare initrd.cpio.gz from rootfs.cpio") - shutil.copy2(src, initrd) - with open(initrd, 'rb') as f_in, gzip.open(initrd_gz, 'wb') as f_out: + bb.plain("Prepare initrd.cpio.gz from {} (IB_RAMFS_SOURCE={})".format( + os.path.basename(src), ramfs_source)) + with open(src, 'rb') as f_in, gzip.open(initrd_gz, 'wb') as f_out: shutil.copyfileobj(f_in, f_out) with open(src_hash_file, 'w') as f: f.write(current_hash) @@ -147,8 +148,17 @@ python do_prepare_initrd () { addtask do_prepare_initrd before do_itb # Deploy everything - -do_deploy[depends] = "filesystem:do_fs_check usr-linux:do_deploy" +# +# Deploy is decoupled from the build: it writes the already-built artefacts +# onto the boot media WITHOUT recompiling. It pulls rootfs-linux:do_deploy +# (which extracts the final rootfs.cpio — apps baked in at build time — onto +# p2) and writes the .itb produced by do_itb during `build.sh -a` onto p1 +# (__do_platform_deploy). It does NOT pull do_build / do_itb / usr-linux's +# rootfs.cpio populate — those belong to `build.sh -a`. Workflow: +# edit -> build.sh -> deploy.sh. A deploy with no prior build fails clearly +# (missing rootfs.cpio / .itb) rather than silently rebuilding. + +do_deploy[depends] = "filesystem:do_fs_check rootfs-linux:do_deploy" do_deploy[nostamp] = "1" python do_deploy() { @@ -158,10 +168,9 @@ python do_deploy() { __do_deploy_boot(d); } -# Wire do_itb before both do_build (so `build.sh -a` produces the -# .itb artefacts) and do_deploy (so a standalone `deploy.sh -a` still -# triggers the assembly through sstate misses). -addtask do_itb before do_build before do_deploy +# do_itb runs in the BUILD chain only (it produces the .itb that deploy +# consumes); deploy must not re-trigger it. +addtask do_itb before do_build addtask do_deploy do_deploy_boot[nostamp] = "1" @@ -173,7 +182,6 @@ python do_deploy_boot() { __do_deploy_boot(d) } -addtask do_itb before do_deploy_boot addtask do_deploy_boot do_clean[depends] = "usr-linux:do_clean rootfs-linux:do_clean linux:do_clean uboot:do_clean" diff --git a/linux/target/virt64_standalone.its b/build/meta-bsp/recipes-bsp/linux/files/its/rpi4.its similarity index 59% rename from linux/target/virt64_standalone.its rename to build/meta-bsp/recipes-bsp/linux/files/its/rpi4.its index f56b262..b595deb 100644 --- a/linux/target/virt64_standalone.its +++ b/build/meta-bsp/recipes-bsp/linux/files/its/rpi4.its @@ -19,50 +19,52 @@ /dts-v1/; / { - description = "Kernel and rootfs components for virt64 (armv8) environment"; + description = "Kernel and rootfs components for Raspberry Pi 4 environment"; images { - + linux { - description = "Linux kernel"; - data = /incbin/("../linux/arch/arm64/boot/Image"); + description = "Linux kernel 64-bits"; + data = /incbin/("${IB_LINUX_PATH}/arch/arm64/boot/Image"); type = "kernel"; arch = "arm64"; os = "linux"; compression = "none"; - load = <0x41000000>; - entry = <0x41000000>; + load = <0x01000000>; + entry = <0x01000000>; + }; - fdt_linux { - description = "Linux device tree blob"; - data = /incbin/("../linux/arch/arm64/boot/dts/arm/virt64.dtb"); + fdt_linux { + description = "Linux device tree 64-bits blob"; + data = /incbin/("${IB_LINUX_PATH}/arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dtb"); type = "flat_dt"; arch = "arm64"; compression = "none"; - load = <0x50000000>; + load = <0x10a00000>; }; - + initrd { - description = "Initial rootfs (initrd)"; - data = /incbin/("../rootfs/board/virt64/initrd.cpio"); + description = "Initial rootfs 64-bits (initrd)"; + data = /incbin/("${IB_ROOTFS_PATH}/board/rpi4_64/initrd.cpio.gz"); type = "ramdisk"; arch = "arm64"; - os = "linux"; + os = "linux"; compression = "none"; - load = <0x50c00000>; + load = <0x10c00000>; }; }; - + configurations { default = "conf_linux"; conf_linux { - description = "Linux on virt64"; - kernel = "linux"; - fdt = "fdt_linux"; - ramdisk = "initrd"; + description = "Linux on Raspberry Pi 4 64-bits"; + kernel = "linux"; + fdt = "fdt_linux"; + ramdisk = "initrd"; }; + }; }; diff --git a/build/meta-bsp/recipes-bsp/linux/files/its/virt32.its b/build/meta-bsp/recipes-bsp/linux/files/its/virt32.its new file mode 100644 index 0000000..e7ef4ff --- /dev/null +++ b/build/meta-bsp/recipes-bsp/linux/files/its/virt32.its @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2014-2023 Daniel Rossier + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/dts-v1/; + +/ { + description = "Linx running on AVZ in virt32 environment"; + + images { + + avz { + description = "AVZ Hypervisor (32-bit) Polymorphic SO3"; + data = /incbin/("${IB_AVZ_PATH}/so3.bin"); + type = "kernel"; + os = "linux"; + arch = "arm"; + compression = "none"; + load = <0x40008000>; + entry = <0x40008000>; + }; + + avz_dt { + description = "Flattened Device Tree blob"; + data = /incbin/("${IB_AVZ_PATH}/dts/virt32_avz.dtb"); + type = "avz_dt"; + arch = "arm"; + compression = "none"; + load = <0x40f00000>; + }; + + linux { + description = "Linux kernel"; + data = /incbin/("${IB_LINUX_PATH}/linux/arch/arm/boot/Image"); + type = "avz"; + arch = "arm"; + os = "linux"; + compression = "none"; + load = <0x41008000>; + entry = <0x41008000>; + }; + + fdt_linux { + description = "Linux device tree blob"; + data = /incbin/("${IB_LINUX_PATH}/linux/arch/arm/boot/dts/virt32.dtb"); + type = "flat_dt"; + arch = "arm"; + compression = "none"; + load = <0x5a000000>; + }; + + initrd { + description = "Initial rootfs (initrd)"; + data = /incbin/("${IB_ROOTFS_PATH}/board/virt32/initrd.cpio.gz"); + type = "ramdisk"; + arch = "arm"; + os = "linux"; + compression = "none"; + load = <0x50c00000>; + }; + + }; + + configurations { + default = "conf_linux_avz"; + + conf_linux_avz { + description = "Linux/AVZ on virt32"; + kernel = "avz"; + fdt = "fdt_linux"; + loadables = "avz_dt", "linux"; + ramdisk = "initrd"; + }; + + }; + +}; diff --git a/linux/target/virt32_avz.its b/build/meta-bsp/recipes-bsp/linux/files/its/virt32_avz.its similarity index 85% rename from linux/target/virt32_avz.its rename to build/meta-bsp/recipes-bsp/linux/files/its/virt32_avz.its index dc5e96e..e7ef4ff 100644 --- a/linux/target/virt32_avz.its +++ b/build/meta-bsp/recipes-bsp/linux/files/its/virt32_avz.its @@ -25,7 +25,7 @@ avz { description = "AVZ Hypervisor (32-bit) Polymorphic SO3"; - data = /incbin/("../avz/so3.bin"); + data = /incbin/("${IB_AVZ_PATH}/so3.bin"); type = "kernel"; os = "linux"; arch = "arm"; @@ -36,7 +36,7 @@ avz_dt { description = "Flattened Device Tree blob"; - data = /incbin/("../avz/dts/virt32_avz.dtb"); + data = /incbin/("${IB_AVZ_PATH}/dts/virt32_avz.dtb"); type = "avz_dt"; arch = "arm"; compression = "none"; @@ -45,7 +45,7 @@ linux { description = "Linux kernel"; - data = /incbin/("../linux/linux/arch/arm/boot/Image"); + data = /incbin/("${IB_LINUX_PATH}/linux/arch/arm/boot/Image"); type = "avz"; arch = "arm"; os = "linux"; @@ -56,7 +56,7 @@ fdt_linux { description = "Linux device tree blob"; - data = /incbin/("../linux/linux/arch/arm/boot/dts/virt32.dtb"); + data = /incbin/("${IB_LINUX_PATH}/linux/arch/arm/boot/dts/virt32.dtb"); type = "flat_dt"; arch = "arm"; compression = "none"; @@ -65,7 +65,7 @@ initrd { description = "Initial rootfs (initrd)"; - data = /incbin/("../rootfs/board/virt32/initrd.cpio"); + data = /incbin/("${IB_ROOTFS_PATH}/board/virt32/initrd.cpio.gz"); type = "ramdisk"; arch = "arm"; os = "linux"; diff --git a/linux/target/virt32_standalone.its b/build/meta-bsp/recipes-bsp/linux/files/its/virt32_standalone.its similarity index 86% rename from linux/target/virt32_standalone.its rename to build/meta-bsp/recipes-bsp/linux/files/its/virt32_standalone.its index 94ceb0a..94199bc 100644 --- a/linux/target/virt32_standalone.its +++ b/build/meta-bsp/recipes-bsp/linux/files/its/virt32_standalone.its @@ -26,7 +26,7 @@ /* avz { description = "AVZ Hypervisor (32-bit) Polymorphic SO3"; - data = /incbin/("../avz/so3.bin"); + data = /incbin/("${IB_AVZ_PATH}/so3.bin"); type = "kernel"; os = "linux"; arch = "arm"; @@ -37,7 +37,7 @@ avz_dt { description = "Flattened Device Tree blob"; - data = /incbin/("../avz/dts/virt32_avz.dtb"); + data = /incbin/("${IB_AVZ_PATH}/dts/virt32_avz.dtb"); type = "avz_dt"; arch = "arm"; compression = "none"; @@ -47,7 +47,7 @@ */ linux { description = "Linux kernel"; - data = /incbin/("../linux/linux/arch/arm/boot/Image"); + data = /incbin/("${IB_LINUX_PATH}/linux/arch/arm/boot/Image"); /* type = "avz" */ type = "kernel"; arch = "arm"; @@ -59,7 +59,7 @@ fdt_linux { description = "Linux device tree blob"; - data = /incbin/("../linux/linux/arch/arm/boot/dts/virt32.dtb"); + data = /incbin/("${IB_LINUX_PATH}/linux/arch/arm/boot/dts/virt32.dtb"); type = "flat_dt"; arch = "arm"; compression = "none"; @@ -68,7 +68,7 @@ initrd { description = "Initial rootfs (initrd)"; - data = /incbin/("../rootfs/board/virt32/initrd.cpio"); + data = /incbin/("${IB_ROOTFS_PATH}/board/virt32/initrd.cpio.gz"); type = "ramdisk"; arch = "arm"; os = "linux"; diff --git a/build/meta-bsp/recipes-bsp/linux/files/its/virt64.its b/build/meta-bsp/recipes-bsp/linux/files/its/virt64.its new file mode 100644 index 0000000..6ab8375 --- /dev/null +++ b/build/meta-bsp/recipes-bsp/linux/files/its/virt64.its @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2020-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + * + * Bare bsp-linux ITS for QEMU virt64. Pairs with IB_BOOT_CHAIN= + * "uboot": QEMU loads the U-Boot ELF directly via `-kernel` (no ATF, + * no OP-TEE, no AVZ — purest dev path). U-Boot bootm's this ITB; the + * buildroot initrd is the rootfs (root=/dev/ram). + * + * Kernel + DTB: the outer-linux build (arch/arm64/.../${IB_PLATFORM}.dtb, + * the customised virt DT — see the virt64.dts patch in meta-linux). + * Initrd: linux/rootfs's board/${IB_PLATFORM}/rootfs.cpio (buildroot + * output gzipped at deploy time into initrd.cpio.gz). + * + * Template: ${IB_*_PATH} / ${IB_PLATFORM} placeholders are expanded to + * absolute build paths by bsp_render_its (bsp.bbclass) at do_itb time. + * + * The AVZ two-ITB path uses virt64_avz.its + the guest ITB instead + * (virt64_so3_guest.its for bsp-so3, virt64_linux_guest.its for the + * Linux agency) — see those files for the guest-boot variant. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/dts-v1/; + +/ { + description = "Kernel and rootfs components for virt64 (armv8) environment"; + + images { + + linux { + description = "Linux kernel"; + data = /incbin/("${IB_LINUX_PATH}/arch/arm64/boot/Image"); + type = "kernel"; + arch = "arm64"; + os = "linux"; + compression = "none"; + load = <0x41000000>; + entry = <0x41000000>; + }; + + fdt_linux { + description = "Linux device tree blob"; + data = /incbin/("${IB_LINUX_PATH}/arch/arm64/boot/dts/arm/${IB_PLATFORM}.dtb"); + type = "flat_dt"; + arch = "arm64"; + compression = "none"; + load = <0x50000000>; + }; + + initrd { + description = "Initial rootfs (initrd)"; + data = /incbin/("${IB_ROOTFS_PATH}/board/${IB_PLATFORM}/initrd.cpio.gz"); + type = "ramdisk"; + arch = "arm64"; + os = "linux"; + compression = "gzip"; + load = <0x50c00000>; + }; + }; + + configurations { + default = "conf_linux"; + + conf_linux { + description = "Linux on virt64"; + kernel = "linux"; + fdt = "fdt_linux"; + ramdisk = "initrd"; + }; + }; + +}; diff --git a/build/meta-bsp/recipes-bsp/linux/files/its/virt64_avz.its b/build/meta-bsp/recipes-bsp/linux/files/its/virt64_avz.its new file mode 100644 index 0000000..7ad5e43 --- /dev/null +++ b/build/meta-bsp/recipes-bsp/linux/files/its/virt64_avz.its @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2020-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + * + * AVZ ITS for QEMU virt64 (armv8). Carries only the AVZ hypervisor + * binary (so3.bin) + the AVZ device tree. The guest lives in a SEPARATE + * ITB (virt64_so3_guest.its for bsp-so3, virt64_linux_guest.its for the + * Linux agency); both are loaded by U-Boot's guest-boot command, which + * passes the AVZ FIT in x0 and the guest ITB in x1. + * + * Template: ${IB_*_PATH} placeholders are expanded to absolute build + * paths by bsp_render_its (bsp.bbclass) at do_itb time. + * + * The bare path uses virt64.its (bsp-linux, IB_BOOT_CHAIN="uboot") + * instead — see that file for the single-ITB bootm variant without AVZ. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/dts-v1/; + +/ { + description = "AVZ Hypervisor bundle for virt64 (armv8)"; + + images { + + avz { + description = "AVZ Hypervisor (64-bit) Polymorphic SO3"; + data = /incbin/("${IB_AVZ_PATH}/so3.bin"); + type = "kernel"; + os = "linux"; + arch = "arm64"; + compression = "none"; + load = <0x40080000>; + entry = <0x40080000>; + }; + + avz_dt { + description = "AVZ device tree"; + data = /incbin/("${IB_AVZ_PATH}/dts/virt64_avz.dtb"); + type = "avz_dt"; + arch = "arm64"; + compression = "none"; + load = <0x46000000>; + }; + }; + + configurations { + default = "avz"; + + avz { + description = "AVZ hypervisor on virt64"; + kernel = "avz"; + loadables = "avz_dt"; + fdt = "avz_dt"; + }; + }; +}; diff --git a/build/meta-bsp/recipes-bsp/linux/files/its/virt64_linux_guest.its b/build/meta-bsp/recipes-bsp/linux/files/its/virt64_linux_guest.its new file mode 100644 index 0000000..f26b20c --- /dev/null +++ b/build/meta-bsp/recipes-bsp/linux/files/its/virt64_linux_guest.its @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2020-2026 Daniel Rossier + * + * Linux guest ITB for virt64 (armv8). Carries the Linux (agency) kernel + * + its guest device tree + initrd. Paired with virt64_avz.itb and loaded + * by U-Boot's guest-boot command, which passes this ITB to AVZ in x1; AVZ's + * loadAgency() loads the agency guest from it. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +/dts-v1/; + +/ { + description = "Linux guest bundle for virt64 (armv8)"; + + images { + + linux { + description = "Linux kernel (guest)"; + data = /incbin/("${IB_LINUX_PATH}/arch/arm64/boot/Image"); + type = "guest"; + arch = "arm64"; + os = "linux"; + compression = "none"; + load = <0x41000000>; + entry = <0x41000000>; + }; + + fdt { + description = "Linux guest device tree"; + data = /incbin/("${IB_LINUX_PATH}/arch/arm64/boot/dts/arm/virt64_guest.dtb"); + type = "flat_dt"; + arch = "arm64"; + compression = "none"; + load = <0x50000000>; + }; + + initrd { + description = "Linux initrd"; + data = /incbin/("${IB_ROOTFS_PATH}/board/virt64/initrd.cpio.gz"); + type = "ramdisk"; + arch = "arm64"; + os = "linux"; + compression = "none"; + load = <0x50c00000>; + }; + }; + + configurations { + default = "capsule"; + + capsule { + description = "Linux agency guest on virt64"; + loadables = "linux"; + fdt = "fdt"; + ramdisk = "initrd"; + }; + }; +}; diff --git a/build/meta-bsp/recipes-bsp/linux/files/uEnv_virt64_avz.txt b/build/meta-bsp/recipes-bsp/linux/files/uEnv_virt64_avz.txt index 14fcf70..a88af13 100644 --- a/build/meta-bsp/recipes-bsp/linux/files/uEnv_virt64_avz.txt +++ b/build/meta-bsp/recipes-bsp/linux/files/uEnv_virt64_avz.txt @@ -1,16 +1,19 @@ fdt_high=ffffffffffffffff initrd_high=ffffffffffffffff -# AVZ boot on virt64: two ITBs (AVZ + Linux agency guest) loaded to -# staging addresses, then jumped via the e1c-boot U-Boot command which -# passes the AVZ FIT in x0 and the guest ITB in x1 (AVZ loadAgency loads -# the agency guest from x1). EL2 is required (st.sh enables -# -M virt,virtualization=on). +# Linux (agency) guest kernel cmdline. Propagated into the guest FDT +# /chosen/bootargs by the guest-boot command (env_get("bootargs") + +# fdt_chosen()). console=ttyAMA0 + earlycon bind the kernel log to the +# PL011 UART so the full boot is visible; loglevel=8 keeps debug output. +# root=/dev/ram: the kernel always boots the embedded initramfs. In +# IB_RAMFS_SOURCE="initrd" mode the small busybox /init then mounts the +# ext4 rootfs on p2 (/dev/vda2, virtio-blk) and switch_root's into it — +# the kernel never mounts a disk root itself. Harmless in "rootfs" mode. +bootargs=console=ttyAMA0 earlycon=pl011,0x9000000 loglevel=8 root=/dev/ram -# Agency kernel cmdline: e1c-boot propagates this 'bootargs' env into the -# agency guest's /chosen (cmd/e1c_boot.c: env_get("bootargs") + fdt_chosen). -# console=ttyAMA0 routes the boot log to the serial console; loglevel=8 -# shows all kernel messages during boot. -bootargs=console=ttyAMA0 loglevel=8 +# AVZ boot on virt64: two ITBs (AVZ + SO3 guest) loaded to staging +# addresses, then jumped via the guest-boot U-Boot command which passes the +# AVZ FIT in x0 and the guest ITB in x1 (AVZ loadAgency loads the guest +# from x1). EL2 is required (st.sh enables -M virt,virtualization=on). -start=load virtio 0 0x65000000 virt64_avz.itb; load virtio 0 0x70000000 virt64_guest.itb; e1c-boot 0x65000000 0x70000000 +start=load virtio 0 0x65000000 virt64_avz.itb; load virtio 0 0x70000000 virt64_guest.itb; guest-boot 0x65000000 0x70000000 diff --git a/build/meta-bsp/recipes-bsp/so3/bsp-so3_1.0.0.bb b/build/meta-bsp/recipes-bsp/so3/bsp-so3_1.0.0.bb index f3d8012..9768d16 100644 --- a/build/meta-bsp/recipes-bsp/so3/bsp-so3_1.0.0.bb +++ b/build/meta-bsp/recipes-bsp/so3/bsp-so3_1.0.0.bb @@ -16,6 +16,9 @@ inherit uboot inherit logging inherit bsp +# ITS templates live in the layer (rendered into IB_ITB_PATH by do_itb) +IB_ITS_SRC = "${THISDIR}/files/its" + # :append (not +=) so no space is inserted before ":so3" — otherwise the # preceding CPU token parses as "arm "/"aarch64 " and : overrides # stop matching. See usr-so3_1.0.bb for the full rationale. @@ -47,20 +50,19 @@ do_itb[nostamp] = "1" do_itb[depends] = "usr-so3:do_deploy" do_itb () { + # ITS are rendered into IB_ITB_PATH by the shared do_render_its (before + # do_itb); this task only mkimage's them. if [ ! -f ${IB_ITB_PATH}/${IB_TARGET_ITS}.its ]; then bbfatal "No corresponding ITS found (${IB_TARGET_ITS})" - else - mkimage -f ${IB_ITB_PATH}/${IB_TARGET_ITS}.its ${IB_ITB_PATH}/${IB_TARGET_ITS}.itb fi + mkimage -f ${IB_ITB_PATH}/${IB_TARGET_ITS}.its ${IB_ITB_PATH}/${IB_TARGET_ITS}.itb # AVZ boot uses a SEPARATE guest ITB (loaded alongside the AVZ ITB by - # the e1c-boot U-Boot command). The guest ITS is derived from the - # selected AVZ ITS: _avz -> _so3_guest (deriving from - # IB_TARGET_ITS, not IB_PLATFORM, keeps the underscore naming on - # platforms whose IB_PLATFORM carries a hyphen, e.g. verdin-imx8mp). + # the guest-boot U-Boot command). The guest ITS (_avz -> + + # IB_GUEST_SUFFIX) is rendered by do_render_its; mkimage it if present. case "${IB_TARGET_ITS}" in *_avz) - guest_its="${IB_TARGET_ITS%_avz}_so3_guest" + guest_its="$(echo "${IB_TARGET_ITS}" | sed 's/_avz$//')${IB_GUEST_SUFFIX}" if [ -f ${IB_ITB_PATH}/${guest_its}.its ]; then mkimage -f ${IB_ITB_PATH}/${guest_its}.its ${IB_ITB_PATH}/${guest_its}.itb fi diff --git a/build/meta-bsp/recipes-bsp/so3/files/its/rpi4_64_avz.its b/build/meta-bsp/recipes-bsp/so3/files/its/rpi4_64_avz.its new file mode 100644 index 0000000..fef0ed3 --- /dev/null +++ b/build/meta-bsp/recipes-bsp/so3/files/its/rpi4_64_avz.its @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2020-2026 Daniel Rossier + * + * AVZ ITB for RPi4 (64-bit). Carries only the AVZ hypervisor binary + * (so3.bin) + the AVZ device tree. The guest (SO3) lives in a SEPARATE + * ITB (rpi4_64_so3_guest.its); both are loaded by U-Boot's guest-boot + * command, which passes the AVZ FIT in x0 and the guest ITB in x1. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +/dts-v1/; + +/ { + description = "AVZ Hypervisor bundle for RPi4 (64-bit)"; + + images { + + avz { + description = "AVZ Hypervisor (64-bit) Polymorphic SO3"; + data = /incbin/("${IB_AVZ_PATH}/so3.bin"); + type = "kernel"; + os = "linux"; + arch = "arm64"; + compression = "none"; + load = <0x00080000>; + entry = <0x00080000>; + }; + + avz_dt { + description = "AVZ device tree"; + data = /incbin/("${IB_AVZ_PATH}/dts/rpi4_64_avz.dtb"); + type = "avz_dt"; + arch = "arm64"; + compression = "none"; + load = <0x03000000>; + }; + }; + + configurations { + default = "avz"; + + avz { + description = "AVZ hypervisor on RPi4 64-bit"; + kernel = "avz"; + loadables = "avz_dt"; + fdt = "avz_dt"; + }; + }; +}; diff --git a/build/meta-bsp/recipes-bsp/so3/files/its/rpi4_64_capsule.its b/build/meta-bsp/recipes-bsp/so3/files/its/rpi4_64_capsule.its new file mode 100644 index 0000000..1788053 --- /dev/null +++ b/build/meta-bsp/recipes-bsp/so3/files/its/rpi4_64_capsule.its @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2020 Daniel Rossier + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/dts-v1/; + +/ { + description = "Kernel and rootfs components for rpi4_64 (armv8) environment"; + + images { + + so3 { + description = "SO3 OS kernel"; + data = /incbin/("${IB_SO3_PATH}/so3/so3.bin"); + type = "guest"; + arch = "arm64"; + os = "linux"; + compression = "none"; + load = <0x41080000>; + entry = <0x41080000>; + }; + + fdt { + description = "Flattened Device Tree blob"; + data = /incbin/("${IB_SO3_PATH}/so3/dts/rpi4_64_capsule.dtb"); + type = "flat_dt"; + arch = "arm64"; + compression = "none"; + load = <0x43000000>; + }; + + ramfs { + description = "SO3 environment minimal rootfs"; + data = /incbin/("${IB_ROOTFS_PATH}/rootfs.fat"); + type = "ramdisk"; + arch = "arm64"; + os = "linux"; + compression = "none"; + load = <0x43500000>; + }; + +}; + + configurations { + default = "so3_ramfs"; + + so3_ramfs { + description = "SO3 kernel image including device tree"; + kernel = "so3"; + fdt = "fdt"; + ramdisk = "ramfs"; + }; + + so3_mmc { + description = "SO3 kernel image including device tree"; + kernel = "so3"; + fdt = "fdt"; + }; + }; + +}; diff --git a/build/meta-bsp/recipes-bsp/so3/files/its/rpi4_64_so3.its b/build/meta-bsp/recipes-bsp/so3/files/its/rpi4_64_so3.its new file mode 100644 index 0000000..ada5eca --- /dev/null +++ b/build/meta-bsp/recipes-bsp/so3/files/its/rpi4_64_so3.its @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2020 Daniel Rossier + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/dts-v1/; + +/ { + description = "Kernel and rootfs components for Raspberry Pi 4 (armv8) environment"; + + images { + + so3 { + description = "SO3 OS kernel"; + data = /incbin/("${IB_SO3_PATH}/so3/so3.bin"); + type = "kernel"; + arch = "arm64"; + os = "linux"; + compression = "none"; + load = <0x01080000>; + entry = <0x01080000>; + }; + + fdt { + description = "Flattened Device Tree blob"; + data = /incbin/("${IB_SO3_PATH}/so3/dts/rpi4_64.dtb"); + type = "flat_dt"; + arch = "arm64"; + compression = "none"; + load = <0x04a00000>; + + }; + + ramfs { + description = "SO3 environment minimal rootfs"; + data = /incbin/("${IB_ROOTFS_PATH}/rootfs.fat"); + type = "ramdisk"; + arch = "arm64"; + os = "linux"; + compression = "none"; + load = <0x04c00000>; + }; + + }; + + configurations { + default = "so3"; + + so3 { + description = "SO3 on RPi4/64-bit"; + kernel = "so3"; + fdt = "fdt"; + ramdisk = "ramfs"; + }; + }; + +}; diff --git a/build/meta-bsp/recipes-bsp/so3/files/its/rpi4_64_so3_guest.its b/build/meta-bsp/recipes-bsp/so3/files/its/rpi4_64_so3_guest.its new file mode 100644 index 0000000..1ceb1db --- /dev/null +++ b/build/meta-bsp/recipes-bsp/so3/files/its/rpi4_64_so3_guest.its @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2020-2026 Daniel Rossier + * + * SO3 guest ITB for RPi4 (64-bit). Carries the SO3 OS kernel (guest) + + * its device tree + minimal rootfs. Paired with rpi4_64_avz.itb and + * loaded by U-Boot's guest-boot command, which passes this ITB to AVZ in + * x1; AVZ's loadAgency() loads the agency guest from it. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +/dts-v1/; + +/ { + description = "SO3 guest bundle for RPi4 (64-bit)"; + + images { + + so3 { + description = "SO3 OS kernel (guest)"; + data = /incbin/("${IB_SO3_PATH}/so3/so3.bin"); + type = "guest"; + arch = "arm64"; + os = "linux"; + compression = "none"; + load = <0x10080000>; + entry = <0x10080000>; + }; + + fdt { + description = "SO3 guest device tree (AVZ-exposed)"; + data = /incbin/("${IB_SO3_PATH}/so3/dts/rpi4_64.dtb"); + type = "flat_dt"; + arch = "arm64"; + compression = "none"; + load = <0x15000000>; + }; + + ramfs { + description = "SO3 environment minimal rootfs"; + data = /incbin/("${IB_ROOTFS_PATH}/rootfs.fat"); + type = "ramdisk"; + arch = "arm64"; + os = "linux"; + compression = "none"; + load = <0x15c00000>; + }; + }; + + configurations { + default = "capsule"; + + capsule { + description = "SO3 guest on RPi4 64-bit"; + loadables = "so3"; + fdt = "fdt"; + ramdisk = "ramfs"; + }; + }; +}; diff --git a/build/meta-bsp/recipes-bsp/so3/files/its/verdin_imx8mp_avz.its b/build/meta-bsp/recipes-bsp/so3/files/its/verdin_imx8mp_avz.its new file mode 100644 index 0000000..6f938c2 --- /dev/null +++ b/build/meta-bsp/recipes-bsp/so3/files/its/verdin_imx8mp_avz.its @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + * + * AVZ ITB for the Toradex Verdin iMX8MP. Carries only the AVZ hypervisor + * binary (so3.bin) + the AVZ device tree. The guest (SO3) lives in a + * SEPARATE ITB (verdin_imx8mp_so3_guest.its); both are loaded by U-Boot's + * guest-boot command, which passes the AVZ FIT in x0 and the guest ITB in x1. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +/dts-v1/; + +/ { + description = "AVZ Hypervisor bundle for the Toradex Verdin iMX8MP"; + + images { + avz { + description = "AVZ Hypervisor (64-bit) Polymorphic SO3"; + data = /incbin/("${IB_AVZ_PATH}/so3.bin"); + type = "kernel"; + os = "linux"; + arch = "arm64"; + compression = "none"; + load = <0x40080000>; + entry = <0x40080000>; + }; + + avz_dt { + description = "AVZ flattened device tree blob"; + data = /incbin/("${IB_AVZ_PATH}/dts/verdin-imx8mp_avz.dtb"); + type = "avz_dt"; + arch = "arm64"; + compression = "none"; + load = <0x46000000>; + }; + }; + + configurations { + default = "avz"; + + avz { + description = "AVZ hypervisor on Verdin iMX8MP"; + kernel = "avz"; + loadables = "avz_dt"; + fdt = "avz_dt"; + }; + }; +}; diff --git a/build/meta-bsp/recipes-bsp/so3/files/its/verdin_imx8mp_so3.its b/build/meta-bsp/recipes-bsp/so3/files/its/verdin_imx8mp_so3.its new file mode 100644 index 0000000..46504af --- /dev/null +++ b/build/meta-bsp/recipes-bsp/so3/files/its/verdin_imx8mp_so3.its @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/dts-v1/; + +/ { + description = "SO3 standalone (bare-metal) for the Toradex Verdin iMX8MP"; + + images { + so3 { + description = "SO3 OS kernel"; + data = /incbin/("${IB_SO3_PATH}/so3/so3.bin"); + type = "kernel"; + os = "linux"; + arch = "arm64"; + compression = "none"; + load = <0x41080000>; + entry = <0x41080000>; + }; + + fdt { + description = "Flattened Device Tree blob"; + data = /incbin/("${IB_SO3_PATH}/so3/dts/verdin-imx8mp_standalone.dtb"); + type = "flat_dt"; + arch = "arm64"; + compression = "none"; + load = <0x44a00000>; + }; + + ramfs { + description = "SO3 environment minimal rootfs"; + data = /incbin/("${IB_ROOTFS_PATH}/rootfs.fat"); + type = "ramdisk"; + arch = "arm64"; + os = "linux"; + compression = "none"; + load = <0x44c00000>; + }; + }; + + configurations { + default = "so3_ramfs"; + + so3_ramfs { + description = "SO3 kernel image including device tree"; + kernel = "so3"; + fdt = "fdt"; + ramdisk = "ramfs"; + }; + }; +}; diff --git a/build/meta-bsp/recipes-bsp/so3/files/its/verdin_imx8mp_so3_guest.its b/build/meta-bsp/recipes-bsp/so3/files/its/verdin_imx8mp_so3_guest.its new file mode 100644 index 0000000..661f611 --- /dev/null +++ b/build/meta-bsp/recipes-bsp/so3/files/its/verdin_imx8mp_so3_guest.its @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + * + * SO3 guest ITB for the Toradex Verdin iMX8MP. Carries the SO3 OS kernel + * (guest) + its device tree + minimal rootfs. Paired with + * verdin_imx8mp_avz.itb and loaded by U-Boot's guest-boot command, which + * passes this ITB to AVZ in x1; AVZ's loadAgency() loads the agency guest + * from it. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +/dts-v1/; + +/ { + description = "SO3 guest bundle for the Toradex Verdin iMX8MP"; + + images { + so3 { + description = "SO3 OS kernel (guest)"; + data = /incbin/("${IB_SO3_PATH}/so3/so3.bin"); + type = "guest"; + arch = "arm64"; + os = "linux"; + compression = "none"; + load = <0x48000000>; + entry = <0x48000000>; + }; + + fdt { + description = "SO3 guest flattened device tree blob"; + data = /incbin/("${IB_SO3_PATH}/so3/dts/verdin-imx8mp.dtb"); + type = "flat_dt"; + arch = "arm64"; + compression = "none"; + load = <0x50200000>; + }; + + ramfs { + description = "SO3 environment minimal rootfs"; + data = /incbin/("${IB_ROOTFS_PATH}/rootfs.fat"); + type = "ramdisk"; + arch = "arm64"; + os = "linux"; + compression = "none"; + load = <0x50c00000>; + }; + }; + + configurations { + default = "capsule"; + + capsule { + description = "SO3 guest on Verdin iMX8MP"; + loadables = "so3"; + fdt = "fdt"; + ramdisk = "ramfs"; + }; + }; +}; diff --git a/build/meta-bsp/recipes-bsp/so3/files/its/virt32_lvperf.its b/build/meta-bsp/recipes-bsp/so3/files/its/virt32_lvperf.its new file mode 100644 index 0000000..c88526d --- /dev/null +++ b/build/meta-bsp/recipes-bsp/so3/files/its/virt32_lvperf.its @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2025 André Costa + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * +*/ + + +/dts-v1/; + +/ { + description = "Kernel and rootfs components for virt32 environment"; + + images { + + so3 { + description = "SO3 OS kernel"; + data = /incbin/("${IB_SO3_PATH}/so3/so3.bin"); + type = "kernel"; + arch = "arm"; + os = "linux"; + compression = "none"; + load = <0x41008000>; + entry = <0x41008000>; + }; + + lvperf_fdt { + description = "Flattened Device Tree blob"; + data = /incbin/("${IB_SO3_PATH}/so3/dts/virt32_lvperf.dtb"); + type = "flat_dt"; + arch = "arm"; + compression = "none"; + load = <0x44a00000>; + + }; + + ramfs { + description = "SO3 environment minimal rootfs"; + data = /incbin/("${IB_ROOTFS_PATH}/rootfs.fat"); + type = "ramdisk"; + arch = "arm"; + os = "linux"; + compression = "none"; + load = <0x44c00000>; + }; + + + }; + + configurations { + default = "so3_lvperf_ramfs"; + so3_lvperf_ramfs { + description = "SO3 kernel image including device tree"; + kernel = "so3"; + fdt = "lvperf_fdt"; + ramdisk = "ramfs"; + }; + }; +}; diff --git a/build/meta-bsp/recipes-bsp/so3/files/its/virt32_so3.its b/build/meta-bsp/recipes-bsp/so3/files/its/virt32_so3.its new file mode 100644 index 0000000..45b89d1 --- /dev/null +++ b/build/meta-bsp/recipes-bsp/so3/files/its/virt32_so3.its @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2014-2023 Daniel Rossier + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * +*/ + +/dts-v1/; + +/ { + description = "Kernel and rootfs components for virt32 environment"; + + images { + + so3 { + description = "SO3 OS kernel"; + data = /incbin/("${IB_SO3_PATH}/so3/so3.bin"); + type = "kernel"; + arch = "arm"; + os = "linux"; + compression = "none"; + load = <0x41008000>; + entry = <0x41008000>; + }; + + fdt { + description = "Flattened Device Tree blob"; + data = /incbin/("${IB_SO3_PATH}/so3/dts/virt32.dtb"); + type = "flat_dt"; + arch = "arm"; + compression = "none"; + load = <0x44a00000>; + + }; + + ramfs { + description = "SO3 environment minimal rootfs"; + data = /incbin/("${IB_ROOTFS_PATH}/rootfs.fat"); + type = "ramdisk"; + arch = "arm"; + os = "linux"; + compression = "none"; + load = <0x44c00000>; + }; + + + }; + + configurations { + default = "so3_ramfs"; + + so3_ramfs { + description = "SO3 kernel image including device tree"; + kernel = "so3"; + fdt = "fdt"; + ramdisk = "ramfs"; + }; + }; +}; diff --git a/linux/target/virt64_avz.its b/build/meta-bsp/recipes-bsp/so3/files/its/virt64_avz.its similarity index 72% rename from linux/target/virt64_avz.its rename to build/meta-bsp/recipes-bsp/so3/files/its/virt64_avz.its index ec31cfa..c423256 100644 --- a/linux/target/virt64_avz.its +++ b/build/meta-bsp/recipes-bsp/so3/files/its/virt64_avz.its @@ -2,10 +2,9 @@ * Copyright (C) 2020-2026 Daniel Rossier * * AVZ ITB for virt64 (armv8). Carries only the AVZ hypervisor binary - * (so3.bin) + the AVZ device tree. The Linux agency guest lives in a - * SEPARATE ITB (virt64_linux_guest.its); both are loaded by U-Boot's - * e1c-boot command, which passes the AVZ FIT in x0 and the guest ITB in - * x1; AVZ's loadAgency() loads the agency guest from it. + * (so3.bin) + the AVZ device tree. The guest (SO3) lives in a SEPARATE + * ITB (virt64_so3_guest.its); both are loaded by U-Boot's guest-boot + * command, which passes the AVZ FIT in x0 and the guest ITB in x1. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -22,7 +21,7 @@ avz { description = "AVZ Hypervisor (64-bit) Polymorphic SO3"; - data = /incbin/("../../avz/so3.bin"); + data = /incbin/("${IB_AVZ_PATH}/so3.bin"); type = "kernel"; os = "linux"; arch = "arm64"; @@ -33,7 +32,7 @@ avz_dt { description = "AVZ device tree"; - data = /incbin/("../../avz/dts/virt64_avz.dtb"); + data = /incbin/("${IB_AVZ_PATH}/dts/virt64_avz.dtb"); type = "avz_dt"; arch = "arm64"; compression = "none"; diff --git a/build/meta-bsp/recipes-bsp/capsule/files/its/virt64_capsule.its b/build/meta-bsp/recipes-bsp/so3/files/its/virt64_capsule.its similarity index 67% rename from build/meta-bsp/recipes-bsp/capsule/files/its/virt64_capsule.its rename to build/meta-bsp/recipes-bsp/so3/files/its/virt64_capsule.its index d0dd197..4b23034 100644 --- a/build/meta-bsp/recipes-bsp/capsule/files/its/virt64_capsule.its +++ b/build/meta-bsp/recipes-bsp/so3/files/its/virt64_capsule.its @@ -1,6 +1,5 @@ /* - * Copyright (c) 2020-2026 REDS Institute, HEIG-VD - * Author: Daniel Rossier + * Copyright (C) 2020 Daniel Rossier * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -11,64 +10,62 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - */ - -/* - * SO3 capsule ITB template for virt64. The ${IB_*_PATH} placeholders are - * expanded to absolute build paths by bsp_render_its (bsp-capsules do_itb) - * before mkimage, so this template is machine-independent while the rendered - * ITS in ${IB_ITB_PATH} carries resolved /incbin paths. + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * */ /dts-v1/; / { - description = "SO3 capsule components for virt64 (armv8) environment"; + description = "Kernel and rootfs components for virt64 (armv8) environment"; images { - so3 { + so3 { description = "SO3 OS kernel"; data = /incbin/("${IB_SO3_PATH}/so3/so3.bin"); type = "guest"; arch = "arm64"; os = "linux"; compression = "none"; - load = <0x41080000>; + load = <0x41080000>; entry = <0x41080000>; }; - - fdt { + + fdt { description = "Flattened Device Tree blob"; data = /incbin/("${IB_SO3_PATH}/so3/dts/virt64_capsule.dtb"); type = "flat_dt"; arch = "arm64"; compression = "none"; load = <0x43000000>; - }; + }; - ramfs { - description = "SO3 environment minimal rootfs"; + ramfs { + description = "SO3 environment minimal rootfs"; data = /incbin/("${IB_ROOTFS_PATH}/rootfs.fat"); type = "ramdisk"; arch = "arm64"; os = "linux"; compression = "none"; load = <0x43500000>; - }; - }; + }; + +}; configurations { default = "so3_ramfs"; - + so3_ramfs { description = "SO3 kernel image including device tree"; kernel = "so3"; fdt = "fdt"; - ramdisk = "ramfs"; + ramdisk = "ramfs"; }; - - so3_mmc { + + so3_mmc { description = "SO3 kernel image including device tree"; kernel = "so3"; fdt = "fdt"; diff --git a/build/meta-bsp/recipes-bsp/so3/files/its/virt64_lvperf.its b/build/meta-bsp/recipes-bsp/so3/files/its/virt64_lvperf.its new file mode 100644 index 0000000..f993f80 --- /dev/null +++ b/build/meta-bsp/recipes-bsp/so3/files/its/virt64_lvperf.its @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2025 André Costa + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/* Based on virt64_so3_standalone.its */ + +/dts-v1/; + +/ { + description = "Kernel and rootfs components for virt64 (armv8) environment"; + + images { + so3 { + description = "SO3 OS kernel"; + data = /incbin/("${IB_SO3_PATH}/so3/so3.bin"); + type = "kernel"; + arch = "arm64"; + os = "linux"; + compression = "none"; + load = <0x41080000>; + entry = <0x41080000>; + }; + + lvperf_fdt { + description = "Flattened Device Tree blob"; + data = /incbin/("${IB_SO3_PATH}/so3/dts/virt64_lvperf.dtb"); + type = "flat_dt"; + arch = "arm64"; + compression = "none"; + load = <0x44a00000>; + }; + + ramfs { + description = "SO3 environment minimal rootfs"; + data = /incbin/("${IB_ROOTFS_PATH}/rootfs.fat"); + type = "ramdisk"; + arch = "arm64"; + os = "linux"; + compression = "none"; + load = <0x44c00000>; + }; + + }; + + configurations { + default = "so3_lvperf_ramfs"; + + so3_lvperf_ramfs { + description = "SO3 kernel image for lvgl perfomance tests"; + kernel = "so3"; + fdt = "lvperf_fdt"; + ramdisk = "ramfs"; + }; + }; + +}; diff --git a/build/meta-bsp/recipes-bsp/so3/files/its/virt64_so3.its b/build/meta-bsp/recipes-bsp/so3/files/its/virt64_so3.its new file mode 100644 index 0000000..cb0d4f4 --- /dev/null +++ b/build/meta-bsp/recipes-bsp/so3/files/its/virt64_so3.its @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2020-2025 Daniel Rossier + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +/dts-v1/; + +/ { + description = "Kernel and rootfs components for virt64 (armv8) environment"; + + images { + so3 { + description = "SO3 OS kernel"; + data = /incbin/("${IB_SO3_PATH}/so3/so3.bin"); + type = "kernel"; + arch = "arm64"; + os = "linux"; + compression = "none"; + load = <0x41080000>; + entry = <0x41080000>; + }; + + fdt { + description = "Flattened Device Tree blob"; + data = /incbin/("${IB_SO3_PATH}/so3/dts/virt64.dtb"); + type = "flat_dt"; + arch = "arm64"; + compression = "none"; + load = <0x44a00000>; + }; + + ramfs { + description = "SO3 environment minimal rootfs"; + data = /incbin/("${IB_ROOTFS_PATH}/rootfs.fat"); + type = "ramdisk"; + arch = "arm64"; + os = "linux"; + compression = "none"; + load = <0x44c00000>; + }; + + }; + + configurations { + default = "so3_ramfs"; + + so3_ramfs { + description = "SO3 kernel image including device tree"; + kernel = "so3"; + fdt = "fdt"; + ramdisk = "ramfs"; + }; + + so3_mmc { + description = "SO3 kernel image including device tree"; + kernel = "so3"; + fdt = "fdt"; + }; + }; + +}; diff --git a/build/meta-bsp/recipes-bsp/so3/files/its/virt64_so3_guest.its b/build/meta-bsp/recipes-bsp/so3/files/its/virt64_so3_guest.its new file mode 100644 index 0000000..20777ef --- /dev/null +++ b/build/meta-bsp/recipes-bsp/so3/files/its/virt64_so3_guest.its @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2020-2026 Daniel Rossier + * + * SO3 guest ITB for virt64 (armv8). Carries the SO3 OS kernel (guest) + + * its device tree + minimal rootfs. Paired with virt64_avz.itb and + * loaded by U-Boot's guest-boot command, which passes this ITB to AVZ in + * x1; AVZ's loadAgency() loads the agency guest from it. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +/dts-v1/; + +/ { + description = "SO3 guest bundle for virt64 (armv8)"; + + images { + + so3 { + description = "SO3 OS kernel (guest)"; + data = /incbin/("${IB_SO3_PATH}/so3/so3.bin"); + type = "guest"; + arch = "arm64"; + os = "linux"; + compression = "none"; + load = <0x41080000>; + entry = <0x41080000>; + }; + + fdt { + description = "SO3 guest device tree (AVZ-exposed)"; + data = /incbin/("${IB_SO3_PATH}/so3/dts/virt64.dtb"); + type = "flat_dt"; + arch = "arm64"; + compression = "none"; + load = <0x50000000>; + }; + + ramfs { + description = "SO3 environment minimal rootfs"; + data = /incbin/("${IB_ROOTFS_PATH}/rootfs.fat"); + type = "ramdisk"; + arch = "arm64"; + os = "linux"; + compression = "none"; + load = <0x50c00000>; + }; + }; + + configurations { + default = "capsule"; + + capsule { + description = "SO3 guest on virt64"; + loadables = "so3"; + fdt = "fdt"; + ramdisk = "ramfs"; + }; + }; +}; diff --git a/build/meta-bsp/recipes-bsp/so3/files/uEnv_rpi4_64_avz.txt b/build/meta-bsp/recipes-bsp/so3/files/uEnv_rpi4_64_avz.txt index 533b399..9049988 100644 --- a/build/meta-bsp/recipes-bsp/so3/files/uEnv_rpi4_64_avz.txt +++ b/build/meta-bsp/recipes-bsp/so3/files/uEnv_rpi4_64_avz.txt @@ -3,7 +3,7 @@ initrd_high=ffffffffffffffff # AVZ boot on RPi4 64-bit: two ITBs (AVZ + SO3 guest) loaded to staging # addresses (above the 0x00080000-0x17c00000 sub-image extraction range), -# then jumped via the e1c-boot U-Boot command which passes the AVZ FIT in +# then jumped via the guest-boot U-Boot command which passes the AVZ FIT in # x0 and the guest ITB in x1 (AVZ loadAgency loads the guest from x1). -start=fatload mmc 0 0x20000000 rpi4_64_avz.itb; fatload mmc 0 0x30000000 rpi4_64_guest.itb; e1c-boot 0x20000000 0x30000000 +start=fatload mmc 0 0x20000000 rpi4_64_avz.itb; fatload mmc 0 0x30000000 rpi4_64_guest.itb; guest-boot 0x20000000 0x30000000 diff --git a/build/meta-bsp/recipes-bsp/so3/files/uEnv_virt64_avz.txt b/build/meta-bsp/recipes-bsp/so3/files/uEnv_virt64_avz.txt index d1f48f5..e36a575 100644 --- a/build/meta-bsp/recipes-bsp/so3/files/uEnv_virt64_avz.txt +++ b/build/meta-bsp/recipes-bsp/so3/files/uEnv_virt64_avz.txt @@ -2,8 +2,8 @@ fdt_high=ffffffffffffffff initrd_high=ffffffffffffffff # AVZ boot on virt64: two ITBs (AVZ + SO3 guest) loaded to staging -# addresses, then jumped via the e1c-boot U-Boot command which passes the +# addresses, then jumped via the guest-boot U-Boot command which passes the # AVZ FIT in x0 and the guest ITB in x1 (AVZ loadAgency loads the guest # from x1). EL2 is required (st.sh enables -M virt,virtualization=on). -start=load virtio 0 0x65000000 virt64_avz.itb; load virtio 0 0x70000000 virt64_guest.itb; e1c-boot 0x65000000 0x70000000 +start=load virtio 0 0x65000000 virt64_avz.itb; load virtio 0 0x70000000 virt64_guest.itb; guest-boot 0x65000000 0x70000000 diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0-patches.inc b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0-patches.inc index b7507bd..5a04a5b 100644 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0-patches.inc +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0-patches.inc @@ -6,7 +6,7 @@ SRC_URI += "\ file://0005-hwinit-common.c.patch \ file://0006-bootm.c.patch \ file://0007-image-board.c.patch \ - file://0008-e1c_boot.c.patch \ + file://0008-guest_boot.c.patch \ file://0009-Kconfig.patch \ file://0010-Makefile.patch \ file://0011-setexpr.c.patch \ diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0008-e1c_boot.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0008-guest_boot.c.patch similarity index 57% rename from build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0008-e1c_boot.c.patch rename to build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0008-guest_boot.c.patch index 972ca1a..e370cfb 100644 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0008-e1c_boot.c.patch +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0008-guest_boot.c.patch @@ -1,17 +1,18 @@ ---- a/cmd/e1c_boot.c -+++ b/cmd/e1c_boot.c +--- a/cmd/guest_boot.c ++++ b/cmd/guest_boot.c @@ -0,0 +1,212 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + * -+ * e1c-boot: load an AVZ FIT image and an e1c capsule FIT image individually, ++ * guest-boot: load an AVZ FIT image and an guest FIT image individually, + * place each declared loadable/kernel/fdt/ramdisk at its declared load address, + * then transfer control to the AVZ entry point. + * + * Argument convention to AVZ (aarch64): + * x0 = AVZ FIT base (so AVZ can locate its avz_dt loadable inside it) -+ * x1 = e1c capsule FIT base (so AVZ can later load the guest from it) ++ * x1 = guest FIT base (so AVZ can later load the guest from it) + * x2 = 0 + * x3 = 0 + */ @@ -25,7 +26,7 @@ +#include +#include + -+static int e1c_place_image(const void *fit, int img_off, const char *desc, ++static int guest_place_image(const void *fit, int img_off, const char *desc, + ulong *load_out, ulong *entry_out) +{ + const void *data; @@ -33,16 +34,16 @@ + ulong load; + + if (fit_image_get_data_and_size(fit, img_off, &data, &size)) { -+ printf("e1c-boot: %s: missing data\n", desc); ++ printf("guest-boot: %s: missing data\n", desc); + return -1; + } + + if (fit_image_get_load(fit, img_off, &load)) { -+ printf("e1c-boot: %s: missing load address\n", desc); ++ printf("guest-boot: %s: missing load address\n", desc); + return -1; + } + -+ debug("e1c-boot: %s -> 0x%lx (%zu bytes)\n", desc, load, size); ++ debug("guest-boot: %s -> 0x%lx (%zu bytes)\n", desc, load, size); + memmove((void *)load, data, size); + flush_cache(load, size); + @@ -59,7 +60,7 @@ + return 0; +} + -+static int e1c_place_named(const void *fit, int conf_off, const char *prop, ++static int guest_place_named(const void *fit, int conf_off, const char *prop, + ulong *load_out, ulong *entry_out, bool required) +{ + int img_off; @@ -67,15 +68,15 @@ + img_off = fit_conf_get_prop_node(fit, conf_off, prop); + if (img_off < 0) { + if (required) { -+ printf("e1c-boot: config has no '%s' image\n", prop); ++ printf("guest-boot: config has no '%s' image\n", prop); + return -1; + } + return 0; + } -+ return e1c_place_image(fit, img_off, prop, load_out, entry_out); ++ return guest_place_image(fit, img_off, prop, load_out, entry_out); +} + -+static int e1c_place_loadables(const void *fit, int conf_off) ++static int guest_place_loadables(const void *fit, int conf_off) +{ + const char *uname; + int idx; @@ -87,77 +88,77 @@ + int img_off = fit_image_get_node(fit, uname); + + if (img_off < 0) { -+ printf("e1c-boot: loadable '%s' not found\n", uname); ++ printf("guest-boot: loadable '%s' not found\n", uname); + return -1; + } -+ if (e1c_place_image(fit, img_off, uname, NULL, NULL)) ++ if (guest_place_image(fit, img_off, uname, NULL, NULL)) + return -1; + } + return 0; +} + -+static int e1c_load_fit(ulong fit_addr, const char *conf_name, ++static int guest_load_fit(ulong fit_addr, const char *conf_name, + ulong *kernel_entry, ulong *fdt_load) +{ + const void *fit = (const void *)fit_addr; + int conf_off; + + if (fit_check_format(fit, IMAGE_SIZE_INVAL)) { -+ printf("e1c-boot: invalid FIT at 0x%lx\n", fit_addr); ++ printf("guest-boot: invalid FIT at 0x%lx\n", fit_addr); + return -1; + } + + conf_off = fit_conf_get_node(fit, conf_name); + if (conf_off < 0) { -+ printf("e1c-boot: config '%s' not found at 0x%lx\n", ++ printf("guest-boot: config '%s' not found at 0x%lx\n", + conf_name ? conf_name : "", fit_addr); + return -1; + } + -+ if (e1c_place_named(fit, conf_off, FIT_KERNEL_PROP, NULL, ++ if (guest_place_named(fit, conf_off, FIT_KERNEL_PROP, NULL, + kernel_entry, kernel_entry != NULL)) + return -1; + -+ if (e1c_place_named(fit, conf_off, FIT_FDT_PROP, fdt_load, ++ if (guest_place_named(fit, conf_off, FIT_FDT_PROP, fdt_load, + NULL, false)) + return -1; + -+ if (e1c_place_named(fit, conf_off, FIT_RAMDISK_PROP, NULL, ++ if (guest_place_named(fit, conf_off, FIT_RAMDISK_PROP, NULL, + NULL, false)) + return -1; + -+ if (e1c_place_loadables(fit, conf_off)) ++ if (guest_place_loadables(fit, conf_off)) + return -1; + + return 0; +} + -+static int do_e1c_boot(struct cmd_tbl *cmdtp, int flag, int argc, ++static int do_guest_boot(struct cmd_tbl *cmdtp, int flag, int argc, + char *const argv[]) +{ -+ ulong avz_itb, e1c_itb, avz_entry = 0, capsule_fdt = 0; ++ ulong avz_itb, guest_itb, avz_entry = 0, capsule_fdt = 0; + + if (argc != 3) + return CMD_RET_USAGE; + + avz_itb = simple_strtoul(argv[1], NULL, 16); -+ e1c_itb = simple_strtoul(argv[2], NULL, 16); ++ guest_itb = simple_strtoul(argv[2], NULL, 16); + -+ printf("e1c-boot: AVZ ITB @ 0x%lx, e1c ITB @ 0x%lx\n", -+ avz_itb, e1c_itb); ++ printf("guest-boot: AVZ ITB @ 0x%lx, guest ITB @ 0x%lx\n", ++ avz_itb, guest_itb); + -+ if (e1c_load_fit(avz_itb, "avz", &avz_entry, NULL)) ++ if (guest_load_fit(avz_itb, "avz", &avz_entry, NULL)) + return CMD_RET_FAILURE; + if (!avz_entry) { -+ printf("e1c-boot: AVZ config has no kernel entry\n"); ++ printf("guest-boot: AVZ config has no kernel entry\n"); + return CMD_RET_FAILURE; + } + -+ if (e1c_load_fit(e1c_itb, "capsule", NULL, &capsule_fdt)) ++ if (guest_load_fit(guest_itb, "capsule", NULL, &capsule_fdt)) + return CMD_RET_FAILURE; + + /* Propagate U-Boot's bootargs env into the guest FDT's /chosen so the -+ * guest kernel sees the cmdline. e1c-boot replaces bootm's standard ++ * guest kernel sees the cmdline. guest-boot replaces bootm's standard + * fdt_chosen() call — without this, the guest kernel cmdline is empty + * and OSTree-aware initramfs (e.g. TorizonOS) can't find its root. */ + if (capsule_fdt) { @@ -165,7 +166,7 @@ + const char *ba = env_get("bootargs"); + int ret; + -+ printf("e1c-boot: capsule fdt @ 0x%lx, bootargs=[%s]\n", ++ printf("guest-boot: capsule fdt @ 0x%lx, bootargs=[%s]\n", + capsule_fdt, ba ? ba : ""); + + /* The guest DTB is tightly packed by mkimage and has no room @@ -174,42 +175,42 @@ + * extra props AVZ injects later. */ + ret = fdt_open_into(fdt, fdt, fdt_totalsize(fdt) + 0x1000); + if (ret < 0) { -+ printf("e1c-boot: WARN: fdt_open_into failed (%d)\n", ++ printf("guest-boot: WARN: fdt_open_into failed (%d)\n", + ret); + } + + ret = fdt_chosen(fdt); + if (ret < 0) -+ printf("e1c-boot: WARN: fdt_chosen failed (%d)\n", ret); ++ printf("guest-boot: WARN: fdt_chosen failed (%d)\n", ret); + else + flush_cache(capsule_fdt, fdt_totalsize(fdt)); + } + -+ printf("e1c-boot: jumping to AVZ at 0x%lx (capsule ITB @ 0x%lx)\n", -+ avz_entry, e1c_itb); ++ printf("guest-boot: jumping to AVZ at 0x%lx (capsule ITB @ 0x%lx)\n", ++ avz_entry, guest_itb); + + cleanup_before_linux(); + -+ armv8_switch_to_el2(avz_itb, e1c_itb, 0, 0, avz_entry, ++ armv8_switch_to_el2(avz_itb, guest_itb, 0, 0, avz_entry, + ES_TO_AARCH64); + + return CMD_RET_FAILURE; +} + +#ifdef CONFIG_SYS_LONGHELP -+static char e1c_boot_help_text[] = -+ " \n" -+ " - Parse the AVZ FIT and the e1c capsule FIT loaded at the given\n" ++static char guest_boot_help_text[] = ++ " \n" ++ " - Parse the AVZ FIT and the guest FIT loaded at the given\n" + " addresses, place every kernel/fdt/ramdisk/loadable at its\n" + " declared load address, then jump to the AVZ entry point with:\n" + " x0 = avz_itb_addr (AVZ scans this FIT for its avz_dt)\n" -+ " x1 = e1c_itb_addr (AVZ uses this FIT to load the guest)"; ++ " x1 = guest_itb_addr (AVZ uses this FIT to load the guest)"; +#endif + -+ll_entry_declare(struct cmd_tbl, e1c_boot, cmd) = { -+ "e1c-boot", 3, cmd_never_repeatable, do_e1c_boot, -+ "boot AVZ hypervisor with an e1c capsule", ++ll_entry_declare(struct cmd_tbl, guest_boot, cmd) = { ++ "guest-boot", 3, cmd_never_repeatable, do_guest_boot, ++ "boot AVZ hypervisor with an guest", +#ifdef CONFIG_SYS_LONGHELP -+ e1c_boot_help_text ++ guest_boot_help_text +#endif +}; diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0009-Kconfig.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0009-Kconfig.patch index a6ea229..dbf2e31 100644 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0009-Kconfig.patch +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0009-Kconfig.patch @@ -4,11 +4,11 @@ help Boot an AArch64 Linux Kernel image from memory. -+config CMD_E1C_BOOT -+ bool "e1c-boot" ++config CMD_GUEST_BOOT ++ bool "guest-boot" + depends on ARM64 && FIT + help -+ Boot the AVZ hypervisor together with an e1c capsule (Linux guest) ++ Boot the AVZ hypervisor together with a guest (Linux) via the two-ITB scheme + from two separate FIT images. Each FIT is parsed individually; every + declared kernel/fdt/ramdisk/loadable is copied to its load address, + then control is transferred to the AVZ entry point with the AVZ FIT diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0010-Makefile.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0010-Makefile.patch index 7e732c0..8110ec1 100644 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0010-Makefile.patch +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0010-Makefile.patch @@ -4,7 +4,7 @@ obj-$(CONFIG_CMD_ADTIMG) += adtimg.o obj-$(CONFIG_CMD_ABOOTIMG) += abootimg.o obj-$(CONFIG_CMD_EXTENSION) += extension_board.o -+obj-$(CONFIG_CMD_E1C_BOOT) += e1c_boot.o ++obj-$(CONFIG_CMD_GUEST_BOOT) += guest_boot.o obj-$(CONFIG_CMD_ECHO) += echo.o obj-$(CONFIG_ENV_IS_IN_EEPROM) += eeprom.o obj-$(CONFIG_CMD_EEPROM) += eeprom.o diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0019-virt64_defconfig.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0019-virt64_defconfig.patch index 6d9778e..8f5c87a 100644 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0019-virt64_defconfig.patch +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2022.04-r0/0019-virt64_defconfig.patch @@ -421,7 +421,7 @@ +CONFIG_BOOTM_EFI=y +# CONFIG_CMD_BOOTZ is not set +CONFIG_CMD_BOOTI=y -+CONFIG_CMD_E1C_BOOT=y ++CONFIG_CMD_GUEST_BOOT=y +CONFIG_BOOTM_LINUX=y +CONFIG_BOOTM_NETBSD=y +# CONFIG_BOOTM_OPENRTOS is not set diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0-patches.inc b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0-patches.inc index a8f2301..7362e2b 100644 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0-patches.inc +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0-patches.inc @@ -43,5 +43,5 @@ SRC_URI += "\ file://0070-Kconfig.patch \ file://0071-Makefile.patch \ file://0072-verdin-imx8mp_defconfig.patch \ - file://0073-e1c_boot.c.patch \ + file://0073-guest_boot.c.patch \ " \ No newline at end of file diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0070-Kconfig.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0070-Kconfig.patch index 6897345..0bae2a9 100644 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0070-Kconfig.patch +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0070-Kconfig.patch @@ -4,11 +4,11 @@ help Boot an AArch64 Linux Kernel image from memory. -+config CMD_E1C_BOOT -+ bool "e1c-boot" ++config CMD_GUEST_BOOT ++ bool "guest-boot" + depends on ARM64 && FIT + help -+ Boot the AVZ hypervisor together with an e1c capsule (Linux guest) ++ Boot the AVZ hypervisor together with a guest (Linux) via the two-ITB scheme + from two separate FIT images. Each FIT is parsed individually; every + declared kernel/fdt/ramdisk/loadable is copied to its load address, + then control is transferred to the AVZ entry point with the AVZ FIT diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0071-Makefile.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0071-Makefile.patch index 39f287b..91eb1c6 100644 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0071-Makefile.patch +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0071-Makefile.patch @@ -4,7 +4,7 @@ obj-$(CONFIG_CMD_CYCLIC) += cyclic.o obj-$(CONFIG_CMD_EVENT) += event.o obj-$(CONFIG_CMD_EXTENSION) += extension_board.o -+obj-$(CONFIG_CMD_E1C_BOOT) += e1c_boot.o ++obj-$(CONFIG_CMD_GUEST_BOOT) += guest_boot.o obj-$(CONFIG_CMD_ECHO) += echo.o obj-$(CONFIG_ENV_IS_IN_EEPROM) += eeprom.o obj-$(CONFIG_CMD_EEPROM) += eeprom.o diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0072-verdin-imx8mp_defconfig.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0072-verdin-imx8mp_defconfig.patch index 10b8b7d..c43cac1 100644 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0072-verdin-imx8mp_defconfig.patch +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0072-verdin-imx8mp_defconfig.patch @@ -4,4 +4,4 @@ CONFIG_USB_GADGET_PRODUCT_NUM=0x4000 CONFIG_IMX_WATCHDOG=y CONFIG_HEXDUMP=y -+CONFIG_CMD_E1C_BOOT=y ++CONFIG_CMD_GUEST_BOOT=y diff --git a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0073-e1c_boot.c.patch b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0073-guest_boot.c.patch similarity index 58% rename from build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0073-e1c_boot.c.patch rename to build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0073-guest_boot.c.patch index 4656e32..e892a28 100644 --- a/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0073-e1c_boot.c.patch +++ b/build/meta-uboot/recipes-uboot/uboot/files/0001-uboot-2024.07-r0/0073-guest_boot.c.patch @@ -1,17 +1,18 @@ --- /dev/null -+++ b/cmd/e1c_boot.c ++++ b/cmd/guest_boot.c @@ -0,0 +1,212 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD + * -+ * e1c-boot: load an AVZ FIT image and an e1c capsule FIT image individually, ++ * guest-boot: load an AVZ FIT image and an guest FIT image individually, + * place each declared loadable/kernel/fdt/ramdisk at its declared load address, + * then transfer control to the AVZ entry point. + * + * Argument convention to AVZ (aarch64): + * x0 = AVZ FIT base (so AVZ can locate its avz_dt loadable inside it) -+ * x1 = e1c capsule FIT base (so AVZ can later load the guest from it) ++ * x1 = guest FIT base (so AVZ can later load the guest from it) + * x2 = 0 + * x3 = 0 + */ @@ -25,7 +26,7 @@ +#include +#include + -+static int e1c_place_image(const void *fit, int img_off, const char *desc, ++static int guest_place_image(const void *fit, int img_off, const char *desc, + ulong *load_out, ulong *entry_out) +{ + const void *data; @@ -33,16 +34,16 @@ + ulong load; + + if (fit_image_get_data_and_size(fit, img_off, &data, &size)) { -+ printf("e1c-boot: %s: missing data\n", desc); ++ printf("guest-boot: %s: missing data\n", desc); + return -1; + } + + if (fit_image_get_load(fit, img_off, &load)) { -+ printf("e1c-boot: %s: missing load address\n", desc); ++ printf("guest-boot: %s: missing load address\n", desc); + return -1; + } + -+ debug("e1c-boot: %s -> 0x%lx (%zu bytes)\n", desc, load, size); ++ debug("guest-boot: %s -> 0x%lx (%zu bytes)\n", desc, load, size); + memmove((void *)load, data, size); + flush_cache(load, size); + @@ -59,7 +60,7 @@ + return 0; +} + -+static int e1c_place_named(const void *fit, int conf_off, const char *prop, ++static int guest_place_named(const void *fit, int conf_off, const char *prop, + ulong *load_out, ulong *entry_out, bool required) +{ + int img_off; @@ -67,15 +68,15 @@ + img_off = fit_conf_get_prop_node(fit, conf_off, prop, IH_PHASE_NONE); + if (img_off < 0) { + if (required) { -+ printf("e1c-boot: config has no '%s' image\n", prop); ++ printf("guest-boot: config has no '%s' image\n", prop); + return -1; + } + return 0; + } -+ return e1c_place_image(fit, img_off, prop, load_out, entry_out); ++ return guest_place_image(fit, img_off, prop, load_out, entry_out); +} + -+static int e1c_place_loadables(const void *fit, int conf_off) ++static int guest_place_loadables(const void *fit, int conf_off) +{ + const char *uname; + int idx; @@ -87,77 +88,77 @@ + int img_off = fit_image_get_node(fit, uname); + + if (img_off < 0) { -+ printf("e1c-boot: loadable '%s' not found\n", uname); ++ printf("guest-boot: loadable '%s' not found\n", uname); + return -1; + } -+ if (e1c_place_image(fit, img_off, uname, NULL, NULL)) ++ if (guest_place_image(fit, img_off, uname, NULL, NULL)) + return -1; + } + return 0; +} + -+static int e1c_load_fit(ulong fit_addr, const char *conf_name, ++static int guest_load_fit(ulong fit_addr, const char *conf_name, + ulong *kernel_entry, ulong *fdt_load) +{ + const void *fit = (const void *)fit_addr; + int conf_off; + + if (fit_check_format(fit, IMAGE_SIZE_INVAL)) { -+ printf("e1c-boot: invalid FIT at 0x%lx\n", fit_addr); ++ printf("guest-boot: invalid FIT at 0x%lx\n", fit_addr); + return -1; + } + + conf_off = fit_conf_get_node(fit, conf_name); + if (conf_off < 0) { -+ printf("e1c-boot: config '%s' not found at 0x%lx\n", ++ printf("guest-boot: config '%s' not found at 0x%lx\n", + conf_name ? conf_name : "", fit_addr); + return -1; + } + -+ if (e1c_place_named(fit, conf_off, FIT_KERNEL_PROP, NULL, ++ if (guest_place_named(fit, conf_off, FIT_KERNEL_PROP, NULL, + kernel_entry, kernel_entry != NULL)) + return -1; + -+ if (e1c_place_named(fit, conf_off, FIT_FDT_PROP, fdt_load, ++ if (guest_place_named(fit, conf_off, FIT_FDT_PROP, fdt_load, + NULL, false)) + return -1; + -+ if (e1c_place_named(fit, conf_off, FIT_RAMDISK_PROP, NULL, ++ if (guest_place_named(fit, conf_off, FIT_RAMDISK_PROP, NULL, + NULL, false)) + return -1; + -+ if (e1c_place_loadables(fit, conf_off)) ++ if (guest_place_loadables(fit, conf_off)) + return -1; + + return 0; +} + -+static int do_e1c_boot(struct cmd_tbl *cmdtp, int flag, int argc, ++static int do_guest_boot(struct cmd_tbl *cmdtp, int flag, int argc, + char *const argv[]) +{ -+ ulong avz_itb, e1c_itb, avz_entry = 0, capsule_fdt = 0; ++ ulong avz_itb, guest_itb, avz_entry = 0, capsule_fdt = 0; + + if (argc != 3) + return CMD_RET_USAGE; + + avz_itb = simple_strtoul(argv[1], NULL, 16); -+ e1c_itb = simple_strtoul(argv[2], NULL, 16); ++ guest_itb = simple_strtoul(argv[2], NULL, 16); + -+ printf("e1c-boot: AVZ ITB @ 0x%lx, e1c ITB @ 0x%lx\n", -+ avz_itb, e1c_itb); ++ printf("guest-boot: AVZ ITB @ 0x%lx, guest ITB @ 0x%lx\n", ++ avz_itb, guest_itb); + -+ if (e1c_load_fit(avz_itb, "avz", &avz_entry, NULL)) ++ if (guest_load_fit(avz_itb, "avz", &avz_entry, NULL)) + return CMD_RET_FAILURE; + if (!avz_entry) { -+ printf("e1c-boot: AVZ config has no kernel entry\n"); ++ printf("guest-boot: AVZ config has no kernel entry\n"); + return CMD_RET_FAILURE; + } + -+ if (e1c_load_fit(e1c_itb, "capsule", NULL, &capsule_fdt)) ++ if (guest_load_fit(guest_itb, "capsule", NULL, &capsule_fdt)) + return CMD_RET_FAILURE; + + /* Propagate U-Boot's bootargs env into the guest FDT's /chosen so the -+ * guest kernel sees the cmdline. e1c-boot replaces bootm's standard ++ * guest kernel sees the cmdline. guest-boot replaces bootm's standard + * fdt_chosen() call — without this, the guest kernel cmdline is empty + * and OSTree-aware initramfs (e.g. TorizonOS) can't find its root. */ + if (capsule_fdt) { @@ -165,7 +166,7 @@ + const char *ba = env_get("bootargs"); + int ret; + -+ printf("e1c-boot: capsule fdt @ 0x%lx, bootargs=[%s]\n", ++ printf("guest-boot: capsule fdt @ 0x%lx, bootargs=[%s]\n", + capsule_fdt, ba ? ba : ""); + + /* The guest DTB is tightly packed by mkimage and has no room @@ -174,42 +175,42 @@ + * extra props AVZ injects later. */ + ret = fdt_open_into(fdt, fdt, fdt_totalsize(fdt) + 0x1000); + if (ret < 0) { -+ printf("e1c-boot: WARN: fdt_open_into failed (%d)\n", ++ printf("guest-boot: WARN: fdt_open_into failed (%d)\n", + ret); + } + + ret = fdt_chosen(fdt); + if (ret < 0) -+ printf("e1c-boot: WARN: fdt_chosen failed (%d)\n", ret); ++ printf("guest-boot: WARN: fdt_chosen failed (%d)\n", ret); + else + flush_cache(capsule_fdt, fdt_totalsize(fdt)); + } + -+ printf("e1c-boot: jumping to AVZ at 0x%lx (capsule ITB @ 0x%lx)\n", -+ avz_entry, e1c_itb); ++ printf("guest-boot: jumping to AVZ at 0x%lx (capsule ITB @ 0x%lx)\n", ++ avz_entry, guest_itb); + + cleanup_before_linux(); + -+ armv8_switch_to_el2(avz_itb, e1c_itb, 0, 0, avz_entry, ++ armv8_switch_to_el2(avz_itb, guest_itb, 0, 0, avz_entry, + ES_TO_AARCH64); + + return CMD_RET_FAILURE; +} + +#ifdef CONFIG_SYS_LONGHELP -+static char e1c_boot_help_text[] = -+ " \n" -+ " - Parse the AVZ FIT and the e1c capsule FIT loaded at the given\n" ++static char guest_boot_help_text[] = ++ " \n" ++ " - Parse the AVZ FIT and the guest FIT loaded at the given\n" + " addresses, place every kernel/fdt/ramdisk/loadable at its\n" + " declared load address, then jump to the AVZ entry point with:\n" + " x0 = avz_itb_addr (AVZ scans this FIT for its avz_dt)\n" -+ " x1 = e1c_itb_addr (AVZ uses this FIT to load the guest)"; ++ " x1 = guest_itb_addr (AVZ uses this FIT to load the guest)"; +#endif + -+ll_entry_declare(struct cmd_tbl, e1c_boot, cmd) = { -+ "e1c-boot", 3, cmd_never_repeatable, do_e1c_boot, -+ "boot AVZ hypervisor with an e1c capsule", ++ll_entry_declare(struct cmd_tbl, guest_boot, cmd) = { ++ "guest-boot", 3, cmd_never_repeatable, do_guest_boot, ++ "boot AVZ hypervisor with an guest", +#ifdef CONFIG_SYS_LONGHELP -+ e1c_boot_help_text ++ guest_boot_help_text +#endif +}; diff --git a/build/meta-uboot/recipes-uboot/uboot/uboot_2022.04.bb b/build/meta-uboot/recipes-uboot/uboot/uboot_2022.04.bb index cf682f6..0760814 100644 --- a/build/meta-uboot/recipes-uboot/uboot/uboot_2022.04.bb +++ b/build/meta-uboot/recipes-uboot/uboot/uboot_2022.04.bb @@ -46,11 +46,10 @@ do_configure () { # and CONFIG_ARCH_QEMU=y, both required for QEMU `-kernel` to # load the U-Boot ELF at any address. Linux runs at EL1 (no # secure / no virtualization in QEMU machine). - # - IB_BOOT_CHAIN="atf+uboot" (bare bsp-torizon) and "full" (capsule) - # both use virt64_defconfig — same FIP-aware U-Boot, the boot - # chain difference lives in ATF (no SPD vs SPD=opteed) and the - # guest DT (see bsp_torizon doc, "Known virt64 DT Workarounds"). - # U-Boot is entered at EL2 by ATF and does NOT switch to EL1 + # - IB_BOOT_CHAIN="atf+uboot" and "full" (capsule) both use + # virt64_defconfig — same FIP-aware U-Boot, the boot chain + # difference lives in ATF (no SPD vs SPD=opteed) and the guest + # DT. U-Boot is entered at EL2 by ATF and does NOT switch to EL1 # before booting the kernel — the kernel performs its own # el2_setup and drops to EL1 itself, as per the arm64 boot # protocol. diff --git a/linux/target/build.sh b/linux/target/build.sh deleted file mode 100755 index cb8bf5d..0000000 --- a/linux/target/build.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash - -function usage { - echo "$0 [OPTIONS]" - echo " -v Verbose" -} - -verbose=n - -while getopts cdhvs option - do - case "${option}" - in - v) verbose=y;; - h) usage && exit 1;; - esac - done - -echo Building the ITB - -cd ../build - -if [ $verbose == y ]; then - bitbake bsp -c itb -vDDD - exit 0 -fi - -bitbake bsp -c itb - - diff --git a/linux/target/mkuboot.sh b/linux/target/mkuboot.sh deleted file mode 100755 index a52d33b..0000000 --- a/linux/target/mkuboot.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash - -function usage { - echo "$0 [OPTIONS]" - echo " -v Verbose" - echo " -h Print this help" -} - -verbose=n - -while getopts cdhvs option - do - case "${option}" - in - v) verbose=y;; - h) usage && exit 1;; - esac - done - - -if [ $verbose == y ]; then - cd ../build - bitbake bsp -c do_itb -vDDD - exit 0 -fi - -cd ../build -bitbake bsp -c do_itb - - - - diff --git a/linux/target/rpi4_64_avz.its b/linux/target/rpi4_64_avz.its deleted file mode 100644 index 1bf78ef..0000000 --- a/linux/target/rpi4_64_avz.its +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (C) 2020-2026 Daniel Rossier - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -/dts-v1/; - -/ { - description = "SOO Agency components for Raspberry Pi 4 64-bit environment"; - - images { - - avz { - description = "AVZ Hypervisor (64-bit)"; - data = /incbin/("../../avz/so3.bin"); - type = "kernel"; - os = "linux"; - arch = "arm64"; - compression = "none"; - load = <0x00080000>; - entry = <0x00080000>; - }; - - avz_dt { - description = "Flattened Device Tree blob"; - data = /incbin/("../../avz/dts/rpi4_64_avz.dtb"); - type = "avz_dt"; - arch = "arm64"; - compression = "none"; - load = <0x03000000>; - }; - - linux { - description = "Linux kernel"; - data = /incbin/("../linux/arch/arm64/boot/Image"); - type = "guest"; - arch = "arm64"; - os = "linux"; - compression = "none"; - load = <0x10000000>; - entry = <0x10000000>; - }; - - fdt { - description = "SOO Agency device tree blob"; - data = /incbin/("../linux/arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dtb"); - type = "flat_dt"; - arch = "arm64"; - compression = "none"; - load = <0x20000000>; - }; - - fdt-overlay { - data = /incbin/("../linux/arch/arm64/boot/dts/overlays/vc4-kms-v3d-pi4.dtbo"); - type = "flat_dt"; - arch = "arm64"; - compression = "none"; - load = <0x20c00000>; - }; - - initrd { - description = "Linux initial rootfs (initrd)"; - data = /incbin/("../rootfs/board/rpi4_64/initrd.cpio"); - type = "ramdisk"; - arch = "arm64"; - os = "linux"; - compression = "none"; - load = <0x20e00000>; - }; - }; - - configurations { - default = "linux_guest"; - - linux_guest { - description = "Linux/AVZ on RPi4 64-bit"; - loadables = "avz_dt", "linux"; - kernel = "avz"; - fdt = "fdt"; - ramdisk = "initrd"; - }; - }; -}; diff --git a/linux/target/rpi4_64_linux.its b/linux/target/rpi4_64_linux.its deleted file mode 100644 index 585c82c..0000000 --- a/linux/target/rpi4_64_linux.its +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) 2020-2026 Daniel Rossier - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -/dts-v1/; - -/ { - description = "SOO Agency components for Raspberry Pi 4 64-bit environment"; - - images { - - linux { - description = "Linux kernel"; - data = /incbin/("../linux/arch/arm64/boot/Image"); - type = "kernel"; - arch = "arm64"; - os = "linux"; - compression = "none"; - load = <0x01000000>; - entry = <0x01000000>; - }; - - fdt { - description = "SOO Agency device tree blob"; - data = /incbin/("../linux/arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dtb"); - type = "flat_dt"; - arch = "arm64"; - compression = "none"; - load = <0x20000000>; - }; - - fdt-overlay { - data = /incbin/("../linux/arch/arm64/boot/dts/overlays/vc4-kms-v3d-pi4.dtbo"); - type = "flat_dt"; - arch = "arm64"; - compression = "none"; - load = <0x20c00000>; - }; - - initrd { - description = "Linux initial rootfs (initrd)"; - data = /incbin/("../rootfs/board/rpi4_64/initrd.cpio"); - type = "ramdisk"; - arch = "arm64"; - os = "linux"; - compression = "none"; - load = <0x20e00000>; - }; - }; - - configurations { - default = "linux"; - - linux { - description = "Linux on RPi4 64-bit"; - kernel = "linux"; - fdt = "fdt"; - ramdisk = "initrd"; - }; - }; -}; diff --git a/linux/target/virt32.its b/linux/target/virt32.its deleted file mode 120000 index 31ce9ba..0000000 --- a/linux/target/virt32.its +++ /dev/null @@ -1 +0,0 @@ -virt32_avz.its \ No newline at end of file diff --git a/linux/target/virt64.its b/linux/target/virt64.its deleted file mode 120000 index 388bdaf..0000000 --- a/linux/target/virt64.its +++ /dev/null @@ -1 +0,0 @@ -virt64_avz.its \ No newline at end of file diff --git a/linux/target/virt64_linux_guest.its b/linux/target/virt64_linux_guest.its deleted file mode 100644 index e76f80f..0000000 --- a/linux/target/virt64_linux_guest.its +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) 2020-2026 Daniel Rossier - * - * Linux agency guest ITB for virt64 (armv8). Carries the Linux agency - * kernel (Image) + its device tree + initrd. Paired with virt64_avz.itb - * and loaded by U-Boot's e1c-boot command, which passes this ITB to AVZ - * in x1; AVZ's loadAgency() loads the agency guest from it. The Linux - * agency hosts the SO3 capsules (injected at runtime via EMISO). - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ - -/dts-v1/; - -/ { - description = "Linux agency guest bundle for virt64 (armv8)"; - - images { - - linux { - description = "Linux agency kernel (guest)"; - data = /incbin/("../linux/arch/arm64/boot/Image"); - type = "guest"; - arch = "arm64"; - os = "linux"; - compression = "none"; - load = <0x41000000>; - entry = <0x41000000>; - }; - - fdt { - description = "Linux agency device tree (AVZ-exposed)"; - data = /incbin/("../linux/arch/arm64/boot/dts/arm/virt64_guest.dtb"); - type = "flat_dt"; - arch = "arm64"; - compression = "none"; - load = <0x50000000>; - }; - - initrd { - description = "Linux agency initrd"; - data = /incbin/("../rootfs/board/virt64/initrd.cpio"); - type = "ramdisk"; - arch = "arm64"; - os = "linux"; - compression = "none"; - load = <0x50c00000>; - }; - }; - - configurations { - /* Node name MUST be "capsule": U-Boot's e1c-boot command looks - * up the guest config by that fixed name (cmd/e1c_boot.c: - * e1c_load_fit(e1c_itb, "capsule", ...)). Same slot as the SO3 - * guest; here it carries the Linux agency. */ - default = "capsule"; - - capsule { - description = "SOO Linux agency on virt64"; - loadables = "linux"; - fdt = "fdt"; - ramdisk = "initrd"; - }; - }; -}; From 487b96ca8d4cb5eeb7d993fa680ad0fd85807e2e Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Sat, 11 Jul 2026 16:04:35 +0200 Subject: [PATCH 27/52] meta-usr/meta-rootfs: fix the agency apps deploy chain (v6.2.0 model) Adopt v6.2.0's usr-linux bbappend and rootfs-linux recipe: baking the usr apps into rootfs.cpio is a BUILD step (deps on the rootfs generator's do_build), and rootfs-linux:do_deploy is a pure media write (no longer pulls buildroot:do_build). micofe had the halves inverted - p2 was populated before the injection and every deploy rebuilt buildroot, regenerating a pristine rootfs.cpio that erased the injected apps; /root on p2 could never catch up with the staged binaries. --- .../recipes-rootfs/linux/rootfs-linux_1.0.bb | 29 +++++++------- .../recipes-usr/linux/usr-linux_1.0.bbappend | 39 +++++++++++-------- 2 files changed, 37 insertions(+), 31 deletions(-) diff --git a/build/meta-rootfs/recipes-rootfs/linux/rootfs-linux_1.0.bb b/build/meta-rootfs/recipes-rootfs/linux/rootfs-linux_1.0.bb index 077515d..d65f500 100644 --- a/build/meta-rootfs/recipes-rootfs/linux/rootfs-linux_1.0.bb +++ b/build/meta-rootfs/recipes-rootfs/linux/rootfs-linux_1.0.bb @@ -23,12 +23,13 @@ do_configure[noexec] = "1" do_build[depends] = "${IB_ROOTFS_METHOD}:do_build" do_build[depends] += "linux:do_build" -# Check that the image is present before deploying rootfs. The rootfs -# generator (buildroot by default) must also have produced rootfs.cpio -# under board/${IB_PLATFORM}/ — without this dep, do_deploy can race -# ahead of buildroot:do_build on a fresh checkout (no cached cpio) and -# fail in __do_rootfs_mount. -do_deploy[depends] += "filesystem:do_fs_check ${IB_ROOTFS_METHOD}:do_build" +# do_deploy is a pure DEPLOY step: it extracts the already-built rootfs.cpio +# (apps baked in by usr-linux:do_deploy during the build) onto p2. It must +# NOT pull ${IB_ROOTFS_METHOD}:do_build — that would rebuild buildroot on +# every `deploy.sh`. The workflow is edit -> build.sh (produces rootfs.cpio) +# -> deploy.sh; a deploy with no prior build fails clearly in +# __do_rootfs_mount (missing rootfs.cpio) rather than silently rebuilding. +do_deploy[depends] += "filesystem:do_fs_check" do_build[nostamp] = "1" do_build () { @@ -49,13 +50,15 @@ do_attach_infrabase () { # Keep a private working copy of the board directory under WORKDIR # (tmp/work). The rootfs generator writes its productions there during # the build (rootfs.cpio via post_image.sh, then rootfs.cpio.backup, - # rootfs.cpio.sha256, initrd.cpio, initrd.cpio.gz). Pointing the board - # symlink at this copy keeps those productions out of the git-tracked - # source tree under files/board. + # initrd.cpio.gz, initrd.cpio.gz.srchash). Pointing the board symlink + # at this copy keeps those productions out of the git-tracked source + # tree under files/board. Note: board//initrd.cpio is now a + # git-tracked SOURCE (the static embedded ramfs for IB_RAMFS_SOURCE = + # "initrd"), refreshed from files/board on every attach. # # `cp -r .../board/.` refreshes the source config files on top of the # copy but does NOT remove the dest-only productions, so the - # do_prepare_initrd content-hash guard (rootfs.cpio.sha256 + + # do_prepare_initrd content-hash guard (initrd.cpio.gz.srchash + # initrd.cpio.gz) keeps working across builds. mkdir -p ${WORKDIR}/board cp -r ${FILE_DIRNAME}/files/board/. ${WORKDIR}/board @@ -82,10 +85,8 @@ python do_deploy () { # Verdin-imx8mp does not deploy its rootfs via a build-time partition # mount: storage is delivered through the platform's Tezi / HTTP recovery # flow (IB_STORAGE_MODE = "http"), so the verdin __do_fs_mount would try - # to mount a physical /dev/sda1 that is absent in a build/CI context. - # Mirror rootfs-torizon:do_deploy, which returns early for verdin for the - # same reason. (FC builds never reach here — their bbappend marks - # do_deploy noexec.) + # to mount a physical /dev/sda1 that is absent in a build/CI context, + # so do_deploy returns early for verdin here. if d.getVar('IB_PLATFORM') == "verdin-imx8mp": bb.plain("verdin-imx8mp: rootfs delivered via Tezi/HTTP, skipping partition deploy") return diff --git a/build/meta-usr/recipes-usr/linux/usr-linux_1.0.bbappend b/build/meta-usr/recipes-usr/linux/usr-linux_1.0.bbappend index 141eb6c..de4db47 100644 --- a/build/meta-usr/recipes-usr/linux/usr-linux_1.0.bbappend +++ b/build/meta-usr/recipes-usr/linux/usr-linux_1.0.bbappend @@ -10,33 +10,38 @@ inherit linux inherit filesystem inherit rootfs +# This is a BUILD step, not a media deploy: it bakes the agency apps INTO +# rootfs.cpio (rsync into the cpio tree, then re-pack). That single rootfs +# image is then the source for both targets: +# - the embedded ramfs (gzip -> initrd.cpio.gz -> ITB) for +# IB_RAMFS_SOURCE="rootfs"; +# - the p2 ext4 partition, which rootfs-linux:do_deploy populates by +# extracting this same (apps-included) rootfs.cpio at DEPLOY time. +# So p2 gets the apps for free via the final rootfs.cpio — no separate +# media write here. Depends on buildroot (rootfs.cpio) + usr:do_build +# (the apps), NOT on rootfs-linux:do_deploy, so the build never touches +# the boot media. +do_deploy[depends] = "${IB_ROOTFS_METHOD}:do_build" + python do_deploy() { import os - import subprocess - - d.setVar('ROOTFS_FILENAME', 'rootfs') - __do_rootfs_mount(d) IB_USR_PATH = d.getVar('IB_USR_PATH') - - if not os.path.isdir(os.path.join(IB_USR_PATH, "build", "deploy")): - - __do_rootfs_umount(d) - bb.fatal("The {} does not exist; please build usr first...".format(IB_USR_PATH)) - IB_ROOTFS_PATH = d.getVar('IB_ROOTFS_PATH') IB_PLATFORM = d.getVar('IB_PLATFORM') + deploy_src = os.path.join(IB_USR_PATH, "build", "deploy") + if not os.path.isdir(deploy_src): + bb.fatal("The {} does not exist; please build usr first...".format(IB_USR_PATH)) if not os.path.isfile(os.path.join(IB_ROOTFS_PATH, "board", IB_PLATFORM, "rootfs.cpio")): - __do_rootfs_umount(d) - bb.fatal("rootfs.cpio is missing; please deploy rootfs first...") + bb.fatal("rootfs.cpio is missing; please build rootfs first...") - # The destination tree is root-owned (cpio -id), so rsync needs root - # to preserve mode bits / ownership while writing into it. + # The destination tree is root-owned (cpio -id), so rsync needs root to + # preserve mode bits / ownership while writing into it. + d.setVar('ROOTFS_FILENAME', 'rootfs') + __do_rootfs_mount(d) utils_sudo(["rsync", "-a", "--keep-dirlinks", - f"{IB_USR_PATH}/build/deploy/", - f"{IB_ROOTFS_PATH}/fs/"], check=True) - + deploy_src + "/", f"{IB_ROOTFS_PATH}/fs/"], check=True) __do_rootfs_umount(d) } \ No newline at end of file From 87799a0afedbfa64116634e09f9d5fdbe0357f3a Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Sat, 11 Jul 2026 16:14:59 +0200 Subject: [PATCH 28/52] meta-usr: commit the source src/CMakeLists.txt, not the build-modified one The in-tree commit captured src/CMakeLists.txt with the lvgl/graphic subdirectories the lvgl bbappend adds at BUILD time; the committed source must carry only examples+soo (the lvgl patch re-adds the rest). --- linux/usr/src/CMakeLists.txt | 2 -- .../usr/src/soo/{injector.c => s3c-inject.c} | 26 +++++++++---------- linux/usr/src/soo/{melist.c => s3c-list.c} | 6 ++--- .../src/soo/{restoreme.c => s3c-restore.c} | 10 +++---- linux/usr/src/soo/{saveme.c => s3c-save.c} | 4 +-- .../src/soo/{shutdownme.c => s3c-shutdown.c} | 8 +++--- 6 files changed, 27 insertions(+), 29 deletions(-) rename linux/usr/src/soo/{injector.c => s3c-inject.c} (82%) rename linux/usr/src/soo/{melist.c => s3c-list.c} (93%) rename linux/usr/src/soo/{restoreme.c => s3c-restore.c} (82%) rename linux/usr/src/soo/{saveme.c => s3c-save.c} (92%) rename linux/usr/src/soo/{shutdownme.c => s3c-shutdown.c} (83%) diff --git a/linux/usr/src/CMakeLists.txt b/linux/usr/src/CMakeLists.txt index 2a87cd3..3fa96ac 100644 --- a/linux/usr/src/CMakeLists.txt +++ b/linux/usr/src/CMakeLists.txt @@ -1,4 +1,2 @@ add_subdirectory(examples) add_subdirectory(soo) -add_subdirectory(lvgl) -add_subdirectory(graphic) diff --git a/linux/usr/src/soo/injector.c b/linux/usr/src/soo/s3c-inject.c similarity index 82% rename from linux/usr/src/soo/injector.c rename to linux/usr/src/soo/s3c-inject.c index 6963f04..8ed646d 100644 --- a/linux/usr/src/soo/injector.c +++ b/linux/usr/src/soo/s3c-inject.c @@ -51,7 +51,7 @@ * @return int */ int main(int argc, char *argv[]) { - int fd_migration, fd, ret; + int fd_core, fd, ret; int nread, S3C_size; void *S3C_buffer; struct stat filestat; @@ -72,18 +72,18 @@ int main(int argc, char *argv[]) { } if (optind >= argc) { - fprintf(stderr, "Expected ME file path after options\n"); + fprintf(stderr, "Expected S3C file path after options\n"); exit(EXIT_FAILURE); } char *s3c_file_path = argv[optind]; - printf("SOO ME injector (Smart Object Oriented based virtualization framework).\n"); + printf("SOO S3C injector (Smart Object Oriented based virtualization framework).\n"); printf("Version: %s\n", SOO_VERSION); - fd_migration = open(SOO_CORE_DEVICE, O_RDWR); - if (fd_migration < 0) { - printf("Failed to open device: " SOO_CORE_DEVICE " (%d)\n", fd_migration); + fd_core = open(SOO_CORE_DEVICE, O_RDWR); + if (fd_core < 0) { + printf("Failed to open device: " SOO_CORE_DEVICE " (%d)\n", fd_core); exit(EXIT_FAILURE); } @@ -98,16 +98,16 @@ int main(int argc, char *argv[]) { S3C_size = filestat.st_size; - /* Allocate the ME buffer */ + /* Allocate the S3C buffer */ S3C_buffer = malloc(S3C_size); assert(S3C_buffer != NULL); DBG("agency_core: size to read from sd : %d, buffer address : 0x%08lx\n", S3C_size, (unsigned long) S3C_buffer); - /* Read the ME content */ + /* Read the S3C content */ nread = read(fd, S3C_buffer, S3C_size); if (nread < 0) { - printf("Error when reading the ME\n"); + printf("Error when reading the S3C\n"); exit(EXIT_FAILURE); } @@ -116,18 +116,18 @@ int main(int argc, char *argv[]) { args.value = S3C_size; args.slotID = -1; /* Wherever */ - if ((ret = ioctl(fd_migration, AGENCY_IOCTL_INJECT_CAPSULE, &args)) < 0) { - printf("Failed to inject ME (%d)\n", ret); + if ((ret = ioctl(fd_core, AGENCY_IOCTL_INJECT_CAPSULE, &args)) < 0) { + printf("Failed to inject S3C (%d)\n", ret); exit(EXIT_FAILURE); } if (args.slotID == -1) { - printf("No available ME slot further...\n"); + printf("No available S3C slot further...\n"); exit(EXIT_FAILURE); } if (!hold_capsule) { - ioctl(fd_migration, AGENCY_IOCTL_START_CAPSULE, &args); + ioctl(fd_core, AGENCY_IOCTL_START_CAPSULE, &args); } close(fd); diff --git a/linux/usr/src/soo/melist.c b/linux/usr/src/soo/s3c-list.c similarity index 93% rename from linux/usr/src/soo/melist.c rename to linux/usr/src/soo/s3c-list.c index 7caeb04..fd64452 100644 --- a/linux/usr/src/soo/melist.c +++ b/linux/usr/src/soo/s3c-list.c @@ -62,13 +62,13 @@ int main(int argc, char *argv[]) { S3C_id_t id_array[MAX_S3C_DOMAINS]; agency_ioctl_args_t agency_ioctl_args; - printf("*** SOO - SO3 Capsule ID Retrieval ***\n\n"); + printf("*** SOO - Mobile Entity ID Retrieval ***\n\n"); fd_core = open("/dev/soo/core", O_RDWR); assert(fd_core > 0); - /* Prepare to terminate the running ME (dom #2) */ - printf("*** List of residing SO3 Capsules: \n"); + /* Prepare to terminate the running S3C (dom #2) */ + printf("*** List of residing Mobile Entities: \n"); agency_ioctl_args.buffer = &id_array; ioctl(fd_core, AGENCY_IOCTL_GET_S3C_ID_ARRAY, (unsigned long) &agency_ioctl_args); diff --git a/linux/usr/src/soo/restoreme.c b/linux/usr/src/soo/s3c-restore.c similarity index 82% rename from linux/usr/src/soo/restoreme.c rename to linux/usr/src/soo/s3c-restore.c index ede8654..cc5c425 100644 --- a/linux/usr/src/soo/restoreme.c +++ b/linux/usr/src/soo/s3c-restore.c @@ -36,14 +36,14 @@ int main(int argc, char *argv[]) { size_t buffer_size; struct zip_t *zip; - printf("*** SOO - SO3 Capsule snapshot restorer ***\n"); + printf("*** SOO - Mobile Entity snapshot restorer ***\n"); if (argc != 2) { - printf("## Usage is : restoreme where is the file containing the ME snapshot.\n"); + printf("## Usage is : s3c-restore where is the file containing the S3C snapshot.\n"); exit(-1); } - printf("** Now reading the ME snapshot.\n"); + printf("** Now reading the S3C snapshot.\n"); fd_core = open("/dev/soo/core", O_RDWR); assert(fd_core > 0); @@ -63,14 +63,14 @@ int main(int argc, char *argv[]) { zip_close(zip); - printf(" ** ME memory re-implantation and resuming the capsule.\n"); + printf(" ** S3C memory re-implantation and resuming the capsule.\n"); args.slotID = -1; ioctl(fd_core, AGENCY_IOCTL_WRITE_SNAPSHOT, &args); close(fd_core); - printf(" ** ME successfully restored and resumed...\n"); + printf(" ** S3C successfully restored and resumed...\n"); return 0; } diff --git a/linux/usr/src/soo/saveme.c b/linux/usr/src/soo/s3c-save.c similarity index 92% rename from linux/usr/src/soo/saveme.c rename to linux/usr/src/soo/s3c-save.c index ceb9bec..841519d 100644 --- a/linux/usr/src/soo/saveme.c +++ b/linux/usr/src/soo/s3c-save.c @@ -35,10 +35,10 @@ int main(int argc, char *argv[]) { struct zip_t *zip; struct agency_ioctl_args args; - printf("*** SOO - SO3 Capsule snapshot saver ***\n"); + printf("*** SOO - Mobile Entity snapshot saver ***\n"); if (argc != 2) { - printf("## Usage is : saveme where is the file containing the ME snapshot.\n"); + printf("## Usage is : s3c-save where is the file containing the S3C snapshot.\n"); exit(-1); } diff --git a/linux/usr/src/soo/shutdownme.c b/linux/usr/src/soo/s3c-shutdown.c similarity index 83% rename from linux/usr/src/soo/shutdownme.c rename to linux/usr/src/soo/s3c-shutdown.c index e041f18..3ae154f 100644 --- a/linux/usr/src/soo/shutdownme.c +++ b/linux/usr/src/soo/s3c-shutdown.c @@ -30,20 +30,20 @@ int main(int argc, char *argv[]) { int fd_core; agency_ioctl_args_t agency_ioctl_args; - printf("*** SOO - SO3 Capsule shutdown ***\n"); + printf("*** SOO - Mobile Entity shutdown ***\n"); if (argc != 2) { - printf("## Usage is : shutdownme \n"); + printf("## Usage is : s3c-shutdown \n"); exit(-1); } - printf("** Perform a shutdown of ME #%d (slotID %d)...", atoi(argv[1]), atoi(argv[1])+1); + printf("** Perform a shutdown of S3C #%d (slotID %d)...", atoi(argv[1]), atoi(argv[1])+1); fflush(stdout); fd_core = open("/dev/soo/core", O_RDWR); assert(fd_core > 0); - /* Prepare to terminate the running ME (dom #2) */ + /* Prepare to terminate the running S3C (dom #2) */ agency_ioctl_args.slotID = atoi(argv[1]) + 1; From 97d535a78bad2a98f6edbff7b9c0f203cc0f22e8 Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Sat, 11 Jul 2026 16:19:25 +0200 Subject: [PATCH 29/52] meta-usr: adopt the SO3 v6.2.0 s3c-* capsule apps, drop the legacy ones Replace the legacy agency apps (injector, melist, saveme, restoreme, shutdownme) with the s3c-inject/s3c-list/s3c-save/s3c-restore/ s3c-shutdown sources as shipped by SO3 v6.2.0 (SOO configuration), together with its cleaned headers (migration prototypes removed, S3C comments). src/soo/CMakeLists.txt is the v6.2.0 base plus the MICOFE targets (fb_mapper, input_forwarding, emiso_engine); the install lines and the S30soo comment follow the new names. --- .../common/rootfs_overlay/etc/init.d/S30soo | 2 +- .../recipes-usr/soo/usr-linux_1.0.bbappend | 10 +++---- linux/usr/include/core/core.h | 5 ---- linux/usr/include/core/debug.h | 1 - linux/usr/include/core/device_access.h | 2 +- linux/usr/include/soo/debug.h | 1 - linux/usr/include/soo/uapi/soo.h | 26 +++++++++---------- linux/usr/src/soo/CMakeLists.txt | 16 +++++++----- 8 files changed, 29 insertions(+), 34 deletions(-) diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/init.d/S30soo b/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/init.d/S30soo index 14826dc..8ad5df7 100755 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/init.d/S30soo +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/init.d/S30soo @@ -1,7 +1,7 @@ #!/bin/sh # # Create the SOO core device node used by the capsule management -# applications (injector, melist, saveme, ...). The soo core driver +# applications (s3c-inject, s3c-save, ...). The soo core driver # registers char major 126 (soo/core) but does not create the node # itself, and this agency boots with SysVinit (no systemd, no udev) # so it must be created here. diff --git a/build/meta-usr/recipes-usr/soo/usr-linux_1.0.bbappend b/build/meta-usr/recipes-usr/soo/usr-linux_1.0.bbappend index fedd89a..9572521 100644 --- a/build/meta-usr/recipes-usr/soo/usr-linux_1.0.bbappend +++ b/build/meta-usr/recipes-usr/soo/usr-linux_1.0.bbappend @@ -18,11 +18,11 @@ LICENSE = "GPLv2" do_install_apps:append () { if echo ":${OVERRIDES}:" | grep -q ":soo"; then - usr_do_install_file_root "${IB_TARGET}/build/src/soo/injector" - usr_do_install_file_root "${IB_TARGET}/build/src/soo/restoreme" - usr_do_install_file_root "${IB_TARGET}/build/src/soo/saveme" - usr_do_install_file_root "${IB_TARGET}/build/src/soo/melist" - usr_do_install_file_root "${IB_TARGET}/build/src/soo/shutdownme" + usr_do_install_file_root "${IB_TARGET}/build/src/soo/s3c-inject" + usr_do_install_file_root "${IB_TARGET}/build/src/soo/s3c-restore" + usr_do_install_file_root "${IB_TARGET}/build/src/soo/s3c-save" + usr_do_install_file_root "${IB_TARGET}/build/src/soo/s3c-list" + usr_do_install_file_root "${IB_TARGET}/build/src/soo/s3c-shutdown" usr_do_install_file_root "${IB_TARGET}/build/src/soo/fb_mapper" usr_do_install_file_root "${IB_TARGET}/build/src/soo/input_forwarding" diff --git a/linux/usr/include/core/core.h b/linux/usr/include/core/core.h index b59e607..e78b322 100644 --- a/linux/usr/include/core/core.h +++ b/linux/usr/include/core/core.h @@ -41,8 +41,6 @@ extern bool opt_nosend; /* To indicate f the main agency cycle loop is interrupted */ extern bool ag_cycle_interrupted; -int initialize_migration(unsigned int S3C_slotID); - int get_S3C_free_slot(size_t S3C_size); bool get_S3C_id(uint32_t slotID, S3C_id_t *S3C_id); @@ -51,10 +49,7 @@ void read_S3C_snapshot(unsigned int slotID, void **buffer, uint32_t *buffer_size void write_S3C_snapshot(unsigned int slotID, unsigned char *S3C_buffer); void *prepare_S3C_slot(unsigned int slotID); -int finalize_migration(unsigned int slotID); void main_loop(int cycle_period); -void migration_init(void); - #endif /* CORE_H */ diff --git a/linux/usr/include/core/debug.h b/linux/usr/include/core/debug.h index 58a22b3..73ff012 100644 --- a/linux/usr/include/core/debug.h +++ b/linux/usr/include/core/debug.h @@ -38,7 +38,6 @@ #else #define DBG(fmt, ...) -#define RTDBG(fmt, ...) #define DBG0(...) #define DBG_BUFFER(buffer, ...) #define DBG_ON__ diff --git a/linux/usr/include/core/device_access.h b/linux/usr/include/core/device_access.h index 9c32fab..816e8b9 100644 --- a/linux/usr/include/core/device_access.h +++ b/linux/usr/include/core/device_access.h @@ -23,7 +23,7 @@ #define FILENAME_MAX_LEN 80 -#define SOO_S3C_DIRECTORY "/mnt/ME" +#define SOO_S3C_DIRECTORY "/mnt/S3C" #define SOO_BOOT_PART "/mnt/boot/" #define SOO_ROOTFS_P2 "/mnt/rootfs1/" #define SOO_ROOTFS_P4 "/mnt/rootfs2/" diff --git a/linux/usr/include/soo/debug.h b/linux/usr/include/soo/debug.h index 58a22b3..73ff012 100644 --- a/linux/usr/include/soo/debug.h +++ b/linux/usr/include/soo/debug.h @@ -38,7 +38,6 @@ #else #define DBG(fmt, ...) -#define RTDBG(fmt, ...) #define DBG0(...) #define DBG_BUFFER(buffer, ...) #define DBG_ON__ diff --git a/linux/usr/include/soo/uapi/soo.h b/linux/usr/include/soo/uapi/soo.h index 90bf274..3808014 100644 --- a/linux/usr/include/soo/uapi/soo.h +++ b/linux/usr/include/soo/uapi/soo.h @@ -24,15 +24,15 @@ #define MAX_S3C_DOMAINS 5 /* - * ME states: + * S3C states: * - S3C_state_stopped: Capsule is stopped (right after start or later) - * - S3C_state_living: ME is full-functional and activated (all frontend devices are consistent) - * - S3C_state_suspended: ME is suspended before migrating. This state is maintained for the resident ME instance - * - S3C_state_hibernate: ME is in a state of hibernate snapshot - * - S3C_state_resuming: ME ready to perform resuming (after recovering) - * - S3C_state_awakened: ME is just being awakened - * - S3C_state_terminated: ME has been terminated (by a shutdown) - * - S3C_state_dead: ME does not exist + * - S3C_state_living: S3C is full-functional and activated (all frontend devices are consistent) + * - S3C_state_suspended: S3C is suspended (e.g. before taking a snapshot) + * - S3C_state_hibernate: S3C is in a state of hibernate snapshot + * - S3C_state_resuming: S3C ready to perform resuming (after recovering) + * - S3C_state_awakened: S3C is just being awakened + * - S3C_state_terminated: S3C has been terminated (by a shutdown) + * - S3C_state_dead: S3C does not exist */ typedef enum { S3C_state_stopped, @@ -47,17 +47,17 @@ typedef enum { } S3C_state_t; /* Keep information about slot availability - * FREE: the slot is available (no ME) - * BUSY: the slot is allocated a ME + * FREE: the slot is available (no S3C) + * BUSY: the slot is allocated a S3C */ typedef enum { S3C_SLOT_FREE, S3C_SLOT_BUSY } S3C_slotState_t; -/* ME ID related information */ +/* S3C ID related information */ #define S3C_NAME_SIZE 40 #define S3C_SHORTDESC_SIZE 1024 /* - * Definition of ME ID information used by functions which need + * Definition of S3C ID information used by functions which need * to get a list of running MEs with their information. */ typedef struct { @@ -71,7 +71,7 @@ typedef struct { } S3C_id_t; /* - * IOCTL commands for migration. + * IOCTL commands for S3C management. * This part is shared between the kernel and user spaces. */ diff --git a/linux/usr/src/soo/CMakeLists.txt b/linux/usr/src/soo/CMakeLists.txt index c36590d..87d2018 100644 --- a/linux/usr/src/soo/CMakeLists.txt +++ b/linux/usr/src/soo/CMakeLists.txt @@ -1,16 +1,18 @@ -add_executable(injector injector.c) +add_executable(s3c-inject s3c-inject.c) -add_executable(saveme saveme.c) -add_executable(restoreme restoreme.c) -add_executable(shutdownme shutdownme.c) +add_executable(s3c-save s3c-save.c) +add_executable(s3c-restore s3c-restore.c) +add_executable(s3c-shutdown s3c-shutdown.c) -add_executable(melist melist.c) +add_executable(s3c-list s3c-list.c) + +# MICOFE additions: the framebuffer/input forwarders and the EMISO engine add_executable(fb_mapper fb_mapper.c) add_executable(input_forwarding input_forwarding.c) add_subdirectory(emiso_engine) -target_link_libraries(saveme zip) -target_link_libraries(restoreme zip) +target_link_libraries(s3c-save zip) +target_link_libraries(s3c-restore zip) From 902314f01da29f3e7beb062354dc68e97e709996 Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Sat, 11 Jul 2026 16:55:07 +0200 Subject: [PATCH 30/52] Bump SO3/AVZ to v6.2.1-rc and align the bare-linux patch set MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move the so3+avz fetch to the v6.2.1-rc tag (ed2b17916), which carries the s3c user-visible string fixes (so3#277) — re-adopt the fixed 0018-Kconfig/0077-core.c soo patches (virt64 + rpi4 sets) and re-extract the s3c-list/save/restore/shutdown app sources. Align the bare recipes-linux/linux patch set that was still on the 255 baseline: this brings the guest CMA pool 96 -> 160 MB (so3#273), required by the snapshot path (EMISO create/save do a 128 MB dma_alloc) — the EMISO 'container create' used to freeze the agency on the CMA BUG_ON. --- .../0002-virt64_guest.dts.patch | 2 +- .../0001-linux-6.12-r0/0022-virt64.dts.patch | 392 ++++++++++++++++ .../0023-virt64_guest.dts.patch | 428 ++++++++++++++++++ .../0001-linux-6.12-r0/0018-Kconfig.patch | 2 +- .../0001-linux-6.12-r0/0077-core.c.patch | 2 +- .../0018-Kconfig.patch | 2 +- .../0001-linux-6.12-rpi4-r0/0077-core.c.patch | 2 +- build/meta-so3/recipes-so3/avz/avz_6.2.0.bb | 8 +- build/meta-so3/recipes-so3/so3/so3_6.2.0.bb | 8 +- linux/usr/src/soo/s3c-list.c | 4 +- linux/usr/src/soo/s3c-restore.c | 2 +- linux/usr/src/soo/s3c-save.c | 2 +- linux/usr/src/soo/s3c-shutdown.c | 2 +- 13 files changed, 838 insertions(+), 18 deletions(-) create mode 100644 build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0022-virt64.dts.patch create mode 100644 build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0023-virt64_guest.dts.patch diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0002-virt64_guest.dts.patch b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0002-virt64_guest.dts.patch index 37402d6..25cbdf3 100644 --- a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0002-virt64_guest.dts.patch +++ b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0002-virt64_guest.dts.patch @@ -16,7 +16,7 @@ + linux,cma { + compatible = "shared-dma-pool"; + reusable; -+ size = <0x0 0x6000000>; ++ size = <0x0 0xa000000>; + alignment = <0x0 0x1000>; + linux,cma-default; + }; diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0022-virt64.dts.patch b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0022-virt64.dts.patch new file mode 100644 index 0000000..4c08dc8 --- /dev/null +++ b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0022-virt64.dts.patch @@ -0,0 +1,392 @@ +--- a/arch/arm64/boot/dts/arm/virt64.dts ++++ b/arch/arm64/boot/dts/arm/virt64.dts +@@ -0,0 +1,389 @@ ++/dts-v1/; ++ ++/ { ++ interrupt-parent = <0x8001>; ++ #size-cells = <0x02>; ++ #address-cells = <0x02>; ++ compatible = "linux,dummy-virt"; ++ ++ psci { ++ migrate = <0xc4000005>; ++ cpu_on = <0xc4000003>; ++ cpu_off = <0x84000002>; ++ cpu_suspend = <0xc4000001>; ++ method = "hvc"; ++ compatible = "arm,psci-0.2\0arm,psci"; ++ }; ++ ++ memory@40000000 { ++ reg = <0x00 0x40000000 0x0 0x40000000>; ++ device_type = "memory"; ++ }; ++ ++ platform@c000000 { ++ interrupt-parent = <0x8001>; ++ ranges = <0x00 0x00 0xc000000 0x2000000>; ++ #address-cells = <0x01>; ++ #size-cells = <0x01>; ++ compatible = "qemu,platform\0simple-bus"; ++ }; ++ ++ fw-cfg@9020000 { ++ dma-coherent; ++ reg = <0x00 0x9020000 0x00 0x18>; ++ compatible = "qemu,fw-cfg-mmio"; ++ }; ++ ++ virtio_mmio@a000000 { ++ dma-coherent; ++ interrupts = <0x00 0x10 0x01>; ++ reg = <0x00 0xa000000 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a000200 { ++ dma-coherent; ++ interrupts = <0x00 0x11 0x01>; ++ reg = <0x00 0xa000200 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a000400 { ++ dma-coherent; ++ interrupts = <0x00 0x12 0x01>; ++ reg = <0x00 0xa000400 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a000600 { ++ dma-coherent; ++ interrupts = <0x00 0x13 0x01>; ++ reg = <0x00 0xa000600 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a000800 { ++ dma-coherent; ++ interrupts = <0x00 0x14 0x01>; ++ reg = <0x00 0xa000800 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a000a00 { ++ dma-coherent; ++ interrupts = <0x00 0x15 0x01>; ++ reg = <0x00 0xa000a00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a000c00 { ++ dma-coherent; ++ interrupts = <0x00 0x16 0x01>; ++ reg = <0x00 0xa000c00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a000e00 { ++ dma-coherent; ++ interrupts = <0x00 0x17 0x01>; ++ reg = <0x00 0xa000e00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a001000 { ++ dma-coherent; ++ interrupts = <0x00 0x18 0x01>; ++ reg = <0x00 0xa001000 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a001200 { ++ dma-coherent; ++ interrupts = <0x00 0x19 0x01>; ++ reg = <0x00 0xa001200 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a001400 { ++ dma-coherent; ++ interrupts = <0x00 0x1a 0x01>; ++ reg = <0x00 0xa001400 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a001600 { ++ dma-coherent; ++ interrupts = <0x00 0x1b 0x01>; ++ reg = <0x00 0xa001600 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a001800 { ++ dma-coherent; ++ interrupts = <0x00 0x1c 0x01>; ++ reg = <0x00 0xa001800 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a001a00 { ++ dma-coherent; ++ interrupts = <0x00 0x1d 0x01>; ++ reg = <0x00 0xa001a00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a001c00 { ++ dma-coherent; ++ interrupts = <0x00 0x1e 0x01>; ++ reg = <0x00 0xa001c00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a001e00 { ++ dma-coherent; ++ interrupts = <0x00 0x1f 0x01>; ++ reg = <0x00 0xa001e00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a002000 { ++ dma-coherent; ++ interrupts = <0x00 0x20 0x01>; ++ reg = <0x00 0xa002000 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a002200 { ++ dma-coherent; ++ interrupts = <0x00 0x21 0x01>; ++ reg = <0x00 0xa002200 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a002400 { ++ dma-coherent; ++ interrupts = <0x00 0x22 0x01>; ++ reg = <0x00 0xa002400 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a002600 { ++ dma-coherent; ++ interrupts = <0x00 0x23 0x01>; ++ reg = <0x00 0xa002600 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a002800 { ++ dma-coherent; ++ interrupts = <0x00 0x24 0x01>; ++ reg = <0x00 0xa002800 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a002a00 { ++ dma-coherent; ++ interrupts = <0x00 0x25 0x01>; ++ reg = <0x00 0xa002a00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a002c00 { ++ dma-coherent; ++ interrupts = <0x00 0x26 0x01>; ++ reg = <0x00 0xa002c00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a002e00 { ++ dma-coherent; ++ interrupts = <0x00 0x27 0x01>; ++ reg = <0x00 0xa002e00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a003000 { ++ dma-coherent; ++ interrupts = <0x00 0x28 0x01>; ++ reg = <0x00 0xa003000 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a003200 { ++ dma-coherent; ++ interrupts = <0x00 0x29 0x01>; ++ reg = <0x00 0xa003200 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a003400 { ++ dma-coherent; ++ interrupts = <0x00 0x2a 0x01>; ++ reg = <0x00 0xa003400 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a003600 { ++ dma-coherent; ++ interrupts = <0x00 0x2b 0x01>; ++ reg = <0x00 0xa003600 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a003800 { ++ dma-coherent; ++ interrupts = <0x00 0x2c 0x01>; ++ reg = <0x00 0xa003800 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a003a00 { ++ dma-coherent; ++ interrupts = <0x00 0x2d 0x01>; ++ reg = <0x00 0xa003a00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a003c00 { ++ dma-coherent; ++ interrupts = <0x00 0x2e 0x01>; ++ reg = <0x00 0xa003c00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a003e00 { ++ dma-coherent; ++ interrupts = <0x00 0x2f 0x01>; ++ reg = <0x00 0xa003e00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ gpio-keys { ++ #address-cells = <0x01>; ++ #size-cells = <0x00>; ++ compatible = "gpio-keys"; ++ ++ poweroff { ++ gpios = <&pl061 0x03 0x00>; ++ linux,code = <0x74>; ++ label = "GPIO Key Poweroff"; ++ }; ++ }; ++ ++ pl061: pl061@9030000 { ++ clock-names = "apb_pclk"; ++ clocks = <&apb_clk>; ++ interrupts = <0x00 0x07 0x04>; ++ gpio-controller; ++ #gpio-cells = <0x02>; ++ compatible = "arm,pl061\0arm,primecell"; ++ reg = <0x00 0x9030000 0x00 0x1000>; ++ }; ++ ++ pcie@10000000 { ++ interrupt-map-mask = <0x1800 0x00 0x00 0x07>; ++ interrupt-map = <0x00 0x00 0x00 0x01 0x8001 0x00 0x00 0x00 0x03 0x04 0x00 0x00 0x00 0x02 0x8001 0x00 0x00 0x00 0x04 0x04 0x00 0x00 0x00 0x03 0x8001 0x00 0x00 0x00 0x05 0x04 0x00 0x00 0x00 0x04 0x8001 0x00 0x00 0x00 0x06 0x04 0x800 0x00 0x00 0x01 0x8001 0x00 0x00 0x00 0x04 0x04 0x800 0x00 0x00 0x02 0x8001 0x00 0x00 0x00 0x05 0x04 0x800 0x00 0x00 0x03 0x8001 0x00 0x00 0x00 0x06 0x04 0x800 0x00 0x00 0x04 0x8001 0x00 0x00 0x00 0x03 0x04 0x1000 0x00 0x00 0x01 0x8001 0x00 0x00 0x00 0x05 0x04 0x1000 0x00 0x00 0x02 0x8001 0x00 0x00 0x00 0x06 0x04 0x1000 0x00 0x00 0x03 0x8001 0x00 0x00 0x00 0x03 0x04 0x1000 0x00 0x00 0x04 0x8001 0x00 0x00 0x00 0x04 0x04 0x1800 0x00 0x00 0x01 0x8001 0x00 0x00 0x00 0x06 0x04 0x1800 0x00 0x00 0x02 0x8001 0x00 0x00 0x00 0x03 0x04 0x1800 0x00 0x00 0x03 0x8001 0x00 0x00 0x00 0x04 0x04 0x1800 0x00 0x00 0x04 0x8001 0x00 0x00 0x00 0x05 0x04>; ++ #interrupt-cells = <0x01>; ++ ranges = <0x1000000 0x00 0x00 0x00 0x3eff0000 0x00 0x10000 0x2000000 0x00 0x10000000 0x00 0x10000000 0x00 0x2eff0000 0x3000000 0x80 0x00 0x80 0x00 0x80 0x00>; ++ reg = <0x40 0x10000000 0x00 0x10000000>; ++ msi-parent = <&v2m>; ++ dma-coherent; ++ bus-range = <0x00 0xff>; ++ linux,pci-domain = <0x00>; ++ #size-cells = <0x02>; ++ #address-cells = <0x03>; ++ device_type = "pci"; ++ compatible = "pci-host-ecam-generic"; ++ }; ++ ++ pl031@9010000 { ++ clock-names = "apb_pclk"; ++ clocks = <&apb_clk>; ++ interrupts = <0x00 0x02 0x04>; ++ reg = <0x00 0x9010000 0x00 0x1000>; ++ compatible = "arm,pl031\0arm,primecell"; ++ }; ++ ++ pl011@9000000 { ++ clock-names = "uartclk\0apb_pclk"; ++ clocks = <&apb_clk &apb_clk>; ++ interrupts = <0x00 0x01 0x04>; ++ reg = <0x00 0x9000000 0x00 0x1000>; ++ compatible = "arm,pl011\0arm,primecell"; ++ }; ++ ++ pmu { ++ interrupts = <0x01 0x07 0xf04>; ++ compatible = "arm,armv8-pmuv3"; ++ }; ++ ++ intc@8000000 { ++ phandle = <0x8001>; ++ reg = <0x00 0x8000000 0x00 0x10000 0x00 0x8010000 0x00 0x10000>; ++ compatible = "arm,cortex-a15-gic"; ++ ranges; ++ #size-cells = <0x02>; ++ #address-cells = <0x02>; ++ interrupt-controller; ++ #interrupt-cells = <0x03>; ++ ++ v2m: v2m@8020000 { ++ reg = <0x00 0x8020000 0x00 0x1000>; ++ msi-controller; ++ compatible = "arm,gic-v2m-frame"; ++ }; ++ }; ++ ++ flash@0 { ++ bank-width = <0x04>; ++ reg = <0x00 0x00 0x00 0x4000000 0x00 0x4000000 0x00 0x4000000>; ++ compatible = "cfi-flash"; ++ }; ++ ++ cpus { ++ #size-cells = <0x00>; ++ #address-cells = <0x01>; ++ ++ cpu@0 { ++ reg = <0x00>; ++ enable-method = "psci"; ++ compatible = "arm,cortex-a72"; ++ device_type = "cpu"; ++ }; ++ ++ cpu@1 { ++ reg = <0x01>; ++ enable-method = "psci"; ++ compatible = "arm,cortex-a72"; ++ device_type = "cpu"; ++ }; ++ ++ cpu@2 { ++ reg = <0x02>; ++ enable-method = "psci"; ++ compatible = "arm,cortex-a72"; ++ device_type = "cpu"; ++ }; ++ ++ cpu@3 { ++ reg = <0x03>; ++ enable-method = "psci"; ++ compatible = "arm,cortex-a72"; ++ device_type = "cpu"; ++ }; ++ }; ++ ++ timer { ++ interrupts = <0x01 0x0d 0xf04 0x01 0x0e 0xf04 0x01 0x0b 0xf04 0x01 0x0a 0xf04>; ++ always-on; ++ compatible = "arm,armv8-timer\0arm,armv7-timer"; ++ }; ++ ++ apb_clk: apb-pclk { ++ clock-output-names = "clk24mhz"; ++ clock-frequency = <0x16e3600>; ++ #clock-cells = <0x00>; ++ compatible = "fixed-clock"; ++ }; ++ ++}; diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0023-virt64_guest.dts.patch b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0023-virt64_guest.dts.patch new file mode 100644 index 0000000..ef33a72 --- /dev/null +++ b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-r0/0023-virt64_guest.dts.patch @@ -0,0 +1,428 @@ +--- a/arch/arm64/boot/dts/arm/virt64_guest.dts ++++ b/arch/arm64/boot/dts/arm/virt64_guest.dts +@@ -0,0 +1,425 @@ ++/dts-v1/; ++ ++/ { ++ interrupt-parent = <0x8001>; ++ #size-cells = <0x02>; ++ #address-cells = <0x02>; ++ compatible = "linux,dummy-virt"; ++ ++ reserved-memory { ++ #address-cells = <2>; ++ #size-cells = <2>; ++ ranges; ++ linux,cma { ++ compatible = "shared-dma-pool"; ++ reusable; ++ size = <0x0 0x6000000>; ++ alignment = <0x0 0x1000>; ++ linux,cma-default; ++ }; ++ }; ++ ++ console { ++ focus-dom-max = <3>; ++ }; ++ ++ psci { ++ migrate = <0xc4000005>; ++ cpu_on = <0xc4000003>; ++ cpu_off = <0x84000002>; ++ cpu_suspend = <0xc4000001>; ++ method = "hvc"; ++ compatible = "arm,psci-0.2\0arm,psci"; ++ }; ++ ++ memory@41000000 { ++ reg = <0x00 0x41000000 0x00 0x20000000>; ++ device_type = "memory"; ++ }; ++ ++ platform@c000000 { ++ interrupt-parent = <0x8001>; ++ ranges = <0x00 0x00 0xc000000 0x2000000>; ++ #address-cells = <0x01>; ++ #size-cells = <0x01>; ++ compatible = "qemu,platform\0simple-bus"; ++ }; ++ ++ fw-cfg@9020000 { ++ dma-coherent; ++ reg = <0x00 0x9020000 0x00 0x18>; ++ compatible = "qemu,fw-cfg-mmio"; ++ }; ++ ++ virtio_mmio@a000000 { ++ dma-coherent; ++ interrupts = <0x00 0x10 0x01>; ++ reg = <0x00 0xa000000 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a000200 { ++ dma-coherent; ++ interrupts = <0x00 0x11 0x01>; ++ reg = <0x00 0xa000200 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a000400 { ++ dma-coherent; ++ interrupts = <0x00 0x12 0x01>; ++ reg = <0x00 0xa000400 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a000600 { ++ dma-coherent; ++ interrupts = <0x00 0x13 0x01>; ++ reg = <0x00 0xa000600 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a000800 { ++ dma-coherent; ++ interrupts = <0x00 0x14 0x01>; ++ reg = <0x00 0xa000800 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a000a00 { ++ dma-coherent; ++ interrupts = <0x00 0x15 0x01>; ++ reg = <0x00 0xa000a00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a000c00 { ++ dma-coherent; ++ interrupts = <0x00 0x16 0x01>; ++ reg = <0x00 0xa000c00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a000e00 { ++ dma-coherent; ++ interrupts = <0x00 0x17 0x01>; ++ reg = <0x00 0xa000e00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a001000 { ++ dma-coherent; ++ interrupts = <0x00 0x18 0x01>; ++ reg = <0x00 0xa001000 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a001200 { ++ dma-coherent; ++ interrupts = <0x00 0x19 0x01>; ++ reg = <0x00 0xa001200 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a001400 { ++ dma-coherent; ++ interrupts = <0x00 0x1a 0x01>; ++ reg = <0x00 0xa001400 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a001600 { ++ dma-coherent; ++ interrupts = <0x00 0x1b 0x01>; ++ reg = <0x00 0xa001600 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a001800 { ++ dma-coherent; ++ interrupts = <0x00 0x1c 0x01>; ++ reg = <0x00 0xa001800 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a001a00 { ++ dma-coherent; ++ interrupts = <0x00 0x1d 0x01>; ++ reg = <0x00 0xa001a00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a001c00 { ++ dma-coherent; ++ interrupts = <0x00 0x1e 0x01>; ++ reg = <0x00 0xa001c00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a001e00 { ++ dma-coherent; ++ interrupts = <0x00 0x1f 0x01>; ++ reg = <0x00 0xa001e00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a002000 { ++ dma-coherent; ++ interrupts = <0x00 0x20 0x01>; ++ reg = <0x00 0xa002000 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a002200 { ++ dma-coherent; ++ interrupts = <0x00 0x21 0x01>; ++ reg = <0x00 0xa002200 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a002400 { ++ dma-coherent; ++ interrupts = <0x00 0x22 0x01>; ++ reg = <0x00 0xa002400 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a002600 { ++ dma-coherent; ++ interrupts = <0x00 0x23 0x01>; ++ reg = <0x00 0xa002600 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a002800 { ++ dma-coherent; ++ interrupts = <0x00 0x24 0x01>; ++ reg = <0x00 0xa002800 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a002a00 { ++ dma-coherent; ++ interrupts = <0x00 0x25 0x01>; ++ reg = <0x00 0xa002a00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a002c00 { ++ dma-coherent; ++ interrupts = <0x00 0x26 0x01>; ++ reg = <0x00 0xa002c00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a002e00 { ++ dma-coherent; ++ interrupts = <0x00 0x27 0x01>; ++ reg = <0x00 0xa002e00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a003000 { ++ dma-coherent; ++ interrupts = <0x00 0x28 0x01>; ++ reg = <0x00 0xa003000 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a003200 { ++ dma-coherent; ++ interrupts = <0x00 0x29 0x01>; ++ reg = <0x00 0xa003200 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a003400 { ++ dma-coherent; ++ interrupts = <0x00 0x2a 0x01>; ++ reg = <0x00 0xa003400 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a003600 { ++ dma-coherent; ++ interrupts = <0x00 0x2b 0x01>; ++ reg = <0x00 0xa003600 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a003800 { ++ dma-coherent; ++ interrupts = <0x00 0x2c 0x01>; ++ reg = <0x00 0xa003800 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a003a00 { ++ dma-coherent; ++ interrupts = <0x00 0x2d 0x01>; ++ reg = <0x00 0xa003a00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a003c00 { ++ dma-coherent; ++ interrupts = <0x00 0x2e 0x01>; ++ reg = <0x00 0xa003c00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ virtio_mmio@a003e00 { ++ dma-coherent; ++ interrupts = <0x00 0x2f 0x01>; ++ reg = <0x00 0xa003e00 0x00 0x200>; ++ compatible = "virtio,mmio"; ++ }; ++ ++ pcie@10000000 { ++ interrupt-map-mask = <0x1800 0x00 0x00 0x07>; ++ interrupt-map = <0x00 0x00 0x00 0x01 0x8001 0x00 0x00 0x00 0x03 0x04 0x00 0x00 0x00 0x02 0x8001 0x00 0x00 0x00 0x04 0x04 0x00 0x00 0x00 0x03 0x8001 0x00 0x00 0x00 0x05 0x04 0x00 0x00 0x00 0x04 0x8001 0x00 0x00 0x00 0x06 0x04 0x800 0x00 0x00 0x01 0x8001 0x00 0x00 0x00 0x04 0x04 0x800 0x00 0x00 0x02 0x8001 0x00 0x00 0x00 0x05 0x04 0x800 0x00 0x00 0x03 0x8001 0x00 0x00 0x00 0x06 0x04 0x800 0x00 0x00 0x04 0x8001 0x00 0x00 0x00 0x03 0x04 0x1000 0x00 0x00 0x01 0x8001 0x00 0x00 0x00 0x05 0x04 0x1000 0x00 0x00 0x02 0x8001 0x00 0x00 0x00 0x06 0x04 0x1000 0x00 0x00 0x03 0x8001 0x00 0x00 0x00 0x03 0x04 0x1000 0x00 0x00 0x04 0x8001 0x00 0x00 0x00 0x04 0x04 0x1800 0x00 0x00 0x01 0x8001 0x00 0x00 0x00 0x06 0x04 0x1800 0x00 0x00 0x02 0x8001 0x00 0x00 0x00 0x03 0x04 0x1800 0x00 0x00 0x03 0x8001 0x00 0x00 0x00 0x04 0x04 0x1800 0x00 0x00 0x04 0x8001 0x00 0x00 0x00 0x05 0x04>; ++ #interrupt-cells = <0x01>; ++ ranges = <0x1000000 0x00 0x00 0x00 0x3eff0000 0x00 0x10000 0x2000000 0x00 0x10000000 0x00 0x10000000 0x00 0x2eff0000 0x3000000 0x80 0x00 0x80 0x00 0x80 0x00>; ++ reg = <0x40 0x10000000 0x00 0x10000000>; ++ msi-parent = <&v2m>; ++ dma-coherent; ++ bus-range = <0x00 0xff>; ++ linux,pci-domain = <0x00>; ++ #size-cells = <0x02>; ++ #address-cells = <0x03>; ++ device_type = "pci"; ++ compatible = "pci-host-ecam-generic"; ++ }; ++ ++ pl011@9000000 { ++ clock-names = "uartclk\0apb_pclk"; ++ clocks = <&apb_clk &apb_clk>; ++ interrupts = <0x00 0x01 0x04>; ++ reg = <0x00 0x9000000 0x00 0x1000>; ++ compatible = "arm,pl011\0arm,primecell"; ++ }; ++ ++ pmu { ++ interrupts = <0x01 0x07 0xf04>; ++ compatible = "arm,armv8-pmuv3"; ++ }; ++ ++ intc@8000000 { ++ phandle = <0x8001>; ++ reg = <0x00 0x8000000 0x00 0x10000 0x00 0x8010000 0x00 0x10000>; ++ compatible = "arm,cortex-a15-gic"; ++ ranges; ++ #size-cells = <0x02>; ++ #address-cells = <0x02>; ++ interrupt-controller; ++ #interrupt-cells = <0x03>; ++ ++ v2m: v2m@8020000 { ++ reg = <0x00 0x8020000 0x00 0x1000>; ++ msi-controller; ++ compatible = "arm,gic-v2m-frame"; ++ }; ++ }; ++ ++ flash@0 { ++ bank-width = <0x04>; ++ reg = <0x00 0x00 0x00 0x4000000 0x00 0x4000000 0x00 0x4000000>; ++ compatible = "cfi-flash"; ++ }; ++ ++ cpus { ++ #size-cells = <0x00>; ++ #address-cells = <0x01>; ++ ++ cpu@0 { ++ reg = <0x00>; ++ enable-method = "psci"; ++ compatible = "arm,cortex-a72"; ++ device_type = "cpu"; ++ }; ++ ++ cpu@1 { ++ reg = <0x01>; ++ enable-method = "psci"; ++ compatible = "arm,cortex-a72"; ++ device_type = "cpu"; ++ }; ++ ++ cpu@2 { ++ reg = <0x02>; ++ enable-method = "psci"; ++ compatible = "arm,cortex-a72"; ++ device_type = "cpu"; ++ }; ++ ++ cpu@3 { ++ reg = <0x03>; ++ enable-method = "psci"; ++ compatible = "arm,cortex-a72"; ++ device_type = "cpu"; ++ }; ++ }; ++ ++ timer { ++ interrupts = <0x01 0x0d 0xf04 0x01 0x0e 0xf04 0x01 0x0b 0xf04 0x01 0x0a 0xf04>; ++ always-on; ++ compatible = "arm,armv8-timer\0arm,armv7-timer"; ++ }; ++ ++ apb_clk: apb-pclk { ++ clock-output-names = "clk24mhz"; ++ clock-frequency = <0x16e3600>; ++ #clock-cells = <0x00>; ++ compatible = "fixed-clock"; ++ }; ++ ++ clcd_clk: clcd-clk { ++ compatible = "fixed-clock"; ++ #clock-cells = <0x00>; ++ clock-frequency = <25175000>; ++ clock-output-names = "clcdclk"; ++ }; ++ ++ panel: panel { ++ compatible = "panel-dpi"; ++ width-mm = <152>; ++ height-mm = <91>; ++ ++ panel-timing { ++ clock-frequency = <25175000>; ++ hactive = <640>; ++ vactive = <480>; ++ hback-porch = <48>; ++ hfront-porch = <16>; ++ hsync-len = <96>; ++ vback-porch = <33>; ++ vfront-porch = <10>; ++ vsync-len = <2>; ++ hsync-active = <0>; ++ vsync-active = <0>; ++ de-active = <1>; ++ pixelclk-active = <0>; ++ }; ++ ++ port { ++ panel_in: endpoint { ++ remote-endpoint = <&clcd_out>; ++ }; ++ }; ++ }; ++ ++ clcd@8800000 { ++ compatible = "arm,pl111", "arm,primecell"; ++ reg = <0x00 0x8800000 0x00 0x1000>; ++ interrupts = <0x00 0x0a 0x04>; ++ clocks = <&clcd_clk>, <&apb_clk>; ++ clock-names = "clcdclk", "apb_pclk"; ++ ++ port { ++ clcd_out: endpoint { ++ remote-endpoint = <&panel_in>; ++ }; ++ }; ++ }; ++ ++}; diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0018-Kconfig.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0018-Kconfig.patch index febe962..a013df5 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0018-Kconfig.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0018-Kconfig.patch @@ -12,7 +12,7 @@ + bool "SOO vDummy support for debugging and testing" + +config VUART_BACKEND -+ bool "vuart UART Backend support for SOO Mobile Entity consoles" ++ bool "vuart UART Backend support for SO3 capsule consoles" + select SERIAL_CORE_CONSOLE + +config VLEDS_BACKEND diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0077-core.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0077-core.c.patch index 1c4f2e8..b477725 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0077-core.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0077-core.c.patch @@ -219,7 +219,7 @@ + int slotID; + S3C_desc_t desc; + -+ lprintk("%s: !! Now terminating all Mobile Entities of this smart object...\n", ++ lprintk("%s: !! Now terminating all SO3 capsules of this smart object...\n", + __func__); + + for (slotID = 2; slotID < MAX_DOMAINS; slotID++) { diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0018-Kconfig.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0018-Kconfig.patch index febe962..a013df5 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0018-Kconfig.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0018-Kconfig.patch @@ -12,7 +12,7 @@ + bool "SOO vDummy support for debugging and testing" + +config VUART_BACKEND -+ bool "vuart UART Backend support for SOO Mobile Entity consoles" ++ bool "vuart UART Backend support for SO3 capsule consoles" + select SERIAL_CORE_CONSOLE + +config VLEDS_BACKEND diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0077-core.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0077-core.c.patch index 2e5e5f6..aa7dce3 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0077-core.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0077-core.c.patch @@ -219,7 +219,7 @@ + int slotID; + S3C_desc_t desc; + -+ lprintk("%s: !! Now terminating all Mobile Entities of this smart object...\n", ++ lprintk("%s: !! Now terminating all SO3 capsules of this smart object...\n", + __func__); + + for (slotID = 2; slotID < MAX_DOMAINS; slotID++) { diff --git a/build/meta-so3/recipes-so3/avz/avz_6.2.0.bb b/build/meta-so3/recipes-so3/avz/avz_6.2.0.bb index a930ff0..d159e73 100644 --- a/build/meta-so3/recipes-so3/avz/avz_6.2.0.bb +++ b/build/meta-so3/recipes-so3/avz/avz_6.2.0.bb @@ -19,12 +19,12 @@ IB_TARGET = "${IB_AVZ_PATH}" # MICOFE is a separate repository and does not embed the SO3/AVZ sources, so # AVZ is FETCHED from the SO3 repo (unlike the SO3 tree itself, which builds -# in place). Pinned to the SO3 v6.2.0 release tag (build-system→infrabase + -# SOO capsule + new logo). The bitbake git fetcher takes the tag's commit as +# in place). Pinned to the SO3 release tag IB_SO3_TAG (see below; +# the bitbake git fetcher takes the tag's commit as # SRCREV; IB_SO3_TAG records the human-readable tag it corresponds to. -IB_SO3_TAG = "v6.2.0" +IB_SO3_TAG = "v6.2.1-rc" SRC_URI = "git://github.com/smartobjectoriented/so3.git;nobranch=1;protocol=https" -SRCREV = "c6001712742296973b1a601f58a7db91b3abbffe" +SRCREV = "ed2b17916eaa06259c6df7b373c4700628cc3bbc" # MICOFE-specific AVZ patches applied on top of the fetched SO3 tree. # Generate/refresh the set with `bitbake avz -c updiff` (do_diffcompose diff --git a/build/meta-so3/recipes-so3/so3/so3_6.2.0.bb b/build/meta-so3/recipes-so3/so3/so3_6.2.0.bb index 7ca7640..de9e961 100644 --- a/build/meta-so3/recipes-so3/so3/so3_6.2.0.bb +++ b/build/meta-so3/recipes-so3/so3/so3_6.2.0.bb @@ -21,12 +21,12 @@ IB_TARGET = "${IB_SO3_PATH}" # MICOFE is a separate repository and does not embed the SO3 sources, so the # kernel is FETCHED from the SO3 repo (unlike the SO3 tree itself, which builds -# in place). Pinned to the SO3 v6.2.0 release tag (build-system→infrabase + -# SOO capsule + new logo). The bitbake git fetcher takes the tag's commit as +# in place). Pinned to the SO3 release tag IB_SO3_TAG (see below; +# the bitbake git fetcher takes the tag's commit as # SRCREV; IB_SO3_TAG records the human-readable tag it corresponds to. -IB_SO3_TAG = "v6.2.0" +IB_SO3_TAG = "v6.2.1-rc" SRC_URI = "git://github.com/smartobjectoriented/so3.git;nobranch=1;protocol=https" -SRCREV = "c6001712742296973b1a601f58a7db91b3abbffe" +SRCREV = "ed2b17916eaa06259c6df7b373c4700628cc3bbc" # MICOFE-specific SO3 patches applied on top of the fetched tree. # Generate/refresh the set with `bitbake so3 -c updiff` (do_diffcompose diff --git a/linux/usr/src/soo/s3c-list.c b/linux/usr/src/soo/s3c-list.c index fd64452..149c9f5 100644 --- a/linux/usr/src/soo/s3c-list.c +++ b/linux/usr/src/soo/s3c-list.c @@ -62,13 +62,13 @@ int main(int argc, char *argv[]) { S3C_id_t id_array[MAX_S3C_DOMAINS]; agency_ioctl_args_t agency_ioctl_args; - printf("*** SOO - Mobile Entity ID Retrieval ***\n\n"); + printf("*** SOO - SO3 Capsule ID Retrieval ***\n\n"); fd_core = open("/dev/soo/core", O_RDWR); assert(fd_core > 0); /* Prepare to terminate the running S3C (dom #2) */ - printf("*** List of residing Mobile Entities: \n"); + printf("*** List of residing SO3 Capsules: \n"); agency_ioctl_args.buffer = &id_array; ioctl(fd_core, AGENCY_IOCTL_GET_S3C_ID_ARRAY, (unsigned long) &agency_ioctl_args); diff --git a/linux/usr/src/soo/s3c-restore.c b/linux/usr/src/soo/s3c-restore.c index cc5c425..07b6bcd 100644 --- a/linux/usr/src/soo/s3c-restore.c +++ b/linux/usr/src/soo/s3c-restore.c @@ -36,7 +36,7 @@ int main(int argc, char *argv[]) { size_t buffer_size; struct zip_t *zip; - printf("*** SOO - Mobile Entity snapshot restorer ***\n"); + printf("*** SOO - SO3 Capsule snapshot restorer ***\n"); if (argc != 2) { printf("## Usage is : s3c-restore where is the file containing the S3C snapshot.\n"); diff --git a/linux/usr/src/soo/s3c-save.c b/linux/usr/src/soo/s3c-save.c index 841519d..6643347 100644 --- a/linux/usr/src/soo/s3c-save.c +++ b/linux/usr/src/soo/s3c-save.c @@ -35,7 +35,7 @@ int main(int argc, char *argv[]) { struct zip_t *zip; struct agency_ioctl_args args; - printf("*** SOO - Mobile Entity snapshot saver ***\n"); + printf("*** SOO - SO3 Capsule snapshot saver ***\n"); if (argc != 2) { printf("## Usage is : s3c-save where is the file containing the S3C snapshot.\n"); diff --git a/linux/usr/src/soo/s3c-shutdown.c b/linux/usr/src/soo/s3c-shutdown.c index 3ae154f..c198cd8 100644 --- a/linux/usr/src/soo/s3c-shutdown.c +++ b/linux/usr/src/soo/s3c-shutdown.c @@ -30,7 +30,7 @@ int main(int argc, char *argv[]) { int fd_core; agency_ioctl_args_t agency_ioctl_args; - printf("*** SOO - Mobile Entity shutdown ***\n"); + printf("*** SOO - SO3 Capsule shutdown ***\n"); if (argc != 2) { printf("## Usage is : s3c-shutdown \n"); From b1d76bcfa684bc5f1ae610ebf56b3d30d679f847 Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Sat, 11 Jul 2026 17:38:35 +0200 Subject: [PATCH 31/52] meta-rootfs: route the capsule logs with the S3C prefix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Align the remaining rootfs overlay files on SO3 v6.2.1-rc: syslog-ng still parsed the old [ME:] prefix and wrote me_.log while the vlogs driver has been tagging [S3C:] since the rename — per-capsule logs were silently unrouted. Also adopt the s3c wording in S30soo, the /mnt/s3c fstab mount points (rpi4/virt32) and the inittab.d keep. --- .../board/common/rootfs_overlay/etc/init.d/S30soo | 4 ++-- .../common/rootfs_overlay/etc/inittab.d/.gitkeep | 6 ++++++ .../board/common/rootfs_overlay/etc/syslog-ng.conf | 14 +++++++------- .../files/board/rpi4/rootfs_overlay/etc/fstab | 2 +- .../files/board/virt32/rootfs_overlay/etc/fstab | 2 +- 5 files changed, 17 insertions(+), 11 deletions(-) create mode 100644 build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/inittab.d/.gitkeep diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/init.d/S30soo b/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/init.d/S30soo index 8ad5df7..781f371 100755 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/init.d/S30soo +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/init.d/S30soo @@ -3,8 +3,8 @@ # Create the SOO core device node used by the capsule management # applications (s3c-inject, s3c-save, ...). The soo core driver # registers char major 126 (soo/core) but does not create the node -# itself, and this agency boots with SysVinit (no systemd, no udev) -# so it must be created here. +# itself, and this rootfs boots with busybox init (no systemd, no +# udev) so it must be created here. case "$1" in start) diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/inittab.d/.gitkeep b/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/inittab.d/.gitkeep new file mode 100644 index 0000000..33fe2a8 --- /dev/null +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/inittab.d/.gitkeep @@ -0,0 +1,6 @@ +# Placeholder so /etc/inittab.d exists in the rootfs. +# +# sysvinit >= 3.04 scans /etc/inittab.d/*.conf in addition to /etc/inittab +# and prints "INIT: No inittab.d directory found" when the directory is +# absent. Shipping the (empty) directory silences that boot message. Only +# *.conf snippets are read here, so this file is ignored by init. diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/syslog-ng.conf b/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/syslog-ng.conf index fd12fa8..3d3f708 100644 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/syslog-ng.conf +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/common/rootfs_overlay/etc/syslog-ng.conf @@ -25,16 +25,16 @@ source s_kernel { }; # Define a custom parser -parser p_me { +parser p_s3c { regexp-parser( prefix("parsed_") - patterns('\[ME:(?\d+)\].*$') + patterns('\[S3C:(?\d+)\].*$') ); }; -# Logging of MEs -destination d_me { - file("/var/log/soo/me_${parsed_id}.log" +# Logging of capsules +destination d_s3c { + file("/var/log/soo/s3c_${parsed_id}.log" # It’s good to ensure directory creation and permissions create_dirs(yes) dir_owner("root") @@ -49,6 +49,6 @@ destination d_me { log { source(s_kernel); - parser(p_me); - destination(d_me); + parser(p_s3c); + destination(d_s3c); }; diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/etc/fstab b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/etc/fstab index 61eb11e..3a3abb0 100644 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/etc/fstab +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4/rootfs_overlay/etc/fstab @@ -8,7 +8,7 @@ tmpfs /run tmpfs mode=0755,nosuid,nodev 0 0 sysfs /sys sysfs defaults 0 0 /dev/mmcblk0p1 /mnt/boot vfat defaults 0 2 /dev/mmcblk0p2 /mnt/rootfs1 ext4 defaults 0 2 -/dev/mmcblk0p3 /mnt/ME ext4 defaults 0 2 +/dev/mmcblk0p3 /mnt/s3c ext4 defaults 0 2 /dev/mmcblk0p4 /mnt/rootfs2 ext4 defaults 0 2 diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/virt32/rootfs_overlay/etc/fstab b/build/meta-rootfs/recipes-rootfs/linux/files/board/virt32/rootfs_overlay/etc/fstab index b3380d9..bf4f5f2 100644 --- a/build/meta-rootfs/recipes-rootfs/linux/files/board/virt32/rootfs_overlay/etc/fstab +++ b/build/meta-rootfs/recipes-rootfs/linux/files/board/virt32/rootfs_overlay/etc/fstab @@ -6,5 +6,5 @@ tmpfs /dev/shm tmpfs mode=0777 0 0 tmpfs /tmp tmpfs mode=1777 0 0 tmpfs /run tmpfs mode=0755,nosuid,nodev 0 0 sysfs /sys sysfs defaults 0 0 -/dev/vda3 /mnt/ME ext4 defaults 0 2 +/dev/vda3 /mnt/s3c ext4 defaults 0 2 From c3ab272ff9827e55ad9fc1673e5c5b0574d789fe Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Sat, 11 Jul 2026 17:38:35 +0200 Subject: [PATCH 32/52] doc: describe the aligned build system and refresh EMISO/glossary Add a Build system chapter covering the SO3 v6.2.1-rc-aligned Infrabase workflow: source model (fetched so3/avz vs in-tree usr apps), positional build.sh/deploy.sh, the ITS render model, IB_RAMFS_SOURCE two-stage boot, the guest-boot two-ITB chain and the s3c-* capsule lifecycle. EMISO: S3C terminology, the real image store (/mnt/capsules/image), the SysVinit note for the systemd unit, s3c_.log paths and a validated REST quick-validation walkthrough (ping/version/images, create/start, CMA requirement). Glossary: Mobile Entity marked historical, SO3 Capsule (S3C) entry added; build chapter wired into the toctree. --- doc/source/build.rst | 110 ++++++++++++++++++++++++++++++++++++++++ doc/source/emiso.rst | 67 ++++++++++++++++++++---- doc/source/glossary.rst | 10 +++- doc/source/index.rst | 1 + 4 files changed, 176 insertions(+), 12 deletions(-) create mode 100644 doc/source/build.rst diff --git a/doc/source/build.rst b/doc/source/build.rst new file mode 100644 index 0000000..3727aa1 --- /dev/null +++ b/doc/source/build.rst @@ -0,0 +1,110 @@ +.. _build: + +Build system +############ + +MICOFE is built with the **Infrabase** build system (bitbake based), aligned on +the SO3 release the framework is pinned to (currently the ``v6.2.1-rc`` tag). +The build tree follows the SO3 reference model: shared recipes and scripts are +kept identical to SO3, and only genuine MICOFE additions (the framebuffer/input +forwarding, the EMISO engine, the agency applications) diverge. + +Source model +************ + +The components fall into two categories: + +* **Fetched** components: ``so3`` (the capsule kernel), ``avz`` (the + hypervisor), ``u-boot`` and ``qemu`` are fetched at build time from their + upstream repositories. SO3 and AVZ are pinned to an SO3 release tag through + ``SRCREV`` / ``IB_SO3_TAG`` in ``build/meta-so3/recipes-so3/{so3,avz}``. The + fetched trees at the repository root (``so3/``, ``avz/``, ``u-boot/``, + ``qemu/``) are build products and are not committed. + +* **In-tree** components: the Linux agency kernel patches live in + ``build/meta-linux``, and the MICOFE user space applications are committed + under ``linux/usr`` (``src/soo`` holds the capsule management applications, + the framebuffer/input forwarders and the EMISO engine). They are built in + place — no patch materialization. + +Building +******** + +The entry point is ``scripts/build.sh`` with a positional recipe name:: + + ./scripts/build.sh bsp-linux # full agency BSP (kernel, u-boot, rootfs, usr, ITBs) + ./scripts/build.sh bsp-capsules # the SO3 capsule image (virt64_capsule.itb) + ./scripts/build.sh so3 # a single component (also: avz, uboot, usr-linux, ...) + ./scripts/build.sh -l # list the available recipes + ./scripts/build.sh -c bsp-linux # clean, then rebuild + +bitbake runs unprivileged; the few privileged operations (losetup, mkfs, +rootfs extraction) go through ``sudo -n``. Run +``scripts/common/setup_sudo.sh`` once so the sudo timestamp is shared with the +build (it installs a sudoers drop-in enabling global timestamps). + +Building ``bsp-linux`` bakes the agency applications **into** +``rootfs.cpio``: the user space is compiled, then injected into the rootfs +archive as a build step. Deploying never rebuilds nor modifies that archive. + +Image assembly (ITS render) +=========================== + +The FIT image sources (``.its``) are **templates** committed in the layers +(``build/meta-bsp/recipes-bsp/{linux,so3}/files/its/``). At build time the +shared ``do_render_its`` task expands their ``${IB_*_PATH}`` placeholders and +renders them into the git-ignored ``linux/images/`` (or ``so3/images/``), +where ``do_itb`` runs ``mkimage``. The embedded ramfs is selected by +``IB_RAMFS_SOURCE`` in ``build/conf/local.conf``: + +* ``"initrd"`` (MICOFE default) — the small, git-tracked + ``board//initrd.cpio`` busybox ramdisk. Its ``/init`` mounts the ext4 + rootfs on the second partition and ``switch_root``'s into it (two-stage + boot). +* ``"rootfs"`` — the full buildroot ``rootfs.cpio``, run from RAM. + +Deploying +********* + +``scripts/deploy.sh`` is a pure media write (nothing is rebuilt):: + + ./scripts/deploy.sh bsp-linux # ITBs + uEnv.txt on p1, agency rootfs on p2 + ./scripts/deploy.sh bsp-capsules # capsule .itb into p2:/mnt/capsules/image/ + +The target is the ``filesystem/work/sdcard.img.`` image +(``IB_STORAGE_MODE = "soft"``), created once with +``./scripts/build.sh filesystem``. + +Booting +******* + +``scripts/st.sh`` boots the deployed image in QEMU (serial console on stdio). +The AVZ boot is a **two-ITB chain**: U-Boot loads ``virt64_avz.itb`` (the +hypervisor) and ``virt64_guest.itb`` (the Linux agency), then jumps to AVZ +through the ``guest-boot`` command (AVZ FIT in ``x0``, guest ITB in ``x1``). +``st.sh`` detects the AVZ configuration from the selected ITS and enables EL2 +(``-M virt,virtualization=on``) automatically. + +The agency then performs the two-stage boot: the embedded busybox ramdisk +mounts the full rootfs on ``/dev/vda2`` and switches into it, up to the MICOFE +login on the serial console. + +Capsule lifecycle +***************** + +The capsule management applications shipped in the agency ``/root`` are the +SO3 ``s3c-*`` tools:: + + s3c-inject /mnt/capsules/image/virt64_capsule.itb # inject and start a capsule + s3c-list # list residing capsules and their state + s3c-save # snapshot a capsule + s3c-restore # restore a snapshot + s3c-shutdown # shut a capsule down + +They talk to the SOO core driver through ``/dev/soo/core`` (char device, +major 126), created at boot by the ``/etc/init.d/S30soo`` script (the agency +runs SysVinit). A living capsule exposes its console through the vuart +backend, multiplexed on the agency serial console. + +The :ref:`EMISO engine ` offers the same lifecycle through a +Docker-compatible REST API. diff --git a/doc/source/emiso.rst b/doc/source/emiso.rst index 25de9f5..cded368 100644 --- a/doc/source/emiso.rst +++ b/doc/source/emiso.rst @@ -46,10 +46,17 @@ Where Service ******* -A ``emiso`` service has been added to help control the engine. Currently this -service only starts the ``emiso-engine``. +A ``emiso`` systemd service exists to help control the engine on +systemd-based root file systems. -Usage: +.. note:: + + The current MICOFE agency boots with **SysVinit** (busybox), so the + systemd unit is inert there — start the engine from the agency shell + (``/root/emiso_engine &``, log on its stdout) or wire an + ``/etc/init.d`` script. + +Usage on a systemd rootfs: * Control @@ -83,9 +90,10 @@ The different blocks of the engine are: Daemon ****** -The EMISO engine *Daemon* provides an interface to interact with the SO3 capsule. -SO3 capsule are SOO Mobile Entity (ME). ME has been instrumented to be controlled -by the daemon. +The EMISO engine *Daemon* provides an interface to interact with the SO3 +capsules (S3C — the concept formerly called *Mobile Entity*). The capsules are +controlled by the daemon through the SOO core driver (``/dev/soo/core``), the +same interface used by the ``s3c-*`` command line tools. The following table provides the mapping between the Docker and SO3 elements. The Docker elements which are not present in the table - like volumes, networks, … - @@ -112,7 +120,8 @@ SO3 Images ========== An SO3 capsule image consists in a SO3 “itb” file. These images are stored in -``/root/capsule/`` folder. +the ``/mnt/capsules/image/`` folder of the agency (populated by +``deploy.sh bsp-capsules``, see :doc:`build`). SO3 Capsule - Creation ======================== @@ -158,7 +167,7 @@ is sent to the Linux kernel via the VLOGS backend/frontend drives. The logged messages are stored in dedicated log files. Each capsule has its own file. The file path for these logs is as follows: -* File path: ``/var/log/soo/me_.log`` +* File path: ``/var/log/soo/s3c_.log`` The following image shows an overview of this log's mechanism. @@ -171,10 +180,48 @@ The following image shows an overview of this log's mechanism. The behaviors is implemented this way: * **SO3 Capsule**: The ``logs`` function has been added to SO3 containers. This -function adds ``[ME:]`` prefix to the messages. +function adds ``[S3C:]`` prefix to the messages. * **linux**: syslog-ng has been configured to store the messages with this prefix in the logs files. .. note:: - All the ``me_.log`` files are deleted at boot time + All the ``s3c_.log`` files are deleted at boot time + +Quick validation +**************** + +The engine listens on port **2375** (the standard Docker daemon port). The +whole container lifecycle can be exercised from the agency shell with the +busybox ``wget``: + +.. code-block:: shell + + /root/emiso_engine & + + # Docker-compatible discovery (what Portainer probes) + wget -q -O - http://127.0.0.1:2375/_ping # -> OK + wget -q -O - http://127.0.0.1:2375/version # -> ApiVersion 1.43, engine 1.0 + wget -q -O - http://127.0.0.1:2375/images/json # -> lists virt64_capsule.itb + + # Container lifecycle (create = inject + snapshot + shutdown) + wget -q -O - --post-data='{"Image":"virt64_capsule"}' \ + "http://127.0.0.1:2375/containers/create?name=demo1" # -> {"Id": "0"} + wget -q -O - --post-data= http://127.0.0.1:2375/containers/0/start + wget -q -O - http://127.0.0.1:2375/containers/json # -> State "running" + +``s3c-list`` then reports the capsule as ``S3C_state_living``, and its console +shows up on the multiplexed agency serial console. + +.. note:: + + Container Ids start at 0, and a *created* (not started) container does + not appear in ``/containers/json`` — by design, creation snapshots the + capsule and shuts it down until ``start`` restores it. + +.. note:: + + The snapshot path performs a single 128 MB DMA allocation, so the agency + guest needs the 160 MB CMA pool (``linux,cma`` in ``virt64_guest.dts``, + inherited from the SO3 base since v6.2.1-rc). With a smaller pool the + ``create`` request freezes on a kernel BUG. diff --git a/doc/source/glossary.rst b/doc/source/glossary.rst index 79b544f..d0b3093 100644 --- a/doc/source/glossary.rst +++ b/doc/source/glossary.rst @@ -36,8 +36,14 @@ Glossary running container. Mobile Entity - Also abbreviated *ME*. The :term:`SOO` virtualization concept of a self-contained, - migratable execution unit on which SO3 capsules are based. + Also abbreviated *ME*. The historical :term:`SOO` name of the concept now + called the :term:`SO3 Capsule` (S3C): a self-contained execution unit that + can be injected, snapshotted and restored. The term only survives in older + code and papers. + + SO3 Capsule + Also abbreviated *S3C*. The current name of the :term:`mobile entity` + concept; see :term:`Capsule`. EMISO The engine, running in the :term:`agency domain` user space, that manages the diff --git a/doc/source/index.rst b/doc/source/index.rst index 4302080..018d45f 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -25,6 +25,7 @@ the SO3 operating system with Arm64 virtualization. introduction architecture + build emiso portainer syscalls_alignment From 75702db4debd60058b55dd9c376f0024ca6f973a Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Sat, 11 Jul 2026 18:13:44 +0200 Subject: [PATCH 33/52] meta-rootfs: restore syslog-ng in the agency rootfs (capsule logs) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The June alignment adopted so3's buildroot virt64 defconfig and only re-flipped the EMISO REST deps (jsoncpp, libhttpserver), losing MICOFE's BR2_PACKAGE_SYSLOG_NG=y — without syslog-ng the [S3C:] vlogs routing has no consumer and /var/log/soo/ never exists. Re-enable it (a MICOFE delta over the so3 base, like the EMISO deps). Validated at runtime: after injection /var/log/soo/s3c_2.log receives the capsule's [S3C:2] messages. --- .../files/0001-buildroot-2024.11-r0/0003-virt64_defconfig.patch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0003-virt64_defconfig.patch b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0003-virt64_defconfig.patch index 71986bd..c057a51 100644 --- a/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0003-virt64_defconfig.patch +++ b/build/meta-rootfs/recipes-rootfs/buildroot/files/0001-buildroot-2024.11-r0/0003-virt64_defconfig.patch @@ -3038,7 +3038,7 @@ +# +# BR2_PACKAGE_SWUPDATE is not set +# BR2_PACKAGE_SYSKLOGD is not set -+# BR2_PACKAGE_SYSLOG_NG is not set ++BR2_PACKAGE_SYSLOG_NG=y +BR2_PACKAGE_SYSTEMD_ARCH_SUPPORTS=y +BR2_PACKAGE_SYSTEMD_BOOTCHART_ARCH_SUPPORTS=y +BR2_PACKAGE_SYSVINIT=y From 5fb4193bb4d976e019a971edca62da7a3401a737 Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Sat, 11 Jul 2026 22:30:55 +0200 Subject: [PATCH 34/52] meta-linux: restore the framebuffer/input backend wiring The June wholesale adoption of the so3 patch sets silently dropped the MICOFE virtualized-framebuffer kernel wiring, leaving vfbdev.c/vinput.c as dead sources: the VFBDEV_BACKEND/VINPUT_BACKEND Kconfig entries, the soo/drivers Makefile obj lines, the per-directory Makefiles, the defconfig enables, the fbdev hypercall block in the agency uapi soo.h (MAX_FBDEV_PFN, fbdev_pfns_t, AVZ_FBDEV_SET_PFNS/CHANGE_FOCUS/ GET_S3C_ADDR and the hyp-args union members) and the vfbdev sysfs entries. Restore them on both the virt64 and rpi4 sets, taking the hypercall block from the v6.2.1-rc capsule uapi (pfn_count field, GET_S3C_ADDR naming) so agency, AVZ (fbdev_gnt) and the capsule frontend share the same ABI; the sysfs bodies come from the initial import. Also restore the rpi4_64 _soo defconfig selections in local.conf. Validated: vfbdev.o/vinput.o build into the agency kernel and /sys/soo/backend/vfbdev appears at boot. --- build/conf/local.conf | 3 +- ...0017-rpi4_64_nomodules_soo_defconfig.patch | 4 +- .../soo/files/0001-linux-6.12-r0-patches.inc | 2 + .../0002-virt64_soo_defconfig.patch | 4 +- .../0001-linux-6.12-r0/0018-Kconfig.patch | 12 +++++- .../0001-linux-6.12-r0/0019-Makefile.patch | 4 +- .../0001-linux-6.12-r0/0056-sysfs.h.patch | 10 ++++- .../files/0001-linux-6.12-r0/0062-soo.h.patch | 30 ++++++++++++++- .../0001-linux-6.12-r0/0088-sysfs.c.patch | 37 ++++++++++++++++++- .../0001-linux-6.12-r0/0132-Makefile.patch | 4 ++ .../0001-linux-6.12-r0/0133-Makefile.patch | 4 ++ .../files/0001-linux-6.12-rpi4-r0-patches.inc | 2 + .../0018-Kconfig.patch | 12 +++++- .../0019-Makefile.patch | 4 +- .../0056-sysfs.h.patch | 10 ++++- .../0001-linux-6.12-rpi4-r0/0062-soo.h.patch | 30 ++++++++++++++- .../0088-sysfs.c.patch | 37 ++++++++++++++++++- .../0132-Makefile.patch | 4 ++ .../0133-Makefile.patch | 4 ++ 19 files changed, 204 insertions(+), 13 deletions(-) create mode 100644 build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0132-Makefile.patch create mode 100644 build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0133-Makefile.patch create mode 100644 build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0132-Makefile.patch create mode 100644 build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0133-Makefile.patch diff --git a/build/conf/local.conf b/build/conf/local.conf index 20b0fa8..1f9f2bd 100644 --- a/build/conf/local.conf +++ b/build/conf/local.conf @@ -36,7 +36,7 @@ PREFERRED_VERSION_linux = "${PREFERRED_VERSION_linux:${IB_PLATFORM}}" # IB_CONFIG:linux:virt64 ?= "virt64_defconfig" IB_CONFIG:linux:virt64 ?= "virt64_soo_defconfig" # IB_CONFIG:linux:rpi4_64 ?= "rpi4_64_defconfig" -IB_CONFIG:linux:rpi4_64 ?= "rpi4_64_nomodules_defconfig" +IB_CONFIG:linux:rpi4_64 ?= "rpi4_64_nomodules_soo_defconfig" IB_CONFIG:linux:verdin-imx8mp ?= "verdin_imx8mp_defconfig" # --- ITS (boot-image selection) --- @@ -132,6 +132,7 @@ PREFERRED_VERSION_avz:verdin-imx8mp = "6.2.0" # IB_CONFIG:avz:virt64 ?= "virt64_avz_defconfig" IB_CONFIG:avz:verdin-imx8mp ?= "verdin-imx8mp_avz_defconfig" IB_CONFIG:avz:virt64 ?= "virt64_avz_soo_defconfig" +IB_CONFIG:avz:rpi4_64 ?= "rpi4_64_avz_soo_defconfig" # *************** Boot chain *************** # diff --git a/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0017-rpi4_64_nomodules_soo_defconfig.patch b/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0017-rpi4_64_nomodules_soo_defconfig.patch index d88473e..c65018e 100644 --- a/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0017-rpi4_64_nomodules_soo_defconfig.patch +++ b/build/meta-linux/recipes-linux/linux/files/0002-linux-6.12-rpi4-r0/0017-rpi4_64_nomodules_soo_defconfig.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/micofe/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/configs/rpi4_64_nomodules_soo_defconfig 1970-01-01 01:00:00.000000000 +0100 +++ ./arch/arm64/configs/rpi4_64_nomodules_soo_defconfig 2026-02-13 12:39:28.107216945 +0100 -@@ -0,0 +1,5437 @@ +@@ -0,0 +1,5439 @@ +# +# Automatically generated file; DO NOT EDIT. +# Linux/arm64 6.12.34 Kernel Configuration @@ -5436,5 +5436,7 @@ +CONFIG_VUART_BACKEND=y +# CONFIG_VLEDS_BACKEND is not set +CONFIG_VLOGS_BACKEND=y ++CONFIG_VFBDEV_BACKEND=y ++CONFIG_VINPUT_BACKEND=y +# end of Smart Object Oriented subsystem +# end of SOO Framework and subsystems diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0-patches.inc b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0-patches.inc index 78659f1..3e295b8 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0-patches.inc +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0-patches.inc @@ -128,4 +128,6 @@ SRC_URI:append:soo = "\ file://0129-vfbdev.h.patch \ file://0130-vinput.c.patch \ file://0131-vinput.h.patch \ + file://0132-Makefile.patch \ + file://0133-Makefile.patch \ " diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0002-virt64_soo_defconfig.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0002-virt64_soo_defconfig.patch index 2a941a5..6b1f5aa 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0002-virt64_soo_defconfig.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0002-virt64_soo_defconfig.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/arch/arm64/configs/virt64_soo_defconfig 1970-01-01 01:00:00.000000000 +0100 +++ ./arch/arm64/configs/virt64_soo_defconfig 2025-08-29 08:46:39.970708755 +0200 -@@ -0,0 +1,8995 @@ +@@ -0,0 +1,8997 @@ +# +# Automatically generated file; DO NOT EDIT. +# Linux/arm64 6.12.0 Kernel Configuration @@ -8994,5 +8994,7 @@ +# CONFIG_VSENSELED_BACKEND is not set +# CONFIG_VSENSEJ_BACKEND is not set +CONFIG_VLOGS_BACKEND=y ++CONFIG_VFBDEV_BACKEND=y ++CONFIG_VINPUT_BACKEND=y +# end of Smart Object Oriented subsystem +# end of SOO Framework and subsystems diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0018-Kconfig.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0018-Kconfig.patch index a013df5..d028908 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0018-Kconfig.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0018-Kconfig.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/drivers/Kconfig 1970-01-01 01:00:00.000000000 +0100 +++ ./soo/drivers/Kconfig 2025-08-29 08:46:41.395616621 +0200 -@@ -0,0 +1,44 @@ +@@ -0,0 +1,54 @@ +# +# SOO device configuration +# @@ -40,6 +40,16 @@ + The vlogs driver is used to logs Capsules logs - logs are store in + `/var/log/soo/capsule_N.log` (N corresponds to the SlotID of the capsule). + ++config VFBDEV_BACKEND ++ bool "vfbdev Framebuffer Backend support for SOO Capsules" ++ help ++ The vfbdev driver is used to allow capsules to access a framebuffer from Linux. ++ ++config VINPUT_BACKEND ++ bool "vinput Input support for SOO Capsules" ++ help ++ The vinput driver is used to allow capsules to access a mouse/keyboard inputs from Linux. ++ +endmenu + + diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0019-Makefile.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0019-Makefile.patch index 588941f..b39572d 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0019-Makefile.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0019-Makefile.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/drivers/Makefile 1970-01-01 01:00:00.000000000 +0100 +++ ./soo/drivers/Makefile 2025-08-29 08:46:41.395638406 +0200 -@@ -0,0 +1,12 @@ +@@ -0,0 +1,14 @@ +# +# Makefile for SOO general drivers. +# @@ -13,3 +13,5 @@ +obj-$(CONFIG_VSENSELED_BACKEND) += vsenseledback/ +obj-$(CONFIG_VSENSEJ_BACKEND) += vsensejback/ +obj-$(CONFIG_VLOGS_BACKEND) += vlogsback/ ++obj-$(CONFIG_VFBDEV_BACKEND) += vfbdevback/ ++obj-$(CONFIG_VINPUT_BACKEND) += vinputback/ diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0056-sysfs.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0056-sysfs.h.patch index ac21c58..0133623 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0056-sysfs.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0056-sysfs.h.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/sysfs.h 1970-01-01 01:00:00.000000000 +0100 +++ ./soo/include/soo/sysfs.h 2025-08-29 08:46:41.395990253 +0200 -@@ -0,0 +1,57 @@ +@@ -0,0 +1,65 @@ + +/* + * Copyright (C) 2020 Daniel Rossier @@ -40,6 +40,14 @@ + /**** vsensej ****/ + vsensej_js, + ++ /**** vfbdev ****/ ++ vfbdev_hres, ++ vfbdev_vres, ++ vfbdev_bpp, ++ vfbdev_size, ++ vfbdev_addr, ++ vfbdev_pid, ++ + /**** vwagoled ****/ + vwagoled_notify, + vwagoled_debug, diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0062-soo.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0062-soo.h.patch index dbbdc56..d25cce6 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0062-soo.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0062-soo.h.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/uapi/soo.h 1970-01-01 01:00:00.000000000 +0100 +++ ./soo/include/soo/uapi/soo.h 2025-08-29 08:46:41.395924678 +0200 -@@ -0,0 +1,461 @@ +@@ -0,0 +1,489 @@ +/* + * Copyright (C) 2014-2025 Daniel Rossier + * @@ -74,6 +74,13 @@ + +void do_gnttab(gnttab_op_t *args); + ++#define MAX_FBDEV_PFN 8 ++typedef struct fbdev_pfns { ++ size_t pfn_count; ++ addr_t pfn[MAX_FBDEV_PFN]; ++ size_t page_count[MAX_FBDEV_PFN]; ++} fbdev_pfns_t; ++ +#define AVZ_SCHEDULER_FLIP 0 + +/* @@ -302,6 +309,9 @@ +#define AVZ_SET_S3C_STATE 11 +#define AVZ_GET_DOM_DESC 12 +#define AVZ_GRANT_TABLE_OP 13 ++#define AVZ_FBDEV_SET_PFNS 14 ++#define AVZ_FBDEV_CHANGE_FOCUS 15 ++#define AVZ_FBDEV_GET_S3C_ADDR 16 + +/* AVZ_INJECT_CAPSULE */ +typedef struct { @@ -364,6 +374,21 @@ + gnttab_op_t gnttab_op; +} avz_gnttab_t; + ++/* AVZ_FBDEV_SET_PFNS */ ++typedef struct { ++ fbdev_pfns_t fbdev; ++} avz_fbdev_pfns_t; ++ ++/* AVZ_FBDEV_CHANGE_FOCUS */ ++typedef struct { ++ int new_slotID; ++} avz_fbdev_focus_t; ++ ++/* AVZ_FBDEV_GET_S3C_ADDR */ ++typedef struct { ++ addr_t paddr; ++} avz_fbdev_addr_t; ++ +/* + * AVZ hypercall argument + */ @@ -383,6 +408,9 @@ + avz_console_io_t avz_console_io_args; + avz_domctl_t avz_domctl_args; + avz_gnttab_t avz_gnttab_args; ++ avz_fbdev_pfns_t avz_fbdev_pfns_args; ++ avz_fbdev_focus_t avz_fbdev_focus_args; ++ avz_fbdev_addr_t avz_fbdev_addr_args; + } u; +} avz_hyp_t; + diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0088-sysfs.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0088-sysfs.c.patch index f29f618..24d4e4f 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0088-sysfs.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0088-sysfs.c.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/sysfs.c 1970-01-01 01:00:00.000000000 +0100 +++ ./soo/kernel/sysfs.c 2025-08-29 08:46:41.394665675 +0200 -@@ -0,0 +1,158 @@ +@@ -0,0 +1,193 @@ + +/* + * Copyright (C) 2020 Daniel Rossier @@ -34,12 +34,19 @@ + [agencyUID] = "agencyUID", + [name] = "name", + [vsensej_js]= "vsensej_js", ++ [vfbdev_hres] = "vfbdev_hres", ++ [vfbdev_vres] = "vfbdev_vres", ++ [vfbdev_bpp] = "vfbdev_bpp", ++ [vfbdev_size] = "vfbdev_size", ++ [vfbdev_addr] = "vfbdev_addr", ++ [vfbdev_pid] = "vfbdev_pid", +}; + +static struct kobject *root_kobj; + +static struct kobject *backend_kobj; +static struct kobject *backend_vsensej_kobj; ++static struct kobject *backend_vfbdev_kobj; + + +/* Internal list structure to manage the diversity of callback functions related to attributes */ @@ -107,6 +114,13 @@ +/**** vsensej ****/ +static struct kobj_attribute vsensej_js_attr = __ATTR(vsensej_js, 0664, attr_show, attr_store); + ++static struct kobj_attribute vfbdev_hres_attr = __ATTR(vfbdev_hres, 0664, attr_show, attr_store); ++static struct kobj_attribute vfbdev_vres_attr = __ATTR(vfbdev_vres, 0664, attr_show, attr_store); ++static struct kobj_attribute vfbdev_bpp_attr = __ATTR(vfbdev_bpp, 0664, attr_show, attr_store); ++static struct kobj_attribute vfbdev_size_attr = __ATTR(vfbdev_size, 0664, attr_show, attr_store); ++static struct kobj_attribute vfbdev_addr_attr = __ATTR(vfbdev_addr, 0664, attr_show, attr_store); ++static struct kobj_attribute vfbdev_pid_attr = __ATTR(vfbdev_pid, 0664, attr_show, attr_store); ++ + +/* Groups of attributes for SOO (root) */ +static struct attribute *soo_attrs[] = { @@ -130,6 +144,20 @@ + .attrs = backend_vsensej_attrs, +}; + ++static struct attribute *backend_vfbdev_attrs[] = { ++ &vfbdev_hres_attr.attr, ++ &vfbdev_vres_attr.attr, ++ &vfbdev_bpp_attr.attr, ++ &vfbdev_size_attr.attr, ++ &vfbdev_addr_attr.attr, ++ &vfbdev_pid_attr.attr, ++ NULL, /* need to NULL terminate the list of attributes */ ++}; ++ ++static struct attribute_group backend_vfbdev_group = { ++ .attrs = backend_vfbdev_attrs, ++}; ++ +void soo_sysfs_init(void) { + int ret; + @@ -156,6 +184,13 @@ + + ret = sysfs_create_group(backend_vsensej_kobj, &backend_vsensej_group); + BUG_ON(ret); ++ ++ /**** vfbdev ****/ ++ backend_vfbdev_kobj = kobject_create_and_add("vfbdev", backend_kobj); ++ BUG_ON(!backend_vfbdev_kobj); ++ ++ ret = sysfs_create_group(backend_vfbdev_kobj, &backend_vfbdev_group); ++ BUG_ON(ret); +} + + diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0132-Makefile.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0132-Makefile.patch new file mode 100644 index 0000000..2c25580 --- /dev/null +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0132-Makefile.patch @@ -0,0 +1,4 @@ +--- ./build/tmp/work/linux-6.12-r0/linux-6.12/soo/drivers/vfbdevback/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/drivers/vfbdevback/Makefile 2026-02-17 08:18:11.150593301 +0100 +@@ -0,0 +1 @@ ++obj-y := vfbdev.o diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0133-Makefile.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0133-Makefile.patch new file mode 100644 index 0000000..e37967a --- /dev/null +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0133-Makefile.patch @@ -0,0 +1,4 @@ +--- ./build/tmp/work/linux-6.12-r0/linux-6.12/soo/drivers/vinputback/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/drivers/vinputback/Makefile 2026-04-28 16:34:33.037734565 +0200 +@@ -0,0 +1 @@ ++obj-y := vinput.o diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0-patches.inc b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0-patches.inc index a8b55b8..c7af1cb 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0-patches.inc +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0-patches.inc @@ -126,5 +126,7 @@ SRC_URI:append:soo = "\ file://0129-vfbdev.h.patch \ file://0130-vinput.c.patch \ file://0131-vinput.h.patch \ + file://0132-Makefile.patch \ + file://0133-Makefile.patch \ file://0132-bcm2711-rpi-4-b.dts.patch \ " diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0018-Kconfig.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0018-Kconfig.patch index a013df5..d028908 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0018-Kconfig.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0018-Kconfig.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/drivers/Kconfig 1970-01-01 01:00:00.000000000 +0100 +++ ./soo/drivers/Kconfig 2025-08-29 08:46:41.395616621 +0200 -@@ -0,0 +1,44 @@ +@@ -0,0 +1,54 @@ +# +# SOO device configuration +# @@ -40,6 +40,16 @@ + The vlogs driver is used to logs Capsules logs - logs are store in + `/var/log/soo/capsule_N.log` (N corresponds to the SlotID of the capsule). + ++config VFBDEV_BACKEND ++ bool "vfbdev Framebuffer Backend support for SOO Capsules" ++ help ++ The vfbdev driver is used to allow capsules to access a framebuffer from Linux. ++ ++config VINPUT_BACKEND ++ bool "vinput Input support for SOO Capsules" ++ help ++ The vinput driver is used to allow capsules to access a mouse/keyboard inputs from Linux. ++ +endmenu + + diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0019-Makefile.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0019-Makefile.patch index 588941f..b39572d 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0019-Makefile.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0019-Makefile.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/drivers/Makefile 1970-01-01 01:00:00.000000000 +0100 +++ ./soo/drivers/Makefile 2025-08-29 08:46:41.395638406 +0200 -@@ -0,0 +1,12 @@ +@@ -0,0 +1,14 @@ +# +# Makefile for SOO general drivers. +# @@ -13,3 +13,5 @@ +obj-$(CONFIG_VSENSELED_BACKEND) += vsenseledback/ +obj-$(CONFIG_VSENSEJ_BACKEND) += vsensejback/ +obj-$(CONFIG_VLOGS_BACKEND) += vlogsback/ ++obj-$(CONFIG_VFBDEV_BACKEND) += vfbdevback/ ++obj-$(CONFIG_VINPUT_BACKEND) += vinputback/ diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0056-sysfs.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0056-sysfs.h.patch index ac21c58..0133623 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0056-sysfs.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0056-sysfs.h.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/sysfs.h 1970-01-01 01:00:00.000000000 +0100 +++ ./soo/include/soo/sysfs.h 2025-08-29 08:46:41.395990253 +0200 -@@ -0,0 +1,57 @@ +@@ -0,0 +1,65 @@ + +/* + * Copyright (C) 2020 Daniel Rossier @@ -40,6 +40,14 @@ + /**** vsensej ****/ + vsensej_js, + ++ /**** vfbdev ****/ ++ vfbdev_hres, ++ vfbdev_vres, ++ vfbdev_bpp, ++ vfbdev_size, ++ vfbdev_addr, ++ vfbdev_pid, ++ + /**** vwagoled ****/ + vwagoled_notify, + vwagoled_debug, diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0062-soo.h.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0062-soo.h.patch index 6738454..7d4264a 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0062-soo.h.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0062-soo.h.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/include/soo/uapi/soo.h 1970-01-01 01:00:00.000000000 +0100 +++ ./soo/include/soo/uapi/soo.h 2025-08-29 08:46:41.395924678 +0200 -@@ -0,0 +1,459 @@ +@@ -0,0 +1,487 @@ +/* + * Copyright (C) 2014-2025 Daniel Rossier + * @@ -74,6 +74,13 @@ + +void do_gnttab(gnttab_op_t *args); + ++#define MAX_FBDEV_PFN 8 ++typedef struct fbdev_pfns { ++ size_t pfn_count; ++ addr_t pfn[MAX_FBDEV_PFN]; ++ size_t page_count[MAX_FBDEV_PFN]; ++} fbdev_pfns_t; ++ +#define AVZ_SCHEDULER_FLIP 0 + +/* @@ -301,6 +308,9 @@ +#define AVZ_SET_S3C_STATE 11 +#define AVZ_GET_DOM_DESC 12 +#define AVZ_GRANT_TABLE_OP 13 ++#define AVZ_FBDEV_SET_PFNS 14 ++#define AVZ_FBDEV_CHANGE_FOCUS 15 ++#define AVZ_FBDEV_GET_S3C_ADDR 16 + +/* AVZ_INJECT_CAPSULE */ +typedef struct { @@ -362,6 +372,21 @@ + gnttab_op_t gnttab_op; +} avz_gnttab_t; + ++/* AVZ_FBDEV_SET_PFNS */ ++typedef struct { ++ fbdev_pfns_t fbdev; ++} avz_fbdev_pfns_t; ++ ++/* AVZ_FBDEV_CHANGE_FOCUS */ ++typedef struct { ++ int new_slotID; ++} avz_fbdev_focus_t; ++ ++/* AVZ_FBDEV_GET_S3C_ADDR */ ++typedef struct { ++ addr_t paddr; ++} avz_fbdev_addr_t; ++ +/* + * AVZ hypercall argument + */ @@ -381,6 +406,9 @@ + avz_console_io_t avz_console_io_args; + avz_domctl_t avz_domctl_args; + avz_gnttab_t avz_gnttab_args; ++ avz_fbdev_pfns_t avz_fbdev_pfns_args; ++ avz_fbdev_focus_t avz_fbdev_focus_args; ++ avz_fbdev_addr_t avz_fbdev_addr_args; + } u; +} avz_hyp_t; + diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0088-sysfs.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0088-sysfs.c.patch index f29f618..57a0ab8 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0088-sysfs.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0088-sysfs.c.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/sysfs.c 1970-01-01 01:00:00.000000000 +0100 +++ ./soo/kernel/sysfs.c 2025-08-29 08:46:41.394665675 +0200 -@@ -0,0 +1,158 @@ +@@ -0,0 +1,193 @@ + +/* + * Copyright (C) 2020 Daniel Rossier @@ -34,12 +34,19 @@ + [agencyUID] = "agencyUID", + [name] = "name", + [vsensej_js]= "vsensej_js", ++ [vfbdev_hres] = "vfbdev_hres", ++ [vfbdev_vres] = "vfbdev_vres", ++ [vfbdev_bpp] = "vfbdev_bpp", ++ [vfbdev_size] = "vfbdev_size", ++ [vfbdev_addr] = "vfbdev_addr", ++ [vfbdev_pid] = "vfbdev_pid", +}; + +static struct kobject *root_kobj; + +static struct kobject *backend_kobj; +static struct kobject *backend_vsensej_kobj; ++static struct kobject *backend_vfbdev_kobj; + + +/* Internal list structure to manage the diversity of callback functions related to attributes */ @@ -108,6 +115,13 @@ +static struct kobj_attribute vsensej_js_attr = __ATTR(vsensej_js, 0664, attr_show, attr_store); + + ++static struct kobj_attribute vfbdev_hres_attr = __ATTR(vfbdev_hres, 0664, attr_show, attr_store); ++static struct kobj_attribute vfbdev_vres_attr = __ATTR(vfbdev_vres, 0664, attr_show, attr_store); ++static struct kobj_attribute vfbdev_bpp_attr = __ATTR(vfbdev_bpp, 0664, attr_show, attr_store); ++static struct kobj_attribute vfbdev_size_attr = __ATTR(vfbdev_size, 0664, attr_show, attr_store); ++static struct kobj_attribute vfbdev_addr_attr = __ATTR(vfbdev_addr, 0664, attr_show, attr_store); ++static struct kobj_attribute vfbdev_pid_attr = __ATTR(vfbdev_pid, 0664, attr_show, attr_store); ++ +/* Groups of attributes for SOO (root) */ +static struct attribute *soo_attrs[] = { + &agencyUID_attr.attr, @@ -130,6 +144,20 @@ + .attrs = backend_vsensej_attrs, +}; + ++static struct attribute *backend_vfbdev_attrs[] = { ++ &vfbdev_hres_attr.attr, ++ &vfbdev_vres_attr.attr, ++ &vfbdev_bpp_attr.attr, ++ &vfbdev_size_attr.attr, ++ &vfbdev_addr_attr.attr, ++ &vfbdev_pid_attr.attr, ++ NULL, /* need to NULL terminate the list of attributes */ ++}; ++ ++static struct attribute_group backend_vfbdev_group = { ++ .attrs = backend_vfbdev_attrs, ++}; ++ +void soo_sysfs_init(void) { + int ret; + @@ -156,6 +184,13 @@ + + ret = sysfs_create_group(backend_vsensej_kobj, &backend_vsensej_group); + BUG_ON(ret); ++ ++ /**** vfbdev ****/ ++ backend_vfbdev_kobj = kobject_create_and_add("vfbdev", backend_kobj); ++ BUG_ON(!backend_vfbdev_kobj); ++ ++ ret = sysfs_create_group(backend_vfbdev_kobj, &backend_vfbdev_group); ++ BUG_ON(ret); +} + + diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0132-Makefile.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0132-Makefile.patch new file mode 100644 index 0000000..2c25580 --- /dev/null +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0132-Makefile.patch @@ -0,0 +1,4 @@ +--- ./build/tmp/work/linux-6.12-r0/linux-6.12/soo/drivers/vfbdevback/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/drivers/vfbdevback/Makefile 2026-02-17 08:18:11.150593301 +0100 +@@ -0,0 +1 @@ ++obj-y := vfbdev.o diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0133-Makefile.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0133-Makefile.patch new file mode 100644 index 0000000..e37967a --- /dev/null +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0133-Makefile.patch @@ -0,0 +1,4 @@ +--- ./build/tmp/work/linux-6.12-r0/linux-6.12/soo/drivers/vinputback/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ ./soo/drivers/vinputback/Makefile 2026-04-28 16:34:33.037734565 +0200 +@@ -0,0 +1 @@ ++obj-y := vinput.o From 4ec1f6e841590a96bf4f0e6f3a17b91baacc01ff Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Sun, 12 Jul 2026 10:27:36 +0200 Subject: [PATCH 35/52] Restore the end-to-end virtualized framebuffer chain MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Re-wire the remaining pieces of the MICOFE virtualized framebuffer that the June wholesale had dropped, and enable the feature across the stack: - capsule DTS (micofe patch on the fetched SO3): turn the vfbdev and vinput frontends on — the MICOFE agency now provides both backends. - agency guest DTS (0001, virt64 + rpi4 sets): add the vfbdev,backend and vinput,backend nodes; without them vfbdev_init returns early and the sysfs stores are never registered (fb_mapper's writes were silently lost and the frontend crashed on a NULL vdev at first use). - console.c (0074, both sets): restore the AVZ_FBDEV_CHANGE_FOCUS hypercall in vfb_set_focus and call it from the serial focus switch, so terminal focus and screen focus track together (double CTRL-A). Validated on virt64 (QEMU needs modern virtio for the agency real framebuffer: -global virtio-mmio.force-legacy=false -device virtio-gpu-device): fb_mapper handshake, capsule injection, frontend connected, fb_test drawing inside the capsule lands in the agency /dev/fb0 memory after the focus switch (fb content goes from ~2% to ~98% populated). --- .../0001-virt64_guest.dts.patch | 12 ++++++- .../0001-linux-6.12-r0/0074-console.c.patch | 9 +++++- .../0001-linux-6.12-r0/0090-vbstorage.c.patch | 4 ++- .../0074-console.c.patch | 9 +++++- .../0090-vbstorage.c.patch | 4 ++- .../so3/files/0001-so3-6.2.0-r0-patches.inc | 4 +++ .../0001-virt64_capsule.dts.patch | 31 +++++++++++++++++++ 7 files changed, 68 insertions(+), 5 deletions(-) create mode 100644 build/meta-so3/recipes-so3/so3/files/0001-so3-6.2.0-r0/0001-virt64_capsule.dts.patch diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0001-virt64_guest.dts.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0001-virt64_guest.dts.patch index 2abb77d..8586260 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0001-virt64_guest.dts.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0001-virt64_guest.dts.patch @@ -19,7 +19,7 @@ }; timer { -@@ -403,4 +404,36 @@ +@@ -403,4 +404,46 @@ compatible = "fixed-clock"; }; @@ -37,6 +37,16 @@ + compatible = "vuart,backend"; + status = "ok"; + }; ++ ++ vfbdev { ++ compatible = "vfbdev,backend"; ++ status = "ok"; ++ }; ++ ++ vinput { ++ compatible = "vinput,backend"; ++ status = "ok"; ++ }; + + vsenseled { + compatible = "vsenseled,backend"; diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0074-console.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0074-console.c.patch index a75408f..5a4cd2d 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0074-console.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0074-console.c.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/console/console.c 1970-01-01 01:00:00.000000000 +0100 +++ ./soo/kernel/console/console.c 2025-08-29 08:46:41.394716106 +0200 -@@ -0,0 +1,152 @@ +@@ -0,0 +1,159 @@ +/* + * Copyright (C) 2016-2019 Daniel Rossier + * @@ -64,6 +64,12 @@ + +int vfb_set_focus(int next_domain) +{ ++ avz_hyp_t hyp_args; ++ ++ hyp_args.cmd = AVZ_FBDEV_CHANGE_FOCUS; ++ hyp_args.u.avz_fbdev_focus_args.new_slotID = next_domain; ++ avz_hypercall(&hyp_args); ++ + vfb_active = next_domain; + return vfb_active; +} @@ -111,6 +117,7 @@ + next = ((next == 1) ? next+1 : next); + + avzcons_set_focus(active); ++ vfb_set_focus(active); + + switch_code_count = 0; + diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0090-vbstorage.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0090-vbstorage.c.patch index 6c4103e..1d6d93c 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0090-vbstorage.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-r0/0090-vbstorage.c.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/vbstore/vbstorage.c 1970-01-01 01:00:00.000000000 +0100 +++ ./soo/kernel/vbstore/vbstorage.c 2025-08-29 08:46:41.395120704 +0200 -@@ -0,0 +1,518 @@ +@@ -0,0 +1,520 @@ +/* + * Copyright (C) 2016-2019 Daniel Rossier + * Copyright (C) 2018 Baptiste Delporte @@ -518,4 +518,6 @@ + np = of_find_compatible_node(NULL, NULL, "vlogs,backend"); + if (of_device_is_available(np)) + vbs_store_mkdir("/backend/vlogs"); ++ vbs_store_mkdir("/backend/vfbdev"); ++ vbs_store_mkdir("/backend/vinput"); +} diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0074-console.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0074-console.c.patch index a75408f..5a4cd2d 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0074-console.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0074-console.c.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/console/console.c 1970-01-01 01:00:00.000000000 +0100 +++ ./soo/kernel/console/console.c 2025-08-29 08:46:41.394716106 +0200 -@@ -0,0 +1,152 @@ +@@ -0,0 +1,159 @@ +/* + * Copyright (C) 2016-2019 Daniel Rossier + * @@ -64,6 +64,12 @@ + +int vfb_set_focus(int next_domain) +{ ++ avz_hyp_t hyp_args; ++ ++ hyp_args.cmd = AVZ_FBDEV_CHANGE_FOCUS; ++ hyp_args.u.avz_fbdev_focus_args.new_slotID = next_domain; ++ avz_hypercall(&hyp_args); ++ + vfb_active = next_domain; + return vfb_active; +} @@ -111,6 +117,7 @@ + next = ((next == 1) ? next+1 : next); + + avzcons_set_focus(active); ++ vfb_set_focus(active); + + switch_code_count = 0; + diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0090-vbstorage.c.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0090-vbstorage.c.patch index 6c4103e..1d6d93c 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0090-vbstorage.c.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0090-vbstorage.c.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/git/micofe/build/tmp/work/linux-6.12-r0/linux-6.12/soo/kernel/vbstore/vbstorage.c 1970-01-01 01:00:00.000000000 +0100 +++ ./soo/kernel/vbstore/vbstorage.c 2025-08-29 08:46:41.395120704 +0200 -@@ -0,0 +1,518 @@ +@@ -0,0 +1,520 @@ +/* + * Copyright (C) 2016-2019 Daniel Rossier + * Copyright (C) 2018 Baptiste Delporte @@ -518,4 +518,6 @@ + np = of_find_compatible_node(NULL, NULL, "vlogs,backend"); + if (of_device_is_available(np)) + vbs_store_mkdir("/backend/vlogs"); ++ vbs_store_mkdir("/backend/vfbdev"); ++ vbs_store_mkdir("/backend/vinput"); +} diff --git a/build/meta-so3/recipes-so3/so3/files/0001-so3-6.2.0-r0-patches.inc b/build/meta-so3/recipes-so3/so3/files/0001-so3-6.2.0-r0-patches.inc index f701da1..0057ca1 100644 --- a/build/meta-so3/recipes-so3/so3/files/0001-so3-6.2.0-r0-patches.inc +++ b/build/meta-so3/recipes-so3/so3/files/0001-so3-6.2.0-r0-patches.inc @@ -4,3 +4,7 @@ # MICOFE patch manifest — auto-regenerated by 'bitbake -c updiff'. # Empty until the first updiff: a clean SO3 (SRCREV) is fetched and no # patch is applied. Add MICOFE deltas to ${IB_TARGET}, then run updiff. + +SRC_URI += " \ + file://0001-virt64_capsule.dts.patch \ + " diff --git a/build/meta-so3/recipes-so3/so3/files/0001-so3-6.2.0-r0/0001-virt64_capsule.dts.patch b/build/meta-so3/recipes-so3/so3/files/0001-so3-6.2.0-r0/0001-virt64_capsule.dts.patch new file mode 100644 index 0000000..6e7069b --- /dev/null +++ b/build/meta-so3/recipes-so3/so3/files/0001-so3-6.2.0-r0/0001-virt64_capsule.dts.patch @@ -0,0 +1,31 @@ +--- a/so3/dts/virt64_capsule.dts ++++ b/so3/dts/virt64_capsule.dts +@@ -129,21 +129,19 @@ + status = "ok"; + }; + +- /* Framebuffer support: disabled — the Linux agency built from +- * this repo provides no vfbdev backend (vuart/vlogs only), and +- * the capsule BUG()s at vbstore init when the backend node is +- * missing. Re-enable when an agency with the virtual +- * framebuffer backend is used. */ ++ /* Framebuffer support: enabled — the MICOFE Linux agency ++ * provides the vfbdev backend (virtualized framebuffer via ++ * the 2-stage MMU IPA remap, fb_mapper user space). */ + vfbdev { + compatible = "vfbdev,frontend"; +- status = "disabled"; ++ status = "ok"; + }; + +- /* Input support: disabled — no vinput backend in the agency +- * (see vfbdev above). */ ++ /* Input support: enabled — the MICOFE agency provides the ++ * vinput backend (input_forwarding user space). */ + vinput { + compatible = "vinput,frontend"; +- status = "disabled"; ++ status = "ok"; + }; + }; + }; From 57f70083a795028ad2a45ba6ad96a8f6bdb52557 Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Sun, 12 Jul 2026 10:48:23 +0200 Subject: [PATCH 36/52] fb_mapper: force the framebuffer damage on each refresh tick MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The capsule pixels reach the shadow buffer through the AVZ stage-2 remap, bypassing the agency MMU, so the DRM fbdev deferred-io tracking never sees them and FBIOPAN_DISPLAY alone presents nothing. Rewrite the shadow through write() on each tick — an identity copy that marks the whole framebuffer damaged and triggers the flush toward the display pipeline; the pan/modeset path remains as a fallback. Note: under headless QEMU the virtio-gpu scanout still shows only the fbcon surface in screendumps; the memory-level path is proven (fb0 content carries the capsule drawing) and a real scanout (rpi4) reads the memory directly. --- linux/usr/src/soo/fb_mapper.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/linux/usr/src/soo/fb_mapper.c b/linux/usr/src/soo/fb_mapper.c index 44a16a8..9ba921b 100644 --- a/linux/usr/src/soo/fb_mapper.c +++ b/linux/usr/src/soo/fb_mapper.c @@ -152,11 +152,22 @@ int main(int argc, char *argv[]) while (1) { usleep(USECONDS / FPS); - if (ioctl(fd, FBIOPAN_DISPLAY, &vinfo) == -1) { - /* Fallback to force the update */ - vinfo.activate = FB_ACTIVATE_NOW | FB_ACTIVATE_FORCE; - if (ioctl(fd, FBIOPUT_VSCREENINFO, &vinfo) == -1) { - perror("Error while updating the FB"); + /* On DRM fbdev emulation (e.g. virtio-gpu under QEMU) the + * capsule pixels land in the shadow buffer through the AVZ + * stage-2 remap, bypassing the agency MMU — the deferred-io + * damage tracking never sees them and nothing is presented. + * Rewriting the shadow through write() is an identity copy + * but marks the whole framebuffer damaged, which triggers + * the flush to the host. On a real scanout (e.g. rpi4) the + * hardware reads the memory directly. */ + lseek(fd, 0, SEEK_SET); + if (write(fd, fb_ptr, screen_size) < 0) { + if (ioctl(fd, FBIOPAN_DISPLAY, &vinfo) == -1) { + /* Fallback to force the update */ + vinfo.activate = FB_ACTIVATE_NOW | FB_ACTIVATE_FORCE; + if (ioctl(fd, FBIOPUT_VSCREENINFO, &vinfo) == -1) { + perror("Error while updating the FB"); + } } } } From 8bc0a2567bb7d8121550232612966965cdb74859 Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Sun, 12 Jul 2026 12:04:34 +0200 Subject: [PATCH 37/52] rpi4_64: make the AVZ agency build end to end MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Validate and repair the rpi4_64 build environment on the v6.2.1-rc base — everything now compiles up to the two AVZ boot ITBs (rpi4_64_avz.itb + rpi4_64_linux_guest.itb): - wire rpi4_64_nomodules_soo_defconfig into the referenced patch set (it lived in an orphan 0002- directory no recipe includes — upstream so3 carries the same gap, rpi4 is not CI-built there). - repair the RPi DTS patch set, which was an inconsistent extract of the downstream kernel: include bcm2711-rpi.dtsi from the board dts (brings the v3d/vc4 pipeline), prune the status overrides and __overrides__/aliases entries that reference downstream-only labels (fb, firmwarekms, csi, smi, random, mmcnr, spi0, axiperf...), and normalize the 0132 board patch (context lines had lost their leading space; hunk counts fixed). - usr modules: rpi4_64 builds the generic modtry (the default qemu.c is x86-only and senseled needs the VSENSE backends that have never been enabled); port senseled_remove to the 6.11+ void prototype anyway. - add the rpi4_64_avz/_linux_guest ITS templates for bsp-linux (AVZ copied from the so3 set; guest mirrors virt64 at the rpi4 load addresses 0x10000000/0x15000000/0x15c00000) and select IB_TARGET_ITS:linux:rpi4_64 = rpi4_64_avz. Not booted (no board); build-level validation only. --- build/conf/local.conf | 1 + .../linux/files/its/rpi4_64_avz.its | 53 + .../linux/files/its/rpi4_64_linux_guest.its | 63 + .../files/0001-linux-6.12-rpi4-r0-patches.inc | 1 + .../0003-bcm270x-rpi.dtsi.patch | 33 +- .../0005-bcm2711-rpi-4-b.dts.patch | 3 +- .../0006-bcm2711-rpi.dtsi.patch | 36 +- ...0017-rpi4_64_nomodules_soo_defconfig.patch | 5442 +++++++++++++++++ .../0132-bcm2711-rpi-4-b.dts.patch | 14 +- linux/usr/src/modules/Makefile | 4 + linux/usr/src/modules/senseled.c | 4 +- 11 files changed, 5572 insertions(+), 82 deletions(-) create mode 100644 build/meta-bsp/recipes-bsp/linux/files/its/rpi4_64_avz.its create mode 100644 build/meta-bsp/recipes-bsp/linux/files/its/rpi4_64_linux_guest.its create mode 100644 build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0017-rpi4_64_nomodules_soo_defconfig.patch diff --git a/build/conf/local.conf b/build/conf/local.conf index 1f9f2bd..0e4ec44 100644 --- a/build/conf/local.conf +++ b/build/conf/local.conf @@ -44,6 +44,7 @@ IB_CONFIG:linux:verdin-imx8mp ?= "verdin_imx8mp_defconfig" # IB_TARGET_ITS:linux:virt64 ?= "virt64" # Linux as agency/guest on AVZ (MICOFE default — hosts the SO3 capsules): IB_TARGET_ITS:linux:virt64 ?= "virt64_avz" +IB_TARGET_ITS:linux:rpi4_64 ?= "rpi4_64_avz" # ============================================================================ diff --git a/build/meta-bsp/recipes-bsp/linux/files/its/rpi4_64_avz.its b/build/meta-bsp/recipes-bsp/linux/files/its/rpi4_64_avz.its new file mode 100644 index 0000000..fef0ed3 --- /dev/null +++ b/build/meta-bsp/recipes-bsp/linux/files/its/rpi4_64_avz.its @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2020-2026 Daniel Rossier + * + * AVZ ITB for RPi4 (64-bit). Carries only the AVZ hypervisor binary + * (so3.bin) + the AVZ device tree. The guest (SO3) lives in a SEPARATE + * ITB (rpi4_64_so3_guest.its); both are loaded by U-Boot's guest-boot + * command, which passes the AVZ FIT in x0 and the guest ITB in x1. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +/dts-v1/; + +/ { + description = "AVZ Hypervisor bundle for RPi4 (64-bit)"; + + images { + + avz { + description = "AVZ Hypervisor (64-bit) Polymorphic SO3"; + data = /incbin/("${IB_AVZ_PATH}/so3.bin"); + type = "kernel"; + os = "linux"; + arch = "arm64"; + compression = "none"; + load = <0x00080000>; + entry = <0x00080000>; + }; + + avz_dt { + description = "AVZ device tree"; + data = /incbin/("${IB_AVZ_PATH}/dts/rpi4_64_avz.dtb"); + type = "avz_dt"; + arch = "arm64"; + compression = "none"; + load = <0x03000000>; + }; + }; + + configurations { + default = "avz"; + + avz { + description = "AVZ hypervisor on RPi4 64-bit"; + kernel = "avz"; + loadables = "avz_dt"; + fdt = "avz_dt"; + }; + }; +}; diff --git a/build/meta-bsp/recipes-bsp/linux/files/its/rpi4_64_linux_guest.its b/build/meta-bsp/recipes-bsp/linux/files/its/rpi4_64_linux_guest.its new file mode 100644 index 0000000..abf72e9 --- /dev/null +++ b/build/meta-bsp/recipes-bsp/linux/files/its/rpi4_64_linux_guest.its @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2020-2026 Daniel Rossier + * + * Linux guest ITB for rpi4_64. Carries the Linux (agency) kernel + * + its guest device tree + initrd. Paired with virt64_avz.itb and loaded + * by U-Boot's guest-boot command, which passes this ITB to AVZ in x1; AVZ's + * loadAgency() loads the agency guest from it. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +/dts-v1/; + +/ { + description = "Linux guest bundle for rpi4_64"; + + images { + + linux { + description = "Linux kernel (guest)"; + data = /incbin/("${IB_LINUX_PATH}/arch/arm64/boot/Image"); + type = "guest"; + arch = "arm64"; + os = "linux"; + compression = "none"; + load = <0x10000000>; + entry = <0x10000000>; + }; + + fdt { + description = "Linux guest device tree"; + data = /incbin/("${IB_LINUX_PATH}/arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dtb"); + type = "flat_dt"; + arch = "arm64"; + compression = "none"; + load = <0x15000000>; + }; + + initrd { + description = "Linux initrd"; + data = /incbin/("${IB_ROOTFS_PATH}/board/rpi4_64/initrd.cpio.gz"); + type = "ramdisk"; + arch = "arm64"; + os = "linux"; + compression = "none"; + load = <0x15c00000>; + }; + }; + + configurations { + default = "capsule"; + + capsule { + description = "Linux agency guest on virt64"; + loadables = "linux"; + fdt = "fdt"; + ramdisk = "initrd"; + }; + }; +}; diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0-patches.inc b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0-patches.inc index 61e7018..798fc71 100644 --- a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0-patches.inc +++ b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0-patches.inc @@ -18,4 +18,5 @@ SRC_URI += "\ file://0004-bcm2711.dtsi.patch \ file://0013-bcm283x-rpi-usb-peripheral.dtsi.patch \ file://0016-rpi4_64_nomodules_defconfig.patch \ + file://0017-rpi4_64_nomodules_soo_defconfig.patch \ " \ No newline at end of file diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0003-bcm270x-rpi.dtsi.patch b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0003-bcm270x-rpi.dtsi.patch index b8149c2..72ae72d 100644 --- a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0003-bcm270x-rpi.dtsi.patch +++ b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0003-bcm270x-rpi.dtsi.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/infrabase/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/boot/dts/broadcom/bcm270x-rpi.dtsi 1970-01-01 01:00:00.000000000 +0100 +++ ./arch/arm64/boot/dts/broadcom/bcm270x-rpi.dtsi 2025-05-05 20:19:23.871333855 +0200 -@@ -0,0 +1,157 @@ +@@ -0,0 +1,126 @@ +/* Downstream modifications to bcm2835-rpi.dtsi */ + +/ { @@ -8,11 +8,7 @@ + audio = &audio; + aux = &aux; + sound = &sound; -+ soc = &soc; + dma = &dma; -+ intc = &intc; -+ watchdog = &watchdog; -+ random = &random; + mailbox = &mailbox; + + /* SOO.tech - avoid a compilation warning */ @@ -21,21 +17,17 @@ + uart0 = &uart0; + uart1 = &uart1; + sdhost = &sdhost; -+ mmc = &mmc; -+ mmc1 = &mmc; + mmc0 = &sdhost; + i2s = &i2s; + i2c0 = &i2c0; + i2c1 = &i2c1; + i2c10 = &i2c_csi_dsi; -+ spi0 = &spi0; + spi1 = &spi1; + spi2 = &spi2; + usb = &usb; + leds = &leds; + fb = &fb; + thermal = &thermal; -+ axiperf = &axiperf; + }; + + /* Define these notional regulators for use by overlays */ @@ -83,29 +75,6 @@ + }; + }; + -+ __overrides__ { -+ cache_line_size; -+ -+ uart0 = <&uart0>,"status"; -+ uart1 = <&uart1>,"status"; -+ i2s = <&i2s>,"status"; -+ spi = <&spi0>,"status"; -+ i2c0 = <&i2c0if>,"status",<&i2c0mux>,"status"; -+ i2c1 = <&i2c1>,"status"; -+ i2c0_baudrate = <&i2c0if>,"clock-frequency:0"; -+ i2c1_baudrate = <&i2c1>,"clock-frequency:0"; -+ -+ audio = <&audio>,"status"; -+ watchdog = <&watchdog>,"status"; -+ random = <&random>,"status"; -+ sd_overclock = <&sdhost>,"brcm,overclock-50:0"; -+ sd_force_pio = <&sdhost>,"brcm,force-pio?"; -+ sd_pio_limit = <&sdhost>,"brcm,pio-limit:0"; -+ sd_debug = <&sdhost>,"brcm,debug"; -+ sdio_overclock = <&mmc>,"brcm,overclock-50:0", -+ <&mmcnr>,"brcm,overclock-50:0"; -+ axiperf = <&axiperf>,"status"; -+ }; +}; + +&uart0 { diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0005-bcm2711-rpi-4-b.dts.patch b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0005-bcm2711-rpi-4-b.dts.patch index 255c160..2feb082 100644 --- a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0005-bcm2711-rpi-4-b.dts.patch +++ b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0005-bcm2711-rpi-4-b.dts.patch @@ -1,6 +1,6 @@ --- /home/rossierd/soo/infrabase/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dts 2025-09-03 20:23:08.000000000 +0200 +++ ./arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dts 2025-09-04 17:39:05.169281153 +0200 -@@ -1,2 +1,416 @@ +@@ -1,2 +1,417 @@ // SPDX-License-Identifier: GPL-2.0 -#include "arm/broadcom/bcm2711-rpi-4-b.dts" +/* SOO.tech */ @@ -8,6 +8,7 @@ +/dts-v1/; +#include "bcm2711.dtsi" +#include "bcm2835-rpi.dtsi" ++#include "bcm2711-rpi.dtsi" +#include "bcm283x-rpi-usb-peripheral.dtsi" + +#include diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0006-bcm2711-rpi.dtsi.patch b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0006-bcm2711-rpi.dtsi.patch index 1f2f32c..ff77511 100644 --- a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0006-bcm2711-rpi.dtsi.patch +++ b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0006-bcm2711-rpi.dtsi.patch @@ -1,14 +1,10 @@ --- /home/rossierd/soo/infrabase/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/boot/dts/broadcom/bcm2711-rpi.dtsi 1970-01-01 01:00:00.000000000 +0100 +++ ./arch/arm64/boot/dts/broadcom/bcm2711-rpi.dtsi 2025-05-05 20:19:23.871333855 +0200 -@@ -0,0 +1,201 @@ +@@ -0,0 +1,167 @@ +// SPDX-License-Identifier: GPL-2.0 +#include "bcm270x-rpi.dtsi" + +/ { -+ __overrides__ { -+ arm_freq; -+ }; -+ + v3dbus: v3dbus { + compatible = "simple-bus"; + #address-cells = <1>; @@ -109,36 +105,6 @@ + compatible = "brcm,bcm2711-vchiq"; +}; + -+&firmwarekms { -+ compatible = "raspberrypi,rpi-firmware-kms-2711"; -+ interrupts = ; -+}; -+ -+&smi { -+ interrupts = ; -+}; -+ -+&mmc { -+ interrupts = ; -+}; -+ -+&mmcnr { -+ interrupts = ; -+}; -+ -+&csi0 { -+ interrupts = ; -+}; -+ -+&csi1 { -+ interrupts = ; -+}; -+ -+&random { -+ compatible = "brcm,bcm2711-rng200"; -+ status = "okay"; -+}; -+ +&usb { + /* Enable the FIQ support */ + reg = <0x7e980000 0x10000>, diff --git a/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0017-rpi4_64_nomodules_soo_defconfig.patch b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0017-rpi4_64_nomodules_soo_defconfig.patch new file mode 100644 index 0000000..c65018e --- /dev/null +++ b/build/meta-linux/recipes-linux/linux/files/0001-linux-6.12-rpi4-r0/0017-rpi4_64_nomodules_soo_defconfig.patch @@ -0,0 +1,5442 @@ +--- /home/rossierd/soo/micofe/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/configs/rpi4_64_nomodules_soo_defconfig 1970-01-01 01:00:00.000000000 +0100 ++++ ./arch/arm64/configs/rpi4_64_nomodules_soo_defconfig 2026-02-13 12:39:28.107216945 +0100 +@@ -0,0 +1,5439 @@ ++# ++# Automatically generated file; DO NOT EDIT. ++# Linux/arm64 6.12.34 Kernel Configuration ++# ++CONFIG_CC_VERSION_TEXT="aarch64-none-linux-gnu-gcc (Arm GNU Toolchain 12.2.Rel1 (Build arm-12.24)) 12.2.1 20221205" ++CONFIG_CC_IS_GCC=y ++CONFIG_GCC_VERSION=120201 ++CONFIG_CLANG_VERSION=0 ++CONFIG_AS_IS_GNU=y ++CONFIG_AS_VERSION=23900 ++CONFIG_LD_IS_BFD=y ++CONFIG_LD_VERSION=23900 ++CONFIG_LLD_VERSION=0 ++CONFIG_RUSTC_VERSION=109101 ++CONFIG_RUSTC_LLVM_VERSION=210102 ++CONFIG_CC_CAN_LINK=y ++CONFIG_CC_CAN_LINK_STATIC=y ++CONFIG_GCC_ASM_GOTO_OUTPUT_BROKEN=y ++CONFIG_CC_HAS_ASM_INLINE=y ++CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y ++CONFIG_LD_CAN_USE_KEEP_IN_OVERLAY=y ++CONFIG_RUSTC_HAS_UNNECESSARY_TRANSMUTES=y ++CONFIG_PAHOLE_VERSION=0 ++CONFIG_IRQ_WORK=y ++CONFIG_BUILDTIME_TABLE_SORT=y ++CONFIG_THREAD_INFO_IN_TASK=y ++ ++# ++# General setup ++# ++CONFIG_INIT_ENV_ARG_LIMIT=32 ++# CONFIG_COMPILE_TEST is not set ++# CONFIG_WERROR is not set ++CONFIG_LOCALVERSION="-v8" ++# CONFIG_LOCALVERSION_AUTO is not set ++CONFIG_BUILD_SALT="" ++CONFIG_DEFAULT_INIT="" ++CONFIG_DEFAULT_HOSTNAME="(none)" ++CONFIG_SYSVIPC=y ++CONFIG_SYSVIPC_SYSCTL=y ++CONFIG_SYSVIPC_COMPAT=y ++CONFIG_POSIX_MQUEUE=y ++CONFIG_POSIX_MQUEUE_SYSCTL=y ++# CONFIG_WATCH_QUEUE is not set ++CONFIG_CROSS_MEMORY_ATTACH=y ++# CONFIG_USELIB is not set ++CONFIG_AUDIT=y ++CONFIG_HAVE_ARCH_AUDITSYSCALL=y ++CONFIG_AUDITSYSCALL=y ++ ++# ++# IRQ subsystem ++# ++CONFIG_GENERIC_IRQ_PROBE=y ++CONFIG_GENERIC_IRQ_SHOW=y ++CONFIG_GENERIC_IRQ_SHOW_LEVEL=y ++CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y ++CONFIG_GENERIC_IRQ_MIGRATION=y ++CONFIG_GENERIC_IRQ_INJECTION=y ++CONFIG_HARDIRQS_SW_RESEND=y ++CONFIG_GENERIC_IRQ_CHIP=y ++CONFIG_IRQ_DOMAIN=y ++CONFIG_IRQ_DOMAIN_HIERARCHY=y ++CONFIG_GENERIC_IRQ_IPI=y ++CONFIG_GENERIC_MSI_IRQ=y ++CONFIG_IRQ_MSI_IOMMU=y ++CONFIG_IRQ_FORCED_THREADING=y ++CONFIG_SPARSE_IRQ=y ++CONFIG_GENERIC_IRQ_DEBUGFS=y ++# end of IRQ subsystem ++ ++CONFIG_GENERIC_TIME_VSYSCALL=y ++CONFIG_GENERIC_CLOCKEVENTS=y ++CONFIG_ARCH_HAS_TICK_BROADCAST=y ++CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y ++CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y ++CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y ++CONFIG_CONTEXT_TRACKING=y ++CONFIG_CONTEXT_TRACKING_IDLE=y ++ ++# ++# Timers subsystem ++# ++CONFIG_TICK_ONESHOT=y ++CONFIG_NO_HZ_COMMON=y ++# CONFIG_HZ_PERIODIC is not set ++CONFIG_NO_HZ_IDLE=y ++# CONFIG_NO_HZ_FULL is not set ++CONFIG_NO_HZ=y ++CONFIG_HIGH_RES_TIMERS=y ++# end of Timers subsystem ++ ++CONFIG_BPF=y ++CONFIG_HAVE_EBPF_JIT=y ++CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y ++ ++# ++# BPF subsystem ++# ++CONFIG_BPF_SYSCALL=y ++CONFIG_BPF_JIT=y ++# CONFIG_BPF_JIT_ALWAYS_ON is not set ++CONFIG_BPF_JIT_DEFAULT_ON=y ++CONFIG_BPF_UNPRIV_DEFAULT_OFF=y ++# CONFIG_BPF_PRELOAD is not set ++# CONFIG_BPF_LSM is not set ++# end of BPF subsystem ++ ++CONFIG_PREEMPT_BUILD=y ++# CONFIG_PREEMPT_NONE is not set ++# CONFIG_PREEMPT_VOLUNTARY is not set ++CONFIG_PREEMPT=y ++# CONFIG_PREEMPT_RT is not set ++CONFIG_PREEMPT_COUNT=y ++CONFIG_PREEMPTION=y ++# CONFIG_PREEMPT_DYNAMIC is not set ++ ++# ++# CPU/Task time and stats accounting ++# ++CONFIG_TICK_CPU_ACCOUNTING=y ++# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set ++# CONFIG_IRQ_TIME_ACCOUNTING is not set ++CONFIG_BSD_PROCESS_ACCT=y ++CONFIG_BSD_PROCESS_ACCT_V3=y ++CONFIG_TASKSTATS=y ++CONFIG_TASK_DELAY_ACCT=y ++CONFIG_TASK_XACCT=y ++CONFIG_TASK_IO_ACCOUNTING=y ++CONFIG_PSI=y ++CONFIG_PSI_DEFAULT_DISABLED=y ++# end of CPU/Task time and stats accounting ++ ++CONFIG_CPU_ISOLATION=y ++ ++# ++# RCU Subsystem ++# ++CONFIG_TREE_RCU=y ++CONFIG_PREEMPT_RCU=y ++# CONFIG_RCU_EXPERT is not set ++CONFIG_TREE_SRCU=y ++CONFIG_TASKS_RCU_GENERIC=y ++CONFIG_NEED_TASKS_RCU=y ++CONFIG_TASKS_RCU=y ++CONFIG_TASKS_RUDE_RCU=y ++CONFIG_TASKS_TRACE_RCU=y ++CONFIG_RCU_STALL_COMMON=y ++CONFIG_RCU_NEED_SEGCBLIST=y ++# end of RCU Subsystem ++ ++# CONFIG_IKCONFIG is not set ++# CONFIG_IKHEADERS is not set ++CONFIG_LOG_BUF_SHIFT=17 ++CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 ++# CONFIG_PRINTK_INDEX is not set ++CONFIG_GENERIC_SCHED_CLOCK=y ++ ++# ++# Scheduler features ++# ++# CONFIG_UCLAMP_TASK is not set ++# end of Scheduler features ++ ++CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y ++CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y ++CONFIG_CC_HAS_INT128=y ++CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" ++CONFIG_GCC10_NO_ARRAY_BOUNDS=y ++CONFIG_CC_NO_ARRAY_BOUNDS=y ++CONFIG_GCC_NO_STRINGOP_OVERFLOW=y ++CONFIG_CC_NO_STRINGOP_OVERFLOW=y ++CONFIG_ARCH_SUPPORTS_INT128=y ++# CONFIG_NUMA_BALANCING is not set ++CONFIG_SLAB_OBJ_EXT=y ++CONFIG_CGROUPS=y ++CONFIG_PAGE_COUNTER=y ++# CONFIG_CGROUP_FAVOR_DYNMODS is not set ++CONFIG_MEMCG=y ++# CONFIG_MEMCG_V1 is not set ++CONFIG_BLK_CGROUP=y ++CONFIG_CGROUP_WRITEBACK=y ++CONFIG_CGROUP_SCHED=y ++CONFIG_GROUP_SCHED_WEIGHT=y ++CONFIG_FAIR_GROUP_SCHED=y ++CONFIG_CFS_BANDWIDTH=y ++# CONFIG_RT_GROUP_SCHED is not set ++CONFIG_SCHED_MM_CID=y ++CONFIG_CGROUP_PIDS=y ++# CONFIG_CGROUP_RDMA is not set ++CONFIG_CGROUP_FREEZER=y ++CONFIG_CPUSETS=y ++CONFIG_CPUSETS_V1=y ++CONFIG_PROC_PID_CPUSET=y ++CONFIG_CGROUP_DEVICE=y ++CONFIG_CGROUP_CPUACCT=y ++CONFIG_CGROUP_PERF=y ++CONFIG_CGROUP_BPF=y ++# CONFIG_CGROUP_MISC is not set ++# CONFIG_CGROUP_DEBUG is not set ++CONFIG_SOCK_CGROUP_DATA=y ++CONFIG_NAMESPACES=y ++CONFIG_UTS_NS=y ++CONFIG_TIME_NS=y ++CONFIG_IPC_NS=y ++CONFIG_USER_NS=y ++CONFIG_PID_NS=y ++CONFIG_NET_NS=y ++CONFIG_CHECKPOINT_RESTORE=y ++CONFIG_SCHED_AUTOGROUP=y ++CONFIG_RELAY=y ++CONFIG_BLK_DEV_INITRD=y ++CONFIG_INITRAMFS_SOURCE="" ++CONFIG_RD_GZIP=y ++CONFIG_RD_BZIP2=y ++CONFIG_RD_LZMA=y ++CONFIG_RD_XZ=y ++CONFIG_RD_LZO=y ++CONFIG_RD_LZ4=y ++CONFIG_RD_ZSTD=y ++# CONFIG_BOOT_CONFIG is not set ++CONFIG_INITRAMFS_PRESERVE_MTIME=y ++CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y ++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set ++CONFIG_LD_ORPHAN_WARN=y ++CONFIG_LD_ORPHAN_WARN_LEVEL="warn" ++CONFIG_SYSCTL=y ++CONFIG_HAVE_UID16=y ++CONFIG_SYSCTL_EXCEPTION_TRACE=y ++CONFIG_EXPERT=y ++CONFIG_UID16=y ++CONFIG_MULTIUSER=y ++# CONFIG_SGETMASK_SYSCALL is not set ++CONFIG_SYSFS_SYSCALL=y ++CONFIG_FHANDLE=y ++CONFIG_POSIX_TIMERS=y ++CONFIG_PRINTK=y ++CONFIG_BUG=y ++CONFIG_ELF_CORE=y ++# CONFIG_BASE_SMALL is not set ++CONFIG_FUTEX=y ++CONFIG_FUTEX_PI=y ++CONFIG_EPOLL=y ++CONFIG_SIGNALFD=y ++CONFIG_TIMERFD=y ++CONFIG_EVENTFD=y ++CONFIG_SHMEM=y ++CONFIG_AIO=y ++CONFIG_IO_URING=y ++CONFIG_ADVISE_SYSCALLS=y ++CONFIG_MEMBARRIER=y ++CONFIG_KCMP=y ++CONFIG_RSEQ=y ++# CONFIG_DEBUG_RSEQ is not set ++CONFIG_CACHESTAT_SYSCALL=y ++# CONFIG_PC104 is not set ++CONFIG_KALLSYMS=y ++# CONFIG_KALLSYMS_SELFTEST is not set ++CONFIG_KALLSYMS_ALL=y ++CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y ++CONFIG_HAVE_PERF_EVENTS=y ++CONFIG_GUEST_PERF_EVENTS=y ++ ++# ++# Kernel Performance Events And Counters ++# ++CONFIG_PERF_EVENTS=y ++# CONFIG_DEBUG_PERF_USE_VMALLOC is not set ++# end of Kernel Performance Events And Counters ++ ++CONFIG_PROFILING=y ++CONFIG_TRACEPOINTS=y ++ ++# ++# Kexec and crash features ++# ++# CONFIG_KEXEC_FILE is not set ++# end of Kexec and crash features ++# end of General setup ++ ++CONFIG_ARM64=y ++CONFIG_RUSTC_SUPPORTS_ARM64=y ++CONFIG_GCC_SUPPORTS_DYNAMIC_FTRACE_WITH_ARGS=y ++CONFIG_64BIT=y ++CONFIG_MMU=y ++CONFIG_ARM64_CONT_PTE_SHIFT=4 ++CONFIG_ARM64_CONT_PMD_SHIFT=4 ++CONFIG_ARCH_MMAP_RND_BITS_MIN=18 ++CONFIG_ARCH_MMAP_RND_BITS_MAX=24 ++CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11 ++CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 ++CONFIG_STACKTRACE_SUPPORT=y ++CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 ++CONFIG_LOCKDEP_SUPPORT=y ++CONFIG_GENERIC_BUG=y ++CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y ++CONFIG_GENERIC_HWEIGHT=y ++CONFIG_GENERIC_CSUM=y ++CONFIG_GENERIC_CALIBRATE_DELAY=y ++CONFIG_SMP=y ++CONFIG_KERNEL_MODE_NEON=y ++CONFIG_FIX_EARLYCON_MEM=y ++CONFIG_PGTABLE_LEVELS=3 ++CONFIG_ARCH_SUPPORTS_UPROBES=y ++CONFIG_ARCH_PROC_KCORE_TEXT=y ++CONFIG_BUILTIN_RETURN_ADDRESS_STRIPS_PAC=y ++ ++# ++# Platform selection ++# ++# CONFIG_ARCH_ACTIONS is not set ++# CONFIG_ARCH_AIROHA is not set ++# CONFIG_ARCH_SUNXI is not set ++# CONFIG_ARCH_ALPINE is not set ++# CONFIG_ARCH_APPLE is not set ++CONFIG_ARCH_BCM=y ++CONFIG_ARCH_BCM2835=y ++# CONFIG_ARCH_BCM_IPROC is not set ++# CONFIG_ARCH_BCMBCA is not set ++CONFIG_ARCH_BRCMSTB=y ++# CONFIG_ARCH_BERLIN is not set ++# CONFIG_ARCH_BITMAIN is not set ++# CONFIG_ARCH_EXYNOS is not set ++# CONFIG_ARCH_SPARX5 is not set ++# CONFIG_ARCH_K3 is not set ++# CONFIG_ARCH_LG1K is not set ++# CONFIG_ARCH_HISI is not set ++# CONFIG_ARCH_KEEMBAY is not set ++# CONFIG_ARCH_MEDIATEK is not set ++# CONFIG_ARCH_MESON is not set ++# CONFIG_ARCH_MVEBU is not set ++# CONFIG_ARCH_NXP is not set ++# CONFIG_ARCH_MA35 is not set ++# CONFIG_ARCH_NPCM is not set ++# CONFIG_ARCH_PENSANDO is not set ++# CONFIG_ARCH_QCOM is not set ++# CONFIG_ARCH_REALTEK is not set ++# CONFIG_ARCH_RENESAS is not set ++# CONFIG_ARCH_ROCKCHIP is not set ++# CONFIG_ARCH_SEATTLE is not set ++# CONFIG_ARCH_INTEL_SOCFPGA is not set ++# CONFIG_ARCH_STM32 is not set ++# CONFIG_ARCH_SYNQUACER is not set ++# CONFIG_ARCH_TEGRA is not set ++# CONFIG_ARCH_SPRD is not set ++# CONFIG_ARCH_THUNDER is not set ++# CONFIG_ARCH_THUNDER2 is not set ++# CONFIG_ARCH_UNIPHIER is not set ++# CONFIG_ARCH_VEXPRESS is not set ++# CONFIG_ARCH_VISCONTI is not set ++# CONFIG_ARCH_XGENE is not set ++# CONFIG_ARCH_ZYNQMP is not set ++# end of Platform selection ++ ++# ++# Kernel Features ++# ++ ++# ++# ARM errata workarounds via the alternatives framework ++# ++CONFIG_AMPERE_ERRATUM_AC03_CPU_38=y ++CONFIG_ARM64_WORKAROUND_CLEAN_CACHE=y ++CONFIG_ARM64_ERRATUM_826319=y ++CONFIG_ARM64_ERRATUM_827319=y ++CONFIG_ARM64_ERRATUM_824069=y ++CONFIG_ARM64_ERRATUM_819472=y ++CONFIG_ARM64_ERRATUM_832075=y ++CONFIG_ARM64_ERRATUM_834220=y ++CONFIG_ARM64_ERRATUM_1742098=y ++CONFIG_ARM64_ERRATUM_845719=y ++CONFIG_ARM64_ERRATUM_843419=y ++CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y ++CONFIG_ARM64_ERRATUM_1024718=y ++CONFIG_ARM64_ERRATUM_1418040=y ++CONFIG_ARM64_WORKAROUND_SPECULATIVE_AT=y ++CONFIG_ARM64_ERRATUM_1165522=y ++CONFIG_ARM64_ERRATUM_1319367=y ++CONFIG_ARM64_ERRATUM_1530923=y ++CONFIG_ARM64_WORKAROUND_REPEAT_TLBI=y ++CONFIG_ARM64_ERRATUM_2441007=y ++CONFIG_ARM64_ERRATUM_1286807=y ++CONFIG_ARM64_ERRATUM_1463225=y ++CONFIG_ARM64_ERRATUM_1542419=y ++CONFIG_ARM64_ERRATUM_1508412=y ++CONFIG_ARM64_ERRATUM_2051678=y ++CONFIG_ARM64_ERRATUM_2077057=y ++CONFIG_ARM64_ERRATUM_2658417=y ++CONFIG_ARM64_WORKAROUND_TSB_FLUSH_FAILURE=y ++CONFIG_ARM64_ERRATUM_2054223=y ++CONFIG_ARM64_ERRATUM_2067961=y ++CONFIG_ARM64_ERRATUM_2441009=y ++CONFIG_ARM64_ERRATUM_2457168=y ++CONFIG_ARM64_ERRATUM_2645198=y ++CONFIG_ARM64_WORKAROUND_SPECULATIVE_UNPRIV_LOAD=y ++CONFIG_ARM64_ERRATUM_2966298=y ++CONFIG_ARM64_ERRATUM_3117295=y ++CONFIG_ARM64_ERRATUM_3194386=y ++# CONFIG_CAVIUM_ERRATUM_22375 is not set ++CONFIG_CAVIUM_ERRATUM_23144=y ++# CONFIG_CAVIUM_ERRATUM_23154 is not set ++# CONFIG_CAVIUM_ERRATUM_27456 is not set ++CONFIG_CAVIUM_ERRATUM_30115=y ++CONFIG_CAVIUM_TX2_ERRATUM_219=y ++CONFIG_FUJITSU_ERRATUM_010001=y ++CONFIG_HISILICON_ERRATUM_161600802=y ++CONFIG_HISILICON_ERRATUM_162100801=y ++CONFIG_QCOM_FALKOR_ERRATUM_1003=y ++CONFIG_QCOM_FALKOR_ERRATUM_1009=y ++CONFIG_QCOM_QDF2400_ERRATUM_0065=y ++CONFIG_QCOM_FALKOR_ERRATUM_E1041=y ++CONFIG_NVIDIA_CARMEL_CNP_ERRATUM=y ++CONFIG_ROCKCHIP_ERRATUM_3588001=y ++CONFIG_SOCIONEXT_SYNQUACER_PREITS=y ++# end of ARM errata workarounds via the alternatives framework ++ ++CONFIG_ARM64_4K_PAGES=y ++# CONFIG_ARM64_16K_PAGES is not set ++# CONFIG_ARM64_64K_PAGES is not set ++CONFIG_ARM64_VA_BITS_39=y ++# CONFIG_ARM64_VA_BITS_48 is not set ++# CONFIG_ARM64_VA_BITS_52 is not set ++CONFIG_ARM64_VA_BITS=39 ++CONFIG_ARM64_PA_BITS_48=y ++CONFIG_ARM64_PA_BITS=48 ++# CONFIG_CPU_BIG_ENDIAN is not set ++CONFIG_CPU_LITTLE_ENDIAN=y ++# CONFIG_SCHED_MC is not set ++# CONFIG_SCHED_CLUSTER is not set ++# CONFIG_SCHED_SMT is not set ++CONFIG_NR_CPUS=2 ++CONFIG_HOTPLUG_CPU=y ++CONFIG_NUMA=y ++CONFIG_NODES_SHIFT=4 ++# CONFIG_HZ_100 is not set ++CONFIG_HZ_250=y ++# CONFIG_HZ_300 is not set ++# CONFIG_HZ_1000 is not set ++CONFIG_HZ=250 ++CONFIG_SCHED_HRTICK=y ++CONFIG_ARCH_SPARSEMEM_ENABLE=y ++CONFIG_HW_PERF_EVENTS=y ++CONFIG_CC_HAVE_SHADOW_CALL_STACK=y ++# CONFIG_PARAVIRT is not set ++# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set ++CONFIG_ARCH_SUPPORTS_KEXEC_FILE=y ++CONFIG_ARCH_SUPPORTS_KEXEC_SIG=y ++CONFIG_ARCH_SUPPORTS_KEXEC_IMAGE_VERIFY_SIG=y ++CONFIG_ARCH_DEFAULT_KEXEC_IMAGE_VERIFY_SIG=y ++CONFIG_ARCH_SUPPORTS_CRASH_DUMP=y ++CONFIG_ARCH_DEFAULT_CRASH_DUMP=y ++# CONFIG_XEN is not set ++CONFIG_ARCH_FORCE_MAX_ORDER=10 ++CONFIG_UNMAP_KERNEL_AT_EL0=y ++CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY=y ++CONFIG_RODATA_FULL_DEFAULT_ENABLED=y ++# CONFIG_ARM64_SW_TTBR0_PAN is not set ++CONFIG_ARM64_TAGGED_ADDR_ABI=y ++CONFIG_COMPAT=y ++CONFIG_KUSER_HELPERS=y ++# CONFIG_COMPAT_ALIGNMENT_FIXUPS is not set ++CONFIG_ARMV8_DEPRECATED=y ++CONFIG_SWP_EMULATION=y ++CONFIG_CP15_BARRIER_EMULATION=y ++CONFIG_SETEND_EMULATION=y ++ ++# ++# ARMv8.1 architectural features ++# ++CONFIG_ARM64_HW_AFDBM=y ++CONFIG_ARM64_PAN=y ++CONFIG_AS_HAS_LSE_ATOMICS=y ++CONFIG_ARM64_LSE_ATOMICS=y ++CONFIG_ARM64_USE_LSE_ATOMICS=y ++# end of ARMv8.1 architectural features ++ ++# ++# ARMv8.2 architectural features ++# ++CONFIG_AS_HAS_ARMV8_2=y ++CONFIG_AS_HAS_SHA3=y ++# CONFIG_ARM64_PMEM is not set ++CONFIG_ARM64_RAS_EXTN=y ++CONFIG_ARM64_CNP=y ++# end of ARMv8.2 architectural features ++ ++# ++# ARMv8.3 architectural features ++# ++CONFIG_ARM64_PTR_AUTH=y ++CONFIG_ARM64_PTR_AUTH_KERNEL=y ++CONFIG_CC_HAS_BRANCH_PROT_PAC_RET=y ++CONFIG_CC_HAS_SIGN_RETURN_ADDRESS=y ++CONFIG_AS_HAS_ARMV8_3=y ++CONFIG_AS_HAS_CFI_NEGATE_RA_STATE=y ++CONFIG_AS_HAS_LDAPR=y ++# end of ARMv8.3 architectural features ++ ++# ++# ARMv8.4 architectural features ++# ++CONFIG_ARM64_AMU_EXTN=y ++CONFIG_AS_HAS_ARMV8_4=y ++CONFIG_ARM64_TLB_RANGE=y ++# end of ARMv8.4 architectural features ++ ++# ++# ARMv8.5 architectural features ++# ++CONFIG_AS_HAS_ARMV8_5=y ++CONFIG_ARM64_BTI=y ++CONFIG_CC_HAS_BRANCH_PROT_PAC_RET_BTI=y ++CONFIG_ARM64_E0PD=y ++CONFIG_ARM64_AS_HAS_MTE=y ++CONFIG_ARM64_MTE=y ++# end of ARMv8.5 architectural features ++ ++# ++# ARMv8.7 architectural features ++# ++CONFIG_ARM64_EPAN=y ++# end of ARMv8.7 architectural features ++ ++# ++# ARMv8.9 architectural features ++# ++CONFIG_ARM64_POE=y ++CONFIG_ARCH_PKEY_BITS=3 ++# end of ARMv8.9 architectural features ++ ++CONFIG_ARM64_SVE=y ++# CONFIG_ARM64_PSEUDO_NMI is not set ++CONFIG_RELOCATABLE=y ++CONFIG_RANDOMIZE_BASE=y ++CONFIG_RANDOMIZE_MODULE_REGION_FULL=y ++CONFIG_CC_HAVE_STACKPROTECTOR_SYSREG=y ++CONFIG_STACKPROTECTOR_PER_TASK=y ++# end of Kernel Features ++ ++# ++# Boot options ++# ++CONFIG_CMDLINE="console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait" ++CONFIG_CMDLINE_FROM_BOOTLOADER=y ++# CONFIG_CMDLINE_FORCE is not set ++CONFIG_EFI_STUB=y ++CONFIG_EFI=y ++# CONFIG_COMPRESSED_INSTALL is not set ++CONFIG_DMI=y ++# end of Boot options ++ ++# ++# Power management options ++# ++# CONFIG_SUSPEND is not set ++# CONFIG_HIBERNATION is not set ++CONFIG_PM=y ++CONFIG_PM_DEBUG=y ++# CONFIG_PM_ADVANCED_DEBUG is not set ++# CONFIG_DPM_WATCHDOG is not set ++CONFIG_PM_CLK=y ++CONFIG_PM_GENERIC_DOMAINS=y ++# CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set ++CONFIG_PM_GENERIC_DOMAINS_OF=y ++CONFIG_CPU_PM=y ++# CONFIG_ENERGY_MODEL is not set ++CONFIG_ARCH_HIBERNATION_POSSIBLE=y ++CONFIG_ARCH_SUSPEND_POSSIBLE=y ++# end of Power management options ++ ++# ++# CPU Power Management ++# ++ ++# ++# CPU Idle ++# ++CONFIG_CPU_IDLE=y ++# CONFIG_CPU_IDLE_GOV_LADDER is not set ++CONFIG_CPU_IDLE_GOV_MENU=y ++# CONFIG_CPU_IDLE_GOV_TEO is not set ++ ++# ++# ARM CPU Idle Drivers ++# ++# CONFIG_ARM_PSCI_CPUIDLE is not set ++# end of ARM CPU Idle Drivers ++# end of CPU Idle ++ ++# ++# CPU Frequency scaling ++# ++CONFIG_CPU_FREQ=y ++CONFIG_CPU_FREQ_GOV_ATTR_SET=y ++CONFIG_CPU_FREQ_GOV_COMMON=y ++CONFIG_CPU_FREQ_STAT=y ++# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set ++# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set ++# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set ++CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y ++# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set ++# CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set ++CONFIG_CPU_FREQ_GOV_PERFORMANCE=y ++CONFIG_CPU_FREQ_GOV_POWERSAVE=y ++CONFIG_CPU_FREQ_GOV_USERSPACE=y ++CONFIG_CPU_FREQ_GOV_ONDEMAND=y ++CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y ++CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y ++ ++# ++# CPU frequency scaling drivers ++# ++CONFIG_CPUFREQ_DT=y ++CONFIG_CPUFREQ_DT_PLATDEV=y ++CONFIG_ARM_BRCMSTB_AVS_CPUFREQ=y ++CONFIG_ARM_RASPBERRYPI_CPUFREQ=y ++# end of CPU Frequency scaling ++# end of CPU Power Management ++ ++CONFIG_ARCH_SUPPORTS_ACPI=y ++# CONFIG_ACPI is not set ++CONFIG_KVM_COMMON=y ++CONFIG_HAVE_KVM_IRQCHIP=y ++CONFIG_HAVE_KVM_IRQ_ROUTING=y ++CONFIG_HAVE_KVM_DIRTY_RING=y ++CONFIG_HAVE_KVM_DIRTY_RING_ACQ_REL=y ++CONFIG_NEED_KVM_DIRTY_RING_WITH_BITMAP=y ++CONFIG_KVM_MMIO=y ++CONFIG_HAVE_KVM_MSI=y ++CONFIG_HAVE_KVM_READONLY_MEM=y ++CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT=y ++CONFIG_KVM_VFIO=y ++CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y ++CONFIG_HAVE_KVM_IRQ_BYPASS=y ++CONFIG_HAVE_KVM_VCPU_RUN_PID_CHANGE=y ++CONFIG_KVM_XFER_TO_GUEST_WORK=y ++CONFIG_KVM_GENERIC_HARDWARE_ENABLING=y ++CONFIG_KVM_GENERIC_MMU_NOTIFIER=y ++CONFIG_VIRTUALIZATION=y ++CONFIG_KVM=y ++# CONFIG_NVHE_EL2_DEBUG is not set ++# CONFIG_PTDUMP_STAGE2_DEBUGFS is not set ++CONFIG_CPU_MITIGATIONS=y ++ ++# ++# General architecture-dependent options ++# ++CONFIG_ARCH_HAS_SUBPAGE_FAULTS=y ++CONFIG_HOTPLUG_CORE_SYNC=y ++CONFIG_HOTPLUG_CORE_SYNC_DEAD=y ++CONFIG_KPROBES=y ++CONFIG_JUMP_LABEL=y ++# CONFIG_STATIC_KEYS_SELFTEST is not set ++CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y ++CONFIG_KRETPROBES=y ++CONFIG_HAVE_IOREMAP_PROT=y ++CONFIG_HAVE_KPROBES=y ++CONFIG_HAVE_KRETPROBES=y ++CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y ++CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y ++CONFIG_HAVE_NMI=y ++CONFIG_TRACE_IRQFLAGS_SUPPORT=y ++CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y ++CONFIG_HAVE_ARCH_TRACEHOOK=y ++CONFIG_HAVE_DMA_CONTIGUOUS=y ++CONFIG_GENERIC_SMP_IDLE_THREAD=y ++CONFIG_GENERIC_IDLE_POLL_SETUP=y ++CONFIG_ARCH_HAS_FORTIFY_SOURCE=y ++CONFIG_ARCH_HAS_KEEPINITRD=y ++CONFIG_ARCH_HAS_SET_MEMORY=y ++CONFIG_ARCH_HAS_SET_DIRECT_MAP=y ++CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y ++CONFIG_ARCH_WANTS_NO_INSTR=y ++CONFIG_HAVE_ASM_MODVERSIONS=y ++CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y ++CONFIG_HAVE_RSEQ=y ++CONFIG_HAVE_RUST=y ++CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y ++CONFIG_HAVE_HW_BREAKPOINT=y ++CONFIG_HAVE_PERF_REGS=y ++CONFIG_HAVE_PERF_USER_STACK_DUMP=y ++CONFIG_HAVE_ARCH_JUMP_LABEL=y ++CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y ++CONFIG_MMU_GATHER_TABLE_FREE=y ++CONFIG_MMU_GATHER_RCU_TABLE_FREE=y ++CONFIG_MMU_LAZY_TLB_REFCOUNT=y ++CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y ++CONFIG_ARCH_HAS_NMI_SAFE_THIS_CPU_OPS=y ++CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y ++CONFIG_HAVE_CMPXCHG_LOCAL=y ++CONFIG_HAVE_CMPXCHG_DOUBLE=y ++CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y ++CONFIG_HAVE_ARCH_SECCOMP=y ++CONFIG_HAVE_ARCH_SECCOMP_FILTER=y ++CONFIG_SECCOMP=y ++CONFIG_SECCOMP_FILTER=y ++# CONFIG_SECCOMP_CACHE_DEBUG is not set ++CONFIG_HAVE_ARCH_STACKLEAK=y ++CONFIG_HAVE_STACKPROTECTOR=y ++CONFIG_STACKPROTECTOR=y ++CONFIG_STACKPROTECTOR_STRONG=y ++CONFIG_ARCH_SUPPORTS_SHADOW_CALL_STACK=y ++# CONFIG_SHADOW_CALL_STACK is not set ++CONFIG_ARCH_SUPPORTS_LTO_CLANG=y ++CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y ++CONFIG_LTO_NONE=y ++CONFIG_ARCH_SUPPORTS_CFI_CLANG=y ++CONFIG_HAVE_CONTEXT_TRACKING_USER=y ++CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y ++CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y ++CONFIG_HAVE_MOVE_PUD=y ++CONFIG_HAVE_MOVE_PMD=y ++CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y ++CONFIG_HAVE_ARCH_HUGE_VMAP=y ++CONFIG_HAVE_ARCH_HUGE_VMALLOC=y ++CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y ++CONFIG_HAVE_MOD_ARCH_SPECIFIC=y ++CONFIG_MODULES_USE_ELF_RELA=y ++CONFIG_ARCH_WANTS_EXECMEM_LATE=y ++CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y ++CONFIG_SOFTIRQ_ON_OWN_STACK=y ++CONFIG_ARCH_HAS_ELF_RANDOMIZE=y ++CONFIG_HAVE_ARCH_MMAP_RND_BITS=y ++CONFIG_ARCH_MMAP_RND_BITS=18 ++CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y ++CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11 ++CONFIG_HAVE_PAGE_SIZE_4KB=y ++CONFIG_PAGE_SIZE_4KB=y ++CONFIG_PAGE_SIZE_LESS_THAN_64KB=y ++CONFIG_PAGE_SIZE_LESS_THAN_256KB=y ++CONFIG_PAGE_SHIFT=12 ++CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y ++CONFIG_CLONE_BACKWARDS=y ++CONFIG_OLD_SIGSUSPEND3=y ++CONFIG_COMPAT_OLD_SIGACTION=y ++CONFIG_COMPAT_32BIT_TIME=y ++CONFIG_ARCH_SUPPORTS_RT=y ++CONFIG_HAVE_ARCH_VMAP_STACK=y ++CONFIG_VMAP_STACK=y ++CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y ++CONFIG_RANDOMIZE_KSTACK_OFFSET=y ++# CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set ++CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y ++CONFIG_STRICT_KERNEL_RWX=y ++CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y ++CONFIG_STRICT_MODULE_RWX=y ++CONFIG_HAVE_ARCH_COMPILER_H=y ++CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y ++CONFIG_ARCH_USE_MEMREMAP_PROT=y ++# CONFIG_LOCK_EVENT_COUNTS is not set ++CONFIG_ARCH_HAS_RELR=y ++CONFIG_ARCH_HAS_MEM_ENCRYPT=y ++CONFIG_HAVE_PREEMPT_DYNAMIC=y ++CONFIG_HAVE_PREEMPT_DYNAMIC_KEY=y ++CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y ++CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y ++CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y ++CONFIG_ARCH_HAVE_TRACE_MMIO_ACCESS=y ++CONFIG_ARCH_HAS_HW_PTE_YOUNG=y ++CONFIG_ARCH_HAS_KERNEL_FPU_SUPPORT=y ++ ++# ++# GCOV-based kernel profiling ++# ++# CONFIG_GCOV_KERNEL is not set ++CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y ++# end of GCOV-based kernel profiling ++ ++CONFIG_HAVE_GCC_PLUGINS=y ++CONFIG_GCC_PLUGINS=y ++# CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set ++CONFIG_FUNCTION_ALIGNMENT_4B=y ++CONFIG_FUNCTION_ALIGNMENT_8B=y ++CONFIG_FUNCTION_ALIGNMENT=8 ++# end of General architecture-dependent options ++ ++CONFIG_RT_MUTEXES=y ++CONFIG_MODULES=y ++# CONFIG_MODULE_DEBUG is not set ++# CONFIG_MODULE_FORCE_LOAD is not set ++CONFIG_MODULE_UNLOAD=y ++# CONFIG_MODULE_FORCE_UNLOAD is not set ++# CONFIG_MODULE_UNLOAD_TAINT_TRACKING is not set ++CONFIG_MODVERSIONS=y ++CONFIG_ASM_MODVERSIONS=y ++CONFIG_MODULE_SRCVERSION_ALL=y ++# CONFIG_MODULE_SIG is not set ++CONFIG_MODULE_COMPRESS=y ++# CONFIG_MODULE_COMPRESS_GZIP is not set ++CONFIG_MODULE_COMPRESS_XZ=y ++# CONFIG_MODULE_COMPRESS_ZSTD is not set ++CONFIG_MODULE_COMPRESS_ALL=y ++# CONFIG_MODULE_DECOMPRESS is not set ++# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set ++CONFIG_MODPROBE_PATH="/sbin/modprobe" ++# CONFIG_TRIM_UNUSED_KSYMS is not set ++CONFIG_MODULES_TREE_LOOKUP=y ++CONFIG_BLOCK=y ++CONFIG_BLOCK_LEGACY_AUTOLOAD=y ++CONFIG_BLK_CGROUP_RWSTAT=y ++CONFIG_BLK_DEV_BSG_COMMON=y ++CONFIG_BLK_ICQ=y ++CONFIG_BLK_DEV_BSGLIB=y ++CONFIG_BLK_DEV_INTEGRITY=y ++CONFIG_BLK_DEV_WRITE_MOUNTED=y ++# CONFIG_BLK_DEV_ZONED is not set ++CONFIG_BLK_DEV_THROTTLING=y ++# CONFIG_BLK_WBT is not set ++# CONFIG_BLK_CGROUP_IOLATENCY is not set ++# CONFIG_BLK_CGROUP_IOCOST is not set ++# CONFIG_BLK_CGROUP_IOPRIO is not set ++CONFIG_BLK_DEBUG_FS=y ++# CONFIG_BLK_SED_OPAL is not set ++# CONFIG_BLK_INLINE_ENCRYPTION is not set ++ ++# ++# Partition Types ++# ++CONFIG_PARTITION_ADVANCED=y ++# CONFIG_ACORN_PARTITION is not set ++# CONFIG_AIX_PARTITION is not set ++# CONFIG_OSF_PARTITION is not set ++# CONFIG_AMIGA_PARTITION is not set ++# CONFIG_ATARI_PARTITION is not set ++CONFIG_MAC_PARTITION=y ++CONFIG_MSDOS_PARTITION=y ++# CONFIG_BSD_DISKLABEL is not set ++# CONFIG_MINIX_SUBPARTITION is not set ++# CONFIG_SOLARIS_X86_PARTITION is not set ++# CONFIG_UNIXWARE_DISKLABEL is not set ++# CONFIG_LDM_PARTITION is not set ++# CONFIG_SGI_PARTITION is not set ++# CONFIG_ULTRIX_PARTITION is not set ++# CONFIG_SUN_PARTITION is not set ++# CONFIG_KARMA_PARTITION is not set ++CONFIG_EFI_PARTITION=y ++# CONFIG_SYSV68_PARTITION is not set ++# CONFIG_CMDLINE_PARTITION is not set ++# end of Partition Types ++ ++CONFIG_BLK_MQ_PCI=y ++CONFIG_BLK_PM=y ++ ++# ++# IO Schedulers ++# ++CONFIG_MQ_IOSCHED_DEADLINE=y ++CONFIG_MQ_IOSCHED_KYBER=y ++CONFIG_IOSCHED_BFQ=y ++CONFIG_BFQ_GROUP_IOSCHED=y ++# CONFIG_BFQ_CGROUP_DEBUG is not set ++# end of IO Schedulers ++ ++CONFIG_PREEMPT_NOTIFIERS=y ++CONFIG_ASN1=y ++CONFIG_UNINLINE_SPIN_UNLOCK=y ++CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y ++CONFIG_MUTEX_SPIN_ON_OWNER=y ++CONFIG_RWSEM_SPIN_ON_OWNER=y ++CONFIG_LOCK_SPIN_ON_OWNER=y ++CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y ++CONFIG_QUEUED_SPINLOCKS=y ++CONFIG_ARCH_USE_QUEUED_RWLOCKS=y ++CONFIG_QUEUED_RWLOCKS=y ++CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y ++CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y ++CONFIG_FREEZER=y ++ ++# ++# Executable file formats ++# ++CONFIG_BINFMT_ELF=y ++CONFIG_COMPAT_BINFMT_ELF=y ++CONFIG_ARCH_BINFMT_ELF_STATE=y ++CONFIG_ARCH_BINFMT_ELF_EXTRA_PHDRS=y ++CONFIG_ARCH_HAVE_ELF_PROT=y ++CONFIG_ARCH_USE_GNU_PROPERTY=y ++CONFIG_ELFCORE=y ++CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y ++CONFIG_BINFMT_SCRIPT=y ++# CONFIG_BINFMT_MISC is not set ++CONFIG_COREDUMP=y ++# end of Executable file formats ++ ++# ++# Memory Management options ++# ++CONFIG_ZPOOL=y ++CONFIG_SWAP=y ++CONFIG_ZSWAP=y ++# CONFIG_ZSWAP_DEFAULT_ON is not set ++# CONFIG_ZSWAP_SHRINKER_DEFAULT_ON is not set ++# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_DEFLATE is not set ++CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZO=y ++# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_842 is not set ++# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZ4 is not set ++# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZ4HC is not set ++# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_ZSTD is not set ++CONFIG_ZSWAP_COMPRESSOR_DEFAULT="lzo" ++# CONFIG_ZSWAP_ZPOOL_DEFAULT_ZBUD is not set ++# CONFIG_ZSWAP_ZPOOL_DEFAULT_Z3FOLD_DEPRECATED is not set ++CONFIG_ZSWAP_ZPOOL_DEFAULT_ZSMALLOC=y ++CONFIG_ZSWAP_ZPOOL_DEFAULT="zsmalloc" ++# CONFIG_ZBUD is not set ++# CONFIG_Z3FOLD_DEPRECATED is not set ++CONFIG_ZSMALLOC=y ++# CONFIG_ZSMALLOC_STAT is not set ++CONFIG_ZSMALLOC_CHAIN_SIZE=8 ++ ++# ++# Slab allocator options ++# ++CONFIG_SLUB=y ++# CONFIG_SLUB_TINY is not set ++CONFIG_SLAB_MERGE_DEFAULT=y ++# CONFIG_SLAB_FREELIST_RANDOM is not set ++# CONFIG_SLAB_FREELIST_HARDENED is not set ++# CONFIG_SLAB_BUCKETS is not set ++# CONFIG_SLUB_STATS is not set ++CONFIG_SLUB_CPU_PARTIAL=y ++# CONFIG_RANDOM_KMALLOC_CACHES is not set ++# end of Slab allocator options ++ ++# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set ++# CONFIG_COMPAT_BRK is not set ++CONFIG_SPARSEMEM=y ++CONFIG_SPARSEMEM_EXTREME=y ++CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y ++CONFIG_SPARSEMEM_VMEMMAP=y ++CONFIG_HAVE_GUP_FAST=y ++CONFIG_ARCH_KEEP_MEMBLOCK=y ++CONFIG_MEMORY_ISOLATION=y ++CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y ++CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y ++# CONFIG_MEMORY_HOTPLUG is not set ++CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y ++CONFIG_SPLIT_PTE_PTLOCKS=y ++CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y ++CONFIG_SPLIT_PMD_PTLOCKS=y ++CONFIG_COMPACTION=y ++CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1 ++# CONFIG_PAGE_REPORTING is not set ++CONFIG_MIGRATION=y ++CONFIG_CONTIG_ALLOC=y ++CONFIG_PCP_BATCH_SCALE_MAX=5 ++CONFIG_PHYS_ADDR_T_64BIT=y ++CONFIG_MMU_NOTIFIER=y ++# CONFIG_KSM is not set ++CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 ++CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y ++# CONFIG_MEMORY_FAILURE is not set ++CONFIG_ARCH_WANTS_THP_SWAP=y ++# CONFIG_TRANSPARENT_HUGEPAGE is not set ++CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y ++CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y ++CONFIG_USE_PERCPU_NUMA_NODE_ID=y ++CONFIG_HAVE_SETUP_PER_CPU_AREA=y ++CONFIG_CMA=y ++# CONFIG_CMA_DEBUGFS is not set ++# CONFIG_CMA_SYSFS is not set ++CONFIG_CMA_AREAS=7 ++CONFIG_GENERIC_EARLY_IOREMAP=y ++# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set ++# CONFIG_IDLE_PAGE_TRACKING is not set ++CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y ++CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y ++CONFIG_ARCH_HAS_PTE_DEVMAP=y ++CONFIG_ARCH_HAS_ZONE_DMA_SET=y ++CONFIG_ZONE_DMA=y ++CONFIG_ZONE_DMA32=y ++CONFIG_VMAP_PFN=y ++CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y ++CONFIG_ARCH_HAS_PKEYS=y ++CONFIG_ARCH_USES_PG_ARCH_2=y ++CONFIG_ARCH_USES_PG_ARCH_3=y ++CONFIG_VM_EVENT_COUNTERS=y ++# CONFIG_PERCPU_STATS is not set ++# CONFIG_GUP_TEST is not set ++# CONFIG_DMAPOOL_TEST is not set ++CONFIG_ARCH_HAS_PTE_SPECIAL=y ++CONFIG_MEMFD_CREATE=y ++CONFIG_SECRETMEM=y ++# CONFIG_ANON_VMA_NAME is not set ++# CONFIG_USERFAULTFD is not set ++CONFIG_LRU_GEN=y ++CONFIG_LRU_GEN_ENABLED=y ++# CONFIG_LRU_GEN_STATS is not set ++CONFIG_LRU_GEN_WALKS_MMU=y ++CONFIG_ARCH_SUPPORTS_PER_VMA_LOCK=y ++CONFIG_PER_VMA_LOCK=y ++CONFIG_LOCK_MM_AND_FIND_VMA=y ++CONFIG_EXECMEM=y ++CONFIG_NUMA_MEMBLKS=y ++CONFIG_NUMA_EMU=y ++ ++# ++# Data Access Monitoring ++# ++# CONFIG_DAMON is not set ++# end of Data Access Monitoring ++# end of Memory Management options ++ ++CONFIG_NET=y ++CONFIG_NET_INGRESS=y ++CONFIG_NET_EGRESS=y ++CONFIG_NET_XGRESS=y ++CONFIG_SKB_EXTENSIONS=y ++CONFIG_NET_DEVMEM=y ++ ++# ++# Networking options ++# ++CONFIG_PACKET=y ++# CONFIG_PACKET_DIAG is not set ++CONFIG_UNIX=y ++CONFIG_AF_UNIX_OOB=y ++# CONFIG_UNIX_DIAG is not set ++# CONFIG_TLS is not set ++# CONFIG_XFRM_USER is not set ++# CONFIG_NET_KEY is not set ++# CONFIG_XDP_SOCKETS is not set ++CONFIG_NET_HANDSHAKE=y ++CONFIG_INET=y ++CONFIG_IP_MULTICAST=y ++CONFIG_IP_ADVANCED_ROUTER=y ++# CONFIG_IP_FIB_TRIE_STATS is not set ++CONFIG_IP_MULTIPLE_TABLES=y ++CONFIG_IP_ROUTE_MULTIPATH=y ++CONFIG_IP_ROUTE_VERBOSE=y ++CONFIG_IP_PNP=y ++CONFIG_IP_PNP_DHCP=y ++# CONFIG_IP_PNP_BOOTP is not set ++CONFIG_IP_PNP_RARP=y ++# CONFIG_NET_IPIP is not set ++# CONFIG_NET_IPGRE_DEMUX is not set ++CONFIG_IP_MROUTE_COMMON=y ++CONFIG_IP_MROUTE=y ++CONFIG_IP_MROUTE_MULTIPLE_TABLES=y ++CONFIG_IP_PIMSM_V1=y ++CONFIG_IP_PIMSM_V2=y ++CONFIG_SYN_COOKIES=y ++# CONFIG_NET_IPVTI is not set ++# CONFIG_NET_FOU is not set ++# CONFIG_INET_AH is not set ++# CONFIG_INET_ESP is not set ++# CONFIG_INET_IPCOMP is not set ++CONFIG_INET_TABLE_PERTURB_ORDER=16 ++# CONFIG_INET_DIAG is not set ++CONFIG_TCP_CONG_ADVANCED=y ++# CONFIG_TCP_CONG_BIC is not set ++CONFIG_TCP_CONG_CUBIC=y ++# CONFIG_TCP_CONG_WESTWOOD is not set ++# CONFIG_TCP_CONG_HTCP is not set ++# CONFIG_TCP_CONG_HSTCP is not set ++# CONFIG_TCP_CONG_HYBLA is not set ++# CONFIG_TCP_CONG_VEGAS is not set ++# CONFIG_TCP_CONG_NV is not set ++# CONFIG_TCP_CONG_SCALABLE is not set ++# CONFIG_TCP_CONG_LP is not set ++# CONFIG_TCP_CONG_VENO is not set ++# CONFIG_TCP_CONG_YEAH is not set ++# CONFIG_TCP_CONG_ILLINOIS is not set ++# CONFIG_TCP_CONG_DCTCP is not set ++# CONFIG_TCP_CONG_CDG is not set ++# CONFIG_TCP_CONG_BBR is not set ++CONFIG_DEFAULT_CUBIC=y ++# CONFIG_DEFAULT_RENO is not set ++CONFIG_DEFAULT_TCP_CONG="cubic" ++# CONFIG_TCP_AO is not set ++# CONFIG_TCP_MD5SIG is not set ++# CONFIG_IPV6 is not set ++# CONFIG_NETLABEL is not set ++CONFIG_MPTCP=y ++# CONFIG_NETWORK_SECMARK is not set ++CONFIG_NET_PTP_CLASSIFY=y ++CONFIG_NETWORK_PHY_TIMESTAMPING=y ++CONFIG_NETFILTER=y ++CONFIG_NETFILTER_ADVANCED=y ++ ++# ++# Core Netfilter Configuration ++# ++CONFIG_NETFILTER_INGRESS=y ++CONFIG_NETFILTER_EGRESS=y ++CONFIG_NETFILTER_SKIP_EGRESS=y ++CONFIG_NETFILTER_BPF_LINK=y ++# CONFIG_NETFILTER_NETLINK_ACCT is not set ++# CONFIG_NETFILTER_NETLINK_QUEUE is not set ++# CONFIG_NETFILTER_NETLINK_LOG is not set ++# CONFIG_NETFILTER_NETLINK_OSF is not set ++# CONFIG_NF_CONNTRACK is not set ++# CONFIG_NF_LOG_SYSLOG is not set ++# CONFIG_NF_TABLES is not set ++# CONFIG_NETFILTER_XTABLES is not set ++# end of Core Netfilter Configuration ++ ++# CONFIG_IP_SET is not set ++# CONFIG_IP_VS is not set ++ ++# ++# IP: Netfilter Configuration ++# ++# CONFIG_NF_SOCKET_IPV4 is not set ++# CONFIG_NF_TPROXY_IPV4 is not set ++# CONFIG_NF_DUP_IPV4 is not set ++# CONFIG_NF_LOG_ARP is not set ++# CONFIG_NF_LOG_IPV4 is not set ++# CONFIG_NF_REJECT_IPV4 is not set ++# CONFIG_IP_NF_IPTABLES is not set ++# end of IP: Netfilter Configuration ++ ++# CONFIG_IP_DCCP is not set ++# CONFIG_IP_SCTP is not set ++# CONFIG_RDS is not set ++# CONFIG_TIPC is not set ++# CONFIG_ATM is not set ++# CONFIG_L2TP is not set ++# CONFIG_BRIDGE is not set ++# CONFIG_NET_DSA is not set ++# CONFIG_VLAN_8021Q is not set ++# CONFIG_LLC2 is not set ++# CONFIG_ATALK is not set ++# CONFIG_X25 is not set ++# CONFIG_LAPB is not set ++# CONFIG_PHONET is not set ++# CONFIG_IEEE802154 is not set ++CONFIG_NET_SCHED=y ++ ++# ++# Queueing/Scheduling ++# ++# CONFIG_NET_SCH_HTB is not set ++# CONFIG_NET_SCH_HFSC is not set ++# CONFIG_NET_SCH_PRIO is not set ++# CONFIG_NET_SCH_MULTIQ is not set ++# CONFIG_NET_SCH_RED is not set ++# CONFIG_NET_SCH_SFB is not set ++# CONFIG_NET_SCH_SFQ is not set ++# CONFIG_NET_SCH_TEQL is not set ++# CONFIG_NET_SCH_TBF is not set ++# CONFIG_NET_SCH_CBS is not set ++# CONFIG_NET_SCH_ETF is not set ++# CONFIG_NET_SCH_TAPRIO is not set ++# CONFIG_NET_SCH_GRED is not set ++# CONFIG_NET_SCH_NETEM is not set ++# CONFIG_NET_SCH_DRR is not set ++# CONFIG_NET_SCH_MQPRIO is not set ++# CONFIG_NET_SCH_SKBPRIO is not set ++# CONFIG_NET_SCH_CHOKE is not set ++# CONFIG_NET_SCH_QFQ is not set ++# CONFIG_NET_SCH_CODEL is not set ++# CONFIG_NET_SCH_FQ_CODEL is not set ++# CONFIG_NET_SCH_CAKE is not set ++# CONFIG_NET_SCH_FQ is not set ++# CONFIG_NET_SCH_HHF is not set ++# CONFIG_NET_SCH_PIE is not set ++# CONFIG_NET_SCH_INGRESS is not set ++# CONFIG_NET_SCH_PLUG is not set ++# CONFIG_NET_SCH_ETS is not set ++# CONFIG_NET_SCH_DEFAULT is not set ++ ++# ++# Classification ++# ++CONFIG_NET_CLS=y ++# CONFIG_NET_CLS_BASIC is not set ++# CONFIG_NET_CLS_ROUTE4 is not set ++# CONFIG_NET_CLS_FW is not set ++# CONFIG_NET_CLS_U32 is not set ++# CONFIG_NET_CLS_FLOW is not set ++# CONFIG_NET_CLS_CGROUP is not set ++CONFIG_NET_CLS_BPF=y ++# CONFIG_NET_CLS_FLOWER is not set ++# CONFIG_NET_CLS_MATCHALL is not set ++CONFIG_NET_EMATCH=y ++CONFIG_NET_EMATCH_STACK=32 ++# CONFIG_NET_EMATCH_CMP is not set ++# CONFIG_NET_EMATCH_NBYTE is not set ++# CONFIG_NET_EMATCH_U32 is not set ++# CONFIG_NET_EMATCH_META is not set ++# CONFIG_NET_EMATCH_TEXT is not set ++CONFIG_NET_CLS_ACT=y ++# CONFIG_NET_ACT_POLICE is not set ++# CONFIG_NET_ACT_GACT is not set ++# CONFIG_NET_ACT_MIRRED is not set ++# CONFIG_NET_ACT_SAMPLE is not set ++# CONFIG_NET_ACT_NAT is not set ++# CONFIG_NET_ACT_PEDIT is not set ++# CONFIG_NET_ACT_SIMP is not set ++# CONFIG_NET_ACT_SKBEDIT is not set ++# CONFIG_NET_ACT_CSUM is not set ++# CONFIG_NET_ACT_MPLS is not set ++# CONFIG_NET_ACT_VLAN is not set ++# CONFIG_NET_ACT_BPF is not set ++# CONFIG_NET_ACT_SKBMOD is not set ++# CONFIG_NET_ACT_IFE is not set ++# CONFIG_NET_ACT_TUNNEL_KEY is not set ++# CONFIG_NET_ACT_GATE is not set ++# CONFIG_NET_TC_SKB_EXT is not set ++CONFIG_NET_SCH_FIFO=y ++# CONFIG_DCB is not set ++CONFIG_DNS_RESOLVER=y ++# CONFIG_BATMAN_ADV is not set ++# CONFIG_OPENVSWITCH is not set ++# CONFIG_VSOCKETS is not set ++# CONFIG_NETLINK_DIAG is not set ++CONFIG_MPLS=y ++# CONFIG_NET_MPLS_GSO is not set ++# CONFIG_MPLS_ROUTING is not set ++# CONFIG_NET_NSH is not set ++# CONFIG_HSR is not set ++CONFIG_NET_SWITCHDEV=y ++CONFIG_NET_L3_MASTER_DEV=y ++# CONFIG_QRTR is not set ++# CONFIG_NET_NCSI is not set ++CONFIG_PCPU_DEV_REFCNT=y ++CONFIG_MAX_SKB_FRAGS=17 ++CONFIG_RPS=y ++CONFIG_RFS_ACCEL=y ++CONFIG_SOCK_RX_QUEUE_MAPPING=y ++CONFIG_XPS=y ++CONFIG_CGROUP_NET_PRIO=y ++CONFIG_CGROUP_NET_CLASSID=y ++CONFIG_NET_RX_BUSY_POLL=y ++CONFIG_BQL=y ++# CONFIG_BPF_STREAM_PARSER is not set ++CONFIG_NET_FLOW_LIMIT=y ++ ++# ++# Network testing ++# ++# CONFIG_NET_PKTGEN is not set ++# CONFIG_NET_DROP_MONITOR is not set ++# end of Network testing ++# end of Networking options ++ ++CONFIG_HAMRADIO=y ++ ++# ++# Packet Radio protocols ++# ++# CONFIG_AX25 is not set ++# CONFIG_CAN is not set ++# CONFIG_BT is not set ++# CONFIG_AF_RXRPC is not set ++# CONFIG_AF_KCM is not set ++# CONFIG_MCTP is not set ++CONFIG_FIB_RULES=y ++CONFIG_WIRELESS=y ++# CONFIG_CFG80211 is not set ++ ++# ++# CFG80211 needs to be enabled for MAC80211 ++# ++CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 ++# CONFIG_RFKILL is not set ++# CONFIG_NET_9P is not set ++# CONFIG_CAIF is not set ++# CONFIG_CEPH_LIB is not set ++# CONFIG_NFC is not set ++# CONFIG_PSAMPLE is not set ++# CONFIG_NET_IFE is not set ++CONFIG_LWTUNNEL=y ++CONFIG_LWTUNNEL_BPF=y ++CONFIG_NET_SELFTESTS=y ++CONFIG_NET_SOCK_MSG=y ++CONFIG_PAGE_POOL=y ++# CONFIG_PAGE_POOL_STATS is not set ++# CONFIG_FAILOVER is not set ++CONFIG_ETHTOOL_NETLINK=y ++ ++# ++# Device Drivers ++# ++CONFIG_ARM_AMBA=y ++CONFIG_HAVE_PCI=y ++CONFIG_GENERIC_PCI_IOMAP=y ++CONFIG_PCI=y ++CONFIG_PCI_DOMAINS=y ++CONFIG_PCI_DOMAINS_GENERIC=y ++CONFIG_PCI_SYSCALL=y ++CONFIG_PCIEPORTBUS=y ++CONFIG_PCIEAER=y ++# CONFIG_PCIEAER_INJECT is not set ++# CONFIG_PCIE_ECRC is not set ++CONFIG_PCIEASPM=y ++# CONFIG_PCIEASPM_DEFAULT is not set ++CONFIG_PCIEASPM_POWERSAVE=y ++# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set ++# CONFIG_PCIEASPM_PERFORMANCE is not set ++CONFIG_PCIE_PME=y ++CONFIG_PCIE_DPC=y ++# CONFIG_PCIE_PTM is not set ++CONFIG_PCI_MSI=y ++CONFIG_PCI_QUIRKS=y ++# CONFIG_PCI_DEBUG is not set ++# CONFIG_PCI_STUB is not set ++# CONFIG_PCI_IOV is not set ++# CONFIG_PCI_NPEM is not set ++# CONFIG_PCI_PRI is not set ++# CONFIG_PCI_PASID is not set ++CONFIG_PCI_LABEL=y ++# CONFIG_PCI_DYNAMIC_OF_NODES is not set ++# CONFIG_PCIE_BUS_TUNE_OFF is not set ++CONFIG_PCIE_BUS_DEFAULT=y ++# CONFIG_PCIE_BUS_SAFE is not set ++# CONFIG_PCIE_BUS_PERFORMANCE is not set ++# CONFIG_PCIE_BUS_PEER2PEER is not set ++CONFIG_VGA_ARB=y ++CONFIG_VGA_ARB_MAX_GPUS=16 ++# CONFIG_HOTPLUG_PCI is not set ++ ++# ++# PCI controller drivers ++# ++# CONFIG_PCIE_ALTERA is not set ++CONFIG_PCIE_BRCMSTB=y ++# CONFIG_PCI_HOST_THUNDER_PEM is not set ++# CONFIG_PCI_HOST_THUNDER_ECAM is not set ++# CONFIG_PCI_FTPCI100 is not set ++# CONFIG_PCI_HOST_GENERIC is not set ++# CONFIG_PCI_XGENE is not set ++# CONFIG_PCIE_XILINX is not set ++ ++# ++# Cadence-based PCIe controllers ++# ++# CONFIG_PCIE_CADENCE_PLAT_HOST is not set ++# end of Cadence-based PCIe controllers ++ ++# ++# DesignWare-based PCIe controllers ++# ++# CONFIG_PCIE_AL is not set ++# CONFIG_PCI_MESON is not set ++# CONFIG_PCI_HISI is not set ++# CONFIG_PCIE_KIRIN is not set ++# CONFIG_PCIE_DW_PLAT_HOST is not set ++# end of DesignWare-based PCIe controllers ++ ++# ++# Mobiveil-based PCIe controllers ++# ++# end of Mobiveil-based PCIe controllers ++ ++# ++# PLDA-based PCIe controllers ++# ++# CONFIG_PCIE_MICROCHIP_HOST is not set ++# end of PLDA-based PCIe controllers ++# end of PCI controller drivers ++ ++# ++# PCI Endpoint ++# ++# CONFIG_PCI_ENDPOINT is not set ++# end of PCI Endpoint ++ ++# ++# PCI switch controller drivers ++# ++# CONFIG_PCI_SW_SWITCHTEC is not set ++# end of PCI switch controller drivers ++ ++# CONFIG_CXL_BUS is not set ++# CONFIG_PCCARD is not set ++# CONFIG_RAPIDIO is not set ++ ++# ++# Generic Driver Options ++# ++CONFIG_UEVENT_HELPER=y ++CONFIG_UEVENT_HELPER_PATH="" ++CONFIG_DEVTMPFS=y ++CONFIG_DEVTMPFS_MOUNT=y ++# CONFIG_DEVTMPFS_SAFE is not set ++CONFIG_STANDALONE=y ++CONFIG_PREVENT_FIRMWARE_BUILD=y ++ ++# ++# Firmware loader ++# ++CONFIG_FW_LOADER=y ++CONFIG_EXTRA_FIRMWARE="" ++# CONFIG_FW_LOADER_USER_HELPER is not set ++# CONFIG_FW_LOADER_COMPRESS is not set ++# CONFIG_FW_UPLOAD is not set ++# end of Firmware loader ++ ++CONFIG_ALLOW_DEV_COREDUMP=y ++# CONFIG_DEBUG_DRIVER is not set ++# CONFIG_DEBUG_DEVRES is not set ++# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set ++# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set ++CONFIG_GENERIC_CPU_DEVICES=y ++CONFIG_GENERIC_CPU_AUTOPROBE=y ++CONFIG_GENERIC_CPU_VULNERABILITIES=y ++CONFIG_SOC_BUS=y ++CONFIG_REGMAP=y ++CONFIG_REGMAP_MMIO=y ++CONFIG_DMA_SHARED_BUFFER=y ++# CONFIG_DMA_FENCE_TRACE is not set ++CONFIG_GENERIC_ARCH_TOPOLOGY=y ++CONFIG_GENERIC_ARCH_NUMA=y ++# CONFIG_FW_DEVLINK_SYNC_STATE_TIMEOUT is not set ++# end of Generic Driver Options ++ ++# ++# Bus devices ++# ++# CONFIG_BRCMSTB_GISB_ARB is not set ++# CONFIG_MOXTET is not set ++# CONFIG_VEXPRESS_CONFIG is not set ++# CONFIG_MHI_BUS is not set ++# CONFIG_MHI_BUS_EP is not set ++# end of Bus devices ++ ++# ++# Cache Drivers ++# ++# end of Cache Drivers ++ ++# CONFIG_CONNECTOR is not set ++ ++# ++# Firmware Drivers ++# ++ ++# ++# ARM System Control and Management Interface Protocol ++# ++# CONFIG_ARM_SCMI_PROTOCOL is not set ++# end of ARM System Control and Management Interface Protocol ++ ++# CONFIG_ARM_SCPI_PROTOCOL is not set ++# CONFIG_ARM_SDE_INTERFACE is not set ++# CONFIG_FIRMWARE_MEMMAP is not set ++CONFIG_DMIID=y ++# CONFIG_DMI_SYSFS is not set ++CONFIG_RASPBERRYPI_FIRMWARE=y ++# CONFIG_FW_CFG_SYSFS is not set ++# CONFIG_SYSFB_SIMPLEFB is not set ++# CONFIG_ARM_FFA_TRANSPORT is not set ++# CONFIG_GOOGLE_FIRMWARE is not set ++ ++# ++# EFI (Extensible Firmware Interface) Support ++# ++CONFIG_EFI_ESRT=y ++# CONFIG_EFI_VARS_PSTORE is not set ++CONFIG_EFI_PARAMS_FROM_FDT=y ++CONFIG_EFI_RUNTIME_WRAPPERS=y ++CONFIG_EFI_GENERIC_STUB=y ++# CONFIG_EFI_ZBOOT is not set ++CONFIG_EFI_ARMSTUB_DTB_LOADER=y ++# CONFIG_EFI_BOOTLOADER_CONTROL is not set ++# CONFIG_EFI_CAPSULE_LOADER is not set ++# CONFIG_EFI_TEST is not set ++# CONFIG_RESET_ATTACK_MITIGATION is not set ++# CONFIG_EFI_DISABLE_PCI_DMA is not set ++CONFIG_EFI_EARLYCON=y ++# CONFIG_EFI_DISABLE_RUNTIME is not set ++# CONFIG_EFI_COCO_SECRET is not set ++# end of EFI (Extensible Firmware Interface) Support ++ ++CONFIG_ARM_PSCI_FW=y ++# CONFIG_ARM_PSCI_CHECKER is not set ++ ++# ++# Qualcomm firmware drivers ++# ++# end of Qualcomm firmware drivers ++ ++CONFIG_HAVE_ARM_SMCCC=y ++CONFIG_HAVE_ARM_SMCCC_DISCOVERY=y ++CONFIG_ARM_SMCCC_SOC_ID=y ++ ++# ++# Tegra firmware driver ++# ++# end of Tegra firmware driver ++# end of Firmware Drivers ++ ++# CONFIG_GNSS is not set ++# CONFIG_MTD is not set ++CONFIG_DTC=y ++CONFIG_OF=y ++# CONFIG_OF_UNITTEST is not set ++CONFIG_OF_FLATTREE=y ++CONFIG_OF_EARLY_FLATTREE=y ++CONFIG_OF_KOBJ=y ++CONFIG_OF_DYNAMIC=y ++CONFIG_OF_ADDRESS=y ++CONFIG_OF_IRQ=y ++CONFIG_OF_RESERVED_MEM=y ++CONFIG_OF_RESOLVE=y ++CONFIG_OF_OVERLAY=y ++CONFIG_OF_NUMA=y ++CONFIG_OF_CONFIGFS=y ++# CONFIG_PARPORT is not set ++CONFIG_BLK_DEV=y ++# CONFIG_BLK_DEV_NULL_BLK is not set ++# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set ++# CONFIG_ZRAM is not set ++CONFIG_BLK_DEV_LOOP=y ++CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 ++# CONFIG_BLK_DEV_DRBD is not set ++# CONFIG_BLK_DEV_NBD is not set ++CONFIG_BLK_DEV_RAM=y ++CONFIG_BLK_DEV_RAM_COUNT=16 ++CONFIG_BLK_DEV_RAM_SIZE=4096 ++# CONFIG_CDROM_PKTCDVD is not set ++# CONFIG_ATA_OVER_ETH is not set ++# CONFIG_BLK_DEV_RBD is not set ++# CONFIG_BLK_DEV_UBLK is not set ++ ++# ++# NVME Support ++# ++CONFIG_NVME_CORE=y ++CONFIG_BLK_DEV_NVME=y ++# CONFIG_NVME_MULTIPATH is not set ++# CONFIG_NVME_VERBOSE_ERRORS is not set ++CONFIG_NVME_HWMON=y ++# CONFIG_NVME_FC is not set ++# CONFIG_NVME_TCP is not set ++# CONFIG_NVME_HOST_AUTH is not set ++# CONFIG_NVME_TARGET is not set ++# end of NVME Support ++ ++# ++# Misc devices ++# ++# CONFIG_BCM2835_SMI is not set ++# CONFIG_AD525X_DPOT is not set ++# CONFIG_DUMMY_IRQ is not set ++# CONFIG_PHANTOM is not set ++# CONFIG_RPMB is not set ++# CONFIG_TIFM_CORE is not set ++# CONFIG_ICS932S401 is not set ++# CONFIG_ENCLOSURE_SERVICES is not set ++# CONFIG_HP_ILO is not set ++# CONFIG_APDS9802ALS is not set ++# CONFIG_ISL29003 is not set ++# CONFIG_ISL29020 is not set ++# CONFIG_SENSORS_TSL2550 is not set ++# CONFIG_SENSORS_BH1770 is not set ++# CONFIG_SENSORS_APDS990X is not set ++# CONFIG_HMC6352 is not set ++# CONFIG_DS1682 is not set ++# CONFIG_LATTICE_ECP3_CONFIG is not set ++CONFIG_SRAM=y ++# CONFIG_DW_XDATA_PCIE is not set ++# CONFIG_PCI_ENDPOINT_TEST is not set ++# CONFIG_XILINX_SDFEC is not set ++# CONFIG_HISI_HIKEY_USB is not set ++# CONFIG_OPEN_DICE is not set ++# CONFIG_VCPU_STALL_DETECTOR is not set ++# CONFIG_C2PORT is not set ++ ++# ++# EEPROM support ++# ++# CONFIG_EEPROM_AT24 is not set ++# CONFIG_EEPROM_AT25 is not set ++# CONFIG_EEPROM_MAX6875 is not set ++# CONFIG_EEPROM_93CX6 is not set ++# CONFIG_EEPROM_93XX46 is not set ++# CONFIG_EEPROM_IDT_89HPESX is not set ++# CONFIG_EEPROM_EE1004 is not set ++# end of EEPROM support ++ ++# CONFIG_CB710_CORE is not set ++ ++# ++# Texas Instruments shared transport line discipline ++# ++# CONFIG_TI_ST is not set ++# end of Texas Instruments shared transport line discipline ++ ++# CONFIG_SENSORS_LIS3_SPI is not set ++# CONFIG_SENSORS_LIS3_I2C is not set ++# CONFIG_ALTERA_STAPL is not set ++# CONFIG_VMWARE_VMCI is not set ++# CONFIG_GENWQE is not set ++# CONFIG_ECHO is not set ++# CONFIG_BCM_VK is not set ++# CONFIG_MISC_ALCOR_PCI is not set ++# CONFIG_MISC_RTSX_PCI is not set ++# CONFIG_MISC_RTSX_USB is not set ++# CONFIG_UACCE is not set ++# CONFIG_PVPANIC is not set ++# CONFIG_GP_PCI1XXXX is not set ++# CONFIG_KEBA_CP500 is not set ++# end of Misc devices ++ ++# ++# SCSI device support ++# ++CONFIG_SCSI_MOD=y ++# CONFIG_RAID_ATTRS is not set ++CONFIG_SCSI_COMMON=y ++CONFIG_SCSI=y ++CONFIG_SCSI_DMA=y ++# CONFIG_SCSI_PROC_FS is not set ++ ++# ++# SCSI support type (disk, tape, CD-ROM) ++# ++CONFIG_BLK_DEV_SD=y ++# CONFIG_CHR_DEV_ST is not set ++# CONFIG_BLK_DEV_SR is not set ++# CONFIG_CHR_DEV_SG is not set ++CONFIG_BLK_DEV_BSG=y ++# CONFIG_CHR_DEV_SCH is not set ++# CONFIG_SCSI_CONSTANTS is not set ++# CONFIG_SCSI_LOGGING is not set ++# CONFIG_SCSI_SCAN_ASYNC is not set ++ ++# ++# SCSI Transports ++# ++# CONFIG_SCSI_SPI_ATTRS is not set ++# CONFIG_SCSI_FC_ATTRS is not set ++CONFIG_SCSI_ISCSI_ATTRS=y ++# CONFIG_SCSI_SAS_ATTRS is not set ++# CONFIG_SCSI_SAS_LIBSAS is not set ++# CONFIG_SCSI_SRP_ATTRS is not set ++# end of SCSI Transports ++ ++CONFIG_SCSI_LOWLEVEL=y ++# CONFIG_ISCSI_TCP is not set ++# CONFIG_ISCSI_BOOT_SYSFS is not set ++# CONFIG_SCSI_CXGB3_ISCSI is not set ++# CONFIG_SCSI_CXGB4_ISCSI is not set ++# CONFIG_SCSI_BNX2_ISCSI is not set ++# CONFIG_BE2ISCSI is not set ++# CONFIG_BLK_DEV_3W_XXXX_RAID is not set ++# CONFIG_SCSI_HPSA is not set ++# CONFIG_SCSI_3W_9XXX is not set ++# CONFIG_SCSI_3W_SAS is not set ++# CONFIG_SCSI_ACARD is not set ++# CONFIG_SCSI_AACRAID is not set ++# CONFIG_SCSI_AIC7XXX is not set ++# CONFIG_SCSI_AIC79XX is not set ++# CONFIG_SCSI_AIC94XX is not set ++# CONFIG_SCSI_MVSAS is not set ++# CONFIG_SCSI_MVUMI is not set ++# CONFIG_SCSI_ADVANSYS is not set ++# CONFIG_SCSI_ARCMSR is not set ++# CONFIG_SCSI_ESAS2R is not set ++# CONFIG_MEGARAID_NEWGEN is not set ++# CONFIG_MEGARAID_LEGACY is not set ++# CONFIG_MEGARAID_SAS is not set ++# CONFIG_SCSI_MPT3SAS is not set ++# CONFIG_SCSI_MPT2SAS is not set ++# CONFIG_SCSI_MPI3MR is not set ++# CONFIG_SCSI_SMARTPQI is not set ++# CONFIG_SCSI_HPTIOP is not set ++# CONFIG_SCSI_BUSLOGIC is not set ++# CONFIG_SCSI_MYRB is not set ++# CONFIG_SCSI_MYRS is not set ++# CONFIG_SCSI_SNIC is not set ++# CONFIG_SCSI_DMX3191D is not set ++# CONFIG_SCSI_FDOMAIN_PCI is not set ++# CONFIG_SCSI_IPS is not set ++# CONFIG_SCSI_INITIO is not set ++# CONFIG_SCSI_INIA100 is not set ++# CONFIG_SCSI_STEX is not set ++# CONFIG_SCSI_SYM53C8XX_2 is not set ++# CONFIG_SCSI_IPR is not set ++# CONFIG_SCSI_QLOGIC_1280 is not set ++# CONFIG_SCSI_QLA_ISCSI is not set ++# CONFIG_SCSI_DC395x is not set ++# CONFIG_SCSI_AM53C974 is not set ++# CONFIG_SCSI_WD719X is not set ++# CONFIG_SCSI_DEBUG is not set ++# CONFIG_SCSI_PMCRAID is not set ++# CONFIG_SCSI_PM8001 is not set ++# CONFIG_SCSI_DH is not set ++# end of SCSI device support ++ ++# CONFIG_ATA is not set ++CONFIG_MD=y ++# CONFIG_BLK_DEV_MD is not set ++CONFIG_MD_BITMAP_FILE=y ++# CONFIG_BCACHE is not set ++# CONFIG_BLK_DEV_DM is not set ++# CONFIG_TARGET_CORE is not set ++# CONFIG_FUSION is not set ++ ++# ++# IEEE 1394 (FireWire) support ++# ++# CONFIG_FIREWIRE is not set ++# CONFIG_FIREWIRE_NOSY is not set ++# end of IEEE 1394 (FireWire) support ++ ++CONFIG_NETDEVICES=y ++CONFIG_MII=y ++CONFIG_NET_CORE=y ++# CONFIG_BONDING is not set ++# CONFIG_DUMMY is not set ++# CONFIG_WIREGUARD is not set ++# CONFIG_EQUALIZER is not set ++# CONFIG_NET_FC is not set ++# CONFIG_NET_TEAM is not set ++# CONFIG_MACVLAN is not set ++# CONFIG_IPVLAN is not set ++# CONFIG_VXLAN is not set ++# CONFIG_GENEVE is not set ++# CONFIG_BAREUDP is not set ++# CONFIG_GTP is not set ++# CONFIG_PFCP is not set ++# CONFIG_AMT is not set ++# CONFIG_MACSEC is not set ++# CONFIG_NETCONSOLE is not set ++# CONFIG_TUN is not set ++# CONFIG_TUN_VNET_CROSS_LE is not set ++# CONFIG_VETH is not set ++# CONFIG_NLMON is not set ++CONFIG_NETKIT=y ++# CONFIG_NET_VRF is not set ++# CONFIG_ARCNET is not set ++CONFIG_ETHERNET=y ++CONFIG_NET_VENDOR_3COM=y ++# CONFIG_VORTEX is not set ++# CONFIG_TYPHOON is not set ++CONFIG_NET_VENDOR_ADAPTEC=y ++# CONFIG_ADAPTEC_STARFIRE is not set ++CONFIG_NET_VENDOR_AGERE=y ++# CONFIG_ET131X is not set ++CONFIG_NET_VENDOR_ALACRITECH=y ++# CONFIG_SLICOSS is not set ++CONFIG_NET_VENDOR_ALTEON=y ++# CONFIG_ACENIC is not set ++# CONFIG_ALTERA_TSE is not set ++CONFIG_NET_VENDOR_AMAZON=y ++# CONFIG_ENA_ETHERNET is not set ++CONFIG_NET_VENDOR_AMD=y ++# CONFIG_AMD8111_ETH is not set ++# CONFIG_PCNET32 is not set ++# CONFIG_AMD_XGBE is not set ++# CONFIG_PDS_CORE is not set ++CONFIG_NET_VENDOR_AQUANTIA=y ++# CONFIG_AQTION is not set ++CONFIG_NET_VENDOR_ARC=y ++CONFIG_NET_VENDOR_ASIX=y ++# CONFIG_SPI_AX88796C is not set ++CONFIG_NET_VENDOR_ATHEROS=y ++# CONFIG_ATL2 is not set ++# CONFIG_ATL1 is not set ++# CONFIG_ATL1E is not set ++# CONFIG_ATL1C is not set ++# CONFIG_ALX is not set ++CONFIG_NET_VENDOR_BROADCOM=y ++# CONFIG_B44 is not set ++CONFIG_BCMGENET=y ++# CONFIG_BNX2 is not set ++# CONFIG_CNIC is not set ++# CONFIG_TIGON3 is not set ++# CONFIG_BNX2X is not set ++# CONFIG_SYSTEMPORT is not set ++# CONFIG_BNXT is not set ++CONFIG_BCMASP=y ++CONFIG_NET_VENDOR_CADENCE=y ++CONFIG_MACB=y ++CONFIG_MACB_USE_HWSTAMP=y ++# CONFIG_MACB_PCI is not set ++CONFIG_NET_VENDOR_CAVIUM=y ++# CONFIG_THUNDER_NIC_PF is not set ++# CONFIG_THUNDER_NIC_VF is not set ++# CONFIG_THUNDER_NIC_BGX is not set ++# CONFIG_THUNDER_NIC_RGX is not set ++# CONFIG_CAVIUM_PTP is not set ++# CONFIG_LIQUIDIO is not set ++# CONFIG_LIQUIDIO_VF is not set ++CONFIG_NET_VENDOR_CHELSIO=y ++# CONFIG_CHELSIO_T1 is not set ++# CONFIG_CHELSIO_T3 is not set ++# CONFIG_CHELSIO_T4 is not set ++# CONFIG_CHELSIO_T4VF is not set ++CONFIG_NET_VENDOR_CISCO=y ++# CONFIG_ENIC is not set ++CONFIG_NET_VENDOR_CORTINA=y ++# CONFIG_GEMINI_ETHERNET is not set ++CONFIG_NET_VENDOR_DAVICOM=y ++# CONFIG_DM9051 is not set ++# CONFIG_DNET is not set ++CONFIG_NET_VENDOR_DEC=y ++# CONFIG_NET_TULIP is not set ++CONFIG_NET_VENDOR_DLINK=y ++# CONFIG_DL2K is not set ++# CONFIG_SUNDANCE is not set ++CONFIG_NET_VENDOR_EMULEX=y ++# CONFIG_BE2NET is not set ++CONFIG_NET_VENDOR_ENGLEDER=y ++# CONFIG_TSNEP is not set ++CONFIG_NET_VENDOR_EZCHIP=y ++# CONFIG_EZCHIP_NPS_MANAGEMENT_ENET is not set ++CONFIG_NET_VENDOR_FUNGIBLE=y ++# CONFIG_FUN_ETH is not set ++CONFIG_NET_VENDOR_GOOGLE=y ++# CONFIG_GVE is not set ++CONFIG_NET_VENDOR_HISILICON=y ++# CONFIG_HIX5HD2_GMAC is not set ++# CONFIG_HISI_FEMAC is not set ++# CONFIG_HIP04_ETH is not set ++# CONFIG_HNS_DSAF is not set ++# CONFIG_HNS_ENET is not set ++# CONFIG_HNS3 is not set ++CONFIG_NET_VENDOR_HUAWEI=y ++# CONFIG_HINIC is not set ++CONFIG_NET_VENDOR_I825XX=y ++CONFIG_NET_VENDOR_INTEL=y ++# CONFIG_E100 is not set ++# CONFIG_E1000 is not set ++# CONFIG_E1000E is not set ++# CONFIG_IGB is not set ++# CONFIG_IGBVF is not set ++# CONFIG_IXGBE is not set ++# CONFIG_IXGBEVF is not set ++# CONFIG_I40E is not set ++# CONFIG_I40EVF is not set ++# CONFIG_ICE is not set ++# CONFIG_FM10K is not set ++# CONFIG_IGC is not set ++# CONFIG_IDPF is not set ++# CONFIG_JME is not set ++CONFIG_NET_VENDOR_ADI=y ++# CONFIG_ADIN1110 is not set ++CONFIG_NET_VENDOR_LITEX=y ++# CONFIG_LITEX_LITEETH is not set ++CONFIG_NET_VENDOR_MARVELL=y ++# CONFIG_MVMDIO is not set ++# CONFIG_SKGE is not set ++# CONFIG_SKY2 is not set ++# CONFIG_OCTEONTX2_AF is not set ++# CONFIG_OCTEONTX2_PF is not set ++# CONFIG_OCTEON_EP is not set ++# CONFIG_OCTEON_EP_VF is not set ++CONFIG_NET_VENDOR_MELLANOX=y ++# CONFIG_MLX4_EN is not set ++# CONFIG_MLX5_CORE is not set ++# CONFIG_MLXSW_CORE is not set ++# CONFIG_MLXFW is not set ++CONFIG_NET_VENDOR_META=y ++CONFIG_NET_VENDOR_MICREL=y ++# CONFIG_KS8842 is not set ++# CONFIG_KS8851 is not set ++# CONFIG_KS8851_MLL is not set ++# CONFIG_KSZ884X_PCI is not set ++CONFIG_NET_VENDOR_MICROCHIP=y ++# CONFIG_ENC28J60 is not set ++# CONFIG_ENCX24J600 is not set ++# CONFIG_LAN743X is not set ++# CONFIG_LAN865X is not set ++# CONFIG_LAN966X_SWITCH is not set ++# CONFIG_VCAP is not set ++CONFIG_NET_VENDOR_MICROSEMI=y ++# CONFIG_MSCC_OCELOT_SWITCH is not set ++CONFIG_NET_VENDOR_MICROSOFT=y ++CONFIG_NET_VENDOR_MYRI=y ++# CONFIG_MYRI10GE is not set ++# CONFIG_FEALNX is not set ++CONFIG_NET_VENDOR_NI=y ++# CONFIG_NI_XGE_MANAGEMENT_ENET is not set ++CONFIG_NET_VENDOR_NATSEMI=y ++# CONFIG_NATSEMI is not set ++# CONFIG_NS83820 is not set ++CONFIG_NET_VENDOR_NETERION=y ++# CONFIG_S2IO is not set ++CONFIG_NET_VENDOR_NETRONOME=y ++# CONFIG_NFP is not set ++CONFIG_NET_VENDOR_8390=y ++# CONFIG_NE2K_PCI is not set ++CONFIG_NET_VENDOR_NVIDIA=y ++# CONFIG_FORCEDETH is not set ++CONFIG_NET_VENDOR_OKI=y ++# CONFIG_ETHOC is not set ++# CONFIG_OA_TC6 is not set ++CONFIG_NET_VENDOR_PACKET_ENGINES=y ++# CONFIG_HAMACHI is not set ++# CONFIG_YELLOWFIN is not set ++CONFIG_NET_VENDOR_PENSANDO=y ++# CONFIG_IONIC is not set ++CONFIG_NET_VENDOR_QLOGIC=y ++# CONFIG_QLA3XXX is not set ++# CONFIG_QLCNIC is not set ++# CONFIG_NETXEN_NIC is not set ++# CONFIG_QED is not set ++CONFIG_NET_VENDOR_BROCADE=y ++# CONFIG_BNA is not set ++CONFIG_NET_VENDOR_QUALCOMM=y ++# CONFIG_QCA7000_SPI is not set ++# CONFIG_QCA7000_UART is not set ++# CONFIG_QCOM_EMAC is not set ++# CONFIG_RMNET is not set ++CONFIG_NET_VENDOR_RDC=y ++# CONFIG_R6040 is not set ++CONFIG_NET_VENDOR_REALTEK=y ++# CONFIG_8139CP is not set ++# CONFIG_8139TOO is not set ++# CONFIG_R8169 is not set ++# CONFIG_RTASE is not set ++CONFIG_NET_VENDOR_RENESAS=y ++CONFIG_NET_VENDOR_ROCKER=y ++CONFIG_NET_VENDOR_SAMSUNG=y ++# CONFIG_SXGBE_ETH is not set ++CONFIG_NET_VENDOR_SEEQ=y ++CONFIG_NET_VENDOR_SILAN=y ++# CONFIG_SC92031 is not set ++CONFIG_NET_VENDOR_SIS=y ++# CONFIG_SIS900 is not set ++# CONFIG_SIS190 is not set ++CONFIG_NET_VENDOR_SOLARFLARE=y ++# CONFIG_SFC is not set ++# CONFIG_SFC_FALCON is not set ++# CONFIG_SFC_SIENA is not set ++CONFIG_NET_VENDOR_SMSC=y ++# CONFIG_SMC91X is not set ++# CONFIG_EPIC100 is not set ++# CONFIG_SMSC911X is not set ++# CONFIG_SMSC9420 is not set ++CONFIG_NET_VENDOR_SOCIONEXT=y ++CONFIG_NET_VENDOR_STMICRO=y ++# CONFIG_STMMAC_ETH is not set ++CONFIG_NET_VENDOR_SUN=y ++# CONFIG_HAPPYMEAL is not set ++# CONFIG_SUNGEM is not set ++# CONFIG_CASSINI is not set ++# CONFIG_NIU is not set ++CONFIG_NET_VENDOR_SYNOPSYS=y ++# CONFIG_DWC_XLGMAC is not set ++CONFIG_NET_VENDOR_TEHUTI=y ++# CONFIG_TEHUTI is not set ++# CONFIG_TEHUTI_TN40 is not set ++CONFIG_NET_VENDOR_TI=y ++# CONFIG_TI_CPSW_PHY_SEL is not set ++# CONFIG_TLAN is not set ++CONFIG_NET_VENDOR_VERTEXCOM=y ++# CONFIG_MSE102X is not set ++CONFIG_NET_VENDOR_VIA=y ++# CONFIG_VIA_RHINE is not set ++# CONFIG_VIA_VELOCITY is not set ++CONFIG_NET_VENDOR_WANGXUN=y ++# CONFIG_NGBE is not set ++CONFIG_NET_VENDOR_WIZNET=y ++# CONFIG_WIZNET_W5100 is not set ++# CONFIG_WIZNET_W5300 is not set ++CONFIG_NET_VENDOR_XILINX=y ++# CONFIG_XILINX_EMACLITE is not set ++# CONFIG_XILINX_LL_TEMAC is not set ++# CONFIG_FDDI is not set ++# CONFIG_HIPPI is not set ++CONFIG_PHYLINK=y ++CONFIG_PHYLIB=y ++CONFIG_SWPHY=y ++# CONFIG_LED_TRIGGER_PHY is not set ++CONFIG_PHYLIB_LEDS=y ++CONFIG_FIXED_PHY=y ++# CONFIG_SFP is not set ++ ++# ++# MII PHY device drivers ++# ++# CONFIG_AIR_EN8811H_PHY is not set ++# CONFIG_AMD_PHY is not set ++# CONFIG_ADIN_PHY is not set ++# CONFIG_ADIN1100_PHY is not set ++# CONFIG_AQUANTIA_PHY is not set ++# CONFIG_AX88796B_PHY is not set ++CONFIG_BROADCOM_PHY=y ++# CONFIG_BCM54140_PHY is not set ++CONFIG_BCM7XXX_PHY=y ++# CONFIG_BCM84881_PHY is not set ++# CONFIG_BCM87XX_PHY is not set ++CONFIG_BCM_NET_PHYLIB=y ++CONFIG_BCM_NET_PHYPTP=y ++# CONFIG_CICADA_PHY is not set ++# CONFIG_CORTINA_PHY is not set ++# CONFIG_DAVICOM_PHY is not set ++# CONFIG_ICPLUS_PHY is not set ++# CONFIG_LXT_PHY is not set ++# CONFIG_INTEL_XWAY_PHY is not set ++# CONFIG_LSI_ET1011C_PHY is not set ++# CONFIG_MARVELL_PHY is not set ++# CONFIG_MARVELL_10G_PHY is not set ++# CONFIG_MARVELL_88Q2XXX_PHY is not set ++# CONFIG_MARVELL_88X2222_PHY is not set ++# CONFIG_MAXLINEAR_GPHY is not set ++# CONFIG_MEDIATEK_GE_PHY is not set ++CONFIG_MICREL_PHY=y ++# CONFIG_MICROCHIP_T1S_PHY is not set ++CONFIG_MICROCHIP_PHY=y ++# CONFIG_MICROCHIP_T1_PHY is not set ++# CONFIG_MICROSEMI_PHY is not set ++# CONFIG_MOTORCOMM_PHY is not set ++# CONFIG_NATIONAL_PHY is not set ++# CONFIG_NXP_CBTX_PHY is not set ++# CONFIG_NXP_C45_TJA11XX_PHY is not set ++# CONFIG_NXP_TJA11XX_PHY is not set ++# CONFIG_NCN26000_PHY is not set ++# CONFIG_AT803X_PHY is not set ++# CONFIG_QCA83XX_PHY is not set ++# CONFIG_QCA808X_PHY is not set ++# CONFIG_QCA807X_PHY is not set ++# CONFIG_QSEMI_PHY is not set ++# CONFIG_REALTEK_PHY is not set ++# CONFIG_RENESAS_PHY is not set ++# CONFIG_ROCKCHIP_PHY is not set ++CONFIG_SMSC_PHY=y ++# CONFIG_STE10XP is not set ++# CONFIG_TERANETICS_PHY is not set ++# CONFIG_DP83822_PHY is not set ++# CONFIG_DP83TC811_PHY is not set ++# CONFIG_DP83848_PHY is not set ++# CONFIG_DP83867_PHY is not set ++# CONFIG_DP83869_PHY is not set ++# CONFIG_DP83TD510_PHY is not set ++# CONFIG_DP83TG720_PHY is not set ++# CONFIG_VITESSE_PHY is not set ++# CONFIG_XILINX_GMII2RGMII is not set ++# CONFIG_MICREL_KS8995MA is not set ++# CONFIG_PSE_CONTROLLER is not set ++CONFIG_MDIO_DEVICE=y ++CONFIG_MDIO_BUS=y ++CONFIG_FWNODE_MDIO=y ++CONFIG_OF_MDIO=y ++CONFIG_MDIO_DEVRES=y ++# CONFIG_MDIO_BITBANG is not set ++CONFIG_MDIO_BCM_UNIMAC=y ++# CONFIG_MDIO_HISI_FEMAC is not set ++# CONFIG_MDIO_MVUSB is not set ++# CONFIG_MDIO_MSCC_MIIM is not set ++# CONFIG_MDIO_OCTEON is not set ++# CONFIG_MDIO_IPQ4019 is not set ++# CONFIG_MDIO_IPQ8064 is not set ++# CONFIG_MDIO_THUNDER is not set ++ ++# ++# MDIO Multiplexers ++# ++# CONFIG_MDIO_BUS_MUX_GPIO is not set ++# CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set ++# CONFIG_MDIO_BUS_MUX_MMIOREG is not set ++ ++# ++# PCS device drivers ++# ++# CONFIG_PCS_XPCS is not set ++# end of PCS device drivers ++ ++# CONFIG_PPP is not set ++# CONFIG_SLIP is not set ++CONFIG_USB_NET_DRIVERS=y ++# CONFIG_USB_CATC is not set ++# CONFIG_USB_KAWETH is not set ++# CONFIG_USB_PEGASUS is not set ++# CONFIG_USB_RTL8150 is not set ++# CONFIG_USB_RTL8152 is not set ++CONFIG_USB_LAN78XX=y ++CONFIG_USB_USBNET=y ++# CONFIG_USB_NET_AX8817X is not set ++# CONFIG_USB_NET_AX88179_178A is not set ++# CONFIG_USB_NET_CDCETHER is not set ++# CONFIG_USB_NET_CDC_EEM is not set ++# CONFIG_USB_NET_CDC_NCM is not set ++# CONFIG_USB_NET_HUAWEI_CDC_NCM is not set ++# CONFIG_USB_NET_CDC_MBIM is not set ++# CONFIG_USB_NET_DM9601 is not set ++# CONFIG_USB_NET_SR9700 is not set ++# CONFIG_USB_NET_SR9800 is not set ++# CONFIG_USB_NET_SMSC75XX is not set ++CONFIG_USB_NET_SMSC95XX=y ++# CONFIG_USB_NET_GL620A is not set ++# CONFIG_USB_NET_NET1080 is not set ++# CONFIG_USB_NET_PLUSB is not set ++# CONFIG_USB_NET_MCS7830 is not set ++# CONFIG_USB_NET_RNDIS_HOST is not set ++# CONFIG_USB_NET_CDC_SUBSET is not set ++# CONFIG_USB_NET_ZAURUS is not set ++# CONFIG_USB_NET_CX82310_ETH is not set ++# CONFIG_USB_NET_KALMIA is not set ++# CONFIG_USB_NET_QMI_WWAN is not set ++# CONFIG_USB_NET_INT51X1 is not set ++# CONFIG_USB_IPHETH is not set ++# CONFIG_USB_SIERRA_NET is not set ++# CONFIG_USB_NET_CH9200 is not set ++# CONFIG_USB_NET_AQC111 is not set ++CONFIG_WLAN=y ++CONFIG_WLAN_VENDOR_ADMTEK=y ++CONFIG_WLAN_VENDOR_ATH=y ++# CONFIG_ATH_DEBUG is not set ++# CONFIG_ATH5K_PCI is not set ++CONFIG_WLAN_VENDOR_ATMEL=y ++CONFIG_WLAN_VENDOR_BROADCOM=y ++CONFIG_WLAN_VENDOR_INTEL=y ++CONFIG_WLAN_VENDOR_INTERSIL=y ++CONFIG_WLAN_VENDOR_MARVELL=y ++CONFIG_WLAN_VENDOR_MEDIATEK=y ++CONFIG_WLAN_VENDOR_MICROCHIP=y ++CONFIG_WLAN_VENDOR_PURELIFI=y ++CONFIG_WLAN_VENDOR_RALINK=y ++CONFIG_WLAN_VENDOR_REALTEK=y ++CONFIG_WLAN_VENDOR_RSI=y ++CONFIG_WLAN_VENDOR_SILABS=y ++CONFIG_WLAN_VENDOR_ST=y ++CONFIG_WLAN_VENDOR_TI=y ++CONFIG_WLAN_VENDOR_ZYDAS=y ++CONFIG_WLAN_VENDOR_QUANTENNA=y ++# CONFIG_WAN is not set ++ ++# ++# Wireless WAN ++# ++# CONFIG_WWAN is not set ++# end of Wireless WAN ++ ++# CONFIG_VMXNET3 is not set ++# CONFIG_NETDEVSIM is not set ++# CONFIG_NET_FAILOVER is not set ++# CONFIG_ISDN is not set ++ ++# ++# Input device support ++# ++CONFIG_INPUT=y ++CONFIG_INPUT_LEDS=y ++# CONFIG_INPUT_FF_MEMLESS is not set ++# CONFIG_INPUT_SPARSEKMAP is not set ++# CONFIG_INPUT_MATRIXKMAP is not set ++ ++# ++# Userland interfaces ++# ++CONFIG_INPUT_MOUSEDEV=y ++# CONFIG_INPUT_MOUSEDEV_PSAUX is not set ++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 ++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 ++# CONFIG_INPUT_JOYDEV is not set ++CONFIG_INPUT_EVDEV=y ++# CONFIG_INPUT_EVBUG is not set ++ ++# ++# Input Device Drivers ++# ++CONFIG_INPUT_KEYBOARD=y ++# CONFIG_KEYBOARD_ADP5588 is not set ++# CONFIG_KEYBOARD_ADP5589 is not set ++# CONFIG_KEYBOARD_ATKBD is not set ++# CONFIG_KEYBOARD_QT1050 is not set ++# CONFIG_KEYBOARD_QT1070 is not set ++# CONFIG_KEYBOARD_QT2160 is not set ++# CONFIG_KEYBOARD_DLINK_DIR685 is not set ++# CONFIG_KEYBOARD_LKKBD is not set ++# CONFIG_KEYBOARD_GPIO is not set ++# CONFIG_KEYBOARD_GPIO_POLLED is not set ++# CONFIG_KEYBOARD_TCA6416 is not set ++# CONFIG_KEYBOARD_TCA8418 is not set ++# CONFIG_KEYBOARD_MATRIX is not set ++# CONFIG_KEYBOARD_LM8323 is not set ++# CONFIG_KEYBOARD_LM8333 is not set ++# CONFIG_KEYBOARD_MAX7359 is not set ++# CONFIG_KEYBOARD_MPR121 is not set ++# CONFIG_KEYBOARD_NEWTON is not set ++# CONFIG_KEYBOARD_OPENCORES is not set ++# CONFIG_KEYBOARD_PINEPHONE is not set ++# CONFIG_KEYBOARD_SAMSUNG is not set ++# CONFIG_KEYBOARD_STOWAWAY is not set ++# CONFIG_KEYBOARD_SUNKBD is not set ++# CONFIG_KEYBOARD_STMPE is not set ++# CONFIG_KEYBOARD_OMAP4 is not set ++# CONFIG_KEYBOARD_TM2_TOUCHKEY is not set ++# CONFIG_KEYBOARD_XTKBD is not set ++# CONFIG_KEYBOARD_CAP11XX is not set ++# CONFIG_KEYBOARD_BCM is not set ++# CONFIG_KEYBOARD_CYPRESS_SF is not set ++# CONFIG_INPUT_MOUSE is not set ++CONFIG_INPUT_JOYSTICK=y ++# CONFIG_JOYSTICK_ANALOG is not set ++# CONFIG_JOYSTICK_A3D is not set ++# CONFIG_JOYSTICK_ADI is not set ++# CONFIG_JOYSTICK_COBRA is not set ++# CONFIG_JOYSTICK_GF2K is not set ++# CONFIG_JOYSTICK_GRIP is not set ++# CONFIG_JOYSTICK_GRIP_MP is not set ++# CONFIG_JOYSTICK_GUILLEMOT is not set ++# CONFIG_JOYSTICK_INTERACT is not set ++# CONFIG_JOYSTICK_SIDEWINDER is not set ++# CONFIG_JOYSTICK_TMDC is not set ++# CONFIG_JOYSTICK_IFORCE is not set ++# CONFIG_JOYSTICK_WARRIOR is not set ++# CONFIG_JOYSTICK_MAGELLAN is not set ++# CONFIG_JOYSTICK_SPACEORB is not set ++# CONFIG_JOYSTICK_SPACEBALL is not set ++# CONFIG_JOYSTICK_STINGER is not set ++# CONFIG_JOYSTICK_TWIDJOY is not set ++# CONFIG_JOYSTICK_ZHENHUA is not set ++# CONFIG_JOYSTICK_AS5011 is not set ++# CONFIG_JOYSTICK_JOYDUMP is not set ++# CONFIG_JOYSTICK_XPAD is not set ++# CONFIG_JOYSTICK_PSXPAD_SPI is not set ++# CONFIG_JOYSTICK_PXRC is not set ++# CONFIG_JOYSTICK_QWIIC is not set ++# CONFIG_JOYSTICK_FSIA6B is not set ++# CONFIG_JOYSTICK_SENSEHAT is not set ++# CONFIG_JOYSTICK_SEESAW is not set ++# CONFIG_INPUT_TABLET is not set ++CONFIG_INPUT_TOUCHSCREEN=y ++# CONFIG_TOUCHSCREEN_ADS7846 is not set ++# CONFIG_TOUCHSCREEN_AD7877 is not set ++# CONFIG_TOUCHSCREEN_AD7879 is not set ++# CONFIG_TOUCHSCREEN_AR1021_I2C is not set ++# CONFIG_TOUCHSCREEN_ATMEL_MXT is not set ++# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set ++# CONFIG_TOUCHSCREEN_BU21013 is not set ++# CONFIG_TOUCHSCREEN_BU21029 is not set ++# CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set ++# CONFIG_TOUCHSCREEN_CY8CTMA140 is not set ++# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set ++# CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set ++# CONFIG_TOUCHSCREEN_CYTTSP5 is not set ++# CONFIG_TOUCHSCREEN_DYNAPRO is not set ++# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set ++# CONFIG_TOUCHSCREEN_EETI is not set ++# CONFIG_TOUCHSCREEN_EGALAX is not set ++# CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set ++# CONFIG_TOUCHSCREEN_EXC3000 is not set ++# CONFIG_TOUCHSCREEN_FUJITSU is not set ++# CONFIG_TOUCHSCREEN_GOODIX is not set ++# CONFIG_TOUCHSCREEN_GOODIX_BERLIN_I2C is not set ++# CONFIG_TOUCHSCREEN_GOODIX_BERLIN_SPI is not set ++# CONFIG_TOUCHSCREEN_HIDEEP is not set ++# CONFIG_TOUCHSCREEN_HYCON_HY46XX is not set ++# CONFIG_TOUCHSCREEN_HYNITRON_CSTXXX is not set ++# CONFIG_TOUCHSCREEN_ILI210X is not set ++# CONFIG_TOUCHSCREEN_ILITEK is not set ++# CONFIG_TOUCHSCREEN_S6SY761 is not set ++# CONFIG_TOUCHSCREEN_GUNZE is not set ++# CONFIG_TOUCHSCREEN_EKTF2127 is not set ++# CONFIG_TOUCHSCREEN_ELAN is not set ++# CONFIG_TOUCHSCREEN_ELO is not set ++# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set ++# CONFIG_TOUCHSCREEN_WACOM_I2C is not set ++# CONFIG_TOUCHSCREEN_MAX11801 is not set ++# CONFIG_TOUCHSCREEN_MMS114 is not set ++# CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set ++# CONFIG_TOUCHSCREEN_MSG2638 is not set ++# CONFIG_TOUCHSCREEN_MTOUCH is not set ++# CONFIG_TOUCHSCREEN_NOVATEK_NVT_TS is not set ++# CONFIG_TOUCHSCREEN_IMAGIS is not set ++# CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set ++# CONFIG_TOUCHSCREEN_INEXIO is not set ++# CONFIG_TOUCHSCREEN_PENMOUNT is not set ++# CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set ++# CONFIG_TOUCHSCREEN_RASPBERRYPI_FW is not set ++# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set ++# CONFIG_TOUCHSCREEN_TOUCHWIN is not set ++# CONFIG_TOUCHSCREEN_PIXCIR is not set ++# CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set ++# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set ++# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set ++# CONFIG_TOUCHSCREEN_TSC_SERIO is not set ++# CONFIG_TOUCHSCREEN_TSC2004 is not set ++# CONFIG_TOUCHSCREEN_TSC2005 is not set ++# CONFIG_TOUCHSCREEN_TSC2007 is not set ++# CONFIG_TOUCHSCREEN_RM_TS is not set ++# CONFIG_TOUCHSCREEN_SILEAD is not set ++# CONFIG_TOUCHSCREEN_SIS_I2C is not set ++# CONFIG_TOUCHSCREEN_ST1232 is not set ++# CONFIG_TOUCHSCREEN_STMFTS is not set ++# CONFIG_TOUCHSCREEN_STMPE is not set ++# CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set ++# CONFIG_TOUCHSCREEN_SX8654 is not set ++# CONFIG_TOUCHSCREEN_TPS6507X is not set ++# CONFIG_TOUCHSCREEN_ZET6223 is not set ++# CONFIG_TOUCHSCREEN_ZFORCE is not set ++# CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set ++# CONFIG_TOUCHSCREEN_IQS5XX is not set ++# CONFIG_TOUCHSCREEN_IQS7211 is not set ++# CONFIG_TOUCHSCREEN_ZINITIX is not set ++# CONFIG_TOUCHSCREEN_HIMAX_HX83112B is not set ++CONFIG_INPUT_MISC=y ++# CONFIG_INPUT_AD714X is not set ++# CONFIG_INPUT_ATMEL_CAPTOUCH is not set ++# CONFIG_INPUT_BMA150 is not set ++# CONFIG_INPUT_E3X0_BUTTON is not set ++# CONFIG_INPUT_MMA8450 is not set ++# CONFIG_INPUT_GPIO_BEEPER is not set ++# CONFIG_INPUT_GPIO_DECODER is not set ++# CONFIG_INPUT_GPIO_VIBRA is not set ++# CONFIG_INPUT_ATI_REMOTE2 is not set ++# CONFIG_INPUT_KEYSPAN_REMOTE is not set ++# CONFIG_INPUT_KXTJ9 is not set ++# CONFIG_INPUT_POWERMATE is not set ++# CONFIG_INPUT_YEALINK is not set ++# CONFIG_INPUT_CM109 is not set ++# CONFIG_INPUT_REGULATOR_HAPTIC is not set ++# CONFIG_INPUT_UINPUT is not set ++# CONFIG_INPUT_PCF8574 is not set ++# CONFIG_INPUT_PWM_BEEPER is not set ++# CONFIG_INPUT_PWM_VIBRA is not set ++# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set ++# CONFIG_INPUT_DA7280_HAPTICS is not set ++# CONFIG_INPUT_ADXL34X is not set ++# CONFIG_INPUT_IMS_PCU is not set ++# CONFIG_INPUT_IQS269A is not set ++# CONFIG_INPUT_IQS626A is not set ++# CONFIG_INPUT_IQS7222 is not set ++# CONFIG_INPUT_CMA3000 is not set ++# CONFIG_INPUT_DRV260X_HAPTICS is not set ++# CONFIG_INPUT_DRV2665_HAPTICS is not set ++# CONFIG_INPUT_DRV2667_HAPTICS is not set ++# CONFIG_RMI4_CORE is not set ++ ++# ++# Hardware I/O ports ++# ++# CONFIG_SERIO is not set ++# CONFIG_GAMEPORT is not set ++# end of Hardware I/O ports ++# end of Input device support ++ ++# ++# Character devices ++# ++CONFIG_BRCM_CHAR_DRIVERS=y ++CONFIG_BCM2708_VCMEM=y ++CONFIG_BCM_VCIO=y ++CONFIG_TTY=y ++CONFIG_VT=y ++CONFIG_CONSOLE_TRANSLATIONS=y ++CONFIG_VT_CONSOLE=y ++CONFIG_VT_HW_CONSOLE_BINDING=y ++CONFIG_UNIX98_PTYS=y ++# CONFIG_LEGACY_PTYS is not set ++CONFIG_LEGACY_TIOCSTI=y ++CONFIG_LDISC_AUTOLOAD=y ++ ++# ++# Serial drivers ++# ++CONFIG_SERIAL_EARLYCON=y ++CONFIG_SERIAL_8250=y ++# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set ++CONFIG_SERIAL_8250_16550A_VARIANTS=y ++# CONFIG_SERIAL_8250_FINTEK is not set ++CONFIG_SERIAL_8250_CONSOLE=y ++# CONFIG_SERIAL_8250_DMA is not set ++CONFIG_SERIAL_8250_PCILIB=y ++CONFIG_SERIAL_8250_PCI=y ++CONFIG_SERIAL_8250_EXAR=y ++CONFIG_SERIAL_8250_NR_UARTS=5 ++CONFIG_SERIAL_8250_RUNTIME_UARTS=0 ++CONFIG_SERIAL_8250_EXTENDED=y ++# CONFIG_SERIAL_8250_MANY_PORTS is not set ++# CONFIG_SERIAL_8250_PCI1XXXX is not set ++CONFIG_SERIAL_8250_SHARE_IRQ=y ++# CONFIG_SERIAL_8250_DETECT_IRQ is not set ++# CONFIG_SERIAL_8250_RSA is not set ++CONFIG_SERIAL_8250_BCM2835AUX=y ++CONFIG_SERIAL_8250_FSL=y ++# CONFIG_SERIAL_8250_DW is not set ++# CONFIG_SERIAL_8250_RT288X is not set ++CONFIG_SERIAL_8250_PERICOM=y ++CONFIG_SERIAL_8250_BCM7271=y ++CONFIG_SERIAL_OF_PLATFORM=y ++ ++# ++# Non-8250 serial port support ++# ++# CONFIG_SERIAL_AMBA_PL010 is not set ++CONFIG_SERIAL_AMBA_PL011=y ++CONFIG_SERIAL_AMBA_PL011_CONSOLE=y ++# CONFIG_SERIAL_EARLYCON_SEMIHOST is not set ++# CONFIG_SERIAL_KGDB_NMI is not set ++# CONFIG_SERIAL_MAX3100 is not set ++# CONFIG_SERIAL_MAX310X is not set ++# CONFIG_SERIAL_UARTLITE is not set ++CONFIG_SERIAL_CORE=y ++CONFIG_SERIAL_CORE_CONSOLE=y ++CONFIG_CONSOLE_POLL=y ++# CONFIG_SERIAL_JSM is not set ++# CONFIG_SERIAL_SIFIVE is not set ++# CONFIG_SERIAL_SCCNXP is not set ++# CONFIG_SERIAL_SC16IS7XX is not set ++# CONFIG_SERIAL_ALTERA_JTAGUART is not set ++# CONFIG_SERIAL_ALTERA_UART is not set ++# CONFIG_SERIAL_XILINX_PS_UART is not set ++# CONFIG_SERIAL_ARC is not set ++# CONFIG_SERIAL_RP2 is not set ++# CONFIG_SERIAL_FSL_LPUART is not set ++# CONFIG_SERIAL_FSL_LINFLEXUART is not set ++# CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set ++# CONFIG_SERIAL_SPRD is not set ++# CONFIG_SERIAL_RPI_FW is not set ++# end of Serial drivers ++ ++CONFIG_SERIAL_MCTRL_GPIO=y ++# CONFIG_SERIAL_NONSTANDARD is not set ++# CONFIG_N_GSM is not set ++# CONFIG_NOZOMI is not set ++# CONFIG_NULL_TTY is not set ++# CONFIG_HVC_DCC is not set ++CONFIG_SERIAL_DEV_BUS=y ++CONFIG_SERIAL_DEV_CTRL_TTYPORT=y ++CONFIG_TTY_PRINTK=y ++CONFIG_TTY_PRINTK_LEVEL=6 ++# CONFIG_VIRTIO_CONSOLE is not set ++# CONFIG_IPMI_HANDLER is not set ++CONFIG_HW_RANDOM=y ++# CONFIG_HW_RANDOM_TIMERIOMEM is not set ++# CONFIG_HW_RANDOM_BA431 is not set ++CONFIG_HW_RANDOM_BCM2835=y ++CONFIG_HW_RANDOM_IPROC_RNG200=y ++# CONFIG_HW_RANDOM_CCTRNG is not set ++# CONFIG_HW_RANDOM_XIPHERA is not set ++CONFIG_HW_RANDOM_ARM_SMCCC_TRNG=y ++# CONFIG_HW_RANDOM_CN10K is not set ++# CONFIG_APPLICOM is not set ++CONFIG_DEVMEM=y ++CONFIG_DEVPORT=y ++# CONFIG_TCG_TPM is not set ++# CONFIG_XILLYBUS is not set ++# CONFIG_XILLYUSB is not set ++# CONFIG_RASPBERRYPI_GPIOMEM is not set ++# end of Character devices ++ ++# ++# I2C support ++# ++CONFIG_I2C=y ++CONFIG_I2C_BOARDINFO=y ++# CONFIG_I2C_CHARDEV is not set ++# CONFIG_I2C_MUX is not set ++CONFIG_I2C_HELPER_AUTO=y ++ ++# ++# I2C Hardware Bus support ++# ++ ++# ++# PC SMBus host controller drivers ++# ++# CONFIG_I2C_BCM2708 is not set ++# CONFIG_I2C_ALI1535 is not set ++# CONFIG_I2C_ALI1563 is not set ++# CONFIG_I2C_ALI15X3 is not set ++# CONFIG_I2C_AMD756 is not set ++# CONFIG_I2C_AMD8111 is not set ++# CONFIG_I2C_I801 is not set ++# CONFIG_I2C_ISCH is not set ++# CONFIG_I2C_PIIX4 is not set ++# CONFIG_I2C_NFORCE2 is not set ++# CONFIG_I2C_NVIDIA_GPU is not set ++# CONFIG_I2C_SIS5595 is not set ++# CONFIG_I2C_SIS630 is not set ++# CONFIG_I2C_SIS96X is not set ++# CONFIG_I2C_VIA is not set ++# CONFIG_I2C_VIAPRO is not set ++ ++# ++# I2C system bus drivers (mostly embedded / system-on-chip) ++# ++# CONFIG_I2C_BCM2835 is not set ++# CONFIG_I2C_BRCMSTB is not set ++# CONFIG_I2C_CADENCE is not set ++# CONFIG_I2C_CBUS_GPIO is not set ++# CONFIG_I2C_DESIGNWARE_CORE is not set ++# CONFIG_I2C_EMEV2 is not set ++# CONFIG_I2C_GPIO is not set ++# CONFIG_I2C_HISI is not set ++# CONFIG_I2C_NOMADIK is not set ++# CONFIG_I2C_OCORES is not set ++# CONFIG_I2C_PCA_PLATFORM is not set ++# CONFIG_I2C_RK3X is not set ++# CONFIG_I2C_SIMTEC is not set ++# CONFIG_I2C_THUNDERX is not set ++# CONFIG_I2C_XILINX is not set ++ ++# ++# External I2C/SMBus adapter drivers ++# ++# CONFIG_I2C_DIOLAN_U2C is not set ++# CONFIG_I2C_CP2615 is not set ++# CONFIG_I2C_PCI1XXXX is not set ++# CONFIG_I2C_ROBOTFUZZ_OSIF is not set ++# CONFIG_I2C_TAOS_EVM is not set ++# CONFIG_I2C_TINY_USB is not set ++ ++# ++# Other I2C/SMBus bus drivers ++# ++# CONFIG_I2C_VIRTIO is not set ++# end of I2C Hardware Bus support ++ ++# CONFIG_I2C_STUB is not set ++# CONFIG_I2C_SLAVE is not set ++# CONFIG_I2C_DEBUG_CORE is not set ++# CONFIG_I2C_DEBUG_ALGO is not set ++# CONFIG_I2C_DEBUG_BUS is not set ++# end of I2C support ++ ++# CONFIG_I3C is not set ++CONFIG_SPI=y ++# CONFIG_SPI_DEBUG is not set ++CONFIG_SPI_MASTER=y ++CONFIG_SPI_MEM=y ++ ++# ++# SPI Master Controller Drivers ++# ++# CONFIG_SPI_ALTERA is not set ++# CONFIG_SPI_AXI_SPI_ENGINE is not set ++# CONFIG_SPI_BCM2835 is not set ++# CONFIG_SPI_BCM2835AUX is not set ++# CONFIG_SPI_BCM_QSPI is not set ++# CONFIG_SPI_BITBANG is not set ++# CONFIG_SPI_CADENCE is not set ++# CONFIG_SPI_CADENCE_QUADSPI is not set ++# CONFIG_SPI_CADENCE_XSPI is not set ++# CONFIG_SPI_CH341 is not set ++# CONFIG_SPI_DESIGNWARE is not set ++# CONFIG_SPI_GPIO is not set ++# CONFIG_SPI_FSL_SPI is not set ++# CONFIG_SPI_MICROCHIP_CORE is not set ++# CONFIG_SPI_MICROCHIP_CORE_QSPI is not set ++# CONFIG_SPI_OC_TINY is not set ++# CONFIG_SPI_PCI1XXXX is not set ++# CONFIG_SPI_PL022 is not set ++# CONFIG_SPI_RP2040_GPIO_BRIDGE is not set ++# CONFIG_SPI_SC18IS602 is not set ++# CONFIG_SPI_SIFIVE is not set ++# CONFIG_SPI_SN_F_OSPI is not set ++# CONFIG_SPI_MXIC is not set ++# CONFIG_SPI_THUNDERX is not set ++# CONFIG_SPI_XCOMM is not set ++# CONFIG_SPI_XILINX is not set ++# CONFIG_SPI_ZYNQMP_GQSPI is not set ++# CONFIG_SPI_AMD is not set ++ ++# ++# SPI Multiplexer support ++# ++# CONFIG_SPI_MUX is not set ++ ++# ++# SPI Protocol Masters ++# ++# CONFIG_SPI_SPIDEV is not set ++# CONFIG_SPI_LOOPBACK_TEST is not set ++# CONFIG_SPI_TLE62X0 is not set ++CONFIG_SPI_SLAVE=y ++# CONFIG_SPI_SLAVE_TIME is not set ++# CONFIG_SPI_SLAVE_SYSTEM_CONTROL is not set ++CONFIG_SPI_DYNAMIC=y ++# CONFIG_SPMI is not set ++# CONFIG_HSI is not set ++CONFIG_PPS=y ++# CONFIG_PPS_DEBUG is not set ++ ++# ++# PPS clients support ++# ++# CONFIG_PPS_CLIENT_KTIMER is not set ++# CONFIG_PPS_CLIENT_LDISC is not set ++# CONFIG_PPS_CLIENT_GPIO is not set ++ ++# ++# PPS generators support ++# ++ ++# ++# PTP clock support ++# ++CONFIG_PTP_1588_CLOCK=y ++CONFIG_PTP_1588_CLOCK_OPTIONAL=y ++# CONFIG_DP83640_PHY is not set ++# CONFIG_PTP_1588_CLOCK_INES is not set ++CONFIG_PTP_1588_CLOCK_KVM=y ++# CONFIG_PTP_1588_CLOCK_IDT82P33 is not set ++# CONFIG_PTP_1588_CLOCK_IDTCM is not set ++# CONFIG_PTP_1588_CLOCK_FC3W is not set ++# CONFIG_PTP_1588_CLOCK_MOCK is not set ++# end of PTP clock support ++ ++CONFIG_PINCTRL=y ++CONFIG_PINMUX=y ++CONFIG_PINCONF=y ++CONFIG_GENERIC_PINCONF=y ++# CONFIG_DEBUG_PINCTRL is not set ++# CONFIG_PINCTRL_AW9523 is not set ++# CONFIG_PINCTRL_CY8C95X0 is not set ++# CONFIG_PINCTRL_MCP23S08 is not set ++# CONFIG_PINCTRL_MICROCHIP_SGPIO is not set ++# CONFIG_PINCTRL_OCELOT is not set ++# CONFIG_PINCTRL_SINGLE is not set ++# CONFIG_PINCTRL_STMFX is not set ++# CONFIG_PINCTRL_SX150X is not set ++CONFIG_PINCTRL_RP1=y ++CONFIG_PINCTRL_BCM2712=y ++CONFIG_PINCTRL_BCM2835=y ++ ++# ++# Renesas pinctrl drivers ++# ++# end of Renesas pinctrl drivers ++ ++CONFIG_GPIOLIB=y ++CONFIG_GPIOLIB_FASTPATH_LIMIT=512 ++CONFIG_OF_GPIO=y ++CONFIG_GPIOLIB_IRQCHIP=y ++# CONFIG_DEBUG_GPIO is not set ++CONFIG_GPIO_SYSFS=y ++CONFIG_GPIO_CDEV=y ++CONFIG_GPIO_CDEV_V1=y ++CONFIG_GPIO_GENERIC=y ++ ++# ++# Memory mapped GPIO drivers ++# ++# CONFIG_GPIO_74XX_MMIO is not set ++# CONFIG_GPIO_ALTERA is not set ++CONFIG_GPIO_RASPBERRYPI_EXP=y ++CONFIG_GPIO_BCM_VIRT=y ++CONFIG_GPIO_BRCMSTB=y ++# CONFIG_GPIO_CADENCE is not set ++# CONFIG_GPIO_DWAPB is not set ++# CONFIG_GPIO_EXAR is not set ++# CONFIG_GPIO_FTGPIO010 is not set ++# CONFIG_GPIO_GENERIC_PLATFORM is not set ++# CONFIG_GPIO_GRGPIO is not set ++# CONFIG_GPIO_HISI is not set ++# CONFIG_GPIO_HLWD is not set ++# CONFIG_GPIO_LOGICVC is not set ++# CONFIG_GPIO_MB86S7X is not set ++# CONFIG_GPIO_PL061 is not set ++# CONFIG_GPIO_PWM is not set ++# CONFIG_GPIO_SIFIVE is not set ++# CONFIG_GPIO_SYSCON is not set ++# CONFIG_GPIO_XGENE is not set ++# CONFIG_GPIO_XILINX is not set ++# CONFIG_GPIO_AMD_FCH is not set ++# end of Memory mapped GPIO drivers ++ ++# ++# I2C GPIO expanders ++# ++# CONFIG_GPIO_ADNP is not set ++# CONFIG_GPIO_FXL6408 is not set ++# CONFIG_GPIO_DS4520 is not set ++# CONFIG_GPIO_GW_PLD is not set ++# CONFIG_GPIO_MAX7300 is not set ++# CONFIG_GPIO_MAX732X is not set ++# CONFIG_GPIO_PCA953X is not set ++# CONFIG_GPIO_PCA9570 is not set ++# CONFIG_GPIO_PCF857X is not set ++# CONFIG_GPIO_TPIC2810 is not set ++# end of I2C GPIO expanders ++ ++# ++# MFD GPIO expanders ++# ++# CONFIG_GPIO_FSM is not set ++CONFIG_GPIO_STMPE=y ++# end of MFD GPIO expanders ++ ++# ++# PCI GPIO expanders ++# ++# CONFIG_GPIO_BT8XX is not set ++# CONFIG_GPIO_PCI_IDIO_16 is not set ++# CONFIG_GPIO_PCIE_IDIO_24 is not set ++# CONFIG_GPIO_RDC321X is not set ++# end of PCI GPIO expanders ++ ++# ++# SPI GPIO expanders ++# ++# CONFIG_GPIO_74X164 is not set ++# CONFIG_GPIO_MAX3191X is not set ++# CONFIG_GPIO_MAX7301 is not set ++# CONFIG_GPIO_MC33880 is not set ++# CONFIG_GPIO_PISOSR is not set ++# CONFIG_GPIO_XRA1403 is not set ++# end of SPI GPIO expanders ++ ++# ++# USB GPIO expanders ++# ++# end of USB GPIO expanders ++ ++# ++# Virtual GPIO drivers ++# ++# CONFIG_GPIO_AGGREGATOR is not set ++# CONFIG_GPIO_LATCH is not set ++# CONFIG_GPIO_MOCKUP is not set ++# CONFIG_GPIO_SIM is not set ++# end of Virtual GPIO drivers ++ ++# ++# GPIO Debugging utilities ++# ++# CONFIG_GPIO_SLOPPY_LOGIC_ANALYZER is not set ++# CONFIG_GPIO_VIRTUSER is not set ++# end of GPIO Debugging utilities ++ ++# CONFIG_W1 is not set ++CONFIG_POWER_RESET=y ++# CONFIG_POWER_RESET_BRCMSTB is not set ++CONFIG_POWER_RESET_GPIO=y ++# CONFIG_POWER_RESET_GPIO_RESTART is not set ++# CONFIG_POWER_RESET_LTC2952 is not set ++# CONFIG_POWER_RESET_REGULATOR is not set ++# CONFIG_POWER_RESET_RESTART is not set ++# CONFIG_POWER_RESET_XGENE is not set ++# CONFIG_POWER_RESET_SYSCON is not set ++# CONFIG_POWER_RESET_SYSCON_POWEROFF is not set ++# CONFIG_SYSCON_REBOOT_MODE is not set ++# CONFIG_NVMEM_REBOOT_MODE is not set ++# CONFIG_POWER_SEQUENCING is not set ++CONFIG_POWER_SUPPLY=y ++# CONFIG_POWER_SUPPLY_DEBUG is not set ++CONFIG_POWER_SUPPLY_HWMON=y ++# CONFIG_RPI_POE_POWER is not set ++# CONFIG_IP5XXX_POWER is not set ++# CONFIG_TEST_POWER is not set ++# CONFIG_CHARGER_ADP5061 is not set ++# CONFIG_BATTERY_CW2015 is not set ++# CONFIG_BATTERY_DS2780 is not set ++# CONFIG_BATTERY_DS2781 is not set ++# CONFIG_BATTERY_DS2782 is not set ++# CONFIG_BATTERY_SAMSUNG_SDI is not set ++# CONFIG_BATTERY_SBS is not set ++# CONFIG_CHARGER_SBS is not set ++# CONFIG_BATTERY_BQ27XXX is not set ++# CONFIG_BATTERY_MAX17042 is not set ++# CONFIG_BATTERY_MAX1720X is not set ++# CONFIG_CHARGER_ISP1704 is not set ++# CONFIG_CHARGER_MAX8903 is not set ++# CONFIG_CHARGER_LP8727 is not set ++# CONFIG_CHARGER_GPIO is not set ++# CONFIG_CHARGER_MANAGER is not set ++# CONFIG_CHARGER_LT3651 is not set ++# CONFIG_CHARGER_LTC4162L is not set ++# CONFIG_CHARGER_DETECTOR_MAX14656 is not set ++# CONFIG_CHARGER_MAX77976 is not set ++# CONFIG_CHARGER_BQ2415X is not set ++# CONFIG_CHARGER_BQ24190 is not set ++# CONFIG_CHARGER_BQ24257 is not set ++# CONFIG_CHARGER_BQ24735 is not set ++# CONFIG_CHARGER_BQ2515X is not set ++# CONFIG_CHARGER_BQ25890 is not set ++# CONFIG_CHARGER_BQ25980 is not set ++# CONFIG_CHARGER_BQ256XX is not set ++# CONFIG_CHARGER_SMB347 is not set ++# CONFIG_BATTERY_GAUGE_LTC2941 is not set ++# CONFIG_BATTERY_GOLDFISH is not set ++# CONFIG_BATTERY_RT5033 is not set ++# CONFIG_CHARGER_RT9455 is not set ++# CONFIG_CHARGER_RT9467 is not set ++# CONFIG_CHARGER_RT9471 is not set ++# CONFIG_CHARGER_UCS1002 is not set ++# CONFIG_CHARGER_BD99954 is not set ++# CONFIG_BATTERY_UG3105 is not set ++# CONFIG_FUEL_GAUGE_MM8013 is not set ++CONFIG_HWMON=y ++# CONFIG_HWMON_DEBUG_CHIP is not set ++ ++# ++# Native drivers ++# ++# CONFIG_SENSORS_AD7314 is not set ++# CONFIG_SENSORS_AD7414 is not set ++# CONFIG_SENSORS_AD7418 is not set ++# CONFIG_SENSORS_ADM1025 is not set ++# CONFIG_SENSORS_ADM1026 is not set ++# CONFIG_SENSORS_ADM1029 is not set ++# CONFIG_SENSORS_ADM1031 is not set ++# CONFIG_SENSORS_ADM1177 is not set ++# CONFIG_SENSORS_ADM9240 is not set ++# CONFIG_SENSORS_ADT7310 is not set ++# CONFIG_SENSORS_ADT7410 is not set ++# CONFIG_SENSORS_ADT7411 is not set ++# CONFIG_SENSORS_ADT7462 is not set ++# CONFIG_SENSORS_ADT7470 is not set ++# CONFIG_SENSORS_ADT7475 is not set ++# CONFIG_SENSORS_AHT10 is not set ++# CONFIG_SENSORS_AQUACOMPUTER_D5NEXT is not set ++# CONFIG_SENSORS_AS370 is not set ++# CONFIG_SENSORS_ASC7621 is not set ++# CONFIG_SENSORS_ASUS_ROG_RYUJIN is not set ++# CONFIG_SENSORS_AXI_FAN_CONTROL is not set ++# CONFIG_SENSORS_ATXP1 is not set ++# CONFIG_SENSORS_CHIPCAP2 is not set ++# CONFIG_SENSORS_CORSAIR_CPRO is not set ++# CONFIG_SENSORS_CORSAIR_PSU is not set ++# CONFIG_SENSORS_DS620 is not set ++# CONFIG_SENSORS_DS1621 is not set ++# CONFIG_SENSORS_I5K_AMB is not set ++# CONFIG_SENSORS_F71805F is not set ++# CONFIG_SENSORS_F71882FG is not set ++# CONFIG_SENSORS_F75375S is not set ++# CONFIG_SENSORS_FTSTEUTATES is not set ++# CONFIG_SENSORS_GIGABYTE_WATERFORCE is not set ++# CONFIG_SENSORS_GL518SM is not set ++# CONFIG_SENSORS_GL520SM is not set ++# CONFIG_SENSORS_G760A is not set ++# CONFIG_SENSORS_G762 is not set ++# CONFIG_SENSORS_GPIO_FAN is not set ++# CONFIG_SENSORS_HIH6130 is not set ++# CONFIG_SENSORS_HS3001 is not set ++# CONFIG_SENSORS_IT87 is not set ++# CONFIG_SENSORS_JC42 is not set ++# CONFIG_SENSORS_POWERZ is not set ++# CONFIG_SENSORS_POWR1220 is not set ++# CONFIG_SENSORS_LINEAGE is not set ++# CONFIG_SENSORS_LTC2945 is not set ++# CONFIG_SENSORS_LTC2947_I2C is not set ++# CONFIG_SENSORS_LTC2947_SPI is not set ++# CONFIG_SENSORS_LTC2990 is not set ++# CONFIG_SENSORS_LTC2991 is not set ++# CONFIG_SENSORS_LTC2992 is not set ++# CONFIG_SENSORS_LTC4151 is not set ++# CONFIG_SENSORS_LTC4215 is not set ++# CONFIG_SENSORS_LTC4222 is not set ++# CONFIG_SENSORS_LTC4245 is not set ++# CONFIG_SENSORS_LTC4260 is not set ++# CONFIG_SENSORS_LTC4261 is not set ++# CONFIG_SENSORS_LTC4282 is not set ++# CONFIG_SENSORS_MAX1111 is not set ++# CONFIG_SENSORS_MAX127 is not set ++# CONFIG_SENSORS_MAX16065 is not set ++# CONFIG_SENSORS_MAX1619 is not set ++# CONFIG_SENSORS_MAX1668 is not set ++# CONFIG_SENSORS_MAX197 is not set ++# CONFIG_SENSORS_MAX31722 is not set ++# CONFIG_SENSORS_MAX31730 is not set ++# CONFIG_SENSORS_MAX31760 is not set ++# CONFIG_MAX31827 is not set ++# CONFIG_SENSORS_MAX6620 is not set ++# CONFIG_SENSORS_MAX6621 is not set ++# CONFIG_SENSORS_MAX6639 is not set ++# CONFIG_SENSORS_MAX6650 is not set ++# CONFIG_SENSORS_MAX6697 is not set ++# CONFIG_SENSORS_MAX31790 is not set ++# CONFIG_SENSORS_MC34VR500 is not set ++# CONFIG_SENSORS_MCP3021 is not set ++# CONFIG_SENSORS_TC654 is not set ++# CONFIG_SENSORS_TPS23861 is not set ++# CONFIG_SENSORS_MR75203 is not set ++# CONFIG_SENSORS_ADCXX is not set ++# CONFIG_SENSORS_LM63 is not set ++# CONFIG_SENSORS_LM70 is not set ++# CONFIG_SENSORS_LM73 is not set ++# CONFIG_SENSORS_LM75 is not set ++# CONFIG_SENSORS_LM77 is not set ++# CONFIG_SENSORS_LM78 is not set ++# CONFIG_SENSORS_LM80 is not set ++# CONFIG_SENSORS_LM83 is not set ++# CONFIG_SENSORS_LM85 is not set ++# CONFIG_SENSORS_LM87 is not set ++# CONFIG_SENSORS_LM90 is not set ++# CONFIG_SENSORS_LM92 is not set ++# CONFIG_SENSORS_LM93 is not set ++# CONFIG_SENSORS_LM95234 is not set ++# CONFIG_SENSORS_LM95241 is not set ++# CONFIG_SENSORS_LM95245 is not set ++# CONFIG_SENSORS_PC87360 is not set ++# CONFIG_SENSORS_PC87427 is not set ++# CONFIG_SENSORS_NCT6683 is not set ++# CONFIG_SENSORS_NCT6775 is not set ++# CONFIG_SENSORS_NCT6775_I2C is not set ++# CONFIG_SENSORS_NCT7802 is not set ++# CONFIG_SENSORS_NCT7904 is not set ++# CONFIG_SENSORS_NPCM7XX is not set ++# CONFIG_SENSORS_NZXT_KRAKEN2 is not set ++# CONFIG_SENSORS_NZXT_KRAKEN3 is not set ++# CONFIG_SENSORS_NZXT_SMART2 is not set ++# CONFIG_SENSORS_OCC_P8_I2C is not set ++# CONFIG_SENSORS_PCF8591 is not set ++# CONFIG_PMBUS is not set ++# CONFIG_SENSORS_PT5161L is not set ++# CONFIG_SENSORS_PWM_FAN is not set ++# CONFIG_SENSORS_RASPBERRYPI_HWMON is not set ++# CONFIG_SENSORS_SBTSI is not set ++# CONFIG_SENSORS_SBRMI is not set ++# CONFIG_SENSORS_SHT15 is not set ++# CONFIG_SENSORS_SHT21 is not set ++# CONFIG_SENSORS_SHT3x is not set ++# CONFIG_SENSORS_SHT4x is not set ++# CONFIG_SENSORS_SHTC1 is not set ++# CONFIG_SENSORS_SIS5595 is not set ++# CONFIG_SENSORS_DME1737 is not set ++# CONFIG_SENSORS_EMC1403 is not set ++# CONFIG_SENSORS_EMC2103 is not set ++# CONFIG_SENSORS_EMC2305 is not set ++# CONFIG_SENSORS_EMC6W201 is not set ++# CONFIG_SENSORS_SMSC47M1 is not set ++# CONFIG_SENSORS_SMSC47M192 is not set ++# CONFIG_SENSORS_SMSC47B397 is not set ++# CONFIG_SENSORS_SCH5627 is not set ++# CONFIG_SENSORS_SCH5636 is not set ++# CONFIG_SENSORS_STTS751 is not set ++# CONFIG_SENSORS_ADC128D818 is not set ++# CONFIG_SENSORS_ADS7828 is not set ++# CONFIG_SENSORS_ADS7871 is not set ++# CONFIG_SENSORS_AMC6821 is not set ++# CONFIG_SENSORS_INA209 is not set ++# CONFIG_SENSORS_INA2XX is not set ++# CONFIG_SENSORS_INA238 is not set ++# CONFIG_SENSORS_INA3221 is not set ++# CONFIG_SENSORS_SPD5118 is not set ++# CONFIG_SENSORS_TC74 is not set ++# CONFIG_SENSORS_THMC50 is not set ++# CONFIG_SENSORS_TMP102 is not set ++# CONFIG_SENSORS_TMP103 is not set ++# CONFIG_SENSORS_TMP108 is not set ++# CONFIG_SENSORS_TMP401 is not set ++# CONFIG_SENSORS_TMP421 is not set ++# CONFIG_SENSORS_TMP464 is not set ++# CONFIG_SENSORS_TMP513 is not set ++# CONFIG_SENSORS_VIA686A is not set ++# CONFIG_SENSORS_VT1211 is not set ++# CONFIG_SENSORS_VT8231 is not set ++# CONFIG_SENSORS_W83773G is not set ++# CONFIG_SENSORS_W83781D is not set ++# CONFIG_SENSORS_W83791D is not set ++# CONFIG_SENSORS_W83792D is not set ++# CONFIG_SENSORS_W83793 is not set ++# CONFIG_SENSORS_W83795 is not set ++# CONFIG_SENSORS_W83L785TS is not set ++# CONFIG_SENSORS_W83L786NG is not set ++# CONFIG_SENSORS_W83627HF is not set ++# CONFIG_SENSORS_W83627EHF is not set ++# CONFIG_SENSORS_RP1_ADC is not set ++CONFIG_THERMAL=y ++# CONFIG_THERMAL_NETLINK is not set ++# CONFIG_THERMAL_STATISTICS is not set ++# CONFIG_THERMAL_DEBUGFS is not set ++# CONFIG_THERMAL_CORE_TESTING is not set ++CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 ++CONFIG_THERMAL_HWMON=y ++CONFIG_THERMAL_OF=y ++CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y ++# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set ++# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set ++# CONFIG_THERMAL_GOV_FAIR_SHARE is not set ++CONFIG_THERMAL_GOV_STEP_WISE=y ++# CONFIG_THERMAL_GOV_BANG_BANG is not set ++# CONFIG_THERMAL_GOV_USER_SPACE is not set ++# CONFIG_CPU_THERMAL is not set ++# CONFIG_THERMAL_EMULATION is not set ++# CONFIG_THERMAL_MMIO is not set ++ ++# ++# Broadcom thermal drivers ++# ++CONFIG_BCM2711_THERMAL=y ++CONFIG_BCM2835_THERMAL=y ++# CONFIG_BRCMSTB_THERMAL is not set ++# end of Broadcom thermal drivers ++ ++CONFIG_WATCHDOG=y ++CONFIG_WATCHDOG_CORE=y ++# CONFIG_WATCHDOG_NOWAYOUT is not set ++CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y ++CONFIG_WATCHDOG_OPEN_TIMEOUT=0 ++CONFIG_WATCHDOG_SYSFS=y ++# CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT is not set ++ ++# ++# Watchdog Pretimeout Governors ++# ++# CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set ++ ++# ++# Watchdog Device Drivers ++# ++# CONFIG_SOFT_WATCHDOG is not set ++# CONFIG_GPIO_WATCHDOG is not set ++# CONFIG_XILINX_WATCHDOG is not set ++# CONFIG_XILINX_WINDOW_WATCHDOG is not set ++# CONFIG_ZIIRAVE_WATCHDOG is not set ++# CONFIG_ARM_SP805_WATCHDOG is not set ++# CONFIG_ARM_SBSA_WATCHDOG is not set ++# CONFIG_CADENCE_WATCHDOG is not set ++# CONFIG_DW_WATCHDOG is not set ++# CONFIG_MAX63XX_WATCHDOG is not set ++# CONFIG_ARM_SMC_WATCHDOG is not set ++# CONFIG_ALIM7101_WDT is not set ++# CONFIG_I6300ESB_WDT is not set ++# CONFIG_HP_WATCHDOG is not set ++CONFIG_BCM2835_WDT=y ++# CONFIG_BCM7038_WDT is not set ++# CONFIG_MEN_A21_WDT is not set ++ ++# ++# PCI-based Watchdog Cards ++# ++# CONFIG_PCIPCWATCHDOG is not set ++# CONFIG_WDTPCI is not set ++ ++# ++# USB-based Watchdog Cards ++# ++# CONFIG_USBPCWATCHDOG is not set ++CONFIG_SSB_POSSIBLE=y ++# CONFIG_SSB is not set ++CONFIG_BCMA_POSSIBLE=y ++# CONFIG_BCMA is not set ++ ++# ++# Multifunction device drivers ++# ++CONFIG_MFD_CORE=y ++# CONFIG_MFD_ADP5585 is not set ++# CONFIG_MFD_ACT8945A is not set ++# CONFIG_MFD_AS3711 is not set ++# CONFIG_MFD_SMPRO is not set ++# CONFIG_MFD_AS3722 is not set ++# CONFIG_PMIC_ADP5520 is not set ++# CONFIG_MFD_AAT2870_CORE is not set ++# CONFIG_MFD_ATMEL_FLEXCOM is not set ++# CONFIG_MFD_ATMEL_HLCDC is not set ++# CONFIG_MFD_BCM590XX is not set ++# CONFIG_MFD_BD9571MWV is not set ++# CONFIG_MFD_AXP20X_I2C is not set ++# CONFIG_MFD_CS42L43_I2C is not set ++# CONFIG_MFD_MADERA is not set ++# CONFIG_MFD_MAX5970 is not set ++# CONFIG_PMIC_DA903X is not set ++# CONFIG_MFD_DA9052_SPI is not set ++# CONFIG_MFD_DA9052_I2C is not set ++# CONFIG_MFD_DA9055 is not set ++# CONFIG_MFD_DA9062 is not set ++# CONFIG_MFD_DA9063 is not set ++# CONFIG_MFD_DA9150 is not set ++# CONFIG_MFD_DLN2 is not set ++# CONFIG_MFD_GATEWORKS_GSC is not set ++# CONFIG_MFD_MC13XXX_SPI is not set ++# CONFIG_MFD_MC13XXX_I2C is not set ++# CONFIG_MFD_MP2629 is not set ++# CONFIG_MFD_HI6421_PMIC is not set ++# CONFIG_LPC_ICH is not set ++# CONFIG_LPC_SCH is not set ++# CONFIG_MFD_IQS62X is not set ++# CONFIG_MFD_JANZ_CMODIO is not set ++# CONFIG_MFD_KEMPLD is not set ++# CONFIG_MFD_88PM800 is not set ++# CONFIG_MFD_88PM805 is not set ++# CONFIG_MFD_88PM860X is not set ++# CONFIG_MFD_88PM886_PMIC is not set ++# CONFIG_MFD_MAX14577 is not set ++# CONFIG_MFD_MAX77541 is not set ++# CONFIG_MFD_MAX77620 is not set ++# CONFIG_MFD_MAX77650 is not set ++# CONFIG_MFD_MAX77686 is not set ++# CONFIG_MFD_MAX77693 is not set ++# CONFIG_MFD_MAX77714 is not set ++# CONFIG_MFD_MAX77843 is not set ++# CONFIG_MFD_MAX8907 is not set ++# CONFIG_MFD_MAX8925 is not set ++# CONFIG_MFD_MAX8997 is not set ++# CONFIG_MFD_MAX8998 is not set ++# CONFIG_MFD_MT6360 is not set ++# CONFIG_MFD_MT6370 is not set ++# CONFIG_MFD_MT6397 is not set ++# CONFIG_MFD_MENF21BMC is not set ++# CONFIG_MFD_OCELOT is not set ++# CONFIG_EZX_PCAP is not set ++# CONFIG_MFD_CPCAP is not set ++# CONFIG_MFD_VIPERBOARD is not set ++# CONFIG_MFD_NTXEC is not set ++# CONFIG_MFD_RETU is not set ++# CONFIG_MFD_PCF50633 is not set ++# CONFIG_MFD_SY7636A is not set ++# CONFIG_MFD_RASPBERRYPI_POE_HAT is not set ++# CONFIG_MFD_RDC321X is not set ++# CONFIG_MFD_RT4831 is not set ++# CONFIG_MFD_RT5033 is not set ++# CONFIG_MFD_RT5120 is not set ++# CONFIG_MFD_RC5T583 is not set ++# CONFIG_MFD_RK8XX_I2C is not set ++# CONFIG_MFD_RK8XX_SPI is not set ++# CONFIG_MFD_RN5T618 is not set ++# CONFIG_MFD_SEC_CORE is not set ++# CONFIG_MFD_SI476X_CORE is not set ++# CONFIG_MFD_SM501 is not set ++# CONFIG_MFD_SKY81452 is not set ++CONFIG_MFD_STMPE=y ++ ++# ++# STMicroelectronics STMPE Interface Drivers ++# ++CONFIG_STMPE_I2C=y ++CONFIG_STMPE_SPI=y ++# end of STMicroelectronics STMPE Interface Drivers ++ ++CONFIG_MFD_SYSCON=y ++# CONFIG_MFD_LP3943 is not set ++# CONFIG_MFD_LP8788 is not set ++# CONFIG_MFD_TI_LMU is not set ++# CONFIG_MFD_PALMAS is not set ++# CONFIG_TPS6105X is not set ++# CONFIG_TPS65010 is not set ++# CONFIG_TPS6507X is not set ++# CONFIG_MFD_TPS65086 is not set ++# CONFIG_MFD_TPS65090 is not set ++# CONFIG_MFD_TPS65217 is not set ++# CONFIG_MFD_TI_LP873X is not set ++# CONFIG_MFD_TI_LP87565 is not set ++# CONFIG_MFD_TPS65218 is not set ++# CONFIG_MFD_TPS65219 is not set ++# CONFIG_MFD_TPS6586X is not set ++# CONFIG_MFD_TPS65910 is not set ++# CONFIG_MFD_TPS65912_I2C is not set ++# CONFIG_MFD_TPS65912_SPI is not set ++# CONFIG_MFD_TPS6594_I2C is not set ++# CONFIG_MFD_TPS6594_SPI is not set ++# CONFIG_TWL4030_CORE is not set ++# CONFIG_TWL6040_CORE is not set ++# CONFIG_MFD_WL1273_CORE is not set ++# CONFIG_MFD_LM3533 is not set ++# CONFIG_MFD_TC3589X is not set ++# CONFIG_MFD_TQMX86 is not set ++# CONFIG_MFD_VX855 is not set ++# CONFIG_MFD_LOCHNAGAR is not set ++# CONFIG_MFD_ARIZONA_I2C is not set ++# CONFIG_MFD_ARIZONA_SPI is not set ++# CONFIG_MFD_WM8400 is not set ++# CONFIG_MFD_WM831X_I2C is not set ++# CONFIG_MFD_WM831X_SPI is not set ++# CONFIG_MFD_WM8350_I2C is not set ++# CONFIG_MFD_WM8994 is not set ++# CONFIG_MFD_ROHM_BD718XX is not set ++# CONFIG_MFD_ROHM_BD71828 is not set ++# CONFIG_MFD_ROHM_BD957XMUF is not set ++# CONFIG_MFD_ROHM_BD96801 is not set ++# CONFIG_MFD_STPMIC1 is not set ++# CONFIG_MFD_STMFX is not set ++# CONFIG_MFD_ATC260X_I2C is not set ++# CONFIG_MFD_QCOM_PM8008 is not set ++# CONFIG_MFD_CS40L50_I2C is not set ++# CONFIG_MFD_CS40L50_SPI is not set ++# CONFIG_RAVE_SP_CORE is not set ++# CONFIG_MFD_INTEL_M10_BMC_SPI is not set ++CONFIG_MFD_RP1=y ++# CONFIG_MFD_RSMU_I2C is not set ++# CONFIG_MFD_RSMU_SPI is not set ++# end of Multifunction device drivers ++ ++CONFIG_REGULATOR=y ++# CONFIG_REGULATOR_DEBUG is not set ++CONFIG_REGULATOR_FIXED_VOLTAGE=y ++# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set ++# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set ++# CONFIG_REGULATOR_NETLINK_EVENTS is not set ++# CONFIG_REGULATOR_88PG86X is not set ++# CONFIG_REGULATOR_ACT8865 is not set ++# CONFIG_REGULATOR_AD5398 is not set ++# CONFIG_REGULATOR_AW37503 is not set ++# CONFIG_REGULATOR_DA9121 is not set ++# CONFIG_REGULATOR_DA9210 is not set ++# CONFIG_REGULATOR_DA9211 is not set ++# CONFIG_REGULATOR_FAN53555 is not set ++# CONFIG_REGULATOR_FAN53880 is not set ++CONFIG_REGULATOR_GPIO=y ++# CONFIG_REGULATOR_ISL9305 is not set ++# CONFIG_REGULATOR_ISL6271A is not set ++# CONFIG_REGULATOR_LP3971 is not set ++# CONFIG_REGULATOR_LP3972 is not set ++# CONFIG_REGULATOR_LP872X is not set ++# CONFIG_REGULATOR_LP8755 is not set ++# CONFIG_REGULATOR_LTC3589 is not set ++# CONFIG_REGULATOR_LTC3676 is not set ++# CONFIG_REGULATOR_MAX1586 is not set ++# CONFIG_REGULATOR_MAX77503 is not set ++# CONFIG_REGULATOR_MAX77857 is not set ++# CONFIG_REGULATOR_MAX8649 is not set ++# CONFIG_REGULATOR_MAX8660 is not set ++# CONFIG_REGULATOR_MAX8893 is not set ++# CONFIG_REGULATOR_MAX8952 is not set ++# CONFIG_REGULATOR_MAX8973 is not set ++# CONFIG_REGULATOR_MAX20086 is not set ++# CONFIG_REGULATOR_MAX20411 is not set ++# CONFIG_REGULATOR_MAX77826 is not set ++# CONFIG_REGULATOR_MCP16502 is not set ++# CONFIG_REGULATOR_MP5416 is not set ++# CONFIG_REGULATOR_MP8859 is not set ++# CONFIG_REGULATOR_MP886X is not set ++# CONFIG_REGULATOR_MPQ7920 is not set ++# CONFIG_REGULATOR_MT6311 is not set ++# CONFIG_REGULATOR_PCA9450 is not set ++# CONFIG_REGULATOR_PF8X00 is not set ++# CONFIG_REGULATOR_PFUZE100 is not set ++# CONFIG_REGULATOR_PV88060 is not set ++# CONFIG_REGULATOR_PV88080 is not set ++# CONFIG_REGULATOR_PV88090 is not set ++# CONFIG_REGULATOR_PWM is not set ++# CONFIG_REGULATOR_RAA215300 is not set ++# CONFIG_REGULATOR_RT4801 is not set ++# CONFIG_REGULATOR_RT4803 is not set ++# CONFIG_REGULATOR_RT5190A is not set ++# CONFIG_REGULATOR_RT5739 is not set ++# CONFIG_REGULATOR_RT5759 is not set ++# CONFIG_REGULATOR_RT6160 is not set ++# CONFIG_REGULATOR_RT6190 is not set ++# CONFIG_REGULATOR_RT6245 is not set ++# CONFIG_REGULATOR_RTQ2134 is not set ++# CONFIG_REGULATOR_RTMV20 is not set ++# CONFIG_REGULATOR_RTQ6752 is not set ++# CONFIG_REGULATOR_RTQ2208 is not set ++# CONFIG_REGULATOR_SLG51000 is not set ++# CONFIG_REGULATOR_SY8106A is not set ++# CONFIG_REGULATOR_SY8824X is not set ++# CONFIG_REGULATOR_SY8827N is not set ++# CONFIG_REGULATOR_TPS51632 is not set ++# CONFIG_REGULATOR_TPS62360 is not set ++# CONFIG_REGULATOR_TPS6286X is not set ++# CONFIG_REGULATOR_TPS6287X is not set ++# CONFIG_REGULATOR_TPS65023 is not set ++# CONFIG_REGULATOR_TPS6507X is not set ++# CONFIG_REGULATOR_TPS65132 is not set ++# CONFIG_REGULATOR_TPS6524X is not set ++# CONFIG_REGULATOR_VCTRL is not set ++CONFIG_RC_CORE=y ++CONFIG_BPF_LIRC_MODE2=y ++CONFIG_LIRC=y ++CONFIG_RC_MAP=y ++CONFIG_RC_DECODERS=y ++# CONFIG_IR_IMON_DECODER is not set ++# CONFIG_IR_JVC_DECODER is not set ++# CONFIG_IR_MCE_KBD_DECODER is not set ++# CONFIG_IR_NEC_DECODER is not set ++# CONFIG_IR_RC5_DECODER is not set ++# CONFIG_IR_RC6_DECODER is not set ++# CONFIG_IR_RCMM_DECODER is not set ++# CONFIG_IR_SANYO_DECODER is not set ++# CONFIG_IR_SHARP_DECODER is not set ++# CONFIG_IR_SONY_DECODER is not set ++# CONFIG_IR_XMP_DECODER is not set ++CONFIG_RC_DEVICES=y ++# CONFIG_IR_GPIO_CIR is not set ++# CONFIG_IR_GPIO_TX is not set ++# CONFIG_IR_HIX5HD2 is not set ++# CONFIG_IR_IGORPLUGUSB is not set ++# CONFIG_IR_IGUANA is not set ++# CONFIG_IR_IMON is not set ++# CONFIG_IR_IMON_RAW is not set ++# CONFIG_IR_MCEUSB is not set ++# CONFIG_IR_PWM_TX is not set ++# CONFIG_IR_REDRAT3 is not set ++# CONFIG_IR_SERIAL is not set ++# CONFIG_IR_SPI is not set ++# CONFIG_IR_STREAMZAP is not set ++# CONFIG_IR_TOY is not set ++# CONFIG_IR_TTUSBIR is not set ++# CONFIG_RC_ATI_REMOTE is not set ++# CONFIG_RC_LOOPBACK is not set ++# CONFIG_RC_XBOX_DVD is not set ++ ++# ++# CEC support ++# ++CONFIG_MEDIA_CEC_SUPPORT=y ++# CONFIG_CEC_CH7322 is not set ++# CONFIG_CEC_GPIO is not set ++# CONFIG_USB_PULSE8_CEC is not set ++# CONFIG_USB_RAINSHADOW_CEC is not set ++# end of CEC support ++ ++# CONFIG_MEDIA_SUPPORT is not set ++ ++# ++# Graphics support ++# ++CONFIG_APERTURE_HELPERS=y ++CONFIG_VIDEO=y ++CONFIG_AUXDISPLAY=y ++# CONFIG_HD44780 is not set ++# CONFIG_LCD2S is not set ++# CONFIG_CHARLCD_BL_OFF is not set ++# CONFIG_CHARLCD_BL_ON is not set ++CONFIG_CHARLCD_BL_FLASH=y ++# CONFIG_IMG_ASCII_LCD is not set ++# CONFIG_HT16K33 is not set ++# CONFIG_MAX6959 is not set ++# CONFIG_SEG_LED_GPIO is not set ++# CONFIG_DRM is not set ++ ++# ++# Frame buffer Devices ++# ++CONFIG_FB=y ++CONFIG_FB_BCM2708=y ++# CONFIG_FB_CIRRUS is not set ++# CONFIG_FB_PM2 is not set ++# CONFIG_FB_CYBER2000 is not set ++# CONFIG_FB_ASILIANT is not set ++# CONFIG_FB_IMSTT is not set ++# CONFIG_FB_EFI is not set ++# CONFIG_FB_OPENCORES is not set ++# CONFIG_FB_S1D13XXX is not set ++# CONFIG_FB_NVIDIA is not set ++# CONFIG_FB_RIVA is not set ++# CONFIG_FB_I740 is not set ++# CONFIG_FB_MATROX is not set ++# CONFIG_FB_RADEON is not set ++# CONFIG_FB_ATY128 is not set ++# CONFIG_FB_ATY is not set ++# CONFIG_FB_S3 is not set ++# CONFIG_FB_SAVAGE is not set ++# CONFIG_FB_SIS is not set ++# CONFIG_FB_NEOMAGIC is not set ++# CONFIG_FB_KYRO is not set ++# CONFIG_FB_3DFX is not set ++# CONFIG_FB_VOODOO1 is not set ++# CONFIG_FB_VT8623 is not set ++# CONFIG_FB_TRIDENT is not set ++# CONFIG_FB_ARK is not set ++# CONFIG_FB_PM3 is not set ++# CONFIG_FB_CARMINE is not set ++# CONFIG_FB_SMSCUFX is not set ++# CONFIG_FB_UDL is not set ++# CONFIG_FB_IBM_GXT4500 is not set ++# CONFIG_FB_VIRTUAL is not set ++# CONFIG_FB_METRONOME is not set ++# CONFIG_FB_MB862XX is not set ++CONFIG_FB_SIMPLE=y ++# CONFIG_FB_SSD1307 is not set ++# CONFIG_FB_SM712 is not set ++# CONFIG_FB_RPISENSE is not set ++CONFIG_FB_CORE=y ++CONFIG_FB_NOTIFY=y ++# CONFIG_FIRMWARE_EDID is not set ++CONFIG_FB_DEVICE=y ++CONFIG_FB_CFB_FILLRECT=y ++CONFIG_FB_CFB_COPYAREA=y ++CONFIG_FB_CFB_IMAGEBLIT=y ++# CONFIG_FB_FOREIGN_ENDIAN is not set ++CONFIG_FB_IOMEM_FOPS=y ++CONFIG_FB_IOMEM_HELPERS=y ++# CONFIG_FB_MODE_HELPERS is not set ++# CONFIG_FB_TILEBLITTING is not set ++# end of Frame buffer Devices ++ ++# ++# Backlight & LCD device support ++# ++# CONFIG_LCD_CLASS_DEVICE is not set ++# CONFIG_BACKLIGHT_CLASS_DEVICE is not set ++# end of Backlight & LCD device support ++ ++# ++# Console display driver support ++# ++CONFIG_DUMMY_CONSOLE=y ++CONFIG_DUMMY_CONSOLE_COLUMNS=80 ++CONFIG_DUMMY_CONSOLE_ROWS=25 ++CONFIG_FRAMEBUFFER_CONSOLE=y ++# CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION is not set ++CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y ++CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y ++# CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set ++# end of Console display driver support ++ ++CONFIG_LOGO=y ++# CONFIG_LOGO_LINUX_MONO is not set ++# CONFIG_LOGO_LINUX_VGA16 is not set ++CONFIG_LOGO_LINUX_CLUT224=y ++# end of Graphics support ++ ++CONFIG_SOUND=y ++# CONFIG_SND is not set ++CONFIG_HID_SUPPORT=y ++CONFIG_HID=y ++CONFIG_HID_BATTERY_STRENGTH=y ++CONFIG_HIDRAW=y ++# CONFIG_UHID is not set ++CONFIG_HID_GENERIC=y ++ ++# ++# Special HID drivers ++# ++# CONFIG_HID_A4TECH is not set ++# CONFIG_HID_ACCUTOUCH is not set ++# CONFIG_HID_ACRUX is not set ++# CONFIG_HID_APPLE is not set ++# CONFIG_HID_APPLEIR is not set ++# CONFIG_HID_ASUS is not set ++# CONFIG_HID_AUREAL is not set ++# CONFIG_HID_BELKIN is not set ++# CONFIG_HID_BETOP_FF is not set ++# CONFIG_HID_BIGBEN_FF is not set ++# CONFIG_HID_CHERRY is not set ++# CONFIG_HID_CHICONY is not set ++# CONFIG_HID_CORSAIR is not set ++# CONFIG_HID_COUGAR is not set ++# CONFIG_HID_MACALLY is not set ++# CONFIG_HID_CMEDIA is not set ++# CONFIG_HID_CP2112 is not set ++# CONFIG_HID_CREATIVE_SB0540 is not set ++# CONFIG_HID_CYPRESS is not set ++# CONFIG_HID_DRAGONRISE is not set ++# CONFIG_HID_EMS_FF is not set ++# CONFIG_HID_ELAN is not set ++# CONFIG_HID_ELECOM is not set ++# CONFIG_HID_ELO is not set ++# CONFIG_HID_EVISION is not set ++# CONFIG_HID_EZKEY is not set ++# CONFIG_HID_FT260 is not set ++# CONFIG_HID_GEMBIRD is not set ++# CONFIG_HID_GFRM is not set ++# CONFIG_HID_GLORIOUS is not set ++# CONFIG_HID_HOLTEK is not set ++# CONFIG_HID_GOODIX_SPI is not set ++# CONFIG_HID_GOOGLE_STADIA_FF is not set ++# CONFIG_HID_VIVALDI is not set ++# CONFIG_HID_GT683R is not set ++# CONFIG_HID_KEYTOUCH is not set ++# CONFIG_HID_KYE is not set ++# CONFIG_HID_UCLOGIC is not set ++# CONFIG_HID_WALTOP is not set ++# CONFIG_HID_VIEWSONIC is not set ++# CONFIG_HID_VRC2 is not set ++# CONFIG_HID_XIAOMI is not set ++# CONFIG_HID_GYRATION is not set ++# CONFIG_HID_ICADE is not set ++# CONFIG_HID_ITE is not set ++# CONFIG_HID_JABRA is not set ++# CONFIG_HID_TWINHAN is not set ++# CONFIG_HID_KENSINGTON is not set ++# CONFIG_HID_LCPOWER is not set ++# CONFIG_HID_LED is not set ++# CONFIG_HID_LENOVO is not set ++# CONFIG_HID_LETSKETCH is not set ++# CONFIG_HID_LOGITECH is not set ++# CONFIG_HID_MAGICMOUSE is not set ++# CONFIG_HID_MALTRON is not set ++# CONFIG_HID_MAYFLASH is not set ++# CONFIG_HID_MEGAWORLD_FF is not set ++# CONFIG_HID_REDRAGON is not set ++# CONFIG_HID_MICROSOFT is not set ++# CONFIG_HID_MONTEREY is not set ++# CONFIG_HID_MULTITOUCH is not set ++# CONFIG_HID_NINTENDO is not set ++# CONFIG_HID_NTI is not set ++# CONFIG_HID_NTRIG is not set ++# CONFIG_HID_ORTEK is not set ++# CONFIG_HID_PANTHERLORD is not set ++# CONFIG_HID_PENMOUNT is not set ++# CONFIG_HID_PETALYNX is not set ++# CONFIG_HID_PICOLCD is not set ++# CONFIG_HID_PLANTRONICS is not set ++# CONFIG_HID_PXRC is not set ++# CONFIG_HID_RAZER is not set ++# CONFIG_HID_PRIMAX is not set ++# CONFIG_HID_RETRODE is not set ++# CONFIG_HID_ROCCAT is not set ++# CONFIG_HID_SAITEK is not set ++# CONFIG_HID_SAMSUNG is not set ++# CONFIG_HID_SEMITEK is not set ++# CONFIG_HID_SIGMAMICRO is not set ++# CONFIG_HID_SONY is not set ++# CONFIG_HID_SPEEDLINK is not set ++# CONFIG_HID_STEAM is not set ++# CONFIG_HID_STEELSERIES is not set ++# CONFIG_HID_SUNPLUS is not set ++# CONFIG_HID_RMI is not set ++# CONFIG_HID_GREENASIA is not set ++# CONFIG_HID_SMARTJOYPLUS is not set ++# CONFIG_HID_TIVO is not set ++# CONFIG_HID_TOPSEED is not set ++# CONFIG_HID_TOPRE is not set ++# CONFIG_HID_THINGM is not set ++# CONFIG_HID_THRUSTMASTER is not set ++# CONFIG_HID_UDRAW_PS3 is not set ++# CONFIG_HID_U2FZERO is not set ++# CONFIG_HID_UNIVERSAL_PIDFF is not set ++# CONFIG_HID_WACOM is not set ++# CONFIG_HID_WIIMOTE is not set ++# CONFIG_HID_WINWING is not set ++# CONFIG_HID_XINMO is not set ++# CONFIG_HID_ZEROPLUS is not set ++# CONFIG_HID_ZYDACRON is not set ++# CONFIG_HID_SENSOR_HUB is not set ++# CONFIG_HID_ALPS is not set ++# CONFIG_HID_MCP2200 is not set ++# CONFIG_HID_MCP2221 is not set ++# end of Special HID drivers ++ ++# ++# HID-BPF support ++# ++# CONFIG_HID_BPF is not set ++# end of HID-BPF support ++ ++# ++# USB HID support ++# ++CONFIG_USB_HID=y ++CONFIG_HID_PID=y ++CONFIG_USB_HIDDEV=y ++# end of USB HID support ++ ++CONFIG_I2C_HID=y ++# CONFIG_I2C_HID_OF is not set ++# CONFIG_I2C_HID_OF_ELAN is not set ++# CONFIG_I2C_HID_OF_GOODIX is not set ++CONFIG_USB_OHCI_LITTLE_ENDIAN=y ++CONFIG_USB_SUPPORT=y ++CONFIG_USB_COMMON=y ++# CONFIG_USB_LED_TRIG is not set ++# CONFIG_USB_ULPI_BUS is not set ++# CONFIG_USB_CONN_GPIO is not set ++CONFIG_USB_ARCH_HAS_HCD=y ++CONFIG_USB=y ++CONFIG_USB_PCI=y ++# CONFIG_USB_PCI_AMD is not set ++CONFIG_USB_ANNOUNCE_NEW_DEVICES=y ++ ++# ++# Miscellaneous USB options ++# ++CONFIG_USB_DEFAULT_PERSIST=y ++# CONFIG_USB_FEW_INIT_RETRIES is not set ++# CONFIG_USB_DYNAMIC_MINORS is not set ++# CONFIG_USB_OTG is not set ++# CONFIG_USB_OTG_PRODUCTLIST is not set ++# CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set ++# CONFIG_USB_LEDS_TRIGGER_USBPORT is not set ++CONFIG_USB_AUTOSUSPEND_DELAY=2 ++CONFIG_USB_DEFAULT_AUTHORIZATION_MODE=1 ++# CONFIG_USB_MON is not set ++ ++# ++# USB Host Controller Drivers ++# ++# CONFIG_USB_C67X00_HCD is not set ++CONFIG_USB_XHCI_HCD=y ++# CONFIG_USB_XHCI_DBGCAP is not set ++CONFIG_USB_XHCI_PCI=y ++# CONFIG_USB_XHCI_PCI_RENESAS is not set ++CONFIG_USB_XHCI_PLATFORM=y ++# CONFIG_USB_BRCMSTB is not set ++# CONFIG_USB_EHCI_HCD is not set ++# CONFIG_USB_OXU210HP_HCD is not set ++# CONFIG_USB_ISP116X_HCD is not set ++# CONFIG_USB_MAX3421_HCD is not set ++# CONFIG_USB_OHCI_HCD is not set ++# CONFIG_USB_UHCI_HCD is not set ++# CONFIG_USB_SL811_HCD is not set ++# CONFIG_USB_R8A66597_HCD is not set ++CONFIG_USB_DWCOTG=y ++# CONFIG_USB_HCD_TEST_MODE is not set ++ ++# ++# USB Device Class drivers ++# ++# CONFIG_USB_ACM is not set ++# CONFIG_USB_PRINTER is not set ++# CONFIG_USB_WDM is not set ++# CONFIG_USB_TMC is not set ++ ++# ++# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may ++# ++ ++# ++# also be needed; see USB_STORAGE Help for more info ++# ++CONFIG_USB_STORAGE=y ++# CONFIG_USB_STORAGE_DEBUG is not set ++# CONFIG_USB_STORAGE_REALTEK is not set ++# CONFIG_USB_STORAGE_DATAFAB is not set ++# CONFIG_USB_STORAGE_FREECOM is not set ++# CONFIG_USB_STORAGE_ISD200 is not set ++# CONFIG_USB_STORAGE_USBAT is not set ++# CONFIG_USB_STORAGE_SDDR09 is not set ++# CONFIG_USB_STORAGE_SDDR55 is not set ++# CONFIG_USB_STORAGE_JUMPSHOT is not set ++# CONFIG_USB_STORAGE_ALAUDA is not set ++# CONFIG_USB_STORAGE_ONETOUCH is not set ++# CONFIG_USB_STORAGE_KARMA is not set ++# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set ++# CONFIG_USB_STORAGE_ENE_UB6250 is not set ++CONFIG_USB_UAS=y ++ ++# ++# USB Imaging devices ++# ++# CONFIG_USB_MDC800 is not set ++# CONFIG_USB_MICROTEK is not set ++# CONFIG_USBIP_CORE is not set ++ ++# ++# USB dual-mode controller drivers ++# ++# CONFIG_USB_CDNS_SUPPORT is not set ++# CONFIG_USB_MUSB_HDRC is not set ++CONFIG_USB_DWC3=y ++# CONFIG_USB_DWC3_HOST is not set ++# CONFIG_USB_DWC3_GADGET is not set ++CONFIG_USB_DWC3_DUAL_ROLE=y ++ ++# ++# Platform Glue Driver Support ++# ++CONFIG_USB_DWC3_HAPS=y ++CONFIG_USB_DWC3_OF_SIMPLE=y ++CONFIG_USB_DWC2=y ++# CONFIG_USB_DWC2_HOST is not set ++ ++# ++# Gadget/Dual-role mode requires USB Gadget support to be enabled ++# ++# CONFIG_USB_DWC2_PERIPHERAL is not set ++CONFIG_USB_DWC2_DUAL_ROLE=y ++# CONFIG_USB_DWC2_PCI is not set ++# CONFIG_USB_DWC2_DEBUG is not set ++# CONFIG_USB_DWC2_TRACK_MISSED_SOFS is not set ++# CONFIG_USB_CHIPIDEA is not set ++# CONFIG_USB_ISP1760 is not set ++ ++# ++# USB port drivers ++# ++# CONFIG_USB_SERIAL is not set ++ ++# ++# USB Miscellaneous drivers ++# ++# CONFIG_USB_EMI62 is not set ++# CONFIG_USB_EMI26 is not set ++# CONFIG_USB_ADUTUX is not set ++# CONFIG_USB_SEVSEG is not set ++# CONFIG_USB_LEGOTOWER is not set ++# CONFIG_USB_LCD is not set ++# CONFIG_USB_CYPRESS_CY7C63 is not set ++# CONFIG_USB_CYTHERM is not set ++# CONFIG_USB_IDMOUSE is not set ++# CONFIG_USB_APPLEDISPLAY is not set ++# CONFIG_APPLE_MFI_FASTCHARGE is not set ++# CONFIG_USB_LD is not set ++# CONFIG_USB_TRANCEVIBRATOR is not set ++# CONFIG_USB_IOWARRIOR is not set ++# CONFIG_USB_TEST is not set ++# CONFIG_USB_EHSET_TEST_FIXTURE is not set ++# CONFIG_USB_ISIGHTFW is not set ++# CONFIG_USB_YUREX is not set ++# CONFIG_USB_EZUSB_FX2 is not set ++# CONFIG_USB_HUB_USB251XB is not set ++# CONFIG_USB_HSIC_USB3503 is not set ++# CONFIG_USB_HSIC_USB4604 is not set ++# CONFIG_USB_LINK_LAYER_TEST is not set ++# CONFIG_USB_CHAOSKEY is not set ++CONFIG_BRCM_USB_PINMAP=y ++# CONFIG_USB_ONBOARD_DEV is not set ++ ++# ++# USB Physical Layer drivers ++# ++CONFIG_USB_PHY=y ++CONFIG_NOP_USB_XCEIV=y ++# CONFIG_USB_GPIO_VBUS is not set ++# CONFIG_USB_ISP1301 is not set ++# CONFIG_USB_ULPI is not set ++# end of USB Physical Layer drivers ++ ++CONFIG_USB_GADGET=y ++# CONFIG_USB_GADGET_DEBUG is not set ++# CONFIG_USB_GADGET_DEBUG_FILES is not set ++# CONFIG_USB_GADGET_DEBUG_FS is not set ++CONFIG_USB_GADGET_VBUS_DRAW=2 ++CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 ++ ++# ++# USB Peripheral Controller ++# ++# CONFIG_USB_GR_UDC is not set ++# CONFIG_USB_R8A66597 is not set ++# CONFIG_USB_PXA27X is not set ++# CONFIG_USB_MV_UDC is not set ++# CONFIG_USB_MV_U3D is not set ++# CONFIG_USB_SNP_UDC_PLAT is not set ++# CONFIG_USB_M66592 is not set ++CONFIG_USB_BDC_UDC=y ++# CONFIG_USB_AMD5536UDC is not set ++# CONFIG_USB_NET2272 is not set ++# CONFIG_USB_NET2280 is not set ++# CONFIG_USB_GOKU is not set ++# CONFIG_USB_EG20T is not set ++# CONFIG_USB_GADGET_XILINX is not set ++# CONFIG_USB_MAX3420_UDC is not set ++# CONFIG_USB_DUMMY_HCD is not set ++# end of USB Peripheral Controller ++ ++# CONFIG_USB_CONFIGFS is not set ++ ++# ++# USB Gadget precomposed configurations ++# ++# CONFIG_USB_ZERO is not set ++# CONFIG_USB_ETH is not set ++# CONFIG_USB_G_NCM is not set ++# CONFIG_USB_GADGETFS is not set ++# CONFIG_USB_FUNCTIONFS is not set ++# CONFIG_USB_MASS_STORAGE is not set ++# CONFIG_USB_G_SERIAL is not set ++# CONFIG_USB_G_PRINTER is not set ++# CONFIG_USB_CDC_COMPOSITE is not set ++# CONFIG_USB_G_ACM_MS is not set ++# CONFIG_USB_G_MULTI is not set ++# CONFIG_USB_G_HID is not set ++# CONFIG_USB_G_DBGP is not set ++# CONFIG_USB_RAW_GADGET is not set ++# end of USB Gadget precomposed configurations ++ ++# CONFIG_TYPEC is not set ++CONFIG_USB_ROLE_SWITCH=y ++CONFIG_MMC=y ++CONFIG_PWRSEQ_EMMC=y ++CONFIG_PWRSEQ_SIMPLE=y ++CONFIG_MMC_BLOCK=y ++CONFIG_MMC_BLOCK_MINORS=32 ++# CONFIG_SDIO_UART is not set ++# CONFIG_MMC_TEST is not set ++ ++# ++# MMC/SD/SDIO Host Controller Drivers ++# ++CONFIG_MMC_BCM2835_MMC=y ++CONFIG_MMC_BCM2835_DMA=y ++CONFIG_MMC_BCM2835_PIO_DMA_BARRIER=2 ++# CONFIG_MMC_BCM2835_SDHOST is not set ++# CONFIG_MMC_DEBUG is not set ++# CONFIG_MMC_ARMMMCI is not set ++CONFIG_MMC_SDHCI=y ++CONFIG_MMC_SDHCI_IO_ACCESSORS=y ++# CONFIG_MMC_SDHCI_PCI is not set ++CONFIG_MMC_SDHCI_PLTFM=y ++# CONFIG_MMC_SDHCI_OF_ARASAN is not set ++# CONFIG_MMC_SDHCI_OF_AT91 is not set ++# CONFIG_MMC_SDHCI_OF_DWCMSHC is not set ++# CONFIG_MMC_SDHCI_CADENCE is not set ++# CONFIG_MMC_SDHCI_F_SDH30 is not set ++# CONFIG_MMC_SDHCI_MILBEAUT is not set ++CONFIG_MMC_SDHCI_IPROC=y ++# CONFIG_MMC_TIFM_SD is not set ++# CONFIG_MMC_SPI is not set ++# CONFIG_MMC_CB710 is not set ++# CONFIG_MMC_VIA_SDMMC is not set ++# CONFIG_MMC_DW is not set ++# CONFIG_MMC_VUB300 is not set ++# CONFIG_MMC_USHC is not set ++# CONFIG_MMC_USDHI6ROL0 is not set ++CONFIG_MMC_CQHCI=y ++CONFIG_MMC_HSQ=y ++# CONFIG_MMC_TOSHIBA_PCI is not set ++CONFIG_MMC_BCM2835=y ++# CONFIG_MMC_MTK is not set ++CONFIG_MMC_SDHCI_BRCMSTB=y ++# CONFIG_MMC_SDHCI_XENON is not set ++# CONFIG_SCSI_UFSHCD is not set ++# CONFIG_MEMSTICK is not set ++CONFIG_NEW_LEDS=y ++CONFIG_LEDS_CLASS=y ++# CONFIG_LEDS_CLASS_FLASH is not set ++# CONFIG_LEDS_CLASS_MULTICOLOR is not set ++# CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set ++ ++# ++# LED drivers ++# ++# CONFIG_LEDS_AN30259A is not set ++# CONFIG_LEDS_AW200XX is not set ++# CONFIG_LEDS_AW2013 is not set ++# CONFIG_LEDS_BCM6328 is not set ++# CONFIG_LEDS_BCM6358 is not set ++# CONFIG_LEDS_CR0014114 is not set ++# CONFIG_LEDS_EL15203000 is not set ++# CONFIG_LEDS_LM3530 is not set ++# CONFIG_LEDS_LM3532 is not set ++# CONFIG_LEDS_LM3642 is not set ++# CONFIG_LEDS_LM3692X is not set ++# CONFIG_LEDS_PCA9532 is not set ++CONFIG_LEDS_GPIO=y ++# CONFIG_LEDS_LP3944 is not set ++# CONFIG_LEDS_LP3952 is not set ++# CONFIG_LEDS_LP8860 is not set ++# CONFIG_LEDS_PCA955X is not set ++# CONFIG_LEDS_PCA963X is not set ++# CONFIG_LEDS_PCA995X is not set ++# CONFIG_LEDS_DAC124S085 is not set ++CONFIG_LEDS_PWM=y ++# CONFIG_LEDS_REGULATOR is not set ++# CONFIG_LEDS_BD2606MVV is not set ++# CONFIG_LEDS_BD2802 is not set ++# CONFIG_LEDS_LT3593 is not set ++# CONFIG_LEDS_TCA6507 is not set ++# CONFIG_LEDS_TLC591XX is not set ++# CONFIG_LEDS_LM355x is not set ++# CONFIG_LEDS_IS31FL319X is not set ++# CONFIG_LEDS_IS31FL32XX is not set ++ ++# ++# LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) ++# ++# CONFIG_LEDS_BLINKM is not set ++# CONFIG_LEDS_SYSCON is not set ++# CONFIG_LEDS_MLXREG is not set ++# CONFIG_LEDS_USER is not set ++# CONFIG_LEDS_SPI_BYTE is not set ++# CONFIG_LEDS_LM3697 is not set ++ ++# ++# Flash and Torch LED drivers ++# ++ ++# ++# RGB LED drivers ++# ++ ++# ++# LED Triggers ++# ++CONFIG_LEDS_TRIGGERS=y ++CONFIG_LEDS_TRIGGER_TIMER=y ++CONFIG_LEDS_TRIGGER_ONESHOT=y ++CONFIG_LEDS_TRIGGER_HEARTBEAT=y ++CONFIG_LEDS_TRIGGER_BACKLIGHT=y ++CONFIG_LEDS_TRIGGER_CPU=y ++# CONFIG_LEDS_TRIGGER_ACTIVITY is not set ++# CONFIG_LEDS_TRIGGER_GPIO is not set ++CONFIG_LEDS_TRIGGER_DEFAULT_ON=y ++ ++# ++# iptables trigger is under Netfilter config (LED target) ++# ++# CONFIG_LEDS_TRIGGER_TRANSIENT is not set ++# CONFIG_LEDS_TRIGGER_CAMERA is not set ++CONFIG_LEDS_TRIGGER_INPUT=y ++CONFIG_LEDS_TRIGGER_PANIC=y ++# CONFIG_LEDS_TRIGGER_NETDEV is not set ++# CONFIG_LEDS_TRIGGER_PATTERN is not set ++# CONFIG_LEDS_TRIGGER_TTY is not set ++# CONFIG_LEDS_TRIGGER_INPUT_EVENTS is not set ++CONFIG_LEDS_TRIGGER_ACTPWR=y ++ ++# ++# Simple LED drivers ++# ++CONFIG_ACCESSIBILITY=y ++# CONFIG_A11Y_BRAILLE_CONSOLE is not set ++ ++# ++# Speakup console speech ++# ++# CONFIG_SPEAKUP is not set ++# end of Speakup console speech ++ ++# CONFIG_INFINIBAND is not set ++CONFIG_EDAC_SUPPORT=y ++# CONFIG_EDAC is not set ++CONFIG_RTC_LIB=y ++CONFIG_RTC_CLASS=y ++CONFIG_RTC_HCTOSYS=y ++CONFIG_RTC_HCTOSYS_DEVICE="rtc0" ++CONFIG_RTC_SYSTOHC=y ++CONFIG_RTC_SYSTOHC_DEVICE="rtc0" ++# CONFIG_RTC_DEBUG is not set ++CONFIG_RTC_NVMEM=y ++ ++# ++# RTC interfaces ++# ++CONFIG_RTC_INTF_SYSFS=y ++CONFIG_RTC_INTF_PROC=y ++CONFIG_RTC_INTF_DEV=y ++# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set ++# CONFIG_RTC_DRV_TEST is not set ++ ++# ++# I2C RTC drivers ++# ++# CONFIG_RTC_DRV_ABB5ZES3 is not set ++# CONFIG_RTC_DRV_ABEOZ9 is not set ++# CONFIG_RTC_DRV_ABX80X is not set ++CONFIG_RTC_DRV_RPI=y ++CONFIG_RTC_DRV_BRCMSTB=y ++# CONFIG_RTC_DRV_DS1307 is not set ++# CONFIG_RTC_DRV_DS1374 is not set ++# CONFIG_RTC_DRV_DS1672 is not set ++# CONFIG_RTC_DRV_HYM8563 is not set ++# CONFIG_RTC_DRV_MAX6900 is not set ++# CONFIG_RTC_DRV_MAX31335 is not set ++# CONFIG_RTC_DRV_NCT3018Y is not set ++# CONFIG_RTC_DRV_RS5C372 is not set ++# CONFIG_RTC_DRV_ISL1208 is not set ++# CONFIG_RTC_DRV_ISL12022 is not set ++# CONFIG_RTC_DRV_ISL12026 is not set ++# CONFIG_RTC_DRV_X1205 is not set ++# CONFIG_RTC_DRV_PCF8523 is not set ++# CONFIG_RTC_DRV_PCF85063 is not set ++# CONFIG_RTC_DRV_PCF85363 is not set ++# CONFIG_RTC_DRV_PCF8563 is not set ++# CONFIG_RTC_DRV_PCF8583 is not set ++# CONFIG_RTC_DRV_M41T80 is not set ++# CONFIG_RTC_DRV_BQ32K is not set ++# CONFIG_RTC_DRV_S35390A is not set ++# CONFIG_RTC_DRV_FM3130 is not set ++# CONFIG_RTC_DRV_RX8010 is not set ++# CONFIG_RTC_DRV_RX8111 is not set ++# CONFIG_RTC_DRV_RX8581 is not set ++# CONFIG_RTC_DRV_RX8025 is not set ++# CONFIG_RTC_DRV_EM3027 is not set ++# CONFIG_RTC_DRV_RV3028 is not set ++# CONFIG_RTC_DRV_RV3032 is not set ++# CONFIG_RTC_DRV_RV8803 is not set ++# CONFIG_RTC_DRV_SD2405AL is not set ++# CONFIG_RTC_DRV_SD3078 is not set ++ ++# ++# SPI RTC drivers ++# ++# CONFIG_RTC_DRV_M41T93 is not set ++# CONFIG_RTC_DRV_M41T94 is not set ++# CONFIG_RTC_DRV_DS1302 is not set ++# CONFIG_RTC_DRV_DS1305 is not set ++# CONFIG_RTC_DRV_DS1343 is not set ++# CONFIG_RTC_DRV_DS1347 is not set ++# CONFIG_RTC_DRV_DS1390 is not set ++# CONFIG_RTC_DRV_MAX6916 is not set ++# CONFIG_RTC_DRV_R9701 is not set ++# CONFIG_RTC_DRV_RX4581 is not set ++# CONFIG_RTC_DRV_RS5C348 is not set ++# CONFIG_RTC_DRV_MAX6902 is not set ++# CONFIG_RTC_DRV_PCF2123 is not set ++# CONFIG_RTC_DRV_MCP795 is not set ++CONFIG_RTC_I2C_AND_SPI=y ++ ++# ++# SPI and I2C RTC drivers ++# ++# CONFIG_RTC_DRV_DS3232 is not set ++# CONFIG_RTC_DRV_PCF2127 is not set ++# CONFIG_RTC_DRV_RV3029C2 is not set ++# CONFIG_RTC_DRV_RX6110 is not set ++ ++# ++# Platform RTC drivers ++# ++# CONFIG_RTC_DRV_DS1286 is not set ++# CONFIG_RTC_DRV_DS1511 is not set ++# CONFIG_RTC_DRV_DS1553 is not set ++# CONFIG_RTC_DRV_DS1685_FAMILY is not set ++# CONFIG_RTC_DRV_DS1742 is not set ++# CONFIG_RTC_DRV_DS2404 is not set ++# CONFIG_RTC_DRV_EFI is not set ++# CONFIG_RTC_DRV_STK17TA8 is not set ++# CONFIG_RTC_DRV_M48T86 is not set ++# CONFIG_RTC_DRV_M48T35 is not set ++# CONFIG_RTC_DRV_M48T59 is not set ++# CONFIG_RTC_DRV_MSM6242 is not set ++# CONFIG_RTC_DRV_RP5C01 is not set ++# CONFIG_RTC_DRV_ZYNQMP is not set ++ ++# ++# on-CPU RTC drivers ++# ++# CONFIG_RTC_DRV_PL030 is not set ++# CONFIG_RTC_DRV_PL031 is not set ++# CONFIG_RTC_DRV_CADENCE is not set ++# CONFIG_RTC_DRV_FTRTC010 is not set ++# CONFIG_RTC_DRV_R7301 is not set ++ ++# ++# HID Sensor RTC drivers ++# ++# CONFIG_RTC_DRV_GOLDFISH is not set ++CONFIG_DMADEVICES=y ++# CONFIG_DMADEVICES_DEBUG is not set ++ ++# ++# DMA Devices ++# ++CONFIG_DMA_ENGINE=y ++CONFIG_DMA_VIRTUAL_CHANNELS=y ++CONFIG_DMA_OF=y ++# CONFIG_ALTERA_MSGDMA is not set ++# CONFIG_AMBA_PL08X is not set ++CONFIG_DMA_BCM2835=y ++CONFIG_DW_AXI_DMAC=y ++# CONFIG_FSL_EDMA is not set ++# CONFIG_FSL_QDMA is not set ++# CONFIG_INTEL_IDMA64 is not set ++# CONFIG_MV_XOR_V2 is not set ++# CONFIG_PL330_DMA is not set ++# CONFIG_PLX_DMA is not set ++CONFIG_DMA_BCM2708=y ++# CONFIG_XILINX_DMA is not set ++# CONFIG_XILINX_XDMA is not set ++# CONFIG_XILINX_ZYNQMP_DMA is not set ++# CONFIG_XILINX_ZYNQMP_DPDMA is not set ++# CONFIG_AMD_QDMA is not set ++# CONFIG_QCOM_HIDMA_MGMT is not set ++# CONFIG_QCOM_HIDMA is not set ++# CONFIG_DW_DMAC is not set ++# CONFIG_DW_DMAC_PCI is not set ++# CONFIG_DW_EDMA is not set ++# CONFIG_SF_PDMA is not set ++ ++# ++# DMA Clients ++# ++# CONFIG_ASYNC_TX_DMA is not set ++# CONFIG_DMATEST is not set ++ ++# ++# DMABUF options ++# ++CONFIG_SYNC_FILE=y ++# CONFIG_SW_SYNC is not set ++CONFIG_UDMABUF=y ++# CONFIG_DMABUF_MOVE_NOTIFY is not set ++# CONFIG_DMABUF_DEBUG is not set ++# CONFIG_DMABUF_SELFTESTS is not set ++CONFIG_DMABUF_HEAPS=y ++# CONFIG_DMABUF_SYSFS_STATS is not set ++CONFIG_DMABUF_HEAPS_SYSTEM=y ++CONFIG_DMABUF_HEAPS_CMA=y ++# end of DMABUF options ++ ++# CONFIG_UIO is not set ++# CONFIG_VFIO is not set ++CONFIG_IRQ_BYPASS_MANAGER=y ++# CONFIG_VIRT_DRIVERS is not set ++CONFIG_VIRTIO_MENU=y ++# CONFIG_VIRTIO_PCI is not set ++# CONFIG_VIRTIO_MMIO is not set ++# CONFIG_VDPA is not set ++CONFIG_VHOST_MENU=y ++# CONFIG_VHOST_NET is not set ++CONFIG_VHOST_CROSS_ENDIAN_LEGACY=y ++ ++# ++# Microsoft Hyper-V guest support ++# ++# end of Microsoft Hyper-V guest support ++ ++# CONFIG_GREYBUS is not set ++# CONFIG_COMEDI is not set ++CONFIG_STAGING=y ++# CONFIG_RTLLIB is not set ++# CONFIG_RTS5208 is not set ++# CONFIG_FB_SM750 is not set ++CONFIG_STAGING_MEDIA=y ++# CONFIG_LTE_GDM724X is not set ++# CONFIG_FB_TFT is not set ++CONFIG_BCM_VIDEOCORE=y ++CONFIG_BCM2835_VCHIQ=y ++CONFIG_VCHIQ_CDEV=y ++# CONFIG_BCM_VC_SM_CMA is not set ++# CONFIG_BCM2835_VCHIQ_MMAL is not set ++# CONFIG_XIL_AXIS_FIFO is not set ++# CONFIG_FIELDBUS_DEV is not set ++# CONFIG_VME_BUS is not set ++# CONFIG_GOLDFISH is not set ++# CONFIG_CHROME_PLATFORMS is not set ++# CONFIG_MELLANOX_PLATFORM is not set ++CONFIG_SURFACE_PLATFORMS=y ++CONFIG_ARM64_PLATFORM_DEVICES=y ++CONFIG_HAVE_CLK=y ++CONFIG_HAVE_CLK_PREPARE=y ++CONFIG_COMMON_CLK=y ++ ++# ++# Clock driver for ARM Reference designs ++# ++# CONFIG_CLK_ICST is not set ++# CONFIG_CLK_SP810 is not set ++# end of Clock driver for ARM Reference designs ++ ++# CONFIG_LMK04832 is not set ++# CONFIG_COMMON_CLK_MAX9485 is not set ++CONFIG_COMMON_CLK_RP1=y ++CONFIG_COMMON_CLK_RP1_SDIO=y ++# CONFIG_COMMON_CLK_SI5341 is not set ++# CONFIG_COMMON_CLK_SI5351 is not set ++# CONFIG_COMMON_CLK_SI514 is not set ++# CONFIG_COMMON_CLK_SI544 is not set ++# CONFIG_COMMON_CLK_SI570 is not set ++# CONFIG_COMMON_CLK_CDCE706 is not set ++# CONFIG_COMMON_CLK_CDCE925 is not set ++# CONFIG_COMMON_CLK_CS2000_CP is not set ++# CONFIG_COMMON_CLK_AXI_CLKGEN is not set ++# CONFIG_COMMON_CLK_XGENE is not set ++# CONFIG_COMMON_CLK_PWM is not set ++# CONFIG_COMMON_CLK_RS9_PCIE is not set ++# CONFIG_COMMON_CLK_SI521XX is not set ++# CONFIG_COMMON_CLK_VC3 is not set ++# CONFIG_COMMON_CLK_VC5 is not set ++# CONFIG_COMMON_CLK_VC7 is not set ++# CONFIG_COMMON_CLK_FIXED_MMIO is not set ++CONFIG_CLK_BCM2711_DVP=y ++CONFIG_CLK_BCM2835=y ++CONFIG_CLK_RASPBERRYPI=y ++# CONFIG_XILINX_VCU is not set ++# CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set ++# CONFIG_HWSPINLOCK is not set ++ ++# ++# Clock Source drivers ++# ++CONFIG_TIMER_OF=y ++CONFIG_TIMER_PROBE=y ++CONFIG_CLKSRC_MMIO=y ++CONFIG_ARM_ARCH_TIMER=y ++CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y ++CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND=y ++CONFIG_FSL_ERRATUM_A008585=y ++CONFIG_HISILICON_ERRATUM_161010101=y ++CONFIG_ARM64_ERRATUM_858921=y ++CONFIG_ARM_TIMER_SP804=y ++# end of Clock Source drivers ++ ++CONFIG_MAILBOX=y ++# CONFIG_ARM_MHU is not set ++# CONFIG_ARM_MHU_V2 is not set ++# CONFIG_ARM_MHU_V3 is not set ++# CONFIG_PLATFORM_MHU is not set ++# CONFIG_PL320_MBOX is not set ++# CONFIG_ALTERA_MBOX is not set ++CONFIG_BCM2835_MBOX=y ++# CONFIG_MAILBOX_TEST is not set ++# CONFIG_MBOX_RP1 is not set ++CONFIG_IOMMU_IOVA=y ++CONFIG_IOMMU_API=y ++CONFIG_IOMMU_SUPPORT=y ++ ++# ++# Generic IOMMU Pagetable Support ++# ++# CONFIG_IOMMU_IO_PGTABLE_LPAE is not set ++# CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set ++# CONFIG_IOMMU_IO_PGTABLE_DART is not set ++# end of Generic IOMMU Pagetable Support ++ ++# CONFIG_IOMMU_DEBUGFS is not set ++CONFIG_IOMMU_DEFAULT_DMA_STRICT=y ++# CONFIG_IOMMU_DEFAULT_DMA_LAZY is not set ++# CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set ++CONFIG_OF_IOMMU=y ++CONFIG_IOMMU_DMA=y ++# CONFIG_IOMMUFD is not set ++# CONFIG_ARM_SMMU is not set ++# CONFIG_ARM_SMMU_V3 is not set ++CONFIG_BCM2712_IOMMU=y ++ ++# ++# Remoteproc drivers ++# ++# CONFIG_REMOTEPROC is not set ++# end of Remoteproc drivers ++ ++# ++# Rpmsg drivers ++# ++# CONFIG_RPMSG_QCOM_GLINK_RPM is not set ++# CONFIG_RPMSG_VIRTIO is not set ++# end of Rpmsg drivers ++ ++# CONFIG_SOUNDWIRE is not set ++ ++# ++# SOC (System On Chip) specific Drivers ++# ++ ++# ++# Amlogic SoC drivers ++# ++# end of Amlogic SoC drivers ++ ++# ++# Broadcom SoC drivers ++# ++CONFIG_SOC_BRCMSTB=y ++# end of Broadcom SoC drivers ++ ++# ++# NXP/Freescale QorIQ SoC drivers ++# ++# CONFIG_QUICC_ENGINE is not set ++# end of NXP/Freescale QorIQ SoC drivers ++ ++# ++# fujitsu SoC drivers ++# ++# end of fujitsu SoC drivers ++ ++# ++# i.MX SoC drivers ++# ++# end of i.MX SoC drivers ++ ++# ++# Enable LiteX SoC Builder specific drivers ++# ++# CONFIG_LITEX_SOC_CONTROLLER is not set ++# end of Enable LiteX SoC Builder specific drivers ++ ++# CONFIG_WPCM450_SOC is not set ++ ++# ++# Qualcomm SoC drivers ++# ++# end of Qualcomm SoC drivers ++ ++# CONFIG_SOC_TI is not set ++ ++# ++# Xilinx SoC drivers ++# ++# end of Xilinx SoC drivers ++# end of SOC (System On Chip) specific Drivers ++ ++# ++# PM Domains ++# ++ ++# ++# Amlogic PM Domains ++# ++# end of Amlogic PM Domains ++ ++# ++# Broadcom PM Domains ++# ++CONFIG_BCM2835_POWER=y ++CONFIG_RASPBERRYPI_POWER=y ++# end of Broadcom PM Domains ++ ++# ++# i.MX PM Domains ++# ++# end of i.MX PM Domains ++ ++# ++# Qualcomm PM Domains ++# ++# end of Qualcomm PM Domains ++# end of PM Domains ++ ++# CONFIG_PM_DEVFREQ is not set ++CONFIG_EXTCON=y ++ ++# ++# Extcon Device Drivers ++# ++# CONFIG_EXTCON_FSA9480 is not set ++# CONFIG_EXTCON_GPIO is not set ++# CONFIG_EXTCON_LC824206XA is not set ++# CONFIG_EXTCON_MAX3355 is not set ++# CONFIG_EXTCON_PTN5150 is not set ++# CONFIG_EXTCON_RT8973A is not set ++# CONFIG_EXTCON_SM5502 is not set ++# CONFIG_EXTCON_USB_GPIO is not set ++# CONFIG_MEMORY is not set ++# CONFIG_IIO is not set ++# CONFIG_NTB is not set ++CONFIG_PWM=y ++# CONFIG_PWM_DEBUG is not set ++# CONFIG_PWM_ATMEL_TCB is not set ++# CONFIG_PWM_BCM2835 is not set ++CONFIG_PWM_BRCMSTB=y ++# CONFIG_PWM_CLK is not set ++# CONFIG_PWM_DWC is not set ++# CONFIG_PWM_FSL_FTM is not set ++# CONFIG_PWM_GPIO is not set ++# CONFIG_PWM_PCA9685 is not set ++# CONFIG_PWM_RASPBERRYPI_POE is not set ++CONFIG_PWM_RP1=y ++# CONFIG_PWM_STMPE is not set ++# CONFIG_PWM_XILINX is not set ++ ++# ++# IRQ chip support ++# ++CONFIG_IRQCHIP=y ++CONFIG_ARM_GIC=y ++CONFIG_ARM_GIC_MAX_NR=1 ++CONFIG_ARM_GIC_V2M=y ++CONFIG_ARM_GIC_V3=y ++CONFIG_ARM_GIC_V3_ITS=y ++CONFIG_IRQ_MSI_LIB=y ++# CONFIG_AL_FIC is not set ++CONFIG_BCM2712_MIP=y ++CONFIG_BCM7038_L1_IRQ=y ++CONFIG_BCM7120_L2_IRQ=y ++CONFIG_BRCMSTB_L2_IRQ=y ++# CONFIG_XILINX_INTC is not set ++CONFIG_PARTITION_PERCPU=y ++# end of IRQ chip support ++ ++# CONFIG_IPACK_BUS is not set ++CONFIG_ARCH_HAS_RESET_CONTROLLER=y ++CONFIG_RESET_CONTROLLER=y ++CONFIG_RESET_BRCMSTB=y ++CONFIG_RESET_BRCMSTB_RESCAL=y ++# CONFIG_RESET_GPIO is not set ++CONFIG_RESET_RASPBERRYPI=y ++CONFIG_RESET_SIMPLE=y ++# CONFIG_RESET_TI_SYSCON is not set ++# CONFIG_RESET_TI_TPS380X is not set ++ ++# ++# PHY Subsystem ++# ++CONFIG_GENERIC_PHY=y ++# CONFIG_PHY_CAN_TRANSCEIVER is not set ++ ++# ++# PHY drivers for Broadcom platforms ++# ++# CONFIG_BCM_KONA_USB2_PHY is not set ++# CONFIG_PHY_BRCM_SATA is not set ++CONFIG_PHY_BRCM_USB=y ++# end of PHY drivers for Broadcom platforms ++ ++# CONFIG_PHY_CADENCE_TORRENT is not set ++# CONFIG_PHY_CADENCE_DPHY is not set ++# CONFIG_PHY_CADENCE_DPHY_RX is not set ++# CONFIG_PHY_CADENCE_SIERRA is not set ++# CONFIG_PHY_CADENCE_SALVO is not set ++# CONFIG_PHY_PXA_28NM_HSIC is not set ++# CONFIG_PHY_PXA_28NM_USB2 is not set ++# CONFIG_PHY_LAN966X_SERDES is not set ++# CONFIG_PHY_MAPPHONE_MDM6600 is not set ++# CONFIG_PHY_OCELOT_SERDES is not set ++# CONFIG_PHY_SAMSUNG_USB2 is not set ++# end of PHY Subsystem ++ ++# CONFIG_POWERCAP is not set ++# CONFIG_MCB is not set ++ ++# ++# Performance monitor support ++# ++# CONFIG_ARM_CCI_PMU is not set ++# CONFIG_ARM_CCN is not set ++# CONFIG_ARM_CMN is not set ++# CONFIG_ARM_NI is not set ++CONFIG_ARM_PMU=y ++# CONFIG_ARM_SMMU_V3_PMU is not set ++CONFIG_ARM_PMUV3=y ++# CONFIG_ARM_DSU_PMU is not set ++# CONFIG_ARM_SPE_PMU is not set ++# CONFIG_RPI_AXIPERF is not set ++# CONFIG_HISI_PCIE_PMU is not set ++# CONFIG_HNS3_PMU is not set ++# CONFIG_DWC_PCIE_PMU is not set ++# CONFIG_ARM_CORESIGHT_PMU_ARCH_SYSTEM_PMU is not set ++# end of Performance monitor support ++ ++CONFIG_RAS=y ++# CONFIG_USB4 is not set ++ ++# ++# Android ++# ++CONFIG_ANDROID_BINDER_IPC=y ++CONFIG_ANDROID_BINDERFS=y ++CONFIG_ANDROID_BINDER_DEVICES="binder,hwbinder,vndbinder" ++# CONFIG_ANDROID_BINDER_IPC_SELFTEST is not set ++# end of Android ++ ++# CONFIG_LIBNVDIMM is not set ++# CONFIG_DAX is not set ++CONFIG_NVMEM=y ++CONFIG_NVMEM_SYSFS=y ++CONFIG_NVMEM_LAYOUTS=y ++ ++# ++# Layout Types ++# ++# CONFIG_NVMEM_LAYOUT_SL28_VPD is not set ++# CONFIG_NVMEM_LAYOUT_ONIE_TLV is not set ++# CONFIG_NVMEM_LAYOUT_U_BOOT_ENV is not set ++# end of Layout Types ++ ++CONFIG_NVMEM_RASPBERRYPI_OTP=y ++# CONFIG_NVMEM_RMEM is not set ++ ++# ++# HW tracing support ++# ++# CONFIG_STM is not set ++# CONFIG_INTEL_TH is not set ++# CONFIG_HISI_PTT is not set ++# end of HW tracing support ++ ++# CONFIG_FPGA is not set ++# CONFIG_FSI is not set ++# CONFIG_TEE is not set ++CONFIG_PM_OPP=y ++# CONFIG_SIOX is not set ++# CONFIG_SLIMBUS is not set ++# CONFIG_INTERCONNECT is not set ++# CONFIG_COUNTER is not set ++# CONFIG_MOST is not set ++# CONFIG_PECI is not set ++# CONFIG_HTE is not set ++# CONFIG_CDX_BUS is not set ++# end of Device Drivers ++ ++# ++# File systems ++# ++CONFIG_DCACHE_WORD_ACCESS=y ++# CONFIG_VALIDATE_FS_PARSER is not set ++CONFIG_FS_IOMAP=y ++CONFIG_BUFFER_HEAD=y ++CONFIG_LEGACY_DIRECT_IO=y ++# CONFIG_EXT2_FS is not set ++# CONFIG_EXT3_FS is not set ++CONFIG_EXT4_FS=y ++CONFIG_EXT4_USE_FOR_EXT2=y ++CONFIG_EXT4_FS_POSIX_ACL=y ++CONFIG_EXT4_FS_SECURITY=y ++# CONFIG_EXT4_DEBUG is not set ++CONFIG_JBD2=y ++# CONFIG_JBD2_DEBUG is not set ++CONFIG_FS_MBCACHE=y ++# CONFIG_REISERFS_FS is not set ++# CONFIG_JFS_FS is not set ++# CONFIG_XFS_FS is not set ++# CONFIG_GFS2_FS is not set ++# CONFIG_OCFS2_FS is not set ++# CONFIG_BTRFS_FS is not set ++# CONFIG_NILFS2_FS is not set ++CONFIG_F2FS_FS=y ++CONFIG_F2FS_STAT_FS=y ++CONFIG_F2FS_FS_XATTR=y ++CONFIG_F2FS_FS_POSIX_ACL=y ++CONFIG_F2FS_FS_SECURITY=y ++# CONFIG_F2FS_CHECK_FS is not set ++# CONFIG_F2FS_FAULT_INJECTION is not set ++# CONFIG_F2FS_FS_COMPRESSION is not set ++CONFIG_F2FS_IOSTAT=y ++# CONFIG_F2FS_UNFAIR_RWSEM is not set ++# CONFIG_BCACHEFS_FS is not set ++CONFIG_FS_POSIX_ACL=y ++CONFIG_EXPORTFS=y ++# CONFIG_EXPORTFS_BLOCK_OPS is not set ++CONFIG_FILE_LOCKING=y ++CONFIG_FS_ENCRYPTION=y ++CONFIG_FS_ENCRYPTION_ALGS=y ++# CONFIG_FS_VERITY is not set ++CONFIG_FSNOTIFY=y ++CONFIG_DNOTIFY=y ++CONFIG_INOTIFY_USER=y ++CONFIG_FANOTIFY=y ++# CONFIG_FANOTIFY_ACCESS_PERMISSIONS is not set ++CONFIG_QUOTA=y ++# CONFIG_QUOTA_NETLINK_INTERFACE is not set ++# CONFIG_QUOTA_DEBUG is not set ++# CONFIG_QFMT_V1 is not set ++# CONFIG_QFMT_V2 is not set ++CONFIG_QUOTACTL=y ++CONFIG_AUTOFS_FS=y ++# CONFIG_FUSE_FS is not set ++# CONFIG_OVERLAY_FS is not set ++ ++# ++# Caches ++# ++# end of Caches ++ ++# ++# CD-ROM/DVD Filesystems ++# ++# CONFIG_ISO9660_FS is not set ++# CONFIG_UDF_FS is not set ++# end of CD-ROM/DVD Filesystems ++ ++# ++# DOS/FAT/EXFAT/NT Filesystems ++# ++CONFIG_FAT_FS=y ++CONFIG_MSDOS_FS=y ++CONFIG_VFAT_FS=y ++CONFIG_FAT_DEFAULT_CODEPAGE=437 ++CONFIG_FAT_DEFAULT_IOCHARSET="ascii" ++# CONFIG_FAT_DEFAULT_UTF8 is not set ++# CONFIG_EXFAT_FS is not set ++# CONFIG_NTFS3_FS is not set ++# CONFIG_NTFS_FS is not set ++# end of DOS/FAT/EXFAT/NT Filesystems ++ ++# ++# Pseudo filesystems ++# ++CONFIG_PROC_FS=y ++# CONFIG_PROC_KCORE is not set ++CONFIG_PROC_SYSCTL=y ++CONFIG_PROC_PAGE_MONITOR=y ++CONFIG_PROC_CHILDREN=y ++CONFIG_KERNFS=y ++CONFIG_SYSFS=y ++CONFIG_TMPFS=y ++CONFIG_TMPFS_POSIX_ACL=y ++CONFIG_TMPFS_XATTR=y ++# CONFIG_TMPFS_INODE64 is not set ++# CONFIG_TMPFS_QUOTA is not set ++CONFIG_ARCH_SUPPORTS_HUGETLBFS=y ++# CONFIG_HUGETLBFS is not set ++CONFIG_ARCH_HAS_GIGANTIC_PAGE=y ++CONFIG_CONFIGFS_FS=y ++# CONFIG_EFIVAR_FS is not set ++# end of Pseudo filesystems ++ ++CONFIG_MISC_FILESYSTEMS=y ++# CONFIG_ORANGEFS_FS is not set ++# CONFIG_ADFS_FS is not set ++# CONFIG_AFFS_FS is not set ++# CONFIG_ECRYPT_FS is not set ++# CONFIG_HFS_FS is not set ++# CONFIG_HFSPLUS_FS is not set ++# CONFIG_BEFS_FS is not set ++# CONFIG_BFS_FS is not set ++# CONFIG_EFS_FS is not set ++# CONFIG_CRAMFS is not set ++# CONFIG_SQUASHFS is not set ++# CONFIG_VXFS_FS is not set ++# CONFIG_MINIX_FS is not set ++# CONFIG_OMFS_FS is not set ++# CONFIG_HPFS_FS is not set ++# CONFIG_QNX4FS_FS is not set ++# CONFIG_QNX6FS_FS is not set ++# CONFIG_ROMFS_FS is not set ++CONFIG_PSTORE=y ++CONFIG_PSTORE_DEFAULT_KMSG_BYTES=10240 ++CONFIG_PSTORE_COMPRESS=y ++CONFIG_PSTORE_CONSOLE=y ++# CONFIG_PSTORE_PMSG is not set ++# CONFIG_PSTORE_FTRACE is not set ++CONFIG_PSTORE_RAM=y ++# CONFIG_PSTORE_BLK is not set ++# CONFIG_SYSV_FS is not set ++# CONFIG_UFS_FS is not set ++# CONFIG_EROFS_FS is not set ++CONFIG_NETWORK_FILESYSTEMS=y ++CONFIG_NFS_FS=y ++CONFIG_NFS_V2=y ++CONFIG_NFS_V3=y ++CONFIG_NFS_V3_ACL=y ++CONFIG_NFS_V4=y ++CONFIG_NFS_SWAP=y ++CONFIG_NFS_V4_1=y ++CONFIG_NFS_V4_2=y ++CONFIG_PNFS_FILE_LAYOUT=y ++CONFIG_PNFS_FLEXFILE_LAYOUT=y ++CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" ++# CONFIG_NFS_V4_1_MIGRATION is not set ++CONFIG_NFS_V4_SECURITY_LABEL=y ++CONFIG_ROOT_NFS=y ++# CONFIG_NFS_FSCACHE is not set ++# CONFIG_NFS_USE_LEGACY_DNS is not set ++CONFIG_NFS_USE_KERNEL_DNS=y ++CONFIG_NFS_DISABLE_UDP_SUPPORT=y ++CONFIG_NFS_V4_2_READ_PLUS=y ++# CONFIG_NFSD is not set ++CONFIG_GRACE_PERIOD=y ++CONFIG_LOCKD=y ++CONFIG_LOCKD_V4=y ++CONFIG_NFS_ACL_SUPPORT=y ++CONFIG_NFS_COMMON=y ++CONFIG_NFS_V4_2_SSC_HELPER=y ++CONFIG_SUNRPC=y ++CONFIG_SUNRPC_GSS=y ++CONFIG_SUNRPC_BACKCHANNEL=y ++CONFIG_SUNRPC_SWAP=y ++CONFIG_RPCSEC_GSS_KRB5=y ++# CONFIG_SUNRPC_DEBUG is not set ++# CONFIG_CEPH_FS is not set ++# CONFIG_CIFS is not set ++# CONFIG_SMB_SERVER is not set ++# CONFIG_CODA_FS is not set ++# CONFIG_AFS_FS is not set ++CONFIG_NLS=y ++CONFIG_NLS_DEFAULT="utf8" ++CONFIG_NLS_CODEPAGE_437=y ++# CONFIG_NLS_CODEPAGE_737 is not set ++# CONFIG_NLS_CODEPAGE_775 is not set ++# CONFIG_NLS_CODEPAGE_850 is not set ++# CONFIG_NLS_CODEPAGE_852 is not set ++# CONFIG_NLS_CODEPAGE_855 is not set ++# CONFIG_NLS_CODEPAGE_857 is not set ++# CONFIG_NLS_CODEPAGE_860 is not set ++# CONFIG_NLS_CODEPAGE_861 is not set ++# CONFIG_NLS_CODEPAGE_862 is not set ++# CONFIG_NLS_CODEPAGE_863 is not set ++# CONFIG_NLS_CODEPAGE_864 is not set ++# CONFIG_NLS_CODEPAGE_865 is not set ++# CONFIG_NLS_CODEPAGE_866 is not set ++# CONFIG_NLS_CODEPAGE_869 is not set ++# CONFIG_NLS_CODEPAGE_936 is not set ++# CONFIG_NLS_CODEPAGE_950 is not set ++# CONFIG_NLS_CODEPAGE_932 is not set ++# CONFIG_NLS_CODEPAGE_949 is not set ++# CONFIG_NLS_CODEPAGE_874 is not set ++# CONFIG_NLS_ISO8859_8 is not set ++# CONFIG_NLS_CODEPAGE_1250 is not set ++# CONFIG_NLS_CODEPAGE_1251 is not set ++CONFIG_NLS_ASCII=y ++# CONFIG_NLS_ISO8859_1 is not set ++# CONFIG_NLS_ISO8859_2 is not set ++# CONFIG_NLS_ISO8859_3 is not set ++# CONFIG_NLS_ISO8859_4 is not set ++# CONFIG_NLS_ISO8859_5 is not set ++# CONFIG_NLS_ISO8859_6 is not set ++# CONFIG_NLS_ISO8859_7 is not set ++# CONFIG_NLS_ISO8859_9 is not set ++# CONFIG_NLS_ISO8859_13 is not set ++# CONFIG_NLS_ISO8859_14 is not set ++# CONFIG_NLS_ISO8859_15 is not set ++# CONFIG_NLS_KOI8_R is not set ++# CONFIG_NLS_KOI8_U is not set ++# CONFIG_NLS_MAC_ROMAN is not set ++# CONFIG_NLS_MAC_CELTIC is not set ++# CONFIG_NLS_MAC_CENTEURO is not set ++# CONFIG_NLS_MAC_CROATIAN is not set ++# CONFIG_NLS_MAC_CYRILLIC is not set ++# CONFIG_NLS_MAC_GAELIC is not set ++# CONFIG_NLS_MAC_GREEK is not set ++# CONFIG_NLS_MAC_ICELAND is not set ++# CONFIG_NLS_MAC_INUIT is not set ++# CONFIG_NLS_MAC_ROMANIAN is not set ++# CONFIG_NLS_MAC_TURKISH is not set ++# CONFIG_NLS_UTF8 is not set ++# CONFIG_DLM is not set ++# CONFIG_UNICODE is not set ++CONFIG_IO_WQ=y ++# end of File systems ++ ++# ++# Security options ++# ++CONFIG_KEYS=y ++# CONFIG_KEYS_REQUEST_CACHE is not set ++# CONFIG_PERSISTENT_KEYRINGS is not set ++# CONFIG_TRUSTED_KEYS is not set ++# CONFIG_ENCRYPTED_KEYS is not set ++CONFIG_KEY_DH_OPERATIONS=y ++# CONFIG_SECURITY_DMESG_RESTRICT is not set ++CONFIG_PROC_MEM_ALWAYS_FORCE=y ++# CONFIG_PROC_MEM_FORCE_PTRACE is not set ++# CONFIG_PROC_MEM_NO_FORCE is not set ++CONFIG_SECURITY=y ++CONFIG_SECURITYFS=y ++CONFIG_SECURITY_NETWORK=y ++CONFIG_SECURITY_PATH=y ++# CONFIG_HARDENED_USERCOPY is not set ++# CONFIG_FORTIFY_SOURCE is not set ++# CONFIG_STATIC_USERMODEHELPER is not set ++# CONFIG_SECURITY_SELINUX is not set ++# CONFIG_SECURITY_SMACK is not set ++# CONFIG_SECURITY_TOMOYO is not set ++CONFIG_SECURITY_APPARMOR=y ++# CONFIG_SECURITY_APPARMOR_DEBUG is not set ++CONFIG_SECURITY_APPARMOR_INTROSPECT_POLICY=y ++CONFIG_SECURITY_APPARMOR_HASH=y ++CONFIG_SECURITY_APPARMOR_HASH_DEFAULT=y ++CONFIG_SECURITY_APPARMOR_EXPORT_BINARY=y ++CONFIG_SECURITY_APPARMOR_PARANOID_LOAD=y ++# CONFIG_SECURITY_LOADPIN is not set ++# CONFIG_SECURITY_YAMA is not set ++# CONFIG_SECURITY_SAFESETID is not set ++# CONFIG_SECURITY_LOCKDOWN_LSM is not set ++# CONFIG_SECURITY_LANDLOCK is not set ++# CONFIG_SECURITY_IPE is not set ++CONFIG_INTEGRITY=y ++# CONFIG_INTEGRITY_SIGNATURE is not set ++CONFIG_INTEGRITY_AUDIT=y ++# CONFIG_IMA is not set ++# CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT is not set ++# CONFIG_EVM is not set ++CONFIG_DEFAULT_SECURITY_APPARMOR=y ++# CONFIG_DEFAULT_SECURITY_DAC is not set ++CONFIG_LSM="" ++ ++# ++# Kernel hardening options ++# ++ ++# ++# Memory initialization ++# ++CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y ++CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_BARE=y ++CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y ++# CONFIG_INIT_STACK_NONE is not set ++# CONFIG_INIT_STACK_ALL_PATTERN is not set ++CONFIG_INIT_STACK_ALL_ZERO=y ++# CONFIG_GCC_PLUGIN_STACKLEAK is not set ++# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set ++# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set ++CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y ++# CONFIG_ZERO_CALL_USED_REGS is not set ++# end of Memory initialization ++ ++# ++# Hardening of kernel data structures ++# ++# CONFIG_LIST_HARDENED is not set ++# CONFIG_BUG_ON_DATA_CORRUPTION is not set ++# end of Hardening of kernel data structures ++ ++CONFIG_RANDSTRUCT_NONE=y ++# CONFIG_RANDSTRUCT_FULL is not set ++# CONFIG_RANDSTRUCT_PERFORMANCE is not set ++# end of Kernel hardening options ++# end of Security options ++ ++CONFIG_CRYPTO=y ++ ++# ++# Crypto core or helper ++# ++CONFIG_CRYPTO_ALGAPI=y ++CONFIG_CRYPTO_ALGAPI2=y ++CONFIG_CRYPTO_AEAD2=y ++CONFIG_CRYPTO_SIG=y ++CONFIG_CRYPTO_SIG2=y ++CONFIG_CRYPTO_SKCIPHER=y ++CONFIG_CRYPTO_SKCIPHER2=y ++CONFIG_CRYPTO_HASH=y ++CONFIG_CRYPTO_HASH2=y ++CONFIG_CRYPTO_RNG2=y ++CONFIG_CRYPTO_AKCIPHER2=y ++CONFIG_CRYPTO_AKCIPHER=y ++CONFIG_CRYPTO_KPP2=y ++CONFIG_CRYPTO_KPP=y ++CONFIG_CRYPTO_ACOMP2=y ++CONFIG_CRYPTO_MANAGER=y ++CONFIG_CRYPTO_MANAGER2=y ++# CONFIG_CRYPTO_USER is not set ++CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y ++# CONFIG_CRYPTO_NULL is not set ++# CONFIG_CRYPTO_PCRYPT is not set ++# CONFIG_CRYPTO_CRYPTD is not set ++# CONFIG_CRYPTO_AUTHENC is not set ++# CONFIG_CRYPTO_TEST is not set ++# end of Crypto core or helper ++ ++# ++# Public-key cryptography ++# ++CONFIG_CRYPTO_RSA=y ++CONFIG_CRYPTO_DH=y ++# CONFIG_CRYPTO_DH_RFC7919_GROUPS is not set ++# CONFIG_CRYPTO_ECDH is not set ++# CONFIG_CRYPTO_ECDSA is not set ++# CONFIG_CRYPTO_ECRDSA is not set ++# CONFIG_CRYPTO_CURVE25519 is not set ++# end of Public-key cryptography ++ ++# ++# Block ciphers ++# ++# CONFIG_CRYPTO_AES is not set ++# CONFIG_CRYPTO_AES_TI is not set ++# CONFIG_CRYPTO_ARIA is not set ++# CONFIG_CRYPTO_BLOWFISH is not set ++# CONFIG_CRYPTO_CAMELLIA is not set ++# CONFIG_CRYPTO_CAST5 is not set ++# CONFIG_CRYPTO_CAST6 is not set ++CONFIG_CRYPTO_DES=y ++# CONFIG_CRYPTO_FCRYPT is not set ++# CONFIG_CRYPTO_SERPENT is not set ++# CONFIG_CRYPTO_SM4_GENERIC is not set ++# CONFIG_CRYPTO_TWOFISH is not set ++# end of Block ciphers ++ ++# ++# Length-preserving ciphers and modes ++# ++# CONFIG_CRYPTO_ADIANTUM is not set ++# CONFIG_CRYPTO_CHACHA20 is not set ++# CONFIG_CRYPTO_CBC is not set ++# CONFIG_CRYPTO_CTR is not set ++CONFIG_CRYPTO_CTS=y ++CONFIG_CRYPTO_ECB=y ++# CONFIG_CRYPTO_HCTR2 is not set ++# CONFIG_CRYPTO_KEYWRAP is not set ++# CONFIG_CRYPTO_LRW is not set ++# CONFIG_CRYPTO_PCBC is not set ++CONFIG_CRYPTO_XTS=y ++# end of Length-preserving ciphers and modes ++ ++# ++# AEAD (authenticated encryption with associated data) ciphers ++# ++# CONFIG_CRYPTO_AEGIS128 is not set ++# CONFIG_CRYPTO_CHACHA20POLY1305 is not set ++# CONFIG_CRYPTO_CCM is not set ++# CONFIG_CRYPTO_GCM is not set ++# CONFIG_CRYPTO_SEQIV is not set ++# CONFIG_CRYPTO_ECHAINIV is not set ++# CONFIG_CRYPTO_ESSIV is not set ++# end of AEAD (authenticated encryption with associated data) ciphers ++ ++# ++# Hashes, digests, and MACs ++# ++# CONFIG_CRYPTO_BLAKE2B is not set ++# CONFIG_CRYPTO_CMAC is not set ++# CONFIG_CRYPTO_GHASH is not set ++CONFIG_CRYPTO_HMAC=y ++# CONFIG_CRYPTO_MD4 is not set ++# CONFIG_CRYPTO_MD5 is not set ++# CONFIG_CRYPTO_MICHAEL_MIC is not set ++# CONFIG_CRYPTO_POLY1305 is not set ++# CONFIG_CRYPTO_RMD160 is not set ++# CONFIG_CRYPTO_SHA1 is not set ++CONFIG_CRYPTO_SHA256=y ++# CONFIG_CRYPTO_SHA512 is not set ++# CONFIG_CRYPTO_SHA3 is not set ++# CONFIG_CRYPTO_SM3_GENERIC is not set ++# CONFIG_CRYPTO_STREEBOG is not set ++# CONFIG_CRYPTO_VMAC is not set ++# CONFIG_CRYPTO_WP512 is not set ++# CONFIG_CRYPTO_XCBC is not set ++# CONFIG_CRYPTO_XXHASH is not set ++# end of Hashes, digests, and MACs ++ ++# ++# CRCs (cyclic redundancy checks) ++# ++CONFIG_CRYPTO_CRC32C=y ++CONFIG_CRYPTO_CRC32=y ++CONFIG_CRYPTO_CRCT10DIF=y ++CONFIG_CRYPTO_CRC64_ROCKSOFT=y ++# end of CRCs (cyclic redundancy checks) ++ ++# ++# Compression ++# ++# CONFIG_CRYPTO_DEFLATE is not set ++CONFIG_CRYPTO_LZO=y ++# CONFIG_CRYPTO_842 is not set ++# CONFIG_CRYPTO_LZ4 is not set ++# CONFIG_CRYPTO_LZ4HC is not set ++# CONFIG_CRYPTO_ZSTD is not set ++# end of Compression ++ ++# ++# Random number generation ++# ++# CONFIG_CRYPTO_ANSI_CPRNG is not set ++# CONFIG_CRYPTO_DRBG_MENU is not set ++# CONFIG_CRYPTO_JITTERENTROPY is not set ++CONFIG_CRYPTO_KDF800108_CTR=y ++# end of Random number generation ++ ++# ++# Userspace interface ++# ++# CONFIG_CRYPTO_USER_API_HASH is not set ++# CONFIG_CRYPTO_USER_API_SKCIPHER is not set ++# CONFIG_CRYPTO_USER_API_RNG is not set ++# CONFIG_CRYPTO_USER_API_AEAD is not set ++# end of Userspace interface ++ ++CONFIG_CRYPTO_HASH_INFO=y ++# CONFIG_CRYPTO_NHPOLY1305_NEON is not set ++ ++# ++# Accelerated Cryptographic Algorithms for CPU (arm64) ++# ++# CONFIG_CRYPTO_GHASH_ARM64_CE is not set ++# CONFIG_CRYPTO_SHA1_ARM64_CE is not set ++# CONFIG_CRYPTO_SHA256_ARM64 is not set ++# CONFIG_CRYPTO_SHA2_ARM64_CE is not set ++# CONFIG_CRYPTO_SHA512_ARM64 is not set ++# CONFIG_CRYPTO_SHA512_ARM64_CE is not set ++# CONFIG_CRYPTO_SHA3_ARM64 is not set ++# CONFIG_CRYPTO_SM3_NEON is not set ++# CONFIG_CRYPTO_SM3_ARM64_CE is not set ++# CONFIG_CRYPTO_POLYVAL_ARM64_CE is not set ++# CONFIG_CRYPTO_AES_ARM64 is not set ++# CONFIG_CRYPTO_AES_ARM64_CE is not set ++# CONFIG_CRYPTO_AES_ARM64_CE_BLK is not set ++# CONFIG_CRYPTO_AES_ARM64_NEON_BLK is not set ++# CONFIG_CRYPTO_AES_ARM64_BS is not set ++# CONFIG_CRYPTO_SM4_ARM64_CE is not set ++# CONFIG_CRYPTO_SM4_ARM64_CE_BLK is not set ++# CONFIG_CRYPTO_SM4_ARM64_NEON_BLK is not set ++# CONFIG_CRYPTO_AES_ARM64_CE_CCM is not set ++# CONFIG_CRYPTO_SM4_ARM64_CE_CCM is not set ++# CONFIG_CRYPTO_SM4_ARM64_CE_GCM is not set ++# CONFIG_CRYPTO_CRCT10DIF_ARM64_CE is not set ++# end of Accelerated Cryptographic Algorithms for CPU (arm64) ++ ++# CONFIG_CRYPTO_HW is not set ++CONFIG_ASYMMETRIC_KEY_TYPE=y ++CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y ++CONFIG_X509_CERTIFICATE_PARSER=y ++# CONFIG_PKCS8_PRIVATE_KEY_PARSER is not set ++CONFIG_PKCS7_MESSAGE_PARSER=y ++# CONFIG_FIPS_SIGNATURE_SELFTEST is not set ++ ++# ++# Certificates for signature checking ++# ++CONFIG_SYSTEM_TRUSTED_KEYRING=y ++CONFIG_SYSTEM_TRUSTED_KEYS="" ++# CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set ++# CONFIG_SECONDARY_TRUSTED_KEYRING is not set ++# CONFIG_SYSTEM_BLACKLIST_KEYRING is not set ++# end of Certificates for signature checking ++ ++CONFIG_BINARY_PRINTF=y ++ ++# ++# Library routines ++# ++CONFIG_LINEAR_RANGES=y ++# CONFIG_PACKING is not set ++CONFIG_BITREVERSE=y ++CONFIG_HAVE_ARCH_BITREVERSE=y ++CONFIG_GENERIC_STRNCPY_FROM_USER=y ++CONFIG_GENERIC_STRNLEN_USER=y ++CONFIG_GENERIC_NET_UTILS=y ++# CONFIG_CORDIC is not set ++# CONFIG_PRIME_NUMBERS is not set ++CONFIG_RATIONAL=y ++CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y ++CONFIG_ARCH_HAS_FAST_MULTIPLIER=y ++CONFIG_ARCH_USE_SYM_ANNOTATIONS=y ++# CONFIG_INDIRECT_PIO is not set ++# CONFIG_TRACE_MMIO_ACCESS is not set ++ ++# ++# Crypto library routines ++# ++CONFIG_CRYPTO_LIB_UTILS=y ++CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y ++# CONFIG_CRYPTO_LIB_CHACHA is not set ++# CONFIG_CRYPTO_LIB_CURVE25519 is not set ++CONFIG_CRYPTO_LIB_DES=y ++CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 ++# CONFIG_CRYPTO_LIB_POLY1305 is not set ++# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set ++CONFIG_CRYPTO_LIB_SHA1=y ++CONFIG_CRYPTO_LIB_SHA256=y ++# end of Crypto library routines ++ ++# CONFIG_CRC_CCITT is not set ++CONFIG_CRC16=y ++CONFIG_CRC_T10DIF=y ++CONFIG_CRC64_ROCKSOFT=y ++CONFIG_CRC_ITU_T=y ++CONFIG_CRC32=y ++# CONFIG_CRC32_SELFTEST is not set ++CONFIG_CRC32_SLICEBY8=y ++# CONFIG_CRC32_SLICEBY4 is not set ++# CONFIG_CRC32_SARWATE is not set ++# CONFIG_CRC32_BIT is not set ++CONFIG_CRC64=y ++# CONFIG_CRC4 is not set ++# CONFIG_CRC7 is not set ++CONFIG_LIBCRC32C=y ++# CONFIG_CRC8 is not set ++CONFIG_XXHASH=y ++CONFIG_AUDIT_GENERIC=y ++CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y ++CONFIG_AUDIT_COMPAT_GENERIC=y ++# CONFIG_RANDOM32_SELFTEST is not set ++CONFIG_ZLIB_INFLATE=y ++CONFIG_ZLIB_DEFLATE=y ++CONFIG_LZO_COMPRESS=y ++CONFIG_LZO_DECOMPRESS=y ++CONFIG_LZ4_DECOMPRESS=y ++CONFIG_ZSTD_COMMON=y ++CONFIG_ZSTD_COMPRESS=y ++CONFIG_ZSTD_DECOMPRESS=y ++CONFIG_XZ_DEC=y ++CONFIG_XZ_DEC_X86=y ++CONFIG_XZ_DEC_POWERPC=y ++CONFIG_XZ_DEC_ARM=y ++CONFIG_XZ_DEC_ARMTHUMB=y ++CONFIG_XZ_DEC_ARM64=y ++CONFIG_XZ_DEC_SPARC=y ++CONFIG_XZ_DEC_RISCV=y ++# CONFIG_XZ_DEC_MICROLZMA is not set ++CONFIG_XZ_DEC_BCJ=y ++# CONFIG_XZ_DEC_TEST is not set ++CONFIG_DECOMPRESS_GZIP=y ++CONFIG_DECOMPRESS_BZIP2=y ++CONFIG_DECOMPRESS_LZMA=y ++CONFIG_DECOMPRESS_XZ=y ++CONFIG_DECOMPRESS_LZO=y ++CONFIG_DECOMPRESS_LZ4=y ++CONFIG_DECOMPRESS_ZSTD=y ++CONFIG_GENERIC_ALLOCATOR=y ++CONFIG_REED_SOLOMON=y ++CONFIG_REED_SOLOMON_ENC8=y ++CONFIG_REED_SOLOMON_DEC8=y ++CONFIG_INTERVAL_TREE=y ++CONFIG_ASSOCIATIVE_ARRAY=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_IOPORT=y ++CONFIG_HAS_IOPORT_MAP=y ++CONFIG_HAS_DMA=y ++CONFIG_DMA_OPS_HELPERS=y ++CONFIG_NEED_SG_DMA_FLAGS=y ++CONFIG_NEED_SG_DMA_LENGTH=y ++CONFIG_NEED_DMA_MAP_STATE=y ++CONFIG_ARCH_DMA_ADDR_T_64BIT=y ++CONFIG_DMA_DECLARE_COHERENT=y ++CONFIG_ARCH_HAS_SETUP_DMA_OPS=y ++CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE=y ++CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU=y ++CONFIG_ARCH_HAS_DMA_PREP_COHERENT=y ++CONFIG_SWIOTLB=y ++# CONFIG_SWIOTLB_DYNAMIC is not set ++CONFIG_DMA_NEED_SYNC=y ++# CONFIG_DMA_RESTRICTED_POOL is not set ++CONFIG_DMA_NONCOHERENT_MMAP=y ++CONFIG_DMA_COHERENT_POOL=y ++CONFIG_DMA_DIRECT_REMAP=y ++CONFIG_DMA_CMA=y ++# CONFIG_DMA_NUMA_CMA is not set ++ ++# ++# Default contiguous memory area size: ++# ++CONFIG_CMA_SIZE_MBYTES=5 ++CONFIG_CMA_SIZE_SEL_MBYTES=y ++# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set ++# CONFIG_CMA_SIZE_SEL_MIN is not set ++# CONFIG_CMA_SIZE_SEL_MAX is not set ++CONFIG_CMA_ALIGNMENT=8 ++# CONFIG_DMA_API_DEBUG is not set ++# CONFIG_DMA_MAP_BENCHMARK is not set ++CONFIG_SGL_ALLOC=y ++CONFIG_CPU_RMAP=y ++CONFIG_DQL=y ++CONFIG_GLOB=y ++# CONFIG_GLOB_SELFTEST is not set ++CONFIG_NLATTR=y ++CONFIG_CLZ_TAB=y ++# CONFIG_IRQ_POLL is not set ++CONFIG_MPILIB=y ++CONFIG_DIMLIB=y ++CONFIG_LIBFDT=y ++CONFIG_OID_REGISTRY=y ++CONFIG_UCS2_STRING=y ++CONFIG_HAVE_GENERIC_VDSO=y ++CONFIG_GENERIC_GETTIMEOFDAY=y ++CONFIG_GENERIC_VDSO_TIME_NS=y ++CONFIG_VDSO_GETRANDOM=y ++CONFIG_FONT_SUPPORT=y ++# CONFIG_FONTS is not set ++CONFIG_FONT_8x8=y ++CONFIG_FONT_8x16=y ++CONFIG_SG_POOL=y ++CONFIG_ARCH_STACKWALK=y ++CONFIG_STACKDEPOT=y ++CONFIG_STACKDEPOT_MAX_FRAMES=64 ++CONFIG_SBITMAP=y ++# CONFIG_LWQ_TEST is not set ++# end of Library routines ++ ++CONFIG_GENERIC_IOREMAP=y ++CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y ++ ++# ++# Kernel hacking ++# ++ ++# ++# printk and dmesg options ++# ++CONFIG_PRINTK_TIME=y ++# CONFIG_PRINTK_CALLER is not set ++# CONFIG_STACKTRACE_BUILD_ID is not set ++CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 ++CONFIG_CONSOLE_LOGLEVEL_QUIET=4 ++CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 ++CONFIG_BOOT_PRINTK_DELAY=y ++# CONFIG_DYNAMIC_DEBUG is not set ++# CONFIG_DYNAMIC_DEBUG_CORE is not set ++CONFIG_SYMBOLIC_ERRNAME=y ++CONFIG_DEBUG_BUGVERBOSE=y ++# end of printk and dmesg options ++ ++CONFIG_DEBUG_KERNEL=y ++CONFIG_DEBUG_MISC=y ++ ++# ++# Compile-time checks and compiler options ++# ++CONFIG_AS_HAS_NON_CONST_ULEB128=y ++CONFIG_DEBUG_INFO_NONE=y ++# CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set ++# CONFIG_DEBUG_INFO_DWARF4 is not set ++# CONFIG_DEBUG_INFO_DWARF5 is not set ++CONFIG_FRAME_WARN=2048 ++# CONFIG_STRIP_ASM_SYMS is not set ++# CONFIG_READABLE_ASM is not set ++# CONFIG_HEADERS_INSTALL is not set ++# CONFIG_DEBUG_SECTION_MISMATCH is not set ++CONFIG_SECTION_MISMATCH_WARN_ONLY=y ++# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set ++CONFIG_ARCH_WANT_FRAME_POINTERS=y ++CONFIG_FRAME_POINTER=y ++# CONFIG_VMLINUX_MAP is not set ++# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set ++# end of Compile-time checks and compiler options ++ ++# ++# Generic Kernel Debugging Instruments ++# ++CONFIG_MAGIC_SYSRQ=y ++CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1f6 ++CONFIG_MAGIC_SYSRQ_SERIAL=y ++CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" ++CONFIG_DEBUG_FS=y ++CONFIG_DEBUG_FS_ALLOW_ALL=y ++# CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set ++# CONFIG_DEBUG_FS_ALLOW_NONE is not set ++CONFIG_HAVE_ARCH_KGDB=y ++CONFIG_KGDB=y ++CONFIG_KGDB_HONOUR_BLOCKLIST=y ++CONFIG_KGDB_SERIAL_CONSOLE=y ++# CONFIG_KGDB_TESTS is not set ++CONFIG_KGDB_KDB=y ++CONFIG_KDB_DEFAULT_ENABLE=0x1 ++CONFIG_KDB_KEYBOARD=y ++CONFIG_KDB_CONTINUE_CATASTROPHIC=0 ++CONFIG_ARCH_HAS_UBSAN=y ++# CONFIG_UBSAN is not set ++CONFIG_HAVE_ARCH_KCSAN=y ++CONFIG_HAVE_KCSAN_COMPILER=y ++# CONFIG_KCSAN is not set ++# end of Generic Kernel Debugging Instruments ++ ++# ++# Networking Debugging ++# ++# CONFIG_NET_DEV_REFCNT_TRACKER is not set ++# CONFIG_NET_NS_REFCNT_TRACKER is not set ++# CONFIG_DEBUG_NET is not set ++# end of Networking Debugging ++ ++# ++# Memory Debugging ++# ++# CONFIG_PAGE_EXTENSION is not set ++# CONFIG_DEBUG_PAGEALLOC is not set ++CONFIG_SLUB_DEBUG=y ++# CONFIG_SLUB_DEBUG_ON is not set ++# CONFIG_PAGE_OWNER is not set ++# CONFIG_PAGE_POISONING is not set ++# CONFIG_DEBUG_PAGE_REF is not set ++# CONFIG_DEBUG_RODATA_TEST is not set ++CONFIG_ARCH_HAS_DEBUG_WX=y ++# CONFIG_DEBUG_WX is not set ++CONFIG_GENERIC_PTDUMP=y ++# CONFIG_PTDUMP_DEBUGFS is not set ++CONFIG_HAVE_DEBUG_KMEMLEAK=y ++# CONFIG_DEBUG_KMEMLEAK is not set ++# CONFIG_PER_VMA_LOCK_STATS is not set ++# CONFIG_DEBUG_OBJECTS is not set ++# CONFIG_SHRINKER_DEBUG is not set ++# CONFIG_DEBUG_STACK_USAGE is not set ++# CONFIG_SCHED_STACK_END_CHECK is not set ++CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y ++# CONFIG_DEBUG_VM is not set ++# CONFIG_DEBUG_VM_PGTABLE is not set ++CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y ++# CONFIG_DEBUG_VIRTUAL is not set ++CONFIG_DEBUG_MEMORY_INIT=y ++# CONFIG_DEBUG_PER_CPU_MAPS is not set ++# CONFIG_MEM_ALLOC_PROFILING is not set ++CONFIG_HAVE_ARCH_KASAN=y ++CONFIG_HAVE_ARCH_KASAN_SW_TAGS=y ++CONFIG_HAVE_ARCH_KASAN_HW_TAGS=y ++CONFIG_HAVE_ARCH_KASAN_VMALLOC=y ++CONFIG_CC_HAS_KASAN_GENERIC=y ++CONFIG_CC_HAS_KASAN_SW_TAGS=y ++CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y ++# CONFIG_KASAN is not set ++CONFIG_HAVE_ARCH_KFENCE=y ++# CONFIG_KFENCE is not set ++# end of Memory Debugging ++ ++# CONFIG_DEBUG_SHIRQ is not set ++ ++# ++# Debug Oops, Lockups and Hangs ++# ++# CONFIG_PANIC_ON_OOPS is not set ++CONFIG_PANIC_ON_OOPS_VALUE=0 ++CONFIG_PANIC_TIMEOUT=0 ++# CONFIG_SOFTLOCKUP_DETECTOR is not set ++CONFIG_HAVE_HARDLOCKUP_DETECTOR_BUDDY=y ++# CONFIG_HARDLOCKUP_DETECTOR is not set ++CONFIG_DETECT_HUNG_TASK=y ++CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 ++# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set ++# CONFIG_WQ_WATCHDOG is not set ++# CONFIG_WQ_CPU_INTENSIVE_REPORT is not set ++# CONFIG_TEST_LOCKUP is not set ++# end of Debug Oops, Lockups and Hangs ++ ++# ++# Scheduler Debugging ++# ++CONFIG_SCHED_DEBUG=y ++CONFIG_SCHED_INFO=y ++CONFIG_SCHEDSTATS=y ++# end of Scheduler Debugging ++ ++# CONFIG_DEBUG_PREEMPT is not set ++ ++# ++# Lock Debugging (spinlocks, mutexes, etc...) ++# ++CONFIG_LOCK_DEBUGGING_SUPPORT=y ++# CONFIG_PROVE_LOCKING is not set ++# CONFIG_LOCK_STAT is not set ++# CONFIG_DEBUG_RT_MUTEXES is not set ++# CONFIG_DEBUG_SPINLOCK is not set ++# CONFIG_DEBUG_MUTEXES is not set ++# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set ++# CONFIG_DEBUG_RWSEMS is not set ++# CONFIG_DEBUG_LOCK_ALLOC is not set ++# CONFIG_DEBUG_ATOMIC_SLEEP is not set ++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set ++# CONFIG_LOCK_TORTURE_TEST is not set ++# CONFIG_WW_MUTEX_SELFTEST is not set ++# CONFIG_SCF_TORTURE_TEST is not set ++# CONFIG_CSD_LOCK_WAIT_DEBUG is not set ++# end of Lock Debugging (spinlocks, mutexes, etc...) ++ ++# CONFIG_DEBUG_IRQFLAGS is not set ++CONFIG_STACKTRACE=y ++# CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set ++# CONFIG_DEBUG_KOBJECT is not set ++ ++# ++# Debug kernel data structures ++# ++# CONFIG_DEBUG_LIST is not set ++# CONFIG_DEBUG_PLIST is not set ++# CONFIG_DEBUG_SG is not set ++# CONFIG_DEBUG_NOTIFIERS is not set ++# CONFIG_DEBUG_MAPLE_TREE is not set ++# end of Debug kernel data structures ++ ++# ++# RCU Debugging ++# ++# CONFIG_RCU_SCALE_TEST is not set ++# CONFIG_RCU_TORTURE_TEST is not set ++# CONFIG_RCU_REF_SCALE_TEST is not set ++CONFIG_RCU_CPU_STALL_TIMEOUT=21 ++CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 ++# CONFIG_RCU_CPU_STALL_CPUTIME is not set ++CONFIG_RCU_TRACE=y ++# CONFIG_RCU_EQS_DEBUG is not set ++# end of RCU Debugging ++ ++# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set ++# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set ++CONFIG_LATENCYTOP=y ++# CONFIG_DEBUG_CGROUP_REF is not set ++CONFIG_USER_STACKTRACE_SUPPORT=y ++CONFIG_NOP_TRACER=y ++CONFIG_HAVE_FUNCTION_TRACER=y ++CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y ++CONFIG_HAVE_FUNCTION_GRAPH_RETVAL=y ++CONFIG_HAVE_DYNAMIC_FTRACE=y ++CONFIG_HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y ++CONFIG_HAVE_DYNAMIC_FTRACE_WITH_CALL_OPS=y ++CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y ++CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y ++CONFIG_HAVE_SYSCALL_TRACEPOINTS=y ++CONFIG_HAVE_C_RECORDMCOUNT=y ++CONFIG_TRACER_MAX_TRACE=y ++CONFIG_TRACE_CLOCK=y ++CONFIG_RING_BUFFER=y ++CONFIG_EVENT_TRACING=y ++CONFIG_CONTEXT_SWITCH_TRACER=y ++CONFIG_TRACING=y ++CONFIG_GENERIC_TRACER=y ++CONFIG_TRACING_SUPPORT=y ++CONFIG_FTRACE=y ++# CONFIG_BOOTTIME_TRACING is not set ++CONFIG_FUNCTION_TRACER=y ++CONFIG_FUNCTION_GRAPH_TRACER=y ++# CONFIG_FUNCTION_GRAPH_RETVAL is not set ++CONFIG_DYNAMIC_FTRACE=y ++CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y ++CONFIG_DYNAMIC_FTRACE_WITH_CALL_OPS=y ++CONFIG_DYNAMIC_FTRACE_WITH_ARGS=y ++CONFIG_FUNCTION_PROFILER=y ++CONFIG_STACK_TRACER=y ++# CONFIG_IRQSOFF_TRACER is not set ++# CONFIG_PREEMPT_TRACER is not set ++CONFIG_SCHED_TRACER=y ++# CONFIG_HWLAT_TRACER is not set ++# CONFIG_OSNOISE_TRACER is not set ++# CONFIG_TIMERLAT_TRACER is not set ++CONFIG_FTRACE_SYSCALLS=y ++CONFIG_TRACER_SNAPSHOT=y ++# CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP is not set ++CONFIG_BRANCH_PROFILE_NONE=y ++# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set ++# CONFIG_PROFILE_ALL_BRANCHES is not set ++CONFIG_BLK_DEV_IO_TRACE=y ++CONFIG_KPROBE_EVENTS=y ++# CONFIG_KPROBE_EVENTS_ON_NOTRACE is not set ++# CONFIG_UPROBE_EVENTS is not set ++CONFIG_BPF_EVENTS=y ++CONFIG_DYNAMIC_EVENTS=y ++CONFIG_PROBE_EVENTS=y ++CONFIG_FTRACE_MCOUNT_RECORD=y ++CONFIG_FTRACE_MCOUNT_USE_PATCHABLE_FUNCTION_ENTRY=y ++# CONFIG_SYNTH_EVENTS is not set ++# CONFIG_USER_EVENTS is not set ++# CONFIG_HIST_TRIGGERS is not set ++# CONFIG_TRACE_EVENT_INJECT is not set ++# CONFIG_TRACEPOINT_BENCHMARK is not set ++# CONFIG_RING_BUFFER_BENCHMARK is not set ++# CONFIG_TRACE_EVAL_MAP_FILE is not set ++# CONFIG_FTRACE_RECORD_RECURSION is not set ++# CONFIG_FTRACE_VALIDATE_RCU_IS_WATCHING is not set ++# CONFIG_FTRACE_STARTUP_TEST is not set ++# CONFIG_RING_BUFFER_STARTUP_TEST is not set ++# CONFIG_RING_BUFFER_VALIDATE_TIME_DELTAS is not set ++# CONFIG_PREEMPTIRQ_DELAY_TEST is not set ++# CONFIG_KPROBE_EVENT_GEN_TEST is not set ++# CONFIG_RV is not set ++# CONFIG_SAMPLES is not set ++CONFIG_HAVE_SAMPLE_FTRACE_DIRECT=y ++CONFIG_HAVE_SAMPLE_FTRACE_DIRECT_MULTI=y ++# CONFIG_STRICT_DEVMEM is not set ++ ++# ++# arm64 Debugging ++# ++# CONFIG_PID_IN_CONTEXTIDR is not set ++# CONFIG_ARM64_RELOC_TEST is not set ++# CONFIG_CORESIGHT is not set ++# end of arm64 Debugging ++ ++# ++# Kernel Testing and Coverage ++# ++# CONFIG_KUNIT is not set ++# CONFIG_NOTIFIER_ERROR_INJECTION is not set ++# CONFIG_FUNCTION_ERROR_INJECTION is not set ++# CONFIG_FAULT_INJECTION is not set ++CONFIG_ARCH_HAS_KCOV=y ++CONFIG_CC_HAS_SANCOV_TRACE_PC=y ++# CONFIG_KCOV is not set ++CONFIG_RUNTIME_TESTING_MENU=y ++# CONFIG_TEST_DHRY is not set ++# CONFIG_LKDTM is not set ++# CONFIG_TEST_MIN_HEAP is not set ++# CONFIG_TEST_DIV64 is not set ++# CONFIG_TEST_MULDIV64 is not set ++# CONFIG_BACKTRACE_SELF_TEST is not set ++# CONFIG_TEST_REF_TRACKER is not set ++# CONFIG_RBTREE_TEST is not set ++# CONFIG_REED_SOLOMON_TEST is not set ++# CONFIG_INTERVAL_TREE_TEST is not set ++# CONFIG_PERCPU_TEST is not set ++# CONFIG_ATOMIC64_SELFTEST is not set ++# CONFIG_TEST_HEXDUMP is not set ++# CONFIG_TEST_KSTRTOX is not set ++# CONFIG_TEST_PRINTF is not set ++# CONFIG_TEST_SCANF is not set ++# CONFIG_TEST_BITMAP is not set ++# CONFIG_TEST_UUID is not set ++# CONFIG_TEST_XARRAY is not set ++# CONFIG_TEST_MAPLE_TREE is not set ++# CONFIG_TEST_RHASHTABLE is not set ++# CONFIG_TEST_IDA is not set ++# CONFIG_TEST_LKM is not set ++# CONFIG_TEST_BITOPS is not set ++# CONFIG_TEST_VMALLOC is not set ++# CONFIG_TEST_BPF is not set ++# CONFIG_TEST_BLACKHOLE_DEV is not set ++# CONFIG_FIND_BIT_BENCHMARK is not set ++# CONFIG_TEST_FIRMWARE is not set ++# CONFIG_TEST_SYSCTL is not set ++# CONFIG_TEST_UDELAY is not set ++# CONFIG_TEST_STATIC_KEYS is not set ++# CONFIG_TEST_KMOD is not set ++# CONFIG_TEST_MEMCAT_P is not set ++# CONFIG_TEST_MEMINIT is not set ++# CONFIG_TEST_FREE_PAGES is not set ++# CONFIG_TEST_FPU is not set ++# CONFIG_TEST_OBJPOOL is not set ++CONFIG_ARCH_USE_MEMTEST=y ++# CONFIG_MEMTEST is not set ++# end of Kernel Testing and Coverage ++ ++# ++# Rust hacking ++# ++# end of Rust hacking ++# end of Kernel hacking ++ ++CONFIG_SOO=y ++ ++# ++# SOO Framework and subsystems ++# ++ ++# ++# Smart Object Oriented subsystem ++# ++CONFIG_VDUMMY_BACKEND=y ++CONFIG_VUART_BACKEND=y ++# CONFIG_VLEDS_BACKEND is not set ++CONFIG_VLOGS_BACKEND=y ++CONFIG_VFBDEV_BACKEND=y ++CONFIG_VINPUT_BACKEND=y ++# end of Smart Object Oriented subsystem ++# end of SOO Framework and subsystems diff --git a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0132-bcm2711-rpi-4-b.dts.patch b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0132-bcm2711-rpi-4-b.dts.patch index cfe2b1b..c8f58e9 100644 --- a/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0132-bcm2711-rpi-4-b.dts.patch +++ b/build/meta-linux/recipes-linux/soo/files/0001-linux-6.12-rpi4-r0/0132-bcm2711-rpi-4-b.dts.patch @@ -1,8 +1,8 @@ --- /home/rossierd/soo/micofe/27/build/tmp/work/linux-6.12-rpi4-r0/linux-6.12-rpi4/arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dts 2026-03-23 18:27:32.526573736 +0100 +++ ./arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dts 2026-03-22 19:54:13.857503178 +0100 -@@ -85,3 +85,106 @@ - reg = <0x28>; /* This is due to the control byte (101) + A2, A1, A0 (000) combination (101000 = 0x28) */ - }; +@@ -85,3 +85,98 @@ + reg = <0x28>; /* This is due to the control byte (101) + A2, A1, A0 (000) combination (101000 = 0x28) */ + }; }; + +/ { @@ -92,14 +92,6 @@ + status = "okay"; +}; + -+&fb { -+ status = "disabled"; -+}; -+ -+&firmwarekms { -+ status = "disabled"; -+}; -+ +&dvp { + status = "okay"; +}; diff --git a/linux/usr/src/modules/Makefile b/linux/usr/src/modules/Makefile index 6bef522..b6b5a2a 100644 --- a/linux/usr/src/modules/Makefile +++ b/linux/usr/src/modules/Makefile @@ -4,6 +4,10 @@ ifeq ($(IB_PLATFORM),$(filter $(IB_PLATFORM),rpi4)) obj-m := senseled.o endif +ifeq ($(IB_PLATFORM),$(filter $(IB_PLATFORM),rpi4_64)) +obj-m := modtry.o +endif + ifeq ($(IB_PLATFORM),$(filter $(IB_PLATFORM),virt64)) obj-m := modtry.o endif diff --git a/linux/usr/src/modules/senseled.c b/linux/usr/src/modules/senseled.c index dc37f72..b3cb967 100644 --- a/linux/usr/src/modules/senseled.c +++ b/linux/usr/src/modules/senseled.c @@ -45,11 +45,9 @@ static int senseled_probe(struct platform_device *pdev) { } -static int senseled_remove(struct platform_device *pdev) { +static void senseled_remove(struct platform_device *pdev) { printk("%s: releasing all...\n", __func__); - - return 0; } static const struct of_device_id senseled_of_ids[] = { From 9eed814d695f59baac7f6147a2310ba3cf0cde0e Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Sun, 12 Jul 2026 12:10:57 +0200 Subject: [PATCH 38/52] doc: document target platforms (virt64 runtime-validated, rpi4_64 build-validated) --- doc/source/build.rst | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/doc/source/build.rst b/doc/source/build.rst index 3727aa1..7f491f5 100644 --- a/doc/source/build.rst +++ b/doc/source/build.rst @@ -89,6 +89,50 @@ The agency then performs the two-stage boot: the embedded busybox ramdisk mounts the full rootfs on ``/dev/vda2`` and switches into it, up to the MICOFE login on the serial console. +Target platforms +**************** + +The platform is selected by ``IB_PLATFORM`` in ``build/conf/local.conf``. +When switching platforms, purge the per-recipe work directories and stamps +(``build/tmp/work``, ``build/tmp/stamps``) together with the in-place source +trees (``so3/``, ``avz/``, ``linux/usr/build``) — the fetched/attached trees +are replaced by the new platform's sources and a stale tree silently builds +the wrong target. + +virt64 (QEMU) +============= + +The development and validation platform. The whole stack is runtime-validated +there: agency boot, capsule injection (``s3c-*`` tools and the EMISO REST +API), the per-capsule VLOGS logs and the virtualized framebuffer chain. The +agency real framebuffer requires modern virtio:: + + ./scripts/st.sh "-global virtio-mmio.force-legacy=false -device virtio-gpu-device" + +rpi4_64 (Raspberry Pi 4) +======================== + +Set ``IB_PLATFORM ?= "rpi4_64"`` and build as usual — the full chain compiles +up to the two AVZ boot images (``rpi4_64_avz.itb`` and +``rpi4_64_linux_guest.itb`` under ``linux/images/``): the SO3 capsule, AVZ +(``rpi4_64_avz_soo_defconfig``), the Raspberry Pi kernel with the SOO agency +patch set (including the vfbdev/vinput backends), the ``bcm2711-rpi-4-b.dtb`` +and the buildroot root file system. The AVZ guest ITS load addresses follow +the rpi4 memory map (kernel ``0x10000000``, FDT ``0x15000000``, initrd +``0x15c00000``; AVZ at ``0x00080000``). + +.. note:: + + The rpi4_64 environment is **build-validated only** — it has not been + booted on a board yet. Flashing, the U-Boot/`guest-boot` bring-up and + the framebuffer test on the real scanout are the next step. + +.. note:: + + The user-space test module for rpi4_64 is the generic ``modtry``; the + Sense-HAT ``senseled`` module requires the ``VSENSELED``/``VSENSEJ`` + kernel backends, which have never been enabled in the rpi4 defconfig. + Capsule lifecycle ***************** From 1273cf895dad83d933ab359d416767bd08dbf708 Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Sun, 12 Jul 2026 13:13:58 +0200 Subject: [PATCH 39/52] build: adopt so3 v6.2.1-rc generic fixes (storage guard, attach manifest, header) Pull three upstream improvements micofe had fallen behind on: - fs_arm_common/filesystem.bbclass: hardened IB_STORAGE_DEVICE guard (refuse hard-mode storage init when the device is unset/empty instead of only catching the empty string - a wrong default could overwrite a host disk) - usr.bbclass: clear the do_attach_infrabase manifest on do_clean so a clean tree re-attaches instead of aborting with 'Refusing to re-attach' - core_1.0.bb: restore the dropped EDGEMTech copyright line --- build/meta-filesystem/classes/filesystem.bbclass | 12 +++++++++--- .../classes/fs_arm_common.bbclass | 12 +++++++++--- build/meta-usr/classes/usr.bbclass | 16 +++++++++++++++- build/meta/recipes-core/core/core_1.0.bb | 2 ++ 4 files changed, 35 insertions(+), 7 deletions(-) diff --git a/build/meta-filesystem/classes/filesystem.bbclass b/build/meta-filesystem/classes/filesystem.bbclass index 84495ea..b6c8946 100644 --- a/build/meta-filesystem/classes/filesystem.bbclass +++ b/build/meta-filesystem/classes/filesystem.bbclass @@ -48,9 +48,15 @@ def __do_fs_init_storage(d): if IB_STORAGE_MODE == "remote": return None - if IB_STORAGE_MODE == "hard" and IB_STORAGE_DEVICE == "": - bb.fatal(("No device found; please edit conf/local.conf" - " IB_STORAGE_DEVICE is not set")) + # `not` catches both unset (commented out in local.conf -> None) and empty. + # IB_STORAGE_DEVICE has no default ON PURPOSE: a wrong/default device (e.g. + # /dev/sda) on a mechanical deploy could overwrite a host disk. + if IB_STORAGE_MODE == "hard" and not IB_STORAGE_DEVICE: + bb.fatal("IB_STORAGE_MODE is 'hard' for platform '%s' but IB_STORAGE_DEVICE " + "is not set. Refusing to initialise storage: writing to a wrong or " + "default device (e.g. /dev/sda) could overwrite a host disk. " + "Uncomment and set IB_STORAGE_DEVICE for this platform in " + "conf/local.conf before deploying." % (d.getVar('IB_PLATFORM') or '?')) # Perform the tasks specific to the platform __platform_init_storage(d) diff --git a/build/meta-filesystem/classes/fs_arm_common.bbclass b/build/meta-filesystem/classes/fs_arm_common.bbclass index e20bb85..45e1801 100644 --- a/build/meta-filesystem/classes/fs_arm_common.bbclass +++ b/build/meta-filesystem/classes/fs_arm_common.bbclass @@ -104,9 +104,15 @@ def __do_fs_init_storage(d): if IB_STORAGE_MODE == "remote": return None - if IB_STORAGE_MODE == "hard" and IB_STORAGE_DEVICE == "": - bb.fatal(("No device found; please edit conf/local.conf" - " IB_STORAGE_DEVICE is not set")) + # `not` catches both unset (commented out in local.conf -> None) and empty. + # IB_STORAGE_DEVICE has no default ON PURPOSE: a wrong/default device (e.g. + # /dev/sda) on a mechanical deploy could overwrite a host disk. + if IB_STORAGE_MODE == "hard" and not IB_STORAGE_DEVICE: + bb.fatal("IB_STORAGE_MODE is 'hard' for platform '%s' but IB_STORAGE_DEVICE " + "is not set. Refusing to initialise storage: writing to a wrong or " + "default device (e.g. /dev/sda) could overwrite a host disk. " + "Uncomment and set IB_STORAGE_DEVICE for this platform in " + "conf/local.conf before deploying." % (d.getVar('IB_PLATFORM') or '?')) # Perform the tasks specific to the platform __platform_init_storage(d) diff --git a/build/meta-usr/classes/usr.bbclass b/build/meta-usr/classes/usr.bbclass index c803409..3891743 100644 --- a/build/meta-usr/classes/usr.bbclass +++ b/build/meta-usr/classes/usr.bbclass @@ -128,11 +128,25 @@ addtask do_clean # "No such file or directory: .../temp/fifo.NNNN". Python tasks create the # temp dir themselves and use no fifo, so they are robust here. python do_clean() { - import shutil + import os, shutil target = d.getVar('IB_TARGET') # Remove the applied patches and the (in-tree) user-space build dir. shutil.rmtree(target + '/patches', ignore_errors=True) shutil.rmtree(target + '/build', ignore_errors=True) + + # Clear the do_attach_infrabase manifest (${IB_TARGET}.attach.sha256) so the + # next attach re-attaches from a fresh fetch+patch instead of aborting with + # "Refusing to re-attach". Generic to every usr recipe: the usr build mutates + # IB_TARGET in place (e.g. the :lvgl override fetches lib/lvgl and renames its + # stray CMakeLists.txt to hide them from the recursive CMake glob), and those + # renames/removals make the manifest's `sha256sum -c` fail on the next attach. + # A clean is an explicit reset, and the attach still backs the tree up to + # ${IB_TARGET}.back, so dropping the manifest here is the safe, generic fix — + # the guard stays fully active for builds that were NOT preceded by a clean. + try: + os.remove(target + '.attach.sha256') + except OSError: + pass } diff --git a/build/meta/recipes-core/core/core_1.0.bb b/build/meta/recipes-core/core/core_1.0.bb index fb38f24..0d347b4 100644 --- a/build/meta/recipes-core/core/core_1.0.bb +++ b/build/meta/recipes-core/core/core_1.0.bb @@ -1,3 +1,5 @@ +# Copyright (c) 2025-2026 EDGEMTech SA +# Adapted for MICOFE - Copyright (c) 2026 REDS Institute, HEIG-VD DESCRIPTION = "Core recipe" From 9f0b1bf172a7f533c0a593c3c45ed96778a9df08 Mon Sep 17 00:00:00 2001 From: Daniel Rossier Date: Sun, 12 Jul 2026 13:34:17 +0200 Subject: [PATCH 40/52] rootfs: harmonize the two-stage initrd on the so3 /init model (virt64 + rpi4_64) Rebuild both board initrds from the validated arm64 busybox base with the pivot logic in /init (the so3 initrd_init.sh model), tracked next to the cpio as editable source: - the pivot moves from a custom /sbin/init to /init, with a ~5s poll for the rootfs partition instead of a blind 'sleep 2' (sbin/init returns to a standard busybox applet symlink) - the dead /transient copy is dropped (no references anywhere) - rpi4_64 gets a proper arm64 initrd (was a stale armhf/glibc-2.15 ramdisk) with ROOT_DEV=/dev/mmcblk0p2 Boot-validated on virt64: 'init: switching root to /dev/vda2' then full capsule injection (S3C_state_living). rpi4_64 is build-level only. --- .../linux/files/board/rpi4_64/initrd.cpio | Bin 18390016 -> 6059008 bytes .../linux/files/board/rpi4_64/initrd_init.sh | 46 ++++++++++++++++++ .../linux/files/board/virt64/initrd.cpio | Bin 6058496 -> 6059008 bytes .../linux/files/board/virt64/initrd_init.sh | 46 ++++++++++++++++++ 4 files changed, 92 insertions(+) create mode 100755 build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/initrd_init.sh create mode 100755 build/meta-rootfs/recipes-rootfs/linux/files/board/virt64/initrd_init.sh diff --git a/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/initrd.cpio b/build/meta-rootfs/recipes-rootfs/linux/files/board/rpi4_64/initrd.cpio index 3ae6c8c6401af141bd03aea208ba7e7c0772f05d..4f9654ddc534c852406f4f475c09ff40db3f123a 100644 GIT binary patch literal 6059008 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 z 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

plRS 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ⅇzT%;!k*Q@^{6X0$nQi8)#?={nY=*C6{o|@^Bm( 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%0D$UkwUHhPtdof|zUCs@&N--eT$(HraT z>CHUR`}a0+UZ8LveMC000J@-TSz2rF-5NSG79Mc#5cW1eOXLR- z-wneL``Jfu33H?Wukuc|v4?=krN{?c(<1HjIUD&7c#f%CRZjm)61Rr>#?)O|ZWgU7 zf9DZ&QDTNYxo>P;3_A4aMChw*qh{P;*=i+Izd^YI>N^dL#tidv57&I|swVKt?zd8$ z+*g^u8OS=a4?Rk(_O>+6xuD%h!+i(Bi^F@mfU$f4HZQ-6OMYWRoVV^dcWAWJifo%UDCVI1>YcuK7@tGlWbKQspp0RR#H80f z#rV)KwWoZyWV+NiQ~g<;J$K~}V)+!y&^?oUnLB*$bjE;A76ZPcJ9!TOvw5_U(X(Wm zn}Ym&KmW(({Hv9@4q-3&!%X(ttzoZSE&J=B1q;CEsv9dT?*ay`fp|IeAm^Ms)<2yb zr|?1XB8@GZ_53h2k?|ifm*%+Z8Fz^@xwMw8lt~p>=;wvD_VPD zY%?3+@0)=&!a8M<@t)!g1aJ*|h+6<|2p?YXnZ=FZTpqG{8#2Pli%nl1b=&^Ed zi?uR#2Rz5+1v1SPW#qVmr|H`TtdXRxsns06!p%Y^I^Z*H{m2e};AUYy^-BDTKKBJ+ zo*0}z40w%R4h(vDww?I(7ku|0ojDR)+ROg(O7J@{YE2<}h0R$|`SQf_W0Y(7rN6v} z`4+v&!H(3(`YG}|6~eW9z#-(Rb9PyepB=Ea3iyk7Mr&Y&*N5-Xhd6eNZpMqwhP~+u z>)WtpUZ)H+WE{B1xOdz4tFLemGHz?viIBg9_8tPpl3A3~OY~oIo0UP)7gBOcIsK7r z(#SK_*#i!arEP3PTzfWP=tPCJXTi_)egf_4T@;+R`190c zWAtHJp0^KI^ux;I=lJ-~lQwACI($~AMAkx9gI23g*wYSTPaB2IDx1SWeDRggLBZ7k zR|o&IWH84-r)+s-mE@Vq4V3Q|j;G2Z2ivmg;Dhjo7-+kG56y6!8H?HzUZu*X=Y)1z zIIq1LUms`OKo890*Y@49^(?S_TK2zY+5ap&L$YgQ8%OTLNMdE-dzi0^hEKcX8)%)k zYld=6k>kqQ*+Be@@}>3n58_9jntt-sKtuCcGs~ghTJN>U3GeuF4@<_99Gzes;R&)8 z=1&XDKTKQmD5H0xA&kE{aO6U_890g7`tu|sM5@0}8T}{tPke@TmTPwR!ZQOIR;8xIS zaJJq7enql-OD&z|**7IOvu84~BdJgOLv~#j5kFr^J_YsTm+-$tQs?bpYzcJUBJ|%H zUE?Q=L*uq%N0aQR^&&hB(brDumb@ukL{^VAN`~+6FC)%niF^aX4Pr$0*Up~G{_!L0 z8AGSmz!+i!uo1>Yo4(H+E5B9X@01-uS?GUEIHH_3s?+j~*RLX8g|#{RD$6r2#eQC6 z=fnvPV?5_#6DU*lUb5_@PusHCy=_^44m^VSll)Y4>43V;)n45TXV~(&sq*7YPk@wDYX)&J~7%B05s26e@`zdng4@zeRGq8akLZKXZ>TrHVE?Vdp% zSV7%;9Dmt6#B_y_Bf_#HE52rg=_^mmDBbJJA%9{{ljzKGzWX&YKsM_^GEyV_%+lC` ztK9? zU1s_M7B5t1ZnDn8*!*OjI+K92=sCx>VBe~=f+o&2Z(BtDAJMLImICMMa>+lx?k}t7 zUVW48RDJtgvW^<$_OJ2o*qncZ=O*m{Q$1TtPJ}bB;KAY*19i~%$zi5*ani9rSozZz z?R>#^@6i_KlC^Ne+&Rkqv9BoWThK${uL(su_3q|D1!evCzJPxxXDy2^$3|jf5Dx|R z_=DJA#XPQtEQvu)SWC8F!+q{mlv5nwgRBABZolFS zozeL&e)Olwq5i(;WWDC0_}`ZCX==tR2Kx34fp=_TTCVd>;FykOAAxxi}yq}`P`$tZ$lQX za23m%f3Q{LOD#v4!xyd(CzDvU6hJ!p4!ri&pcB&;6a=eaCypeqr@{AA6C{ zm)Y-g-%uIGWMzNs4=a-I)98cz9ky?WeC|HVt!Mo8XDbf`PFEgi@D(0@5r*~b{cwoUaW)f zzSLq`W|U!T#)dHC5--*mJNgpnEBrM-7DWa;1%1=CY?#NnmhEiOPp&<)37?ba-^q^+ zrrz+G{xWY2d9kbLyV`i(uB+VGbNq*a3vjSD(Zor7QQ+v`T5q0D=v7aC$IdJ|=P-YY zjhld6zJNL^;ZtUEWs?J~dLO-7dWrB)K3>1@*L>Q&db8x|ww>KC61Ql52b{}?&ApFt zN5FN-x+jqPgd1AR&TOYbx~b;a_RHGG_t}2rQ6_%-Eb=){E>(Hy2;F0eVI&^Biu075 z;qXlMQXfNZNcnmkY#lk2l})?RS2bk@{$Sa7)E~9|E6p2cQAY45={w0-nqRg}XGO^G zqV_`Mxn|wld@+C2-1F@n(BL?}Jke#{f1P`^ZQDf_?!XS9`g@aj6o=-e`k^`bCUX%* zH`Von%v)+a4r3t>LcYzq56IK!&1H6M8!{s?9r=csd-2scvV!EefpFW!y>p{Ct|#g} zJY_$FdX(KqsA)9H`=JQ{EGqakIf{uufbJ=R|$ zTY-E)CKBn)2A7yt&2q#oWFndJ2AshpCKU>EoNK5V0eYu~(!iub$O& zLic-dHnhju{fG9s=DJdJyS}B!dk#F3@?4K9b!gYS&OnDjpJ8s6nu1b}8qU)7TApi`!;N6d{Ow9e2#wjfM52V$>ZD-zj@6cDe4W&cPLq!xkO)UU(UVwRg|@HGw|u+ z`{g{3;x|D5Xk#Fy0q{9cTnf&xt|$|p7OJ>%B{o;|?vxKudUq*5@qX#s5&0e96{n!h z;suJSb7aeqE(GnA3`Fb!aT<9+`<$FqA#ig>OY%R*SrULIIOJS%h?6-%tUNx{pyD5W z)F+v7P144=V?8*;9G}9D!~70QXr0sdFto7%yT&izd!kF?jg7oxEw?R$ze&FgqrYpu z7x?n`=mh-!1#gdTt7Chq6eYt$W=vgPcQLf<1*O26lX2{Pxh<{#LO#( zO7@A5Hb8GKW}Wk1d|hLh2yAr@)5J6VC5qqh{LfD8;11=jL~om#?&05)>C9t}-SeS% zo}b-kT7bv?0K6kWoWcfV*T%&)*5?hatC%m}E$z!U0BtBS#!QpXHH7?oLbMgTh45@C za4p8xwcYBrIkCOKEFoC|I6Q#=Btbte`?hIW0sTHk|I~-OxjtvJil@5|0#ns3JG=hh z<$aiXqs*lN*59KZt(ENOukD+|Gs)8qJk;PPiO@IbhRrc2e~J38`FRX~^L*f{?<>JO z3vc+Q{G#Apdn5X%7x#l*Mr)<`LYtFmA~HSr)2BLE$LI3cTVIUj3Gg{zq_Yy-%Es<; zKDH-${wwcfj2 zQY9{qv_qpe$%n+;czHaK_hipzE;>{Ds&beE#adXNPajlg_YUl=%xe|vv)4Tzuh|W* ziT;O$kH7-FEY`dZ+_Mq~XP}|&cPHo0YbO=g;XAkArklP=&uXMD3(L3D-S2~cf;YUt z)4{-(h94n|0JA7Rtpj4(n!NVBy&?_Irg)~aPc*3^mb|~$*(w~P{x)0x)IqM~79V?2 z8h(bKEaGf6=pxp)n!+bwk>bH&+Ixtx2(H4d2U^bNvrerH!r1#HhwQ~))(yN;_$ytY zm~R|lqV-UN9g2D?0tT9hpErf0darxWugE?+>P`8*PoR&rtv7bR)aM;&yyh5QE_lVM zQ~eRm8@Qh-!WuQ$1|#sR8~H}Eqsoop8}&ncBadt71Ts%{>?N-CY%l-JU#IL%YUlUB zN6(+<9v_>fVFUYC!uo8xew^(a`iO^r^zAvW|2KU@Mz?aU`fwC|HY$3~HS~qL@?xHU zFOOKA?ATVGiN1)AW&@v;J=DhRiH89H0DMGrPvehDzLn1pzu-o`rLWCxTe94Z&@q3y zDP9I_Ug7!iBs?GD8d_EyPQnfxfgX7K{RYC;;?7e;-20H#a*?Ma#P2Y#eZ&MT@dI;x zSLyK)8}|?hDc_Rm8w$Vmi=GYtw0i_yQ*(GHZNe8z)ED)6;5>Gc_veL7a2FoTJ{Jqy zJ-`V3>D$+QcGHVodwtK2&E@?Yz^0vlovEq0(|2v$3m>I#2(GUT_~tXbQy-*%zK{h^ zq0bnIt!|>S-=(bH>zu0Xw5fK#B-s!?`FOG(J$sVAXg%sV^!{)Fn+CL_Pq{N+U=Kz& zdv-TauW-;EQ2*C${lqo#uXP`wzY)zBG-*S!e)Z!*+t0k%>(ruCRV z{*ez359b;GfB6sk5an4B{O1m?#TRx$mjy3BYi&C@{}%9`_S)n88+3;dG;}XzBJ|z! zVSIcY=0e}wo(Z~=Dd*Ft)H>{^Kk)(U@RZdNy!ao@X=)u-^Nr>rwHCj^caniL#zS0d zogG8A>E>E8RVpUcuK({{p?#ChU7x$y?)O9B+JEXt*>=BQ7xkuan7sY!SCDmW*Z5n> z`>5?-evDki_I(taw`8nyehu)}G58~?%f=PbFZr;A{||fL*z4!GmJTaCRKF+iuePB@ z%+2|;u?NO%rN%-3_jg@!v73v$pm<2hrOWL&2HA0l26-^ei{Z~!y}?w!zn{Dh)9+{! zri`KQ$F{$U3rY1iJ0`e#@W_sRn``y=LHnN*J4wE5wISS8|35A(dT~!5>+k1^QvGZ` z6&&JXi)t>ol09R{)4x0i_q>?SoEO}qR?f_itxVqg?R`OPS?WE$ImU3ry!R=0N%EQT zo{>v%h)XVCTTj@FhhQxXalf2=7H1Cmw%HV1>Mlr?%dqpf|F7q92YvI_d`@f_WwmaG z@*nYe{4B&;2acAvCA98X16tz^M?E?qo__2H%ITXEyE^&(mHda<5A=kWb6mW_&iMxJ zRlm!>>QG(FCI92cb>Jn6vEd9ADuka`=d^3y-naK~nihlRfUL)|+SRLj{_-E&)Wr#b;$_P2J zPXmvxW!M0L#c9fmZ)x9}@Xy+qpdCOdYE)=8(&Ex9XF{VMiZ zXwywg>AykF-;~ja-7qJ(AhTmjPv&! zAIF>lk5=>271kH~d%ltWX6GPD154z;M3!=p4QD*%>9~x?=JOM7T#1cK@L-P4?Qahu z0~`Z}^6y%hPR($CmF$n?CHaE{OTp029kJ>OY!}#LTI0`M+xL|fR)<%e_=7$ATJk75 z6@Ac}fX@_P!M$ylXKJrOdLTFq54Cwqh4)#^+Xu8Y-STwKj^dmD;JuCCOX@!Z`L$#> zKl7x2>^yZ_ zn|#z;Gy4@+)ka)Z6q>AVX$oBpPa7DWOariefwii!H zT*L>(-Psi>bd}Xj^fv45AowKQT+O8-us!$B6Q;p;iYtVuD9zN z-96FUU)+M+2Y<^yr^ho7_*#_fhH>Y{n$R^O^#3Gf8a@>|s&CbYn!%ybJCN5z3&z+p z+Ova2*hSX@gGboo+)X*)I9g>lgCD8!$ww;x0e1c1y*x(;TB7}{RoS7H;DgFgy0+qXUOS*Z$t02MYs!lvoMBh+*_C1Hpzk+HcfSh!Q2X7qx14XZ z4sQXj3w+~l(DTNstD26XiwN$+zkPNSx@TvDkF#jWInuazA-F#-i2lAw{bS#wjStlR z3gHp*ij6T94)uXw+E*dpkzIS2u=YlJF@iIIcO$uD9AF>7RwDctuD?e19uB8T?#6SK`b%&%lG24~;i= zNpg*Z;TPS@L+$qvmlh!wQ1O4-+l$;?*CBg-T47y9_BPI?8xxEWH~0o{()VLi-@_*q z8>eqYUu@oa`2U0SOExdVbqln%=p|=Koa>^u;KQsD)^QeeD8G#PvEzC2+CF6Y{DE_M zGqINs^DGA&sQ$sJSO@L?tJQV#VrQ3nYgq6ZhkZh8ShTbcpH*14f7Wp(>sY=ljbFBK zd=+;5e}<2SpywJpv6Q3ztFG)FICf;_x%1P;)ji7Cw-R?arEb+}ix<#JKR%9A*enEx z|D>M8KQedXs{|IBGh{!;mlylF z@DSPseNi0elJt!0S8^7@mWniI-!k6y5htoO-UnXEpQ}B7S~nruzXCWrs-N}c7yey( zxtj|f$UpU^M?}|^n}yto$R^Co?(b6;T(SF%Oq4tYY!$~@-+m9Pc@r(wv`{c_(rt% z7%)>EjDdLFOm`-@;^+H;HlAZ%-kM-H`)vRHtN0K{%4g`sa>2u}tL%O9Rn;}1+|U0` zId}|XelFz)Yz|EF{K{5FOZm--p{hWx5G@p5i4WehGTi%X=0*7Mb?PpdT{VULD#264 zua}~ybPe;D#eL>3@q;#B3o+_u$tmCF!hdA!6CbiRwBQBIDKHGq;9fqxf8`&&E2!8o z%ahA9UG$e=Qa94x-sV7op5+ALFPn51gw7_=I4^)s+5Q|K>Jqozthnv5;K!<6Q(X3KbedK7?CFC3Np?-pcj$0klz+uk z$X1}f+cZA=}y(cCWfS~+~LF*YR2iPvp~R%qTo#LwitCl;Oe8b5MgFv|LL zXg|<8#eD(T#<2-l{92UhK7>u<Go zD~5S8)1gc&YY8vJXQk8LN`E#p=L2P~50dc~?_W0Lj$bUdvM2I%5&6OpUB;q>(DO1l+{cPINYprMz6gPG>y z@w?K>z2|YB<4d2y^DbZR4K1&hH07?2RNw8(T|A6(_xkd(8qpKPn>&afj^Jb1wm8sh z_jJJDo?<-`Z&{W&fNySiPL^WoPN1K?1D(5(ylk1!DhGU(zV-!ZiFE1{$Pv@&nzc>6Ejn;AND zz$qw|&w4gEI2?aD`+#Hjq8GnN`?@~gW?Jld+Kf=v&%0dsy}nmpPC<92uc@9lxt8C( z2Yhn4*ZU`d7rxYz1H=ZSiyi4YIoy5k3+9XweQPdu`{yGgre*F-tns;J-=z)9$Ma%^ z=qwta=1Fxg1~%di=!bKC+*eXpVE6@YNc#U(7q}ym<+q&bFJ1r~D*5TVIP#gk>(JR} z+-pswzH#{GY2f>^@5|qlZMJYWay0d=+H`@d{R}I8g_+p!EDe|6!nXPR1)>*r|6~TZ z2VOO2D=y*aeFq*UZ*F99J^Ow_eTC2>_)Ib1><^IZX${Y5msstK+{bu7l(s)cgXgre zK5VWU{2mjm?x9#}+va}SRLmIq#K-7pGWSa={^$_=7#UAAwORhwpZE&1PN1(glH+{_ zF@q056YSX2N4ScqTKZ~nQ$2f?!t`h3>iNC&w@q`lj2r|@k@FN2zL7bV?4?*>$#K1D zCBe@Fql)<>+$+#m=cQfY7Nm{OdLG)G&mOl^{05{m^8j}>XEK= zcI4P|ve7Z>bTXhFGs$NlmSzgu8(H9Qr*GnWP~-=dLg? z^g*+_i7}rK-HNgX;S1HZPPlZwKV+TBK*9keMNuHnDdutyO6bQ^mq zpxJX5q9eT|{>Oa{_qFJ#Gr2eDaaHI+f22LNA$d$N({t$^nHz~)qJ53slhZuEq~t@^ zd+<$o7csn>)MvqeFa499L+fy$yf~A7*3!=g`WXOL#mFo2_l4=}%)imsNzjFXeceHy ze76O91N2LCzgy>ZfuG_9im%bSFvE#G#E-~XG{J8C+P{U*%3rAdIJ3=8&6oDa8Z$JD z^PGcxJjIi!#*;N3E8UiNpQl_nN^iLkInI7a}@g$ zoU&KHD)UfiEDPB(J3L%?@O>?PYduzB4v$@X3q;Z`n3iTbogmRowpgmvILmbbn zUh2^~7wzF{wVe|iPrKn;yz3jlVa|cGvDSL`E_hGeEjUYg@~O#wDVvpDYiqF20GI#M zWc~cD0bmetR+Isc<^cN2E7WyNzFy>+fqqmy6I?^YPdrSVMLo8@e|k_hi%09$RaNjitk;i1TgX+QB-$1-QwdqHEFOYVIw()AC~nsF!t-Z%&5~80?sDaqY$ak#mZ*km6D3v&bvy zLCJ2~TYMNB@EGhEf=4c}c-A)-{xrGNu5oB}BWpJdP3}s{#OTS@Zx9D$>C)!WZVhK* zMd^q5m$=0ZkMORA_!uUm^%QpLu0f_a416ynFPi#p>)Acp{SM_M zW7b^H{!_^h`$xME@GQ=^IVNXV6u$XzR(WYnH8$zdmR}t)r$@Vul+k6nexz&n$D zr%SezH`vxQJIk$k;QA@cQ|0y=_u-sGX&UgAJhh!O5vypg>hUaBc?utX0GRThP@L5) z$Nft3y97FFvpKKJZ#)JGi%frfiqWt~0K0(Xw*;tT@}fmcE3+k&B>zRvxEM5$F_s zCEn^%_tU&@@#T>ZD<`X$J#Y5A+p=BppS$U!#t_#SCVYGh@AE!22Jk9)dlDy9J_IlS zTjL5~^Gfyg|L?d)(Y|!AmMk;+&$O-i)cs;`T78HN7~>$ywsHT6o*{=S7IiLj2~7$P zlo!rUlfe|=o&guzJd0J!KWJN)Hz(7n&p1L`#RopmRkGVd?Q=*_e!j}H-b2vk2$a1@q<<32OFw2$AJ3}}} zjD8_G+7>_$l#{sX$qk*p@zJA!;Un-l`wqXC!i`?qM80{Ex>`!j=y`mfH`}0kAN@#CH7(QjwIUKqK5+*s^~b&p>BXdyAl`$IDaxw4JQj(R2fXn5ZY>DAS; z$7xT^wzPse2V45UIZx$dJ9maRG#x*K`w7l5_oXp^O`K6^R+I)f57~#T@)&DE=go zBvYE@N57o5rLdpz_>esu@GOw#++g=Mz;FN1VA|&}7k_A=PvCHc$sX3tGY^(u?p@Cs z=;mF37#i&bj`;G26`8`iRcYgfbr6dodjPT4qc?&#r^s*kQ~DwwiDvK zZM-jZ>QnAm#;0fG9zSD{fwPc}WQXw&Cq9&Nl4}x!O}qGs>UJgxZ=A(Z#&aI!>Ij;0`cu%osqv6bLU?*8g_t!%wRkz=FXK5wv=y_ez zx0|}3$-Txxo#;e4v18opUvv6HzSs42&=;8MZsFe2c`JI45A|XUt9agpOelTTxe@;# zvTh~)-%gt|%(%s2=Dvd*5zcITMr*M%IdqT8XpD**7F_-e|BybFi7cpbK{u+UGkjV7 z!sn;!$(Ftq#BSj~ewuv`(8ez?_tQ`I?-t#gN?G+c8+o-JIQFcjQh3v%GW@EoG_>a(e z_6Ojp+P9w0w`*s^yQwFQK2`Cq>Z{pq;1&7E@?-hf*Cfj@*6N=DZ|17lj&pL3d%yS* zc;G-gx*0i0GtQF*+-H zdwTnEGr25kqKf@p9D&B$cV^@?z1vPX|Fse2R9hSXXH@?q^hvff!#-vweOsYd-U+IF zLUL2me|Zw$U4oeGDEg6Kc4p$S!PVE|KGPQm_VjnR?JqIh!UyPVr)c_^Ppq!Kf_nqK z>|p)+!nYm3Ho3TJ)E0cUP7M09iGJ=DUgd*Vl1Jl;yT;a)Lo7&muw>2i=Vy9+_!m}J zmk;tR{JSW}EP0Yxd)5j$12bIzb>Z?FV@CPc`J1pAcBx=xA1UANk?Zr=f(OdpSr#l+90_YT(t7@BHlS%YYZy8kbBXn z)cdQrM|Q1)4+Rs_Eb#VjD@Wx9Z)MGB zou=l_i*NGwUKYLN?e9I;m(`y-*O!g-xTO9tI||=gN50IVz=x5v^j~9PWvwEErHhh(A_+EIc@~IO)Jk+_hIhiD~sj`r_74b z`ggGtYtMk*i%x!>?^RwjRP~v0ioN-zm^B zYUj>8`~uh}d6u$o#qYrO4GjpxoBp2N&XXnn-O_=;b)vO7vF|cg?O~J8`v>5nf!}q@ zH@?}+)A5+-D!fKHLu}iTPr55C?&ifre-?nV>VtB#NOsej>i!P$*Tsr;DTqykf6Kod zhaXC(&ZIo`m0<7m#xhrUQxH2sJM!gz&aQ#H*p2+lF13|%dM|t8A1I?X)t>yyYG)Yr z!z;A+arXjXBK|Gk_S?3;oY)oAL!5BFzQJDw4S0U1I2nAMT;DCr#?QG0She_arX>dO zf@i@W?azU3x4i*f1#j2OR-pYe@^`Zrk$KLxd8dA$yiL#!(eyUorb0jbUp_TU7Y5`` zlWk7?!0yGt*7Kcle;;o{wEJV)74CU{PsZ~N=sWw@g{Q?lpABCS4&l?Kz0}z#sdF}- zKi?LzfOx)W=Uuc3?F(wGDSN+c{j&Lo;R#XroZ8+@+v3?4ht}r1k`Kc8W__c`4JaOz z$dKG#@hrTge8qx2MR8|IlsJN0*zX$E{%rme4WVb|trHz!Zz1bm{Nn9R$+g3~HPo4U zr*GciohMV~1%C!ipUuLCf?Zp>qry*6oaT=V8+5G8F+yDLf z)(;_{`8?qnc1Mj>{g0&Z`U7x@=c4C5JJ1bTw}Hp=-Htmw*(Q<1je7jM2Y`>Q*A%$B zplhOUE#%nSHhBD9^lh&2B7sfw8tIP0Z|;{m{?hr(pYGLe2pLJw^MDUyAkT<&Z!bQW zj+MUmO`bEayOD(lliN1Iw^8y;NEh`}Ubv`SZ+2~5T42W~8LV=T=)`&dist-j#=tta zbFP?}`d0%@5#nBI@R^j6-%a*>$x1et8}$13V?DgoJ~1;w`S6Oea>>oc{xf8?P~S|( zW!Eibhudq;3}9SuCBO3z?JawQU`ptqwei2f7!%|&c+0ba?KfW>VdVhyBFyr0mDXX-o8__e_4-ZD)p*Rnixge-1cB*#ENU^vF`pk)5~R zG0^eM&IHv&iHt?&h4_`w59(xAn~$ z;|gyD+vjOpWjknZ0cEr=-qLcu5xvy-dgv$qR*#mq6heD*V)C^-#`h`sHh#&pMA%c? zh+e6_MZRNNqR0D7y?Ewi{>gLsZalxKXp!LH+2ZZ_Kh@s^mcpSZ@K1o_;$sQf$yTJh zOX-KoUyL7AbYT}d+zev0wzK9H+cg83J;FE)c7Q0~t^@84{tM=#*sv$AhB|9RKg^yi z$Ly)ryf(AmWw(MhSbD1ZSJICBO%_&f+wlgEphN7cqF!i?^e*YovS$m=|Fe!5Ag#@o ziJblG?Q{GCw)Ee>NIWTPxN6*3H$g0D96I4AZ>`0Tm)M&EEzo-R(`I5ib_DGgRPKNx zp0oZ3VOL5IY44-fFL(;iPh{KuBo#B(I@YdDPFr+)2X^_? zoCdH-81?baa(6lOB7qG#k)$W`-~4~cDx&}DkMQwU_!+Ww(8>)-n*So>w|s^A#8I1k2N&Uqg2m@VkHBSJ&jBaveHXgl zrL1piq&l!pYc4x>v(_kc6c=tx8s!dR&f>&yitc4FSE;h1b&pbShQ>#v={;@R+69t$~*=1P?s@S9^fS>DB%(%v}+26=CdVwlA+==q8vW^auPVrVZY1&-akL zW3VyYL|;-e%E>kK1zErxnO}Y`MszaysV~}qZkHSTG;1b=9;fS>z^QwNY$w2F@+X)x z=Y|>3hrmnQ3LmFV_1nCd>!jnu&BFSytpTA2xl#@M@@Kh?~t)hMu&9T zU@h&+&vH@5-ojt3^^L`sP1(UVK3V=E&AnuJ`R_CjM(ZRQ>#f{#%kWPL79D%f$Am7D z?Z^6Q$SLO0BH3Yg%T5cOt*By+RyBKZSU-Ij8i!uK6h0p3n~0Ay2`ya?#Qdil4y53l z;;HZKB|i!EbSuVZFm10W%(DA-!_E@f1p=cYh1&Pm1FR~q@?isJ-P?I2=6;m!)*sjm9^+5FVC;H!07%(o7Do#3N74#{4oc9Ztr5$3q<}2G;S+|5F{uK32!}zpBH= z=l>7$T7!>PbFx19ZE9Zsci+bCw`)H3t;Z`B|9wu^UZq%W6Dwt{zOw~+p0ifhAP*h@tliu5&P<~$#hTD{v3D# zy!Z%y|8CYyK=caV!Hjj-hiR+G@14)>+z>8zV1hGgqxRka{ZriF7}1he6Aic<>F06w zm&DrJnE~+w|CI=f+74$D8 znc>J#H*ZDF9f1EoJ8iQ^2CbOcZH-FJ``5{})xJj-*ZQ@pJAwl_6i$>Bf0M<&%LXKejw_?CnENAqT~Hm*73uPu$5HticH5Kfr%cKJq0#jVk0S z#qjv>*;j=}yUT7dQx>c?JC_q%5P`lHz30g(#4@y30w2Lt@Js1ReXC{?8}V~%U%2H0 zVmDMzG}kSm9r4+`)U!yodo#~OA4`z+>^!dX=F#%4-%PUe_%v`!&Et0BoBnzpUj}Xi z=kfl(H;*B29y_iNmqVkxd3j;f@QI$+Zj~M1Y}3=RLhxdP5H~vSgOC*jgLS+Uf=P zsq|eK8T*NioTQJq{n6fM3JP0?6Yh-^AB(XJ}6kdTIZk@wL{c?UDYs9sIO-Ilx|$pzqtC zxwg+2F*nU8pTf(ON&L!GD3?J7Gy@x!l|hP%p%LJ~0`Q`ib+lmJgr*Sd$j;-XmsnlO zUhfXtyawL<23^JV+v~T3uJ&}<>mxxMXJxO`FL4!5X|D?|v2jekdk4=UukGlb-SMP%J!W-2T9zL-AVFC7@xbtyw)I}Iry&>FJ-uYe?4|h zVx+>zrc3ePXf1S$Rxc!;>8hfvz^qYOiht8sknPF6A-l)kCm(G5D_Kdo7Lsj-iI-ta zyAL*^3(IZ-oD@T&{WHkdhj};G_6J)A*R3WLaIZw?@zd8ZebDy{7nzm@#cuJfA)abK zbtRD3;-cZ?i5X4#4$))w?$|N2r%*DRAwO6DnylBPQ-I4h|ALimvEN0gH^Mk=n{zo^ zh&sNv8s5a(x*hyXKm&;}^Wvh2U#XFAf*3Mn*}q)CHD^g2#u&u;3}&BV`M=LkbZ7$o zmae4we@A`5(&}Ro#$t5`V%q4FtN!65I~)LxcdsW$AF;>sm#^Wwm(W{Y;GOEOp$*FY zV)j@h=Q*V>2wzUJ$3-}k zim8wf;3N8_JZnzcqOuxaWkm{OiNfdkH%IX1`hxv9)@`~s({2Dt^`O962d(!;~6%{`JAME`X5#~;xp zc5^-qc#K>!Hnsp8X2@_}Ei^Q8|EdGpALd7{lU|v&E`&WcHx}l-Xsj`XO%CUg1kkm8 z>7n+Cf4;;Lc$G+0EojU7) zxo8d~E@B^qVq%!P`awI-PB(p-w3Q$)zex;p|4{35e-F;$SMEz(z*&Ve*-tT1=O*y1 z(5Xla#{We!GdtdI|-#FRz+53=pf7@jDEO8CsD*d_ce1C56 z`g6qf_CP;O-ZESN!pZJY%0J8=aC?8}WcN?pC&;lF#V+zN=XKcUwDX=Vx8htohqymM zeC)X~vj;_Et`+?!MkUVPkv#TY-t07&8unfq{5^ZINim;o-8;aOkJv*5T|0g&Hhye9 zy_(Z6&uWimWR!05<&!%#|L`5i{kHuFr?3ZpF$u<1Mgg;3w?S}&TTdndacwAqNh9j9*AiS3i<($DyYaeMuuzt0V< zgTDPHRmYLZ?h?NDL-!14ktj~e_GR`3u6)G8FVP&@mk+MlFi&fNzh7%I5n!#Dz7A+D zyzno1X5*G++(YN_&*j8s^DqAAA7^&oPy6zbm87pL6^#Mci~Sk#LbEn+Y@BOb_mL^^ zki1|W{aMDk)|^B}L`s(tqYxo4>O63KUj0y){Uyz-CSKx7C+wOK!6uX!yaoOz{ZZeH z+c4VY9IVnX-zDG+(96UBG1|<{Wh@f`aM4xl)Ae$&RGZ;lg?abpjl~v{|3X#i;SSbd z$B0{qXB9yxRA>|R+C8*OBG@c*EHAfvZx^EHE`-0!_b1&zdJo?f zJIIkUkRvn5;pVR^Dc2dO5n?vN_zwE9r(B9orT&U<9%K)6BCP~^ODqXx>2i~B=QM4f zpk2{fHig%RZm9WKyoTgj3-97f+?%0E>^V)z zpv~s_psV*EQimw@2ZNIhTp?cKdv|7|`~-IW>N(sjSt8crM9wAVLu-`%t;Ts%lWswgLZD7uxPz81dM zJK6YB{8Mcwj(BtO6#13!1D_d@!YAlGvbYyQRG+}*nk*)OtRdvnra2iaHjD&;hW zZt7JIkae8jq5jym@iFh^8_}&)yNZ`kJ*v-sm#pXczpCdt_6h!VJ(}lKJ(3s0#IGHj zQ;A)-3Sa9?c-|~{-Zk(%WFUM+l6CyRN50Cq)-AqetDCy|` zJwNmJzH*+=>0A(ap53e9htHj(4O1_5{~7$3eS8FYI!-a}e3O5JJqyH>^?Rcp|FiiS z@Wa@c2=R>Y%B8&@VSfy>#(Md#jaUeDlGd)(IzI@Rg?#6RF?=6?QyKq~RsV#qDZH|{ zS8L2*2mc{$pCCRHW6o~TB*DIfShYvBUb(JfotS<1l=rg-vn^{|VHmoja*G;-gSkP@ z+qOQ#`@Za*-xVd7!*Ogw(peLN+wn~IwPanFQCIjIq24>_kMu2#LGhH@C#$g}_^yt6 zfOi{f{U$wIK-q?5e;YW{<|N~lT+EtZ@=4Zwst)N#mE>%zfa$yjB_o|BZ?{Gx$Lad z`A)Hn@(HO9mGyG25Wh!Xq{D>pr*y-2Q+71yZn5+ZL;L2&tK9d|VKm>Vd~{y^I{6Ai zAIsa~qYP`mQ!(*jCQ(Nq+g7G ze-5@i`I@$&^F*~rjP(`&tN!h!e_B%mZP?zPZG#SzZsQxtO%b&6+Dn((J-J@&qc7M? z4o;ncaV568!bSI#7cHtNKfv6|Csb)|`q{CMfT@j}BM+E(g8IcgZ!z?($e>qpCTG#3 z&XRS~<;aKn81hOH{)7bgvYQr>8`bF9IP9jxE3I5yQT{Q#!{+MubPnZN2&o=&N6TKS zwepZ+uw|2*&ABGEj{6jPQwSI+H+&DVl3nbPDdDI6_kz_ha6xolad3vZu2UZ##~urx zEqdNr;=tcj@A6c=&C~2zE=8}?HvXfcgtJ8SsS%rk>N^EIq!$p+gI$#ThTQ*(`@6wQ z$<5Lqk=3#N=HvVE%DhjRU+`RhE3HY}e?NO9>A%`u#TXLo<1J-PK1@BT_dofjowBKR ze$9Ow_XFEe{c1<$U*rA1@?Psk_#zzF`mwk*z{ixrOMP<@xETRAHHVr%%36FHSmugk znUqaJG~3G+fM2!NxO47@gLd)d`s{vOB z>a(ew;oHG8$tso1mskFLENCh|-^+EKj4Map3_)M*I>ZOx%{sC^c&;0{rY{xXNl6>@ z;wO~dDw#>+R-B~PUmSd-Tu8Fy{!85>=#nA&CR(%w9BM;mF616vx4Ggwm%1OJw;e-w zJqa(1%bqyO6c@D+uSp$6cREYhLpL{mzhbgY&Iw>Gxg-uhNbp@8yT8hIQ1-{jl-hG= zu!-uObjzZ3;3c?P15FDk_XGV4(|6Ij6M9em#gy+BY_Lxi#Tl=z8RI#BY%=#Q=bv*< z7xqtR_BiEihGrZ5ZI945@ejogXq|a^LFhj@#Gc?;F=O>hPDeJjF!|yq-P6$S2y``$ z{e3R))nE19!u&~miS$|HkY26)IeH&v4EpB#$TsRfadbg_qj*F6onqbjj&I#=%G)`k zuBhx5lv7iubr*BpMzm;VTt1sGb3Eh$JVD!L#Md()sd;HZm z^-KD3w{PsU8LiF|G``g;XrvBky+01x}YyOM$o8hzynOQrGkPIyzr>obW0Spw zz0f^r%Cl4uTqRjkJT1BI=V@N3r-*TVk-p4gZLCe^y!{y7f-CVqK{MCjJ176LaB1*) z9DYr(y^-%FYaLtl^iKFpYv8ttZZR?k{Nb)Bb7$1K^W|WV2HtL{2|Z}>~p5A23StVW{s?eeK^$j4ZaiKH?%p;jwLs?nSaIE zm}H#I9~U6!QdYF$DEgX}r;u;Nd+az5X`D&99b4%x#>!rzeQ>+ds+KQQEzoHXY_fdtqqL();c3AKhy{ z!R?ALHc$B;)W=oW*`oB{Z(~!E`}_vjY=LP|^`7{;7sJ-_*rr0sjdM&v*%;s>*ocm& z{1y}FQ`Oo}xpu586nA?*#;^~+@kYiA3>9N|ZcIxVQ5Xa<@-fCJ16~)65x=GuWgnsQhk>!Tkp%ep$nTB`)`)yrsZMZGVOlo zLjy5`5%8jceSHb&!E@lXWThy4yA0ZwK+ekug)RSxAOmY3S%hy@#?&qA{Zz8d(7#b; z*Q?W;R4z;aYPo9pPE#qr=L+d9e)UAu9xvXLM_nz<=|;xH+=KHu!~DFfgw84s zvIJae``u-3zb|xDZP%ka6$HZL4};gE{ENpYzPYV1&i4n=p_F%4cJsO7LByOD!-IAp z_owDpdoJED(z!dc$O+@g(&D4U-=Ry@jyIF8D-z$g_5Rq)F)CfGg*s#}3DdsLNYXm) z+2wfnZKk@3f5E1mTF=RSovD2Y&!daUj>g=QGvy!J9qRBiCNpWO`#$^-yMHk8FP?m< zcTv%;@TKlS-eG46N*7P9_b`5!-?A3o_KnZl4g7QPH(iM=BHF6F<%fKmu{B&xL^}YN>wj0TTg26;^OLl*)efWA%d&qt+e#U(> z^E^Nn4i*6)jiJaC)Gb0EIn8{W|F$q_WjVfE&39eUIL6tjdL9ry((mW#m+l9t9@^GE zK*@WC|J2+K%mV4Y)^uF(^q4!?4g9a>-DwvDTUoxIb;zJLn4GqrvO3j{G zvSBiYi}?||SN#p+8}^PFQui`CCj5U%<*03iwZ^%DdjHarwWe?{xOB4Zu6zpH9oecFko_S2=6U!`V+iK^tZ&B zU78;MW~X9oClQ-_s3CDwI2dLwpoJw3znoBh!i32gm5t2-8qf3Ey@96qVBQ&1kvsIZ zGQm#xG%y$Y1Yq|JI8n=Z76G$E*!612XUX}yLG`c5aq89(zo49!m5lulT>psjUs_yS zzL0NfdHw`2dIEXx1z;3S!stuMI(|s(U>&jJDx*4VInE;dcl2!O&qarj+ku^9#!d^Y zb-bLH3)!~~4ybO)!i|&STekNPDGf8mD%zKAC_Q3s+J=345#@m4=rCjCoh!Stk9zF+ zy40ihhO&}JQ{|A)g0&vMEsvh4?%U2-Th^kD~b<{ap-^$lcAEiILu4BmYSI6Rl@ z>``WP{j&Sliw<1GGsAty;`%-GA|aD zy~+G7?1OdaV-dKXJF2k|dq50-chFCpyG9WIfNeqc8a)f~Oz#VM)-b^=kx%P)eoY)ASost{_oKxTb z6dEWSq(_tUV%Goz@o>RIX98DppI}eB>P}#1ZKQtHc`R+)Jn>ImPiMXia)}8n8XwVo z`@`dpWpA4&pOmfx_%IxJ?t}ua3l@!^%(D(~PJHxT%3sI5;N6W)vq0a@+&1qOzSZ-} z)H8B!|DWVD&8f<(Z2c`8=5_E~c4>PKJY#=_J|83(fY$B#=h*b&lRwuxctt(5jk)>D zt9)zw&tB_ed{b|-Z;-u4Fnk8sreN_j*Q4m~E1c1JY|gfMk5eY{=Tl{pBP)Tk=5;Z! z)Lbm%o%RbRppgf6aHckWdp8Z=-;2smm=?3R4K7y#H_=}!Yp%bX80r#Yc{yJiS#986 z!hUku{SuuaO8%7|)lQuzisbTZWa2uU}NAXaq*n=NawGyf$V^HNRP#K?4m#S0psdh$$6^$u-Y?xIo~BF z`rM`Lojm@_;-)X4t44^c@_fjiyx*buhYsi)m9178_F{jOSd%r*v{qk89Wz?J^Ji-) zn+?q)?q{@g_g{)1GcUI9$EUjT|7&iJt1hmkhgWh|@(eT9?xnWnSP#Mrt#_3(1=p=i zu=WC@9xZf`Kf8%1JdTgM5nE8DWJ#_WcSXFfzvS4=P~Qe@1+o`KSr{5vO%dlt z{TFLd%YVKC z-Htwm)BR=okK>0AT!(B3O}ReV_qF`%T^Vhkx}O}f@Wfk?VRU}-$?T2r#wPPeXk&O~X>ZTMZdl*5^o#~F`o2PkkLVp)x7br66hqqHl zC?nLKc6%f%eUjv@w9HzQ9!$Ro9%j-rRkukWH_eP%Qy2nA6wkDf{X+Uy>-F5X3%ze; zmsl9~-aGVp7IY%bA6Z}9|IX16{ab6&9+-(ux?{L0ZX6WJs=YIxb{yI)m}boQX*01c zhtf^E?C}dDUOkPplX!Y{b!e)y;y?5}ntYDT@7JCg&TtP9`DUp~vE zH+_AUsgUgR31IgGu$x3)nlLa`42*miQDR%>8}mcznS1S`@SYmr*{Y))j)jXOn3BgvuuEGpp79lV@EdN= z{L5cxlI4Jpg`b6WTBhLA4gGbPhgxJR>A-@yVDcU6*F4lBlj)goW+8hi>>LiLCp|r~ zeh_Q>CE)!DWKF|-Qg7cvlm0-h83gU{>K{;d--=}2s&|%QuZikTcrcDLmW6TeI!ZeW zqh6ae@X-+c^~RXP7<0Wb($|H2UjswZeB*b|0=`oO59Rz10R!Vl#=X?sGmmoEs7t7) zuj6s_9@}3h7NQTfe7c#oOMQuZZ33IQs?)Z)G&{?rdu@9C^~zY>Ha>421Q+T~4@ElD zLXq{esDB4=NjK>+@caR_(Fi=u3a?+H;le@n@n;%CSamu!9#v(Xs>W);?c2Pojp$w4 z;lR7ZQa}szE(ETn@YMES^G98RlUb3ICE4k`FNc^pXqI`Z#9i?1(3JXLczN+o5S!Wd zwNJVWpZTXfjd_)OX2aJS*%Kk#z&~(p_p^Y{((OHe;NB; zZugKu{10*uZYUt0`I?>9mOeO=C7GeS4!g?8NLJ6tw4L3^HO?r`Gah*@x&^#)M&#OXve>#bvU{^3p2*9mRQ zLmztQL;Qr`2C;KCPm5%n@Q6@*6kgr^Vr7Mqyg$OU&zQ_Q1-EK4fsM%}hmlh^Q}e~R zuobo64lRzeW)=6RKKz3ERZrvf%ZO3Q9cI5r4^&;}^`hT;v8?#1B$p<{cm3Fpm^<*I z*ifIr&Ly8)N-wr^FsaOyZu~O(b`fhf08I%%D+90ioBYvjTT;4jH!!i~=gzR@pQpSJ ze^wN{bVd;a1AX``*HvcBG~}RQ>N~}o%I@On%hZviS@IP-E7;rMa}FyOTDXh8!@W7& z4QwpUj*x4iDAMV`a|DM<{0iCVL-E0(iZ=A1UDp~f#&dwpa|7~9Ha5Ubl;OOnV)*ir z0PX1e{o<+2g?+Zxd$x~f%tf)zovA?(`p;sgV~=HhR-{mIw36o}v!`;3_tYZ? z;43sd{}lF?uwqmN@1*ZR`PQKUlF>>m%+^jL=LX+UCcvBoSeF;b=99Ehq{@hnPGnt3 zChHk8b4qQf)V1$ED8U}SX3MqcIpUw5z1EB0RbDdT?z_n6=s#9Qx@eiTb&~^}GZ=X` zojU8kG0k0@75cCeJd>VOKhJS*0Waz=vTz6vVJ|*&%=fv$ZuV2A>7IR#tOZ-=c|3dR z$w~B~{zt|Yp2-*Q>6-Rj5-XQ`{&y3T@BIz>d=KsTfmJKl-BqCqJEkv|y3@gh`juC@ z<@B%MJEbo2{Qj=0V%ZM&xBaNp%7{bxCd^zWm~S(Sf6mvnxhG~i?wyPoeT@F)#pZ&K z!cp0AMK2^Heu(_B?bGbz#J{IKfj#q*ZSPOEy@0&-{~W5Y?O$Bx{)zI1;LE%NX)ZEP z^<}iJIbKTp#3cuFI0OA|@aqL^9v?~n1ZOXzjP`_6uJcLm8QT#9uQiMAE?1vx2ZtEG zJ#(zRf%R2$RcL(x-v+ew0rJlt1{ddk9vP|Fm!bTYjD>jJbFSZIIv=(s%z_WXpWUAQNKO*ecO|Jbg>&+va`q@8{?DKAJ5 z`+q$>FDDjIJJ6hN#XEqfQO@y^Pcl`$kugR7FJtc>A6HfN|L-%CwxO-i=H8?-R@qIdjgwtiATy>$cZko4FEC)4A=x+OgPJ z0&uMS9Gr>U2)nWsQWMB8-(!iV#vIxldk$1>G?JtJNQ2qX!2iRSm<{TuHQmoYfiubdvp&Dr)tyI-Nk`6{82oR) z?k>qiXH=d$?K}T~oZ{lovdwfB0NNk$*RY>IOz~Fo8I{n+rhU__uP7eCW}L_!KjX1+ zS+9|W6|vOWq&|(6T|79AsYKR{j-Y zEa5pLrHXA}zr-U>atX96`#d?0y;Ss3L;n9Y8%uIV*z1+ur2N{-AEUjtwpDIbo$i+1 z>ew8GA!vUYF*_;da#<1Yz^U!~H2FHFC-Ui^Gw*Yc5UVJi{U&T#`~4Qf9x!>tv0pvf zjAQpc&o|MFvo)f7czfR>c1`E;Shuf3y~KM0H@=1dGTN(m{XA!L53`T50p1#duHS@SFIG;scPHSp_RFcS z*WpJY_7;^hWVB^6uz!TV6T3$@0slLue;V*J|MS}>cmpaUI6IKj$+yYnCLHwyVvm8N z6lMo$^b>-9{CO%6&Fos9rkM@IQQSsd+0bf7_wz-d z8NDyf4m7*?1Qd%=T7=)5XVFd)y_GnP<`B5>=_Wq`54CiYA}5{SPd@gE_9lq!hF&6+ z{hVk98q^&fRxUHYgX}kpUxJsM`)LEYUufw{GMI6ThlglK>o8O2Y3igF2CDC%EcNPj z*Whh-yvj3$Z<6oeAV>R4!iDg6KV^Qx?@XJjcMbim<^Oix!rmpU!n)iMDZ^WIo!dv#T_RFZF?`0vUTKfTq z8*b-(q-aiYVC*aN-JYrX(7vL*gKZD{!kS~&gZjIT{aCeq%9Of|wcyi%-|5Uw7+qKQ zXi2YtmslSuezX|=k&6x<)}16lZI%tcKZq_4Z3x zXDQ;Yk}Izo_TYtshc<r||tUhx3I8?5wFZG z-_}}eJ~^d9zO&R~Gs0TjWjyZl!Y68WH3rVCJX}1yKyxpge3bbQ+25kS>4}qNV@(4$tC*)>L`Lve z914?1fPLnX!C(8oyNa-lir&Yc;>ytZclBP)J#6WAPof>x$Nbbj?V*_0f2ef?^yj@kx`6wr%S9`7<-vIPCxcGn1 z**Sc>5gD(wc@21nHzbbHW)<~D*O-3AU`A+5I=};*p|N+AF~5q>IY?P}{M{+``43)V zMm*pajSFVMF1Qa~f{v7a*NLuc;3uzwkI26zi+tFJz5ranu?`sHoJDL26s?*AzwdFf zD+BDy6$P^<)tRhG%c%b=_MGb2A8qAN`L;E_)}Yh=2C&P&t2rJDW|cd65$$PSBws`; z{VC2s?WW-IW$4F}Why71Y3|5qMJq8tPt)I0`dSvuUG;JBt9`Lr#{M=q4I9H5Nb=4H z9DK*zao+sij{6=st6jQ@M?X4?B0UfKesURoDhIXnmnb|UMUHvwDf}q8t5V<;B5zbb z!Yej8zN&&l-N5z5Ns*~)`&sM) z5omD{ZO%0LkL@%;_A>JmqJevW)74#z^m~wY%D{`@8^Y$mU%puJRSiMb3wUGQCQf1w z3y^!@i`bZ=RkQJ-q04~R-11LCV-ENhj^BibD8?l8-l)}~%A_Ma7mT&w8>s8iU2D@5 zb-TQs@R$9jA}cm5nr59IChv9e`l`O!Y7-jI=s=>GOe}^$zF1v|812Ii|6~0|vg75a zk*si7i(xm!dj8L6RNlPIj{}45_S>_VNoXGafod2l6CpCy&C|eg>zyBKWCm!SxCl*IX zw{!iuGVyZRHRMeczxDG5g~3($`f>J7(B;Hh8(?!;+k$`Wc?{bpXZhy=m#vdGo?LLq zBF>R%3?bqCvI((Y!_x=xPr`>6n9VKQZQ1GL$&X;#!|X*gQAaTjnX@I#xjo;Kv}5{J zcP{NqzlvHMI*9^oGWi@_=2H3;Ha_>VM7kYp%RGKZdEW!?wf!s_hiwrV`9GA|jo$CB zhNqxkN#|A067lE%@^vHDX)9aL_R|AYJF^D9WqMfZhX=j;5d#(X-zQ^b74 z3RSA{nKib7`@b`e!0ECFjR`(!Tb#_i`cWc9yWy5=Wi*i zSQVWQ60gzRYECteU5rt4>@vTaL->@P!xhX$1pce{Cgh)GV}Dz+eoS1DA3s72oL&Ei zxr^A)j@rJNcq)8O zw#~kAu|xE6BXOKHd~;d1s$>1YtYwe);r*IilMfE?0!+m&w;+roeAkJBF0TVIIu zFNT(1#0ME?4lbi@Jx6%J1)tFVUQ50I{xG`yFw9fD)>?qv^?eShT zmg!sT;w$OC(a93Rk=B9uz=!+vDC_rW^Auu_`?)d)@tdy0S0i21XnlR%vH49U_mEi^ zh0#rNjni&cM2BlxyL;g~4&`drI+nL;JsbSCA=!zaJ0aEp4t^qA1)3l0pM^i{3U{0k zn}`16Y5zmz*PakNqIm;0^D*vBMrQ8?2cZzZJrn!-xBNJ$WEwArW&Z#dIE;DJvAK)+ z4Ll=V#1se9a{}%5hSI!3GHOl0obRzVT>930T+aXJ=y!;^b?5_(y+_ZBT;fD0a~}ou zPXe!F=?1tO)wlXZ2i>9A;t*rie+v`&3t2yYzj6PJ3B0u00CPmJ+~Lz~gm*6MxYL-C z1K{4)1%Adrj#btb^DCStDWh+|j(&rDqO5YDd(eQP{NM5Qd>gvaoa-I@oj4`-&WA^P z9Ll!>C%V~4Ex$v;bsXF?FPb0iZD-=YUt-_lU~pVQ`w8gOyXwg87S>#S+rQ6M_|ksl z=xDH8XD~+>n2{w*kL$a;GBHlu@zZ(fa}N)}cT>na#?Yg9z$fs{$=8z7`2pF~GZ_QA zPzwLYC9F{!GsyFL=3C$N`%3IH{WthzQrq!k^8Pw}qnS3eA9ZA*6Zdz=Q z2IXqNN!WDkbis@CZ&&*Y%s+Uu_c%K6yl0q~2Z$}N&1TI~?tds32@Ef|Np=Hmxw27d z%hMRZfy%tBw$M@WgUf#PV>j(y>z~rG)x-vZTa~Q@zK^o5MBmC;oyYH7{?h)iL?yf- zy{8b7zpuCWo50Ij%h)yk zeGHj=$2x0o>{)2_#lGIIqK7AP7G1aRC=>hYq4%(s&~M*w zKVvh!Z!bM!$LGoD!L0OuC*A^nS7 zwes&&V9SPHE3IPPRo|qtvN0t4CPu2`tOwP(`+OfC((lw($B8Dkmp(IX{WonLp)KjM z+QZ92E_P8Tj2}pNlpJnD9{z#)FMbmqmV>_dvf{{1;{nYx=fQL)SoSKh$5ZkBGAHC( zfNqC~kJ!w3xK0cP_#| zM4d9f4*c5IS!t&FWf%En$y?I&edmMizxsYzuh550c{*N1{{I#nx!|XZew3G@>-irG#>biP zJ66uDy6yb1oexK2ool9E$z0r0N*p+2Cg)D0VV%5)?h$3~9b&$fzvK~~)n4rwKkyvh z)qW`6{0G3l3_Ak4ZH%XBWdbztBKk`gbmGuP%`vArRJ3g43G{E_GFi>7=&-UoOOJ4F zm%5hbsGmYsc_%`PylUzZHsLv%lD=#;C)PTR<9UH5w zb^fSi<4glD+B)#Co@epwdIQh$EFFNc54hkPxbV|tz1{_kT1%EE-!d`wJhnJ%T6Tiv zy~$p6UL>cyXP@N<;HqfeuZhh7Z~+YEl?-K-^I09M_>`HO3Tefi2$ zL?^Kn_}q71lRYz_cfNk<@Bb|F&uYZ>@m@Av=Jx@9Ymb{T3<%x>^m_$m*E65{IMc8X zzP6nIdDtj>IIFRj{vPCa7Vqzv5&7{!p6>uZ2N~O&OqZTGv{5c?uw4}Av)K& z*{Joo5W9&%2~ z?6CB%r+uB*>OZee_Vu4BCs|ld{ts}l_IrMaeC`ND7VK8c&dLRxmnUY0KHo%-(t2Gd zzntt2>3;0PcZnb6WW_E4M$tkJFlOrJ5qluN=saxyHRRtrQtH)XPk__hM7(%>Y@>7} zJ%s%#2GHgp97?YFIL zszPp5)Bu;}rsHa-L2*Dw6mtnL{~>epJbmhXnR4_9R|gLh+k%W9ddkMO-~$CGE!tBa za}IXwT}5Y@cSlE0obz9o_;+t;jx+kE~wfI4FGu zpXI-WU*`8Et9Rum7BiptM|xe_lb%>k{~F8A2Gg-ZaU|ecI^iIDV~2Te#h;YgME)&s z5d{y7gZ&3{XfLwtMq(H=&(b4?S|a_M(OcKhKD^TAZ7}SoYwpE*csiqBz@58 zy2u&f>MdlS;=6tguB_~vh)n=5HR=5g?f_X3B~PpNR8A?nU}J zuWj+==acdoVn<#?3`kBW&s2q=9r<}!6WCy0ec0qaR=0LWLxg;Al35dxMa%G0JZ||{ zZsKYBkiS}UqPUo4&jp%)$hVN_`ohy*y?ki+v}XzZJN)nc_hM)JJ%2Tb1mLy?YUAj^6(e^ zd3TuiFgk?GUQ={sbeJ_IAMvg*=Tr>-3db1nv5^YR@2OK_HROe0ez)~rKE>W2Dw=!( zerD$o-9mHwG;1}9rju219Fm zklYVR`pLI(zqyHTGavr^lS_@eIX)2AV(l>h%zK7Lb^}8kzLBR`uQ#${>x%JILFs!_ZwD$@3ii=?f);%57G}ftk?@4i2bb(gNwJx2dTB!T5me` z&_DCCzvEeQJt4cx6i>6o%Aj(cUxRL5*SvVdqg)5=8f1)gttIHLvUl)(l-u%KoY>X0 zE1A&591Ze2L?2BPAJ|!UDff&ALPMsUcE zD2`BecN3cY} zue)+>)o=NoBnKh6XkuHy(O7)8rSaKB8PSWzW5+RlYK-x1GsmXj^Jv|9F=NmiXEVpz zACNq@xZ66FG5x>G-vM8y;cqt0F0eg|jwt+QaJv@Vx{Q@I*XwC7jd&Df-?m=(b_aWr z9)2Sa+(-Dn7ylo4+QqzXt1$&D&E{Zi&3Cw4HOJejI7yvvf19`?#lTqDzdbcJN`Bnb z+4zZmVfuG4PgkL*m15U@{UhLfAy+HFk5D^~JtWKQ`KFZ(9SiD)lOdRrTVjeqZ;qPGoDLT>2oyYjZ2RqMT9D&Yat5cvq7FJX$ z-lhI+V3MyzxV)bKiv0xNyTa%LqYJah5l(y;`HqzXd4%}(dGKvZr?*UvmBIH~$gfm8 zrFG|N(4}mPCEV?{9bMVd%i~jH+nL8VZ+BwYIopnYIw#hTEq(dQ_jddqxUD>qo(~)! z$TLaYHhtUtlJ0Nt4RNjk9c_UdNNy;dj-1q7kOx{g&|Y(Dx7i?E+zF3nkGZOhGf~P# zWaI8~Z`>Iseq8y6ROS<`y9hek5#n>`ci;?YYVeHf2EryzOc?o+i9cF_ObQTj0IH?0q{^%bnN;#^BzCY?HqeUhxxtN9Q`RAo6BBa(qIF+|QId zi0s5hA8GoH@z+0hy%P^velg?U1HNq^n{#4nb3O2De{GCD*0TzD-}u^lJ3jMScoDdi zK6dlE_X@Rc&9wpYZ7Rl_^Cp{|?htZ3t;hAu!$MF?@Dp;YPa+kgZ$D51|zR6y?AEW*hWslMRl&rP^z7ObL zE!l{|({Gq7$qIW{F0xehUqbGQr-~*|qc7p)Qe;QEKJ>}`R?1Po+`rpOZN_Pby`V$# ze+rHyagCp+PLuq%v>T$`BhcL4v@KmdEZ-}-w&DLj!1rFQvnv+$*D6*qXcoV(Yv149 zg06WOIuX1{_)rUY7R*s-vuq0I)7XbwroA-e-Mh%KnWI|X>;hyxq;3Mz}+KHaBcjqAasSJ9M?9(vt$~M~xY^>k;PXV9q-q1Z7t?c8u(9l!p zhIYKXTZb%h;4ko*{#^EvRQDA0s`$!z!}Dxg_?6RV3gjE1&245;E;M^zH@5h;x(jn- z2a)00n~+YSe1c)Ex#_vFOy7;*In@&E*4mX``w8gbz-VhdexLdjd+-kPv;jH2PV#ydDNON!kmdA4)zhkI#*LlzLgTsq^(wp5xd<|6c9q!E(`URd%_V8;ef# z`q5_x&^>lN%lYj;^Z#g*WBoWgS&zbn!y1c%gM8)_ob)7#F^M=u%w>M!VsNN9*%V{j zb_MN|pH+KO@*zm4mn>Yz{_Y?)o#@U(mP~~1;;fCGa8C?1}Hs!*jtGwRi=u2~`fGy9P|&lK&EC&k4l5J5J$=qmii7vv4BVQodh zdp>7ZWwW^8eg;hY_!v&fw`0g*3_3S76qLQ?BxcbcdAIIyln09UqkEj{e)>t_d&q zrt+l&PV7ORx4I5%B-pKc1OoI^$JvCV%d?2_hlY?rw(luw?3?mgCETcTm^F zfnx%3%zE~CMjmO;{c`N`)GA*$Ns==nRl`2(I%xGQonsxYd>pvr^re_vt)I|j({AM* zx=bXPU1{43Ve2m>-jaRQA?C}OOx||>t4^48VSkfPPyHF~a{_Coo}o?(cmvE~bQIqR zWm2>i;!H^hyHsT}co2Q0puvZ~iarm|F~rtI=bHY1u`b+#G3B5ak2zF4n8P|R#x`&( zZJhVEjK9;v-V$AHKbNuc?RX#D%^M=W(3e@0;b4!Zt-0PW5=K?Qi(F(QKD*vr#&#Hc(_!B@oQ=GdUAC(z_Dg73GA4tAJaF`Mw&}IMkp;;K zMV0J*<_yxVVckW|iUlt!hU8)5r5ftc#TKHA`DZ(z9jhay@I8%ZU*Nx?C)>^#zb-zd z#wg>m{l8Wi8$h3c?#b~_E*yBZc)98b?mYTaJ_YeFd{+JULF=ry{#JY{S{K5nau*ox zlY9_An7)Zupfk+>8~X~9A*y>fcp+)feB0-lMb>ADy{{M_9}iQe#S{-?zptMb6A!a~ zG2!U7X|WUG7t)R3x!aDydy9BqbZK!6ywnTc6#W8AeT4HiU1zZmhb;Om>y2^D*O|Z$ zcm#gW<2a4KS-Rk+H%BXu_wh(^ERVK32GF120~){LMRS>p?aWAqa$_tc%a53<(Q1k5DOr}E;d++B<%_4a5b_}FjkeYv^irwI4JBp8#>^eooV;F^GR ztbrdxr?O!VH}rR>MB6Xp8<$RuPN6*(`6Oes8D~AVO254J)RLI#(4OuSC;q*D`-!>jYnkK0w5*sz-H>7&s3V!)cY*2f#8)Vzb#yUfRV+bo zAg?@P^HrwrPCtHUv7h%?b>Er^4-Yyq)xC#yhR?O0otr-#zrN`}FM#$PwD}D6cZS zw`*-#|0B>!HZmf>K8kpd%6^shefTU+ z@SEo)jxYw%7vu1G&kH57F8KTxpq(gorxAbIToOCH(21Q--%aQT;t8d8UlJb%v<|KZ z6vKaD9{K|`((-7iY7iO^r#@w2tkK#+7vF1b(9h2KEV`ZGkUuw$eh{R-2cHu?U%*;a z9=I^iw(mvLV+Zid-h|!;A0zI7*cF-FNhJ z!ujzi8NZSIRf0iwS}Qm-=>N8zKJx6+$LZLbzAcu{IYvyM#qaD$v+N0X2EXC)E^&s^ zUws_sCGewC2L^9PFQCj5)C*m2Oz65OFxFvvE~8)kF$rh*TR#p>@pj5Dq8tZdUNhu3~t%3)9^0dQ zTYEPWml~8za}oyqQnE3LU0a$JdBdY`OAGr?j(r{48EpSdH@535$KQW$Moj#Q-~PJo zn-P19-_oC5Xz(27Kzt5Z{d?Nrq3`c;`+PKg{@n6>@wc~_JMp{{WFs_1?k=sR+{87S zM`XO7uSb{EoJyA;n`=?)PVrizsW@kArPoj{M=;5DCC=w~Klr8V)z4>G$C6FrKPhmC zZQMJg`@54r;#}69Zx9F7zX+MZI#q1PwtRRhFmPTzul#O!;|5^48=Xt<-iOEE?@&8o z+s>{x=B3+6)p*x|YABO*eWsp2c z(v9(#<~ZiVFg$MU8{tc1oit{gNoWpVZ+e{9A0Ow$|BrFjq{k`$t3NK)+x5n~zP#bg zp+7F^Qo{8zd_TFYEpiQ~eFVndpOlg7A@mh=xz{>ol*and+lsz5(dJHuZt%qxyb@xJ zO!9nx&!{MI2L1TYdDgD|7{4{o#5%=xT>(8{4|d=~_gJGT@(J7nKT>&v{cr9&5g7b? z4E#8}2k$KT+Ixkz|L>IH3m}G@b&XH=l?XJiHdI$_zw{N>3TrQguKeLPY}^R)JY$E{ zf@k?$7{ka_=tt5qUFO<69&Rtg_Gv=@%*cD69?2DmP0yYNx!ApQOi}G0M3#IGqseAviZ_*VsZ z=pcqcIP2E?ocHZH*(uNdpUz_4vE|H0F31j=O@6@B)V6xFVk})IFbw?LY zeKJg+VS9%V_fj$z$+K0gUud+KHMPyGpI~LlMsyhY<0R9lXKkQ^#Dk}TjK3Dzvw5 z`$dkx1IUx^=jP7HkiQ_${(}CcxCZ&`rH_jDhc;a`90B&d*v9j?msw{NLh$?D$ZMTt z5bZ0LKx1sBjP_g}W9+5a61_P)i{<-m#WqZWFV=E};LSmv=$&vFf>yyyjnW^9 z!-|E7D?Q%FZ1!5_wkkfk+9);>KdixbS9*n?=azY@_G3Hpq}vbthB?vs(YSQKC5yz@ zp^5vuck^5RR~H*sxQfHa*3QLWz&aEj<);~o2alXt9{VJN*Z{JLw?e}m@DRmh`8faG z@iz0Y->g3n-B#;dc93|L_=xaZ3rs2Wb?|6os{aY@@jLCWyRS@o^nUYlnOzezSrhK3 z@oQ1%D*7_;C->8)-yVS$~LJTky(}`71)hYTs}_x_c@% z1i6mD*~oX-`aV%$D*pw!q}>zHAK35x9=d~Qr6Ai_-e|C^y)@tYKHofel=u~PsGkQ2 zUgN=^TyW;m_u9FJdwKU+I;6i5m$ljLp%@JGHA zYk%6cXZh?tT$hoN;w#@nUn@xTQD1ydZRq_v)`}mmcdxY*S=aV_X-2kofww`{($kE+ zV`8Pj2--#L2RF829^aB6^0Ho|V;!1rVCi&XA*t=S{+`z^&L$CWQ|dhK@c zG{vNLeEPhnG`^eQmr3S4F8al1_eWm`-ESV5!yTxyxAMx@0)HGFL$epfp;_4te?m?( zS0jJa|D4FkWBeCi`2+tI7b3dVp5xx5ew^X~4$?3t};tB6Ht zM{Oy-{}`}{7iD}N^4TLR1|&n+bGGtAzT$sjOR8K7*bea=XFeRtDc&Q)Z~oc@%$z?N zMc4o71Z2VFbS&oeAB{8mbE0+NlkXSFpUm?kwD&N7 zvUfaR&);uOIW;y3yxO{(PmRr{E_Ed9Uo+DSV((CXN7&4_eV|il4N7A`Rn-o3^W^OF74W8AJ{2_?pWJN+Hy~ikP8_f18WiaCR@Nh_v@Ll z-0aUoGkm7}`f_NQ@&>yqemecDF8#aokt#L4{m^;!@~N?6aJclOS={I9)vNzX{_D;n z0PhV2;cK(#7uZFIzsk_zX|v#;MdeSyH4>M)2ofX^5Sa12L zsgMkp?!1m1Qr=ALM`AJd+>gyj*}ni=m-XM2BwE3%czOiCqt>kaNYX10uoo`>Qps}* zY);x^#28#ddwZ}I)y7X~r$^4G$(ABuB~Eh^KJo~#mR{&IJA4y;$Sx&uL7wi33kjC} z=nkw$@#_@y@DtG%b6_N&$Rk;YPNzQY`44hD=bvaQ;_&ik9+=7WrQWg8p4Nrvjm(c?$cSS}Tne1- zsrYE<8!K<=;zid;G2w8hw!~`2H)bJl%2{P#N^*E-Ac|};C1i?>8@CPchND$2L=Cf z#y!Zp7WT_hl(FMJ<&@Z^$lnU;-N3hM{(pi0;&B)7|HxlQ=ikS=yoGi74mjI%>FF_Y zzHD1co)yUu@YSCrAF=W+f!q2oK{JvyC-Ymp#Y?Yuk9n5v#GMd@z5GAKfALy!3>G@b zwlc=0yQlU7XBghn%Dg+LaaI;y;hY9PM7|!SY>56+FOJR^9|?^!3*zOB4;gknKAx-C z54;3lrSy|~$K#_%o-1cYHL#F>QF#P<*fSlujaV(cpUvFKkEU3BgZ{RLIg7(D^;_S+ z#czY(nES-a1#^o2t?py(zjxa>bSM3z` zE#Tp5`*+J(uk0UyBlu-WVjQqYKdxh(&+%XNJ_&v_U*Ng^0s8(N{e^g52yYc{8!PL_ zo-;e#@Tk?vrjgr7{Ii$wvPYi-ZLr@|f?U)1rX@Z@elp}G&*aCYZTPU2B^mfvNxz`K z$N9$o-+2FvCrunu{-eE`oY}D$bHn0Ah&n2#(cfs*JV|P zer%cDfq{%yD$yOWp;{GS@b=XtNV6^-fN)N_45 zGWkQ~_svb*!guLH-xrSP&xgUEJMZ)2L;e{m;lO}{_Aa-6M#!NRl5$c8sW$%WAG1)mqzd+T9jX0 z<8r`bxThSu(9i24e^}dMyT7w56EC@4z8>NwwT_b7TjOpz{GCs_=#J>a`+M1cMDKd- z*}6~0)-wO{wX40K1Bc~PzD~=X-M(+U0UXI!8OPTkJ>2&ze#q~RAKIZ_9Dfl$(gl`A z(*DLLxQAMEqdu+#Z}RVR z!*8tb%-#MlFo_2_$l+v@A47v(H7!Bt(%YryhMWEXo;Di6OId5^xe zk7d}0IT2l7bQec|!8g@!KIILZAY0zbMDA(jyn^ca`(DJMfV+^hVgdKDFOYAX`BJ`m zD>GU1$M5T1!?VViu2*h|4LpqexQ#K?0e_u$XIMn*iL#9iYmduz>IoZYc zv<08+3VeAu41Xd{usN4Akh$^g#V&C#!lik6(^D_dw(yr)YDVT|1^S%lO!pVzBgqpD z`98ip9Af-=d3o&>S=#e6+y%^?OYq&XHk-!DS%Q%=PqEs8$7UL@zpbFH9b6vzCu>J@ ztXzAy1x_B8{Sl^IjhR6#Y3Z=yY$cyP`XnEJe<$&%%8wP!YMrEWuHlF?wbqz^=`6&% z_e8T@4Mk6*7}Imt6H2^V)?{oSYXR(xl;2Ogo{YQJGothdeB=48WT*)>1)>x zIPh~``FrD%rIp~%32m+S#-C&7%&=ymZM$ZruWy3atBno(kK@l`omC(w6$4yhs3+O< zodMG=-;vg!>X7HHqlx!=r@HU(TQu`NKTP{zD6ct_O{}ry!f%8xmwrl<@GSIrm%j4x zq3s!Rn!#D)aUa_$rujVR2;NCQ+@ntW7lL<{6TdNL`K@DZ=vHtJKdaXH;$_H{F#fm@ zJda${$QQqUru>P^$g$79py(wWg3lSziL-K${-Vq^{=1Pu_6zsI>%z3zDqVWHiIE@0 zt{M2(yCLViO2w-F6x}C9S=y-fWIM8^%=&^H;mSU97lwTvA31)9TZYHIm~Jl|xfU35 z_;Xe!85=lxH=8?+lt(4A4h2^iF;pS?Da99}Z?fMMZ~8~taUxOfTikG~VoZyu8{#>1 zhxfcs7x#A`WUSf`5Pe7&SPtB6+`r&tKTsU<0wt}`d^gV_eV@p8 z$$sQ~-je8g@6+FXY72WdUuEseb{q$PzLK$znsKX$VQ)+Y$0sfajeb&g-3|C zKTOjPuK&vL72xP+$OG}_Ytf-S`cS?RC;Mq|nOCAV_o8#OPB9}7t_%$y3}z=}TWSp` z{yWW6?R> z{4)DJ=)~f^=m8gnj9Cn?==VgI{PviSIP=H6z&pr$h7KcMctZ5O!rkyw#W8EWYMth@ zUVG4^^Wa@wtl1iLjxKnX)=e|_?>MY6y>oa6t&hmRueB-u5oIm(aDHa3?Z^3mzbmu$ zv~IMn@B!{1?te8fsa|7d51w-wHg;@ui}U2*OegmD+tFQtOZ%9ABL@Ga5OvQazBt1E z{)O7ZF^ZGqJocHf!;4M-E&GW?(OvD^bKBK_FVMx2x~G795c<8w?2R#T32y0XUb~3C8uA`g*P-jcxT_`^5X`` z=N+kD2mXT7BUQJflj-g;e39k0&$XXmocZNL?E4wkf%1~EetLq=`WaE^-_k7YX4<@+ zHf_CapWyBZ=_L8(Z-`!~W4L4T!*$f2V7W0||f6mh~J5NBQ99?!e{4ap`E(gAcr`JvGj%l{+)!XCPlT@8gt-Ntb2~Lp%K@!zZD6 z7g`7A*K|hg!!)nB4DEwwWW9XZI+vQ+OIrZ_o8gwH4CgMJW$(btJkj78>_veu!FU8( z9{su5Pz0>xps7A`u2XGhMn)b6E(7lAf4=On)MBSP1#FU^8M(O^Ul{OK%U2K|XDZ~U z7-4K?%jJEB{gk(Xe{eBz9Q6A*{YeIEp96ch{s1&p20s%_%6Yw6@L*G>miu~&@;eTG z)sHu1txg^JDn1Hy5!HW&xwZAqkZ+swj+Y^~c~(4R>5BPP=qxdE^dQFyY`(D6awj$( zev)g4ahv4D5v~Qd@T@+LAjcF3 zqIY+|$IUyVJr2B8;~r$rC{r!lXNd2zRSxj3mUn~vF5~wQziapnZ$PWx6b;D9t5Z8OKU~CGItpFN!EJ!1VVgw+e-V~rR3{{F9BQq9QiorMn>j9 zcTEojh%d;FoyW7rQl@W|)merKk?ZP}KZ^W8tF9NX{d{C(65pfz4|!faF!a0V-o`Y| z2xXaf$NCPgL|^_Mc8mDiLuOn%c~W*ndAF7EGM6Kv6*W-$*|S7M9D- z`X_yR#l-hBc6j&zJ~!(JJ0Dt}4j&xG-zcAra=ABP-?ThBAO9`u7aVyiNl*ibrcJ^Xs)zhWOnbt!)!+KGL@O_usFltk*W9Pc$r@?P7knYE0mE zO~83<&3m8O-ts`m=84vv<6jZa?D#F^B{SVX)2;9D?Az16o-2L!YQ{BqQUtkAyaasr zdlp97dTIM1Z6~Tv;Iq2#Ue?4ceCx7hRZse;bQtJ&Kz&Fa5qWYg-gn?L6&%|G zxsN%(m1lC>#bZlX%&TIpTHg&hh{Wf2$v!dAt}$O477nGyKAoPIKf-H7PZ^sagR3Fd z>tLzr|0_PH!BRgL1NbOkk3T4bgF4z8Vh=!gV}BtbUw1~Q(H+o|*E7L2{Gy+{lkXaQ z#x8o7;GUhv`Pe(1GxorLQ%CosX7FrgM`yf3+Zu~>3-OefX9d3Dt|Z$XlDFiYWN(bNx8>1($6e!M z*?s4{E1Xz;|54g0kBn?e!<#+%Bge#7UY=FQo#hYud+hXsyx1{faf|KxX=EQd#tlC1 zMuzG44ZdmaT=8{ifIDC-v=^3^MTzO(FdbT>z6~#brSF@{@EhG!{|#@rfP7-AKUU_4iBCwiUEUYZ#tvLsE1q0`fb%!LEH6o12Yq@|%>1|4 z)X#Ar+gz2LZ05rUn*Rws6Js=0_tDnD-=zD9_x*J#_tOV*CkZyr{7%*Tc3>-k&kS*9 zSujTT&1=_rYxL8_b?EJ?--BHP9ZfowHh|aW9M_mlww0&MY152UU1a3T;CDP_7_%+c z@>r-!vGOlHts8HAEY09mlJ!85$Ox;sSL5d=rC5j zZwdq!3s=A6TZ;IPOxx4Zr-Zkqz^A>^=)UUqrd1oOmIsU5TUMP_bpRUp8*L6jH@f4) zu&*=ptw{d?;5G0x#@2tc#zxri<|Fm6Ky(#x$)*3Rwy*JX|@-RGN0)KlV{Vw>C zFMG|FFAo<@*;YSX6JI@T3c4}>hXY0Bg7ZRr-x|A{OZhD&eNptO8gjCBu}-4IPNGlX zr#^opevU@_4VsDa&B#xXYx*}*{;VQXv8)~c4*P48bvpmNhO=+rtXesk;nDVeXTYGN z-%;=GgErRRTEAw?$;0yTL};()ot6c)f!2D*`{ioAGpviyR@Tckzg|tfl^*jldSdbF zh?P;?mv*n|&s*=+yBaTa;qEd0Cf-(`ir%qW<6a96?qckvz@G*Dt%6xN1aGV1fvMYx zBWJ%2Lvjb}sOm8LY{;R)1>>evF53gl=>6*$%Uj5+b&NKFhz8F#hS0o}gHc<}Qa z@5A69Jp$iQ4n?&YWek~quDjH9cyE+eS)A})IP|FhH1>FkzBBpIqu?ygyH@HeU%lk0 zbbbFhH}O}VBm3~D-HTq2esA!n&7SmrKNF!_jl~V-9J76;_lNA*p&RT*^x`|~iG3;D z^Iou7I#iT>Z0=HNc!s{$VcSN6B_D{N`x>w=Yw=?Oq`PZwMH^#vhd-ceepq*y!#n8? z@RY{E@#Axh7q4#t2hfzwqb&N{HIk-3`pz@A5%b5m*dJ8R+&s#6k^4|Im1nx@R|9it zFmGiqx#U97lx!~fThz`u=z!pJerI6X%BDbmdmK86u3Yy47=K`C=YwO@8EwHB*L*-n zhtVBGKbO$gExCp~DEaNu;f|4W=az-jVg=C9v#aOEWMi_&Rv2YGzvF*iBwl|$|NoO7 ze7M2afn|e8hH6gZ@BzgG$|vrzN8xzv&$BPF1vm`;Wqjm^u4P{AyiNI7?Dxzo^9c_s zn5cL*`7Jc=pMbwpS;N|Yk<8hQ9MPKA8mljgTr5~NEmOn;oq=WsMFPg3Of8%#6 z`!WB}dvc$N|J}oSE@VAtVx%Nrs*e$u!8?=sb^Rs5!tyVn&x=2v{hn7}!u$Kc^K|}S z%6%mkci8LVmH4RoM_VRz%Z|Adp3B`TD`lgFz{`J{gA_93aD$&$Rk$wz_et0%xtjMMsHsIR)Isn*}J z%}kyf8?X2S@ct%v9`yY%8y7v!*wpyAfw*z2VO}( zt*;RalkUT?pSefz3E-l_d95-Ts6X}+as<7+P<Zr^i~U_>aPW7?daf5ywh*_53k|(a={kbQm^*>u`V6XQa_X@4y!}$ zETxR-ZVCT24~jdxnCA@s>v;~*u585Tu>(YRvJne;FCR0sS1vo|bm+j>`){eA0&YCo z-febOf_wP^IlKGuSX?-kuFG07>|1zdMP)|sX&lB5l|6QRAB@=Qtvl=2u$JY=h9{N( zmj08YEek>cw{rJZ^Z~y0(6+wq=9_3tG&>Cy+eK0 z@X8c*D)?q1UVX^K>CeAo^AW}fyxXiF2pVvp;~H~Hb9{;)OIKs^tQ@E@q2>tdv&KxZ zd2bHUmc@m0OZ^|AQ{lpePK{Gk8KoUhw2yA+L1PA5eo$q!ZbZv(f2%Un|4HB^5c)oQ zsex4~^b5uB)l4QXL2*_oAJ+ZpzILQ>{u};l9FOu|azp!%jNis!$H7^OF|QD=Ol|XC z;x_&dP6cw8FpAVE^w|*zyF5b2bS19Zpm)RYMuAV z&`@U1B$w7be^qys@|I3$pIBw)p=emRykF04g~K)JxfHBlOt)PKym|DiGddylKmMxj z%>3%N*8aNZ7oa!zdqVPwbV0*9zmo9*-p#ry82$BX$=E(*RS`6?9XWgzGGF$^G_$jQ zS|q+&cO`pmCl70`JZ#8(bQbK~^5@`9+LIsDS{v)fvv>La-ue|vvvOAB!)?5(ocM0j zSLv4F)8cs|W0J4cHOWeM$i(D-3XR`YDc-#_xP5{?OHGNd zQ>JNZ1N=*Usm#6fp|;AfS%^XDcZ#r6fo-Q9cj@XVGEx1I8@kzHjO+o^UeU@3>!pnL zO}w@K75)oOV$;eM>lTOZRVQiO%4vLKPn(<=#2B#d6Vx}JSN}h}7e1!)AK4Cn?ZKDw z{u%kPK9pC<^QyaYUpZsKH;m3+G4Bp^|0ZigG^O7kn49!nqpxzmmhKyU<&1Oj0r}?! zGjv~0zq%9fUg*VTPp^QzL(YyXr^l|z9Sh(6Gc>Y35Sf$OY5J$v5W^3?lrKEB41Yel zr(+`hfz;Oeu;r71RfFJTI=shZE1rnlG~_Yh49$+q!L{#)Bj&Zij2wB3-wlzGUx4?b zQgnr2QS*71VgsJ2{;3Zf#&B2QQZql7y#LPxbno;Q%NM(tu0{%Y$Gl%KQWIs zM!@II=4O5uC(hvaBz#>ro4Eb{BJG}lkB&Iri%LpNPUla#V0T+rRh*KvXSW=ldG4k#~ z=AcAtd@}89W#5K9t%J;m;-QU8o&b2b7c|}1;TQFgr7c0T>VY>{1HcztvT67LGF~ym z+M_Whf9@;f{)OlDBWnwzaTD`6b9^9oV)q<;W}1(SfZ;&y`Q6LecYmESamI!{q4UOv zZnyIp8TsOuxNDDo+0R3VF|kFW5lh$kiF2WG`KvTvF0}8l&p4g45e~E?87v&{mA_9p zTk!Ee0A1;Bx}VU0azr_6WAo8>5#tc9 z_*BfLT;dY!NA{{c#%}2?d1ma2v_IOz_k0UuenGIamQ>Fynip$%k$89NhmE&WZF~(p zs}02=r49sQMH(Zt7=Q)?(1+rS%Yvrzm8QtM$(+cDWS#b5727++oJD|B`?18H)ekXW z5!$?vGN~r?ddB-@jSpPJk*CRGWN~`jm!#jjtR>-bWBUCOp3liL9TV-{3eyu8P)=GDXguPF;zNE+H0O1J z=kfG62fGWp>d)*&LqEP=^T=tjr-51P^&j9(aV^YSMTqq-U;cNI7xxO6tU0Y^eGk!2 zl6`Js+Z6}x)8UGb#~z>^gY3E+Jc))x%Nn<cw;Cki!$h$8vKjKUOy^;JSw5hq% zoV{|sdG}Ay#|yl_PGbWGk9Ez0Fuoqa0RDP2GNSlQ!K66!>50EWThK%^<1ha>wy63}rOQrdU3-jwJ7qlN3!8U4 z++fp;X7H;19=a0W8|zX&i4^-IF7>uiCRK@T%J1o{n>g@^KZ}p6{}A&Jenw0rGV)Ez znkiS$z=vPhGLJld>R<9;N>R+5x2ej?gKK?xFuQ;7^6bAvFE_+-TtxXr@Re-Z%AWT1 z8PWwTZ#nO@*ad0)z3{f3^PZ5iVaBz=?h$ z-+*JSiK|&RS`QlQ3ymtX{MHm@;>ZMd^rTAhW6d@1XFSjQmxwjVW{q)qRZobsEZA`s zs+$k2W^*>7xlJ?nr~8P5D^GDB@Z+DsHy-8vG~!fLF9|(o=Dvx!7ru`2{g1Stta)@<6s)Unt_?A3c4$ro8AUSttAa)t^srU*bTc7wJjYWKIH?WCUrv`}IVC|j> zuGx37-+rlY8r#6=d_UHsIB_lSzOutyw1+)}Y<~@r^PM%c8X*gn0_{J50=1n3%6Q zcSK6<`T_n=663iXnBvm6i1jQr(^tC8yYT*H-be5UXWqw|e~tMP-dmcXOry#Gk0~sL z&#{+A-BMyyJpOy|@gn-y{d%cR;&nP{D~P||$`(@(ueNx)K{RgZvp8`*&z4r%3ub*( zi0@5@wng)Qw>alK7{4ViY}@yA7HcdvE)}^Y{#H6#)BKM+$Ug=@yaL|;#xdC){#j$i zEP1SD`9DUX9%)$KlTxs5?i0@fqVs%wM&_ z(pEwFvkkxnzsy^*Zg?#`Lh;$sRlR`a;XSQ0@Ubxl7oO39t|OX}4J}zB7<7(TzAxF- z+8>q;P2J;iG%EUFe>X)N+o3J3Yis|c&sfV2-j4nu-YB^Leb~pHZ=>ZU*7EKS;9mev zwRdarN_&zaYO8~LCUqWpHt@yiqmBE3GkXcYT%p+M{6rr38?tc!3cpw|@iI2rZ0S;4 z0yZxSxjquIxyRaZLxm^Kc_?j*Y|rpc#+QpMQ@_&7NowQ!U07#%{QefWl-|PL_khhK zv?b`@UqCKYKQ4{?q~VL9EMnR4BdeVz>eO;?^bq;j#Jf{={J9Cq0h2tdy^iuXjp@I@ z%2LX)U*d{aFor$oZQ>ys>t87^p7Eb-%$MyQ&i);vchHTua)t=miJwhH|S2- zGqJbX|5iNJvYXjsVm&V+_GJruXf4FP9Jr>lxW#0zG{82V@@BG`Iy1{#{5AHi$2+Dn z%Db{vbE*WV_Ea@re`7s~=C>*j?{?;F=F~aPiYxkrpMyW2(EYcSSM&)lXPNPf9TT*; z37g_c>%h;!pP$>Uxl&Bi;L1Dtj5&e)3{Lwm!P9}67tK*WQOXX`{^17EpJVe@q}a3c z_@?!ep}moPf!Ny%12Ma=9O|k+wlHY-NXqF)w6Fce(U!@I9qyN2H%z>#+R^)?%sFe~ zb+35g#y^6q&W#tZY7?&$KgGv83m&IE%$MFk{|c6@jBKhH_9(ZvAg}##biojM)y?L) z$`Cr-Wt8>!Uew|=DDJ0vrhku7FF6DDoWt1xeEzKGUCPO6maO{#&$s=d7s+4VNgkDt zE3O>9JphjwYg=o6_6D37cgXLE&>yz;Yhl(`*c%u7nOy_qk=hqjj<1oWd_Rhw1Wzch z0B6ISv<3?kk297pQMNO{nHJF^u?Kfu3?B#(tHIiOgY`KJc`iO>Xxo_Vm~7t^?cPLP z$w+h!)*-p|SqFcnyl7&WKGoJH=FsvX`hJXltW8rDogq1{^Eo{O9mSI89k+EBcLnkm zk22mLf>UBnNA{>Z<&ewGW?w~nINn*@L;S4eU%=K(Us}WeL>>y(|Fm8YH>B6?HEvav(CU;66>Dzr{zHy*i^&XXvO>?x4u_=bTi8!R8;n51+Yxlja&P6|CUGBMp zd$YmIo-#k?ppKZ(MZ720zj`@7MEOI8zvbh61~@-Tdm8IB)~x1c8t;lt-eTdp_OZxD z@mif%rGGoGdEVuH75HMv2>@R#One2|>Y|tCnZn03uO9TUnLdz#oQa*roKued;2yp; zK`#cMjADG31@l);M9)zBf=PRNf7BWR=ZhJyLH9`2n0Jo=pZZojw(eHEhj{A~Snnyxanqxh`2Q9Y=XVhCpogQLdkFZ8NopQtokTbN$v&J!<->kVq&MWY9 z#;g7>(3o1>-=r4$du4;nr*cnfEey^xBk!=@lt26+^#iO6)f=3L|LLpbSYceBqW(e3 zawf&bjU7NH%YIWkIefow%y-5O4zd!`zYjOuV{?KqFW7oMKh->or&ggCj+N>1%l`Rw zKW%1g1^GS5p2A@Nc4B@u*9wtF{!!qp|HEroDx@l&_`7*uWTDZouv#7VCE zaj)h9UM8Pl&7FQ+jg#e}8arx`DAVHj1`ytAtsJjB#?g1WrL*%{H9TC$k55J1Gp5wb@N#-m`*o=!w|I^;+ zhBu&5$-{3~lPCNh&Y_G`&fEQF`q}oL7PHmQ|0de8=N>kpTaRXSS2EAJUeM+V)mqA( zY>*{4bLYy0?v9~g%zeQ3ujvjJ7rQ^i`Y)u8$GOWw#^JGNl&}BnBjwuPMZ;6=?`gv+ z)_?&g5n>0m?{F1#=$64x`ES?cX7UxIw{K?5jB9_m4}YpLx@UWT_)h=Zy39BES~K6C z^S^yF^X(4*8}RSXyN~;K;E(;p0N;q7fAJ&(`|}3uof`|e*KVfrzmxw>ePo}(d=w^v zpY-o2QT>7?7xec{3N3h!yWdhXS;O=p*avxj2)I+Tpefo+eGERS|HAQoXE2VE;nW%U zZBE4BarJk%mrj_m`c2MHbV+7%rps{0nf8Uw!Y439ow|e6Vc*ALp5e&@|EBHRHm)7k z8kAmg8@YAFpA?6CRQTHG#4v@2Z>GK*XdFiO>y`bJ1O`JJyRaj!fWPU^k(*wlJoJ@< zk9-vPl`~xQ#`yeu503?{uRuCe`|+~*i63cv%o(~&wP<}Wuy@JcL5_t@!Q8F@ycd4g z!8m>ZEy}LmPaVmVE*o==9}&JU9uvX;qJ90+LQ~~p)8B0S$xk?f2N~s2?=P$~wRIEq zEgl!05xW*YOP7AnbYkay&UAd2a_*7Q`Deg~IUk~X76$5gFMQ8u+{I0%Lpo~L_{dc8 zUGcB=#919c7Ctb_T`iQC95KYmo&{{Ot$JDK*RzKvJD`)Z0=KaCJaGP$)mQQojg-4q zFf4asv*_!Oyw`X&U*7{B!Rxjy8AcBG{#@|26%Fh6TK1~qhevyamzFwWB+rSAT+8<; z{tvH`GdDb|fBA7D^e=joeQMBouY&)G*4^{*RpZP4f!d}1HT>7yd)TMbn0xP8{AI^R z=PQ<;`owqZu4i&Qkz6V4ogI4x`)}f|bKVs$#_HeFyKNjaa^l>xkJI}H@*P~e(ml2o zdv)z3-_Hqc5$f>TkD<|lIcYq*_~~>8BhDJjd@JLd_VWZ!EpvjpQY}A1>MGN}o^_=6 zrDuMGScEHYy({Y96C(J2!Sf#MJMC9Th!1pvrK_QX|4Z4s$46D2d)#Z!go~hDl8}Tz znVCRUMvgbG!AmB=S}IjbplYe7*^_8XiKoYuU=gU91Zu76g)LE9v?miUJ!WdpNh@g5 zS{d+CEv@CEXnT66Iq_HVM21*h$$8zO7NDNwht^bk7HflBN)KcErje=Bxi_fQ|6yXZ z$Ic~3G`v7D^n$5uYx%Hp|0{Oc%0}X%B_DR$=VHxo&mVc-&hs7iuF2xmZ}`84JFep3 zmiEP-)HCyICWb%dqDxeY@NzieGi|()WeC z#6#1Zaig5ROZTzoD)7Z9)^RECgv&ZNDBoZLJwP$8w6V07Gpjp@jgoKgLUL}e8k4Yb z@WL;h^Szz@6P;<@_V!ozrB}?hc?C6pc$&@k6b2r-xIyt<`KrFg*pw?odzP=!|3i#3 z*Z)VId2@rrK>rs1$r9?KGg^Oy`Z&78&*w3d_a7TPZ!UAw9!YD0nDjLHyEJFTQzoFX z0r;8xSmKp;fiLi9aJ48k8(f8<&(16W&e?mBGQ`XUc=dxF5KiM`7t>k^

Xe~Nqi*39Z2DpbKSoEjNu?Yq9pyeYqoX=)|&jsDHmrC zA(L-f10#v|E)izDpS*s{j#ef&%6~Y z!q>!i!@Va4A5Ry3)~Y_%SJK7Z~qF@^Z&nw*a|S3}ue}`;|J6R}ZYB zvhVAN7ir@8o5Y0boJ*N0Ui84;2suV3)_;q+#`!*tckMi%!SfC9hlrWDD84V!S{E~W zB0RU#r{YK_lZWTNCERh%{DAS^!|Q|IYg2<>e9h`^)@5&c&1&XRyh!zNWwh>CJ+C{t zdS1U`&qi^cCcxc32k|dUrYpxs)z#qa2=i91oepB+{yO3_(+>tqq6heUulTCYR|A3i z8090$1#4FDy#@cytLXA?jOXq)=9AnVX$=uudKpTDI$T+osF3USnd@rJrd%>aa^c13YRN7dl+@4PyM1pMbT=zG&Cs## z3TY-kkYa%*hVjXUzgKGRN$g!fTfU#ZFcsr}QiGODSZ7$|6tZv!bQ^A*mE9&}# zt0R^Mi zeZeX-K0=v~CThBet)AMgJ_D=c-S@AF*#F^A^*F+o-bn0oMUdPpUHIaFxyG`ZvVwhZ z_3G}aqs^>3@O2k$p23=p$>ZL!PdjUVT;^`>GvAeHe`m?zoC0DS@(B> zr?ck%`|aS{ub}6@=pFT6bj)b(3NL793_qg$j#nDHBb1HM#&+m?7jfaxLG)MXu?9N% zHuRx=y|fwA8e`0((>2{SPGSAt4)N*hy#@}nifE_+B zfBNg|MoxNTZo%|}7mey1d0M(uxc7gbH3M(YES~Osb^5)phsI4$upjbz=u^{$>%!@S z7hTbL_`K@rZ_HgX{q338PJfMkrT_aZHru-C_i7BkSblEz0d%+o=gL~@Bi+LuG1D`^ z{v7m&9|5PnV1D!nbNM6mcB7r2@9W&|OsuaXU&K`M@{(WEy8xK~g>pUoqAQG-KK2Ii zQa$M`dBDFn;EX;L$Q#}9yJ_%bXyxXq_nyPI7wtLxqUh$o-nK8f;w#;0_LM7;NA7Rt zv_{AyBAOYEFQ^jPpzrQ)!v1^aKaBT!S7eG7iFe4aD_9Gz*o?GQI9mL|<#`VCDx*K~ z?qdG93ll#&@f*YgipTr@gvqIXo)Lc0Ou$@`K-O*Mk9#=Y*4k}{4l{v?qr&fBJx4l` z_ItHIw*-DES$q#XNO#|fXG!+v&RU*8hL&?bmtr{I4dz8_f(7+&(B6mWen`A#WbMj+ z@r7SA7ILvH9$oTd`R1%IPIhhr+r!|$5PWjF);+ReUZ}9~tvUNE6CBlP>KpqV z+1OiseI1@#9wFa*2V;l_&YtTq->KlZ=7U`o?FCP<35Xer4g7f~`+nDwcT&Gu-SgD5 zm^q%Rb{<04$+gn~%=Aur=DX~rsqFyIyu+tk5d9MKqwJ3z=#%-Jv`s^ej8l8g($l+) z$JhtV&9VO8dNYt&c?NgN;U{9e!Y}=QGcv&99c{jg{+%%Wk7e*hYYy5wS&2VS{Ry5Q z^k2-K7sb(wX{VQd{5YI~=tn7|z0C0PSvI$IdzE?1fgUZ4%kXsw7t2nQU%=*0mK}Hk zI0a(JVmq%1@Z{3eMc~H(aI-q$$!|q`o0yu#H}P8bOri;3gs#UvdvSeW_vX@C=u|i= zxJj4#7vhkh^YWlsSbm6k$QF<+Y75+38iDr2o5kN{18Cn@znnFUN{4*st-)C+GO`1@ ztnD+!%z2l6vG?lO8v~YpPRq%uftA1&I7DIn^NHV>o__-#HOQV;e6>x(%?03qaHFep@66U|!{Be)dxB@0)gk2_ z9G_?M;6-`$KcZgQ8N4@v(IMdWL*xZIwr5zAva@5;FGE+YF{A3Q)cLV6`UHQW7qQn{( z3r;caz0R$3jQHPY$Ss>V{d{aM(=`#8J%E!WGCDR;i4Vy^4gl9KGtYRRhF&9Mv+rdm z=>2uZyPEg*{|AltD6n6|v&;IQ;QO*o#(NFef*X4?_~&f7)jG3j29o5In#x(-!;?mK zcC2u_r)U$xVAUhbrrt{!Mg|c4bBo>Yb_ntGK}0e*ydrw-RH#2 zEa98z{pgaPbed_t-yJ^HrCeu{mqYh$bO+R@@de0#mL9|Y62C6>53a{g{ebmT6O(wc zm-wXV*7&ZQL!2P7W~KP4wH9ISK>Z%i;8^ufUzp!|Fa50DG~R1$F`i^+I5@i;+pGE* zKE(Tom5SAWr9XooBqx6=;q{U~4!$bcD2B4iCEmcA9mhA@76^EQ@Z3uDyfEKvd&GFS zoCUwc`zyXw`DQ}kk#hF5!K>tVCg9iG&AnQ>|5j%s;;f6~ zoK2qF!qipt9VXYS{!jd-!g~T)CEt~v|E99|M&!@uH}^L%^uyPivVUY7mNTxzGl)0k`gb1`zYIDO%%lwrP_V+5Z}h3*UE z*O`LfOF3Kl{!Wls3G%^~FBqrXV@FEr#(0BGqdQ&n3)zc`Z5V7iqx1V$kh_w$#m6(~ zwTIyUl0nCzNo-haTkhd5U?{MZ^{*%m-kDu&2F|^Mw(C1Xe?o4F=$?tEQ`g@uF*pFkoUxu$7 zZ(+}L#I@69yNidf05-jhVcsile?NPn_)7O?Ml73t@*DN%^X&w>eE)E>ZP`S#RkBoh zu0$)6dEpUf&;1=fEGLmB#*IlusTX^kKWt^hmas+IV8c z{FbEt_DOUmc&T*hcZj1)_Ycl)CU3vy_Ac>maqQ~fGhf+i9pt%Ctndlh$eeLWh(>-@ z;boSPD_y*(g1jlVOiAi3mAQIInQOIogC0z7ga~swuz(yOH;3;{Ft-@_7b6MIJOHnJ z94XR;uSXu}Tn&BQLOJPS8q3S}8~c*_{5I=bWqyT`8e{4MjzWaVYr zhTph%Y|NfNjAH}!GEVu>osp)KF%N|EIH#S>(PWGve=4!$wjJFO>f0202;4WG3B zefFlF^z)gWo6S3f?02ui2Z3Faq`i1GxeVa#dN&9A03O~mOTUzN7()lT^*zi{`*&A= z0v^YHs$@VYNsbE2oUnZsrj`qaJb#|wrgQND6@UUz3+|Io9&nzPOgql0f7dhWLo z*lFxP#rNA3DC`TP4|4yWy#q{qOL>;;d0b$VWDd1gV1vUSBNqoe!KZEvajeLstAItA zXSbHKd-}Z`KO=RJuaZ>*?8Df(HnA_UUT|Z+&HByG7yO+S0eAI0Q*)ud=9A0idUVMn zo#qVfXZq*!q*MHzJ~4P&XC*L`F2O!?S5=ZYzo(Ef4-i+QF+ZJ$Ke8}&6W?R?RN{$6hQBLDuS z9qfa=1$+`J+cn)QpfC7rO0i4(7~hq}>`4)eS%DpW2Y&Fdd1kMfwqr}U$e>3|Ou1FY zn+eRrlnFh;ei1kqqAURcd+=E;4JEj%p8q?rK@`sy=hv-*=SenH8T|Iesqnjl+Xn04 z!@znSYZ*j_C77Ge^T787m+EQk;YP5DH-NM4w3#VRloA88Z7$#Fb5@)-MMKA5ZZB;l z7^N;?=D6rA)PGBU8s+3Q#FMrKCSH-2Ob8G6%yW(Na`?j;jm^TDFlF^_D)4UP|5t!F zca#nMg1*PV z$kB58dWkl4wrwB3z1AiRdOt_M*B)htGKxoj0v&0CXr8rbrk{faBRh*|Uok)j3l?@p zn4euAWC&}yG|ipH(q&xQ7fi#fUoYdzu-0YFCC1tYz?0rI zQsISUEHH~2>^a)qD0r`$FP%kxtni%N95nuyv-2Phu1D}SroGfXGB~@Az6Hl7^x4c? zgG+x+xdZemS^>tzzZZGSw0-kENeq^!YLqdg4!ySBcbv7BDWS;bP{ z%J9F>>npe)5&5+gd}vi!)!9iI+4$JGwp^|qGtziJQ~jb->SGJ!>Kbt1CzRRF{b??J z%I{-diJef6`HX06>o89|;stDtE#TZyc+@Q5{a?)U9b&YP!mobF|H_lp!u>gM##RMR z>OLC%>6>tabu5=(0b1YN1kaG}lSIDQJ~G3+*Vxasx)naDq3<(#k1m#zhc4|erGJ8| z3lFaUL}v~9<2vplzLoVT#|E9oh4Wg+1K{lS%rk*ac3=VVv*5MxE6lU- zM>zQ&@Xmv88OGRRrsN++SCx${x<3S5?aI2(q?AoK2O0j|KST>Txq3_mPmS6PR5l_mZ-9$*~qRi;OMq~$kV8uVt0 zrjX|o_?0irtwuk9U*E$Vqzm+7gG`{WH1H*_^*{*Nu4Nwd$=oKUzMXB8aoRIZ5#Fmk zefzq;(cW7_V6&5X_;n|znzD6gafbVUDDz!(VfAyW-f3L&ah{`Ch8L~wnHknUClfS_ z%CIMb;198M)o10IJtKJ@1Fqg5=%3r(=rmNKD?W%{MZUib>-W$|{Xfi}$3L{ZZeIIp zr=iN+Q7RcUjpxJg_-Tx#7hJS(zj&0VxW+f&9k;_v+m)Y;HrvUu6&qPO-_`%fC*?li zzKW>gLjsIJ@s=8sd^~6JE5FVGzQ4w=zDs6^227Z{36TvkWYu$vaxoG=@2v5C?5Uhi zbqjG1ck`!MlV*G)qVcZF-`{)~{ZRd&=oIciKWbSKpQke%JK!hH=tvQKD0hQP+WYNg ztmyjD4)9?Iyd_C4M#0&S5%KRhc$WR&hk(Va%&8Th@^;F~wtN=dgXzs6ev9wR?`GNCMvaV84TEz0Ept=QRq_h>8TIsQba$3`(2>); zOTbyd$-+mmD3i=U5%9sz^LfhFQJ(e~3RrK+Gwqkr4{$F?9mhsJi?Qim8QCD%H_2ZwNb+6p@UtxrE&p(A z{QFbIGoQ6QGemC69neA=9Mv6sf^8BT-$0}EC);sjdKy=GBMlzc@Fyk0oHaD;aUcBt^b`F{0ZkZQq}A~(Y3l{>?& zg1h)pBFdinxza-lQs2kskZoqbna~DbmrLYVmK(*ai*)867f z<~Vg)wvFr2ONfPg9{r`_KF8icxsWz1-sC+nub9R=J+t;PY)cErLnA!tlND*FA&GAK zFnCb$pnopAJQ%uAvZ>Sd;0ce+=oXQ=?kILfuZCfbJV)K@U{fD5OdyY=elmB_;2(Cem?`u3~&zt zGXuFEz&dRF4=*hxI=IoQ1P< zupQLKYR!jr(j4R~J_M`|@+bY`5AsX04!L(KqxY}yUTeD%_`o|n!~GP$q%Q|OO#SIw zfE>xva}QF#j{gs`E)T*}w62PYTDh~lHOVvbuUK=PN*lyQ&C_?)jnJ;%8xw2|>EHcmEb#L9$&lD^vvQM+EAaKe~#NpErFIKcm9f;T}3}R8Q8>myBkWcSd#!>wC+pz zYeBZ;Vzhq<4P?OAV&Y4g4{@)XOSj`A5?_}O(twYOS6F516sC@|MrmXvw6(jLZ;FAB zNl)K!fj1kP*p8i?2Io~5SVX@-J#vvorDMU*86&YOL(YwB{3{8tU%4}=yKs)Q0VjVR z_%PA$gi|Kw$I>T}QK#y5&DcE)n3K*B{TyB?_)lSt-nQ%bGrw)xlpL0AEPPwd*wx21 zjC=pLqn`8_^v%ug?U&g-9>s@h-&4LFojq*?ZwNl#rv0-p`#!|_^(BB0Fgl|6jjw&0 z_;%Vhfktq-cPe}s*o^!ae@&=IeNiK`=~?rZsF}#PH(-O{4y#}*%M7wBEl z6dw_}M#;$vEk1gc^>1~VM9ALPTQCzpDKfGsuX5il%qM;>IE@_61V_$|BkQ4shDzoY zhu^~2X2)66IBOk;uk8RnF3$<}q7?ff+YG+3S1@>obxvcy>brE?k*w8^z`a`9so;Ei zEp64(27F`do64)h7y^`O=6`!-e<6Sq)0n}ZsUX}H+jSGtZ| z)Glz20ZYN!Wo+gh^ur^_B++{Xv~ivLp>yOqN4o&Nw4VE94Qm#Mj;?e}p<DPy`%Oic&+dk+9{XMw1YNsoFPxtF0{D)<%CL^| zX}MLzGZD|)%exBM`+|@3jxPxBocb9$pHIw5LiEo&VeA?zY?o;55 zt6y(oeVkZl;bQuix6Z@wILieV=%nNKqYtRhB=nLin_)jt;~NjY$|wA3%F6#60Zxj; zO=J6il0Bjdd~}fq+DrHEjI{PLmI`9xo55)pc`SQWI!qcFlGIqqC6PcV*twIFA_vE5 zCt)ZXocoirFpQwb{gzzr_;#YRX{QG~(;EE?w_e3B0Y@ieFiJe1yTl4_9(7}4E zOr_>VyW-3EvwJGv7~HBdwMCAH%~-7QYhIxt^MYr|&$Rak{7OfQKwE+%zRvN2rGqYA zfll-~?<4EJx)1s6-H+d+V@14Mbk7`l&t7z%zfRisRNe3A`Wrp6GpPPX%hZ_&+^ z$LWYk2fgT}rfodm7Dygu;iPgGtGtEb$hm@D?z_Gnk?uv=DU4Y#)%~4U0sF7v>(uw( zVMEK_abF$WiY<9$KXO`rxI2+831~+D-@X7@M0t%xHrzN&b&fj(qFXyGL^DwH^UwFr?&e%ea_`h$XvVq zmE419{SU>dWBd=VC&se~ze8c_qrg%!Tzo}3aAL)rd1-Jvfeo?ul<~Zw@ly6Nje|I; z#Qwoq8rLnr>oMjb`B$KPVB*tvjJE!ozuk_0UqvUhdNBAd zUff~%_i)QkWvAW<4s_5?(%5B=U9*X)C$i&E8+DZiFpE@EPUV7un_%_a#yVz!7_R)a#R`kJ*kqslf3z;wN zM`Q3oivyF-@W%TvuxIFO9P`=*+$-tFJ-mjFdl(x^=hP3OA0Di8yq(}q)wt6=+B_1; z4EF}H-KFdOc!p_{KY(%VE@VIZ<$%e5jI*b4#>ala5tAtP!sFP3A0GO00vNgY5)8fx zcR2C~J(Dr{XS(@KuylI(N|B`|8Kxg z!t}@549w-dU~m9CRb{Ifzu#s_s@HD|U#VhP{J0On^)>KZWu(K!ZNKcx@Qyu}0qvjT z8`r+U??v*-tB%f-w!Ki+ny8Hp{D8T3*x2cU z)Nb~EWN#J6{Bs+R8$n{H)?bYJWE4*WSf(+Cu%=RmS=n^l!(6 zmfZeJ7vCCmmuD6$Zb&>(ZQlqCvCCVxvwtl=+YQXMo&Uec|9QZr-At&jDr_lj=N!}y zcNh!x zt0UpD-URk`^gb7}qxbQE>b9I--!3k1{U_dj`_qoVV^J1_->mp$%M`L^cwJt@1I~z z((`>Di|xC)c9dD1#=jtVJj8fTwc*>ykt9G!8A<|Dm5abZP&my?D!TuZ(rCMJ82Iw#=A;2)=6dSBV_nA1G{P zYy-8_k^D|Gmnt)1SCuK+^+<($nw+Unj5pu3z83#Z*(1|@bcQ0k2ZfAqIzJ75ZZ9Hk zC+oM6k0Q<7wg;SsjC=$6;1;k!C)~te{P-ws9?hIQ^nD3WTVDctZ-eHlH4q)%LqF*Q zem`l^IQ^?1hw+8M!}NiY@@DlDPE@N;=m-zstC^zj+V8zwmj7?LWC@O1|dUL4OJGz{F;<{=}4E&*0lxWIj$lD&$cQbRgVO z{I7I6bD8nxvL*>|VBZ+iGdpnhoaVAc*lA|bwl$^s=~1TVr7BaN_`xE{qJac{ihF)A zTE3a_3H<-qCdGnYoP1X;gv4y zF8^_YIf$=1w99=TebbqPa7_B!q4VG+;zh_Qm62arzQtbZA3Bd10?O#U?`wVP;RC_E zXglKwpc~ZCwoAYA^+_L*t|uSd(DITw>MIw!83$jpe%Xc}(MRL(m}j1E+1mo1*P$PQ z%X>{avWs?GtH_Hsfi*J7$OO3F1U?V-$!dR}e#N(Ui)V{}gpr*g6X<)MaRrXl%*%}t z+}aaHHY&G~#-zH$lzdP(5$mk7@-)!5Q+1IuL+W}%>k7xxlo3uP^(z{&brRKoLf36! zt=-9M*n#BEPqFOeebM?#Q|_kNEwb%vgN&lM8rjQALT!Oq@dc>3OP-n%Np+M=&*jGR5gyE=w^MrYSL zyVoGEmh81WN%uDh*DSqd_o5B384TjnLpR*V*jHAE>BsSIp{@PV8Q#mhJAPZ4*N=}J zIZ)n6oKO3g0u7bWp=gD;gVeS3AK-562(U`C7aw}hY4|kwX-aC=EXP0d6nnzPlwK%( zN#D?M$`6ne$c$?thv|e=jF<-Sv>dq4QhVY%RkV435ofuhK8+`k2b5bKWA88Yiu2Z= z!8gUPrx~BQDeQfZ_5UzG^zV`YE>VYZX`kvCZA<^u-jd?zj;{Uh&feBDI(rx7dA)+? z0?rh%=iJL$9^5ph^T5~zoxO|LlhryFCobu|8hwCuoC$t96FHkO)}hR0oxQB_fw6(k zgPbqYKDEo*9$=jhvd)KC-@~l$Ypm}dS>MC=j_v&8*UiAUnO~T3+4WhwC%Zm=JcZWB z;uy3jdCuLIJw=xy7b|ow+vb9eiq|Y=&d{{|e-PbRe7nWQp%uGTqU^)ElS?&1_IBx|pO zU!Gts<^mUu9eZT={u2@ScrdCxeDR>Sy%nv z%)1KWXn&W*oT zb5cLjAGNoFtJzgpbC9RI6>@Ks*m?!)>}LWIB^~ce4R|bo`4gbX=aXEncq@c zFqu18;Sag|Ht_4+l6!TOt)uJ$e22e{yh5ym+a86g>r{RfXP*ya1Kv1gcn4BfK;9whmd)7RC$>mgEKIJ>j@o^X3S8d3CJ=s2GklWFhvuy{! z+iA34V+w4phV^-jmwu!(BWM?ZV=Sf`LNZw1C} z+9F<@8|UA_j5Z=x#yURSn1|q2NqgX_my^wcn`ljN6CN6^8T>##;9T31`|z2?zCLel zC*+F7AFJ0}-x2!ZOBZ9K(T;FhzC`(SG@k_ioIj%n&0Ft z+j_T)e#Oreufkp^JW+Sm6{Ic^{D`d+?-R^tG3JE)^n7c`)>*l8E;?ahUl5)$wC=fl zPjEhwx_hi`#{6{`+)%vvk=h@MH@>}S=d61zbF|h1j1=1?ycImYO}(65ryQ)$u* zqqXH8)`;NA+G;N9KM4&?roCRuC*i*nusYgn z7Av06>H~ax7#%_DT1K0(UlBvJ8-B%o8ZqFG{h+fwJ(Jb;6Yy%}#{^5)6H*<}xnm~a z?+|<@q_*ILliYNXH6h9h7qx~OZ!NHr4X!m#Gw#pRZW11$v8Ne3da&(B?R*wqlfxOG zr#)@?a|LmUy|kHyL6?O=7VgN<;t2a75$318kdgQ>4jz?0Kx~}+Xul76m%!696$$c! z8!NLImpuoib#xfp%!~1L&+^Yh0iVU7oo{Se(QMAlW;>bIw1b``IWA~YVB=- zNtuhxt?W&CQx}>xcu|ASsp%eqoUVVEdg?Tlnb#>p!Y%E*THYab2Wxa`I2uM;oS-E(eodH z*ZU(bvv!BthF-vAy>RU`XzYgYzL zYVR~XE7{X@4-}O9{Q6OQW}V#hDd68Fz9AZ%!`uWL>4(@3(HF0ZbxIe!1KLUxOQ>9m z-SAX9m#!)7_e@AVEPpq9kvTnH`wPB)^lM9hikX7%NB2PYNqn6{>#Du)+WN)ON70pt zkD66U|DxxkJSR>6T+a0L#PaQ##T7g7pQQ0!8~ps~GCyyg_L}Uu^>EDEg21oKEWE&u z&Eh%xyqT{w{e->UK5{+&qUo&@~$qVrkg(hv{O z`m+BPeG|X9a!cuytdv{PzYpxtT^5wXkTfo0jeC12A<$dbqVyYIem*~ z)z@7N&t&ThzjyM#_E(?f|C}Fz+X$A{Fg^zwt-Vd>{&$uxpq~ZJv0EMB=ReL`^{nMNW7R=fdyUhA*;}^eg z^qxRbwDv;Bi?g>TJ#+&!yOyyNdsY3FKNNc<*vcv|UWA{k{tm|J4*$e->FR>zQ2Kf| zd!E?+iTnh=uynSDGIa-vy#Znl#FJjc5B&^wy?o(zzN{a(QvW>mR~-3AY(wAk(!Yvh z^JK3Z-pfbOmj5+!Lz?mJ?>h~N(wa4jnQT83xM62hp6TwLVH*YH%h^)z^X zBX!BC(07{p3rxz|7?V=-;hQn`@UTz!Op;DSn}Kx`COM4X#m}#tgpZ9hv!Um`$do-5 z%;`P&;2XdO|4K9nTyF%}h-wJN_uZYY` z@|(stqxEr@^Gu&@0cX6Z#f-iwB7fdg`MPkS&}e+IVAROazCZRF;Zd(Q5aXs@D6JW{@L@vdv+f4baw z@(ULyHta1n9dF-#U;_5sgw)TNNBc6)WrEM*lL7lnt}tML&J%57KFT+Hv1t7!U-#_g zK8GESncMuOtILJE3C1X2R9?x#HNC8@?2p9GnXRGBgmT&We}?YSr5kj&oM>P?G^V~S z?F{knYP~D^gAL1(C(YCkQ=hiR>;DS=e}a9>-!t!=9TbyZ@Tn2rOSFHp&DRa@X3nAO z@E2l7A7{*xw*~0CY4LS@iL$+(r@VdcKEr#K|7|}j9L28 z0s05Jm!8GikBdlK1~*jq4C`~AQmz?z{)ev$dq(Dp_AxxAmwcy^MHTy=6dB|L~T z7U_xTpYZsdmdEGXb+n)A&h*rFf<5M3+tswaZAe>Aj5(s;KF>R~NsQY+Y}4w&lNEzk zGS{xdk&su)oo4p`EG`!@UbS%%ZN$+1-vyUqq6_eOZ1$UQcP8`K{@yHXDr?Iu^Y=J? zeI^jq{@xDO3D{I`XI#=}h>>U&PjgqynrC=F7223jo8MLucR-N$92n`T_U*GMn4Cp!@C8 zK1vdPBb-Zs7vi%UN*AtarahGpVe1Fr8*yYvEo0L-q?1dx$&F?10Qa%X@o8JKHBLKA zf!TjBmfV~)hZlI({Ph1i#wR}k`+BX7#6u^i#Clw3q^~be9)mtx7#)smOI!O_{^OEV zkUE*5+4ddQMDdBLvocWBYL1VXqkeY~x2d)-KNS_hSG$Wy?wzbm2kLQIo*0j4>`_BOvmpx8bu|VAS5}2IW>+s#(86dy^aPNI+ zPd=BS_LzhJBFus&^H2GHVUFF+Ql5 zw)>Uj_<-g{a>q;=a!qwa8=}MBedw{&)7XdBOF$!`E__bdy-CUg%km1wGL1Y18DQ0W z(D9aJ>uFC%Z7NpApr6Q}r{_QLyI>l62>hdI9KLz#Mfe_Izlr_D@&(+-6eM;wWK4OO z=iFRl$b|l&_V-FsN!BicKB)T%_G7yaqGu+c8@~?p#`6IA|9^{psW_#l;VHt;2ly2Y zzDMr6C+xS$(Vz3~``PzuuVb$7r~h7_Uw0edgs*RL&k*ewYOKQf6TzzT8t(S&044{S z^LG9Oliz}KN&G0HyR_oOZXV-(61uMBe!RD!7oEYbISve2gWeHU<-MF|>;bP`a7sR( z1N3KcK=ShZxn3{xxCk1};e>39CBl2gl;e>@WB&Ym^MLhxQ+z9)r(|xB=!j zp79y_oQSQving@gkt{~vPb0f^mx6^sW{h_abrs8=30_tn);#}BsHC9<$j{S>oQtlbby~{c) zzMB1Bty$E40Xq=+=l&Fb(F^b-7yX{RPoK`dLl5ZGJM7&(O>4sa8t-?Q%MIu?ucE6k z=B^034Z6q1r}(Rijq$3wnzuZ}U1@dbI_>B-)aK& zzU1Vbw=?H3a4Zi_9>t#61qtxj)_Y~Fmz!q>JkUI6Fh=3+)$CJ=w<+$q30c+3Z>8Ej zGV5f!owQ56*`nJhf40pV#(9sjZvU=v7<^w#qbJLMpYq_HUC)(vJquFzfiM1gau$yN zh4b@iDRw%hSpk0d|$CiuirXWpD9Y{fV{MY`oYaA6<3 z{|wrI&qd#49^YkdG41oBAB^BVx|jEVniq13F;Z_rN_v#x+flto&g$94=6oI5EPdd2 zf(N#ZzRB-=6q}}C+@@0ec|MM%3s26oPV)q}EbhJd!TW#p;pM-7{e$<{@;;{fKfpz; zL(MOohGzM+=iqN5-psk~jGi#GD4b2dF*v)5clxGsG2&4p*qqS%;$G%b0dD*VSlG3A zuh2UPE#qS^uKAf`_aXINHn9DE{RHo7edAtVNBoj+-^}60)(PH1z8TKu#OS~2Ow%)p zXK-M5gmW-C8a-QcQhp0)C6S|z$wgi{W$`;T+)2CQ17#=InY+KU|GUU9M>bx->1*RI zmH=~fustLm8`t8~%ne1zl#_@= zVA09>z6sAY;t8yU%UWs8!haZ?W!DLrcsKJFY?=k9aZyiv>{aT#N8bh;NpMP2&%&{L znw1g47Z>`x5uGW<*v*Fdp0#xt`*uT~XmYh|H(!0b#s1#*_Imr<^!APTG&bFEg*itLD2ce?y5E;LMK+7Pj8Sn3BLbK^*geqr_=*uRw>| zTo?4P8(UBCJwx7g@Mm$wI{$tU_crMfC8^Q{rfnR5ikUX>>?C;;@kbWdaCcfSxrosR zy=|PIS6N^XT>?)L-$`>`Nq$bf8!R&D`NgSE@=dx$rr2zq$et8%D$gM2++mWrg{hku zyZG0M^;b=gAsbJizw8f`?9v$$=|kHB#k+K`kNic8elfW8UFxVF@CV0BQZHufgFjmZ zBb|-70{QKK7yJuTce1V(?M?&v8(TY|?Ie2f_0-3&ho5&+>btao?bx>fUZrRGARo-O z+Y3I5{;GJ^UX{k`LO(}&mfp3O?`lhNyTG?A^2+p+xPF1w0GehUy3C;w-ervAG~ie% z+;;O%mOG1bVQk-Kt$<@pXwdgoiFP zyf*mVEtxERX$%&}?m;(#`q-6h^=>TVAd)%W%&4#U^^#aG3v+5*Mc{DpmS z$qaOO>FybHt5Ak9ybSD_he0Qldv`{9?*FftN(;~akf(871bo%~DN zqXC;6@eX`*NrOIhbL8*tF}C^|v0L&5_A=fud)k&B*zb@J{M36ob(LDl&qiZZ9z_611wfyufJ4k&y;O6{gb>r+F3>U3D|R= zhPH$gxp5s_3j9xPAKP;nxTkv)-&yaJ4}RS#|8Ls8kNY<3Xve)2`GwA4(6Llb&k@F} zXS2>(QbHe}p`6}9Kh@eJ*Z(RfJ#~TB>y$okLVv=yR{UjfBi{0f=@DZ_3r>IfCos?* zD>2He{V$+r5xY`cCmdvqr?ySIOK0`K1bV)Cuy`W z^)>2?53U#dES(mne$D^C;!nI%v?^Y!zTN>Z9^u`1=G+IrpK;2ZmUHivc$@ozVpNFB zq>OlTjxXCdVEo+ga95)PJ}2eVyl;~CHhlVJ%8DnQE!l~#&|ZZu1DNSG{4vB# zKP-J_RHElAtV?83d>-^YuJR7n)`a#SN5AP9gH1%A*8E>}!majI^48>!Y8lv&MUBTjzo2@+~PDfFDjg_XcFL^&Oyhy2Smz{D;BWH)}r3L4CTE)p;e& z)$qIt9I$7wfaAHqOz%&nt22Hzxb$|u9jCur;VIqBsbp%%<_8MTVwguc_5$K&wR z!K@E=Hnd7$c`-UVyt^cIzjOs;jQ>0#)ef9<_!OnAa|M9)&U>Unc8UrhqRad323DTd1Uz2-lOnJZ4QUtR7d5N z|3cs3F@MJ&PY2)d&lRh$-lynGa0X7){ZL=x=efP}i29<>Fu$k5aR&1`gZ9*4FKufq zf@udhF+=yCp291|&m8rCC;e~720T#UO=Mrz4V>2bE_#mi1@Uh2?PKuo!>pxnUh@(x zV^0pwieMA4Cq59tev>S!L}#5~$jygNF`M-dkL25@{MeZT&_IMT74M*+w&P5uDYJ+K?X8y(YAzBxo*FzK0C7 z_Z78eZ9kN4FGhPR zuQsKdbb!B+k&`@Eb^|%zc0yCaE&D!Q>IvuU|1(NGtq=5 z*8hyDmN}|y`%cMjo3q6FD-;KMHD$g-nPzk*#e$iwYSx3G4a&&QyJ z4ZOE}n0fw~y4t5?f5O@Wy>;Y@S>Sk^0_4KtoJ1b|2Kg)FZyNIuOm&~K<%O)3c;P(S z$l--}#C<%={y;Bm_!Z-WKBHIhPVl*t`>PE&*Zwv-7;QD>i zX! zC#ik$d|(s0k8jMWm;Gt!+k>r6IcJv3EAcg&WOHc-9wA;amodIc9pR{pE)-_m!bLYr zL%I1|ogII`bBu95_}~(M6IUJjmwpB87grExAl={AKZSSw`We=izQ2zxat`%%zxGk? z!A`>i1V86&)AJB>BBxxjU2EPw!<@7hRr=1_N(WF`@hiQj&pl62Mzj$Imbv|m%1+MJ zQcid_l{OWZ9M9sj#;S4uzmE4&_F))r1LM7ywO&O%D=(S1aD3Zs&JxXiFu>mVCh=~| zx5j^&dFj1)hTe_iS+rn?vk$S(4r?-tJ=Ta$~t0gOkeGHxVI@g=iI)+H0I9P{Nnanr{P#Z`|mU!XZb1{@1I~CdLL)K z1V{BDIOgyzXJZx6hQ6K3dqo4fTfO}S&Uuih`?K^TJ`!3^U+|LVG%!KGNsxot#Xpik z&LpKD;uDeY|BJNy4zzY9_2{=#zWgf2(E&ah_D|${(D#lzSO?WB{D^lwbt)-e%XvwUfmgQQ=`@HBbW1;ZH-ZoC?qxmV1@|}&*8;2K!`n-h z`zdB7;wLHXTkthsACE8&>EzFC(7Hm)%WwTVevz};#4n`79LvIKE$zk0>G=QEj_hC^ z9$+kLN4PD2(1CvjbL5@F9Hl=^LH0_fXNcQhPd({u3C^d6Za|O5ztsMDe@`IH|8rOu zt%)6LR$h#7$iKonhq^}f!LRMu+0566_tKAO4>LM%7J3?awc5YUI>Z0N`1yq+x@T5- z`U3nfy7-2rRp}Xt>Otg)8AmKK_k5|IgAYS^Ud1=z;4ftB!CwU19IRvDVI6C)F+}i{ z{DK&4?TzeVUbBhE)35O30J_Wp`mJQ{kyCj1LULTyKnu?yJ6@)|#T(b3$8hEmM(*dv zE?KF)`p*s-w|tAXPSUS4fX@Dp>Rgqr6J~tcPrHrztWv%Lo&^ixrs5&>D_m^93m9zY0u8%>?vLlTp9Lv8mH{{(*}(-*U@cY$l- zHNr{Dx8aMKb-s)j&wdQPB3u#v2}drHj?b@T-2YO)h5FL@UG}t2v;H1m4{*`TC4(xN z-`SLHqRec{OUJ2ZexjG~N}pct;{DCE6XKjlB{V4hzKt^oK3|Uw+|L}KjeM6_3hGCn zr+kRqB3d8q`Q*wUWB$GzM2;Z?f2O%p*792VE5iq1b3)?>7|EKIQ9r`p80P5n9?p$W zCL(_jWtNK{Cyez$sT_1so}(LwI*xGf6xsR+F*Td%Gm`f~JEDPHUq``>lYI>-GZG%I zGb++`g&*-FgG>K(!jGqxe^mPsG0u`4XH8DVDKbvQ?`~lXy4&=7tm99~FROg=33%>l z;JD(ak8*wi9NcX#4#7u?qGv)&20o(L&DqTB3gDy|r<&k|`Zs~gCZ44W>D>9lz@UXY zqqT0wL<7868@9bCLS6xFg*daN`-zCV*`;z#_%v&|<61QMF22JFL4ObbXaJjv_@eKD zKibRB#ZJ$poP0pH(=YOTykaM8`%C@tp19DD7b5m8dNVrsQO12Yb5$L`oOnc0^a$mW zBQ&p~=;tYSH!#>jIp)=;c;O{SYv#FU`s+C~2W$)(Vc=iZ*LXerlH9N(;jKRdW^0jE z#D-!gPf9%~xPeD$?ZHt;@7lBP5{lo$hRFFV74NZe)))Nx&O=R`qEqY-@tzpd{>-;g~2y{SpByTt8K4N zaT;9iAUVc)Q|hk>Lswew$=S6Pj6MR4#`3(0KE9S~C+WBIecEyHCv6WDoUEG$-?jd# zJBGSb!7r`DEz~_m+gg_d|65*Z@x`Rp@thks?OD5EHSff)Z{=4pcG{B=ZYvf@?-he< z_XL!$2_52*zo3WcUieYzx80q={{P}xccTdA3F#y0bGYvUZr0D2pv;-@eOu04=p~4SEaO@H!mS$REjo{w80I!pF<0P? z>WhDhm+c_`lk&;LD0@rUIIoa;2HAWafAWFKZ*R{aus5k(K`&mwc^S^c=*-MZw4+$n zRpfutT<2f|@BiIQ?{RSU_=%7gM9)~w*xWN^!(mH8*GF0F-)Q}b^%ETq*ql~R+ZdW- z+TW7h&$>-v?d_TnZv`Z%{2KgH=myQKi>tFjtRr=zw_;DaEuSiPxhL;#>KT5yylJy+ zW}TULuMz(*OiiJU0gH#+vBm$gd9BX^{QKRX{ak#4m;1NDZ7zQ0@ZSb!C$SSktp0^@`FndssRVwVC~KIw)AR^86StFdgt6%VyHB1& z@^kDfe#gAgvNxA+OfjMx*aH^L`1oygvV51gW!8M}SNY~(C%X7++~G0LA?Hh)cHJrL z*N9)2O!daXU(&=6iH4fNA7>o6K|ObPV8E{RoT=V*#3L$hz_&+>qWR#FboL#rIZlDD z#Ih^dS2l|jCl%9P-PyyvTjrRaCBV3S*%>`;wX=n{J;oHbCed{!5qHI!_9#xoaQ*=u zM={Ag_@$TH`d#ejYJC`M4wrHO`hQgK?Ej`3sWPjLPu4SfY zA8<53yxi`?5Dz;mKDRSHtzV;d>h9UwpKCc#Bek4EOjhwh!uL6dCJc!9#UY( zqH{-n9HQi;@v%=%>dGcq^Z~-snwh=5A#L#o}t&sC8t3Q%o^GG(o zfH5m{zn020q06wg_(8)fR8M&X%nbH{v+c-tRW%acI0IP*-DLjLuNR};NQtj!<@&Sl zh=B%-fQ#{Qfj1+O#=)`uX1l-Wt2` zvKHICf;s4(MDiPKkq=wnv@T1aE#=`WW31xq(l^B0bN4lBed5ghhEcJe2l0c};Q`}} zwfTPgi_o_O6Xm`U&RE!B&mYIvbQAb5zg{48YmUrIoesVwsGqxER%_<+EFW1K zdyp8)S>HV|c5axygxfkhF$nL_^T{*mz(o8Y3@r*CHpd3{c&uTcch&I9>EgS$Ft=^o zwklp2F*<_J^*E^t)A@=dU8a33r4f z$_)BRVX6f_{lT3ZPj(vMp*bHFZHzVp_n!Oy=Jn^&P7%4eOmJ5MJwCF|Oj29Ax1pCg zM!2)Sg8W&+yP>haA=X@L*Mto;z;z6-wT4C<+UuREo0bN-#|RVKeY zw0{Tw5m_4ZBJU0R|38MI^%#fttR$DUF5hBZLhyRg&B?V{>&HmvQ6?6X-@71nkaM@_ z?t4FmtmvI2-sMEWv)P$YqDS|1i#(VAhLROcbI$ab^w3f<9!T1uvz=4x0`;&ICBR^N;su&DfG?sin;w7 zqgnoy{^Q7oFMwxyeu?;>An(?5=KyCqna>29mkS@oUh&g|@-@-c2Yr|}#fM%?{oVWu ze`1B`G~_1m&#eV4?{b{x>ZG&4TTUVkOJLWKLM&`oSb>N%c?C;F2GoJWuc#`!D-HKh-mV#9qk^ z^qsEb7lyptSz;S2^ng=-4s((}rknLHL1)d$_1qb5?TZ~<@*At?O16uaH=>J#F6Mkc zxUv=hmvTBaq8I4<3f6TSYj^7!{OIHXdL3L7ynaKT zvGOW(I{cwgr^}RUKNDT7p#yo7D^oDd^r-z8fgSlj8+Jgmxo@f;F(0{5XEvI~=q`xM z*CgSmP2>W)q4eWxb}-J~I&@mrHFCNyAIJ^Rqd8{S$JIB%BEt93>PY_}dCcWgXd++G z4V?e!ps&mW_Wqk{?mI7+t&MGC{VusN9KbHAGUs`rF!?^QXEOLH*)QHKnWngB$%I_l z0B5+WVnJJ0{ul0rwYrRLQni} z1t;;42_wlp%lf8SqYm&Ol04G`?nex{Vb??B4m`4K^(3obMbLW@}Z)g=8`^9XaQfFGN}M5$n1^B_E4 zvX=Mkh0kUz4cfbQu=_0h!_z&%5uP`2fHN7A1xdzCJk4hL4q~z~zMIckssf#98u%=2 zx>eXow6h#Mvu&j3dJeHEYG)5^aQAORA!}jtWx1yOD%H7yIwOgf$kjPA=VYCyRj1mo zBRzm~i4AeeIpnNWn|>d&y`NG}yg@R@AbU%>Lu9VXbMCGg-_6N6b)9MF^k0;34gilk zeA}V|TO$pfR&31vrnA4_&Hi>}e}Cow68q6r)p(YVLyw$|tmj@ic!FcTS>1vx3~)Bb z8At9j#^9I@)zTpy?gW>fqx`JW$uXs>wGO!Nt2H;re7D-t?ffA$@Tu9}d3km_>HWxd1HWoc{A|QIRneH(aU~7-e%cz;BHUlAMgij-M*>Z5aiUS zZIzosJ6c~0<63(T#P93;nJ4>-59v$&sNOi<9k|%EsqO#4=PW-JIOx}nUEtaItN{PC zW;wh%|7^PkS7zJmeTsc=+FC6>`~_qbxP{NNxCuXIGi!3PUc#?ek*%lwcF7gh{XJ)$ z+J_xLEQYyW>gGf4?IKZ2X1!J}umn}jp?#1DW; zGQ+OfJEpncfrdiJwBw6AW&7-q?L!DrJ~`Mrn!jVLY_oFhiYczfyQrf zG&+Pafy-piM`n9IhY0+I90`?|lVhqrVBD?joxlq#OVGcA%u8JH=-4Rw-wsbjPpga& z6TKC=R?k{u?sfz(o#Jj|jmxIJeyrINR}S)@g)3WAvMNgZag#kS!n10gNzYZEnxC!I zi>;0JA5ucns$;OsoC%+V<{?Ex>9^>3a zHauN;+s57W5qwj$$9&+&$}!q+>8W5ZEu#LgdAd0h%KAFm={pPm1bc(r-*Pj2bR070 z<=Mm?q1Sby*BS9n{5)3fb3Wd}j{ofV;^$K`e_SHYdWwAB#=qIT1%fyB{$N=b>qq<* zUlV-PxX<#xcQ5xuqIbnK7Wzf+XRmf{zxe&1d7nvt*a$tsAATbAwy}vE?k%_Ffx{?& zJN?T?pna?uZ72t99DJ#bo%~;eKTUdF3_UG^-kn|tv!J_{QhTp&Sz5P_z}o}#`D@CH z|KAC|r30qv3wzGSQ_E+61$zS010`?5%oVcB;yA#5h;T%GdmcC@KhR;ndnJ0A+Fk>^ z;sMm_>V}qhZ}qb%cO59l*yY%2)zEWb`TQ=~5#7*AT=V?ibYjkxzpOBHF=e9H&8NSO z#5n|4&<=W&m$x9TH-6#llQxHc`oDBV&sXqNM?LN9KB+gSWnDj<^O~}c72hu1PkVVf zS0&v~xl__-OasK4{|ohc^1b_+OsUx!)BPe}fY!MuB#Ayak@7M83(BQZVkWMPOd&tR z*XDEXzO`irfcyO)<7wgB2o+o;`eg?dZ`UT4CM*F%ydlEe9#ITw38hqhTV*UyF zA2T+cIgR;8pf zRz@l!BUlIYXH0lN`>Wbp*aW?b|31jxZ526#sas!)Z5L+$Aid8p1DO&|#lEKZ555mS zTS8nkaM!Dk-iyq@8T8Y85pkT{P2tNiWkcIgZ1w4Fd|hjsHpEZ9z`EEE9Fe+k*LvtT zX|l`Z!;3=4kvhigpOipmc6}cG*xro*USvbRdPhe8A%B+QJbPYyU|2`5KNH=1Qeu_X zA?Iq+czx}Gi&(RwyW8eP7V`b!;M~Y1v936<{(^pE8L@d!Gk(2W09@VRFy2iZCb$^7 zm!g4LT+-~8tpoQVl7XW#K* z?(_K}=VhKI-%A8Mr{Ry+1lnG&G6RQMFNfMp*Ym)0n6+`JE!_1w_fj2V?QDb3iEj29 zQz^XLJFS6hUC{%@?KNL$>t(IR!H;Ny{j*$jPa3AzSl54bY97Wm ze4$@5(bC4q?&5i`n2C}Z(k-Ox1xI^!zkEgF`N6!x{Hp0;t8+<)Z3nIxYlX3Fl7HO5 zyCWu0F8yaaI*QJ?ermUSvNBm4?$Um2+Q*s1zEF8&jlC0bPo?KyVEmnGcW9e;rfhlX zHR?|`&YH=@3h?_j#@r6g2kwhW0xm0xWO&8JT8!_Gg=O=HN zlc=U{&4Fp|g*<ySg6@O`Z4=6p{Kd4?T6pu6B= z*JX6+|Bc8OlUI8XJ-2Iaw&~QffbXh#$@1{PpXd+Wt206waNlWi$%BMW$k=x1JgH;> zcJM$q@TP-;gfvm#6Y3jVYi@b+WwWlI^DN3x*$KeW^{fO-NZqEj%HyK zP`+vl{9fhFWAmc$;vhPR-o;GCya@m8o(unl=cwSn>Q3nO+Xvq#mZdt&bbiQPGUez} z>!2ClOHXKgT>H%CSNZ(5dDN8OB2pZ)^=WR}Ezm)4#trji z5AB6N#dLQYd@a3}9Bh5jO2jNEPs1i%^6+M81{vaKty>>SL^?aMTlj9)%mOdm;ikSU zd>S8qg7`;+ozZ+`lg0!sNN&iNeY#)sBz{fSmn$7hee_h=ShGZOV9?U7_<^23guZKG zV(q>Tp5?DkuPyN!>5kej2%ukrpSeMkF(v}OxN~iDjc5U#Jwll%&$LH?3>&jF#QmqQ z1p3o?f26Z&ZAr(2Kj2Ta`*oo-|B4C!jL$Tz?hmuCEx*Xmxl4HIG;cpM27R|IWnQ4i zAi9m>Q@VMEf1{E)?1?e&1r0a#KbfjKLUY2iAnj4-NSLx@1;2MS^ds2?%$4C(uH9G3 zbE3SAqD8g$DPR0Fe{BnX;YqW_KfJsb(*0X`Cja|cJeR$w-`W%0fsaM;SZQCa#_H{X z``B-CLYH^XZ4=La`b^z%V%lb;#@J%VQ+Ol--5KUK#{N2E#P_V&o5IBXw2Pdu`pnbp z2UJ`BT%cU5{{v>_OxHe-^k>Bv%3sSJ@1ZNZ%i9DGvZYS6FP$14dQ;^T$GsXm_#`>G z{xt=cKLwZ8f%YGQ*dBr<-JgvkIF&2&8LQ(c2YMV@C$8V>P_L4ks)hMdU+Qx>^WuY! zs)@M?@;&tIo%(RlX$RF8^Pzdty?@=br*l{tqpx0T+r}R%-0WujA4nf$Eo0}Bhh&EP z>OZ#+1Y-*-~=X6iTINqb?F zHO3DoZ2kU54+MgmHop^-lcg95U@sFcklDbyNdZ{3uf$h7ek z;tM{Lb(x(H&WQ(sZw_-32Oob?+pNQq6Mh?$t@h!+1GenNA$Nvsamva69N}BAi$@La z^}Q5e-CLa@B7ML&gl9Pkt24yW6*l->WS7_8%o6uCY?4FEeB^tBXIVdJtWLT|P4*1= zO2|zRawAJkW%6O4E5A$;BMt*8RXB*M9#i<1B59>Hat5XGApq*lhPhd@V`%@HunLmK%NJ%S!^`#zK6Qg$K42 zZ}9~#8$ecl#7FyX;akJ~20qCh28&qBHczv~_x!WmpFlUZU*81x5O~J?%?|=+axwlS z96c-{~A3|`If%#n>P6mLPc)550|IorjV6z33#ep#@tvvRHb1cn`dG zQ}DSl=(3y-oiogx3}1rI>yowpTe^RD7xUo1CApc;GUE>N&KKZ({7Rpjd~%q3H!$|n zCgVR~)|}<8q}`K#=>U1QZ^iUh!xPdmGePuC$pXouLGJosT~=1boyH_ITZIo@x_eB& zpK}_Ivky#e@G*Vl7PsrjsOu#G-q z*oW*>U)IdIvE9g}biMbWN0rx}oSq%!e}vdC@H%9Fa-Wq^>gT`dM|@3tYuY#YJv``+ zGvJ{*pUysm0k;334f%;p+^tJy#8>_9%#)~`+QXdK-&+xybD?k?wb6hu(QNx!38Bw=%{> z)T7-ipuv;FF6j4sW1s3xo1t@0mr&davRye!k)g*^di0N`LPy=keVzK!M^d;*M1F4E zCeauPrA>^QIq?VCD7jTfPj1AnV zOgfjilP&wEU}X^bj!f+O2v}8Kayxp0c+XgwE8Vw{eTXn~D}3L0_57~YOUJnPV8d#y zbcnX(!&!h#O~LR*aQc5as2H>wDGHnStSHdopABn)iFPM?|iSBzFY$jY2Mwr$hEg z->3^al2y7FD1&nqPU6sBkErF@McfUvh`WKl%zZ$Mxf|$8?gsh_|BJ?Vyk0V) z<5uR`Aj?b0!CtUwbMXiMf)Kv?3icf41>liB_J9mLL+kM|#;ARYY6w5bS9B$~=Uv)z22sUL$*?WmszbKMc?XY8@qzTckhW}p5nFvpcViCWlZS$H(ZCy`+mZ>Mr} zdhsgS`|l=3#p3O`vt6A_IZm$fFW^VAdcTi+LzH1HRL0<)(5;n^(rMqEiM#-J)a86Y zzIzLG#5aT+!LD;fCh*7NSLs{zlJ5(Dr(bW9QB zO$=bae0>VK6?a^IAedPLLB$i17bAGX`n%=#7+e;7-tY{Y3_id9?pJ?q8vBV|JkFg? ziaD|{{r(*2sDL;dxFxx5>jm;$W}@0FGhS8w{wDDRgvRQR#+m7qDGFM~lrk>#=2CnB%H0I!KQz z8wK3=4q98O?os|@qa8z!s80^!FC+e(F_0S{IRy-Tz;*~2Z2g_awe9UJBcEGA;$iyK zyx!o^TmGNuU*(R`CeKrOR6RXGG9k^E1Jb{dDIcKAi~rutcLDO{N$~k8KlAJ!bpJ|n zIj;z#1n!|d`3@y>rJHK)8F-7O$0z2x2lSq{?D)&(y31+17v5~JHy@*I#W;p} zkM4W4CS2rR!~18U5#eJCxD2Ms{@akUmJd#v=Uzrxt<_(g;oZ|kn{{R2Nd6t+48{NG z%g9X0%Y(?uWtCzg>n`v`3_uNNjcUKapSgyG{!F$EZY@&Sf zm;YK9nfudKljvW1+K+)*Fi98NtKUZ$QnKFuHU`pP3P8JdZO{(*tSlkcCdT+rerwGH;5Awo-{ZdrTVZGezpE{rg`vm1eVL;M zI^ONoN%TETOj)K*F`WfQ|-nkZ*Ni*GI{tpAU{NH3Qp60H` z9{wEd+4pN^y7{~}=n7`dneHgn)i^iJbo0``pPT6p=XVs}V+(!R_eW>Cp8($)p8Y;A z)jvKe@yWX>8$ljY_CPS>Ec@(Eo^>4Wck=Xk7a4V}T9%3eQ)uU2Q)-a9(jY3F9aOm_qSmCybs zeE+V*Z0Y1%K5*%k1+*s_cpdX6{668){j3NyF1fRt@8;LBnH5Wp?>p`9CSGZ-BmZX1 z%N?zKX8F&R`&IcTSThIAt_ug`%aWXdcOKZ%cYd089uPl~ocZHln=6k?mtK2wKXz|^ z9ke0cz z-3uJ*|2=HAKE|XmsI9jsC!6IR`g)s>>K|VmM)rGW<#a{}oLV1>=wnMa(Neqn)g>!XrEJS(&CIh?@P_O#-w?IZ`%9Wp{dTz;B0kY z&_#Evi?F8egkDqpZ=QV2TE}6X#{=%u`FfD|^BJ4Yw5(y=(ji8I>nlzUJ|*9`Xu1#| z9r)d-_;o11 zvM|1dJ5HU1VQjz3amPajh^dn~r?tGu-) zokjDxoch9x{CRdABU7G5myV-fXno25(1-t_Z#DT!nER8%YWlS{tY2c38JJJ~IQWM5 z9yR}crrSFzJa7X(h||kWhM%gO?c=I>w%m26m!qGl;Q3U!2Puc2rN6_O72(F}AjzSU;B4Er0ODRXQ{8TnIw zC0It|&lm#B-qW6mUKFRP`Gj^kJ7ny+p*hHZWch(0K9V5w4i6Nqu|7Y&A0R-Uw4wY^ z2M1Ho6y$=i!Bwc+y%H@6wvu zO8L&4zUTsT7qN^L!d(Qq6n%dcUK1cTJ%UcWn|Om>^T;ZlwLtf+uYN?n0`Gqko58t` z|8pL;?}5RCx4zucx#cq>%`peLXU9=d?#^Tk0oF#8_(<6W>aT|W4DrlE*RXh?Z0I!H zP9b|ZqD$o5(h_f7?S$7CV!s3H0h5Z!ExC_8AbRPml>PTT(3k#4 z^*@_47W}_tn)StczP}Xy1#6X=v`W4^I}hO45uXMRHwX{-LWG~8xKN!#yjSc6zjs&~ z-1kM-;OAdWopIWQv#D1FxL3qCenkyA_$61h|C)|x44bN#O=kbRr?V!m3P2B>Pu}sgZ|%ER zqFO4^OfW5+85x^9yN=TGNtG;)}m!+(XMniZ~M`UiYAPwk^Z@ z$;Yw3!FYDfbT4Hr&~JWvO{MpC({XIa7yrrfmtO8HS6|Xwl^^Ic^uZn@|82kWt@kcM zCv6K4RI&fQThG7D|GT{Z)%>?MJ>#(SJN}>CbD&?zO2vC7ABHB0X(|~VZrn{iiLuV; za$D}rf3oX!3T1VMrd;#McM@EVVLu}7>D-)c@XCFlGU(UIDb=Uii%6f=nqE*vTLlU2 zXEBd;cfpHw_OqA1FE^$j z0gbWWSobvenQ*c6xpByd35j9Q>Bo$pIMAK?uYRwltv>Qei?@2``zI#OO3}08VYh65 zuy`}LP&|;!_s?mwhV1v#!2Z$mv>zHH*7qrL z=?j+u(H8M?G4j><%sq9b#+S1sJKPBU)R)W*H%9cG5pE3H{3qNU^cCW}z)Rr$!Fhoc z4-oClrXTKwoU671@M6*7w?=t!HhLe2pLKxu$j5{Dz?FNTAi-YKsdakiVdW&ScXTGU zQEnXVsg1R?0qvllj!Qg)9wA?@XvZ8HEbj;YAa|0PQH+6cb#u@8cz>)|ZOaG#CEAfL z7PV{9>+`80ecr*?*eeL#%A94;pX#VR)qjw_#6RMe){8>lq0C2|bI>!zd8^)!(2-du z%v)jTCf-9UU1CZ8F!4bngPs zJ84fkfh~KfV|mjF%0JHYUGEH*-NpC>ryuz;pIFePl5I(+asKG}YkQfWrO3DK(2w?N z{DD}{$x+4qhil={%jE0C?m#AA0KZ7$qevn{#oyGH?w>q4?81KOd>a_&GU5|-PAUCc z@2x(#_zCP-&i`-VZgkor-opC$X}i)O--SPHD(1d0@n!Zu^&ea(z5zZYOZ5CWwypF5 zaFz0p_E=f4n0o5-_~OSU`$CF4mE4s*(TA^K4}Gbhu-8vWJhl)2tnQ1&KFe1>jEgxG zEsd4`%=!Y<=ietVu!@4}aIDn&-Y??YCar|F1fbF~~h9bo}QV>gL=RU*#;{ zROdYP%T=rMTd>R7Z$)1=u~^TY$PLBXIq0=ZCuJ|*=HtFU(^~v{g!*C0>!y;$`=Emw zQ?O7na=tP7HS8U1M28BZgDU38*ED6SM2F$;+kT(l&C?9I0j<>i<-7d2Nh@7jB&NorB98mhXxM%tGxS{%_?nOvaFM zVOvf%nee}pzNI(MGh=7Vcc3-mo2mHYaay;Di=cV=0wlN59~-3ur|rn0J_PP|w|RG= z_fQLM{)xGl96i2xm-UAy%gw+&&|LRleXbW@<|LBDz!-3n)@PE$c%KKID)#nj_LY

g)VHFOBLT+ka!il z?Kp8Ix8Sd9(jF}_?Z~*$f>d7t`l|X5bX)W@GmNu7_&KCEvTuLtT*qVNdLu5gV(7E) zGgrD-`DM)m?MwI3+KO-vnfvU>y;YdNKQ!h&-T_DGee^lr4YYtm*)>zghu20&A=CWi z5uon}xof1wU(g0kyDw1|y6sVUV+z_bS4Jx`xtCS%(5H{I(02*{BiP9F@lpY0BDvht z$GS?sJFHxIj=#&^AhD`3&Z}5_oXB!n@P$=RI`%FG>=DK}o)|=YlbTo7yC0mGEVHv6 zJYfSJvGvL_-P>3f4s#m?|Jxa-6ZY~d2#>1wzW5>eeJIb_9G!)n5IV}UZg`17j+~me z`I+wB)UV?H7Gy%bA)icSwKL)F}*yMP0a49w}yrtB%^!R-7cf(V=?~k7tHcxcwl$#3qEMu(A zEBSWV^AWD1%75kKtRT;19}1oTWsO?KT6QTdUIpG2FkR8e8KYWSx=X*ZlGn$vS zDDmcjj|X?|*E|B7k2YC51M(a1f>tBUgJ7EtYrlnnfnFaDYmBse#DxuU&i_(P6WH4Fwuuh=_UWp zA!zlJ$=CwWV1Ru;<#9R$Uul*<033zUm$W8_@NvZp?O8zJB6z>u5Sjt_u zx+A2Ieh$%(0}qZt1AX+dg!AFM;XT}Um#gx5(1c>B#dCEYE(#wE+>u(J#Qum+CAr_( zpd;v9KfKZI!I|)q3jLSQz~o7%E9qAZR9|!WXVL>|hyn9um;vcszKe-xLI zE}(D4OQ&V4_CeEfRr8^{H9Loy&YNmXS3T!V?q_bVKG)~o483DV*4gf=bQg#pb$P$b|!w<3sYx!m78wp`MGn$pB!K8=?8Ii2*sJaim&PA?Xlu`KDjiY z`(J`*#py_w|0DZ2TX^;ho^`{+%w$vkNBmGXLw_&x{0MXUd)irtp0Vztv)nbn!@0c6 zq;Kim4m`VakTJw{{s$bC#E7@Y|1h1qYf8Aw({N_5fp_vp#?TWKSKZCG>M*AI7-J1H zwn>Jw{3BysT91OKle2JkT`~{aa~2LH^OQ5Rg?_>@@@SD4OmXjF@E;u+Cx2mWt| zwpw+j7d=sHXE$`H{6bN9X%O97euBPHSsmwU-4OrPEgW-xvbrHqVc?zZ=qS(Ar(lan zMk;?KF~-tiEsY}kWrx}K*yNmbC4RwFcJqvU9F5(q)sislk266r=szAgxbh7#{r2kua#&3J?6gal@ z(2ZUoS|BH^&6D5m>%Qf8UfoKEeyenr6uZxv*-|WCtUd*U?wgXYS@SGd&>0Sx3csuO zPIj;jUwl#338%50e$r)h-R>_FE&;8$y+i8i>y zylo9UVEn6tJ8uCe4U@y4RQ`Ez=REY3_u;?e`UX2IktGe2%_q`NqQFM}OX(Q1BES|j zW>J(iGM@9MyV13jBTel#H%(rJ&H;b&?kN-w4v{Bk8}dPZghR{lr2#ASe_1ngm#uRQ z;&~%Y7xr;cbDrmGmd*47>Iiq@kL!3p6o>d!ineeztCMf$v`cglw>TT!Nc;6#_rKv? zbhby=8(5#Rmzl4D7{A4HwC`bU7jm46?~CUTko$B1U0*R%jCo);axjtuukOCJrx3kH zxmM=^Z@D?}?p1t?@AaMOok23J3HXtr~&1lk%ZHy402#q7qAi9^pt z%hphSu?EJFM81U`lLNs?+17vlpFA7OnhLPzP=w6yo#NQ% zH~Gf4HL+*Zykc&}AbSk=Oh9jBA0s;)nH)ogCE2sr9EYLbQSc<$Ey1i6k#oa-1Jh)%wi|IV)7uf~7;r=ED_oA37KnookSM89e(qLWp|WTUzA zJ~_&KqVW}Ie6=?JT9@K6uhp7jOp+sEXf2&T&tY8RmvPz;o_3aBXZ58g+4s;v}nQOlN2k`!`PdEM4L%&f=Fr`9?T4zf=5e&{@>(^Sg;zbffU36TqOoKfxj2*!9pDaO3ke+V9)Z4z3Jy=HQFvKl?)$qN@}h z0gtRVV5GcabiiTCAL!-&Q~%O+)t{|LT*-CdgnDI3h{`+{a{of#KKO_9UG&YKbiNPK z#dK&#dhP(eOY(eJemECc#1kv{uYIBPURfWxH@-Fg#iViF38NeFM&`INiy=?f1f4Rb2ya299i9DGI(wRs#o zJ(P3&++pG6YajF#uhhNBAC~%UyM4|0uW5HZ?Kb<1kErdw=5W_-;BGPb7JLoo*?5rF z73WoK=6~lWgXP9wOkSFC3FQunA*0_1?&JyRavf^~+F9+}THM3D_bpoUGsQ0;%Qz2U zI8zs^djdKd8ne)f?x%8k-$yy=i7NNVkaEWtKZ%ZQWlX5I){EDaj1Zo6{&O>OJpis0 zL!)()rpa_pz2l32Yk5Z!IqI-?B3q^ZEb%2Lr-VI}C}Zu%za|+4&)XDybGUr*(BC+> zl(ES#86YpkTG=h@eD2HS)RnBgHMM>s@X9sNsm@<%K7Kb?58ocD3`MfnEx zz8bzFxCWqi_ExQ|7EZ+9t>2K}V;Q5R&#ByrME+9ogsc=z33tl^f7A(ORtK7v&Z52@=&Y0+T_E_LgXrHInxeZNhM!iWS8WG2tubh?2VeKfi=hee z?~JCUyZn^PXbSG4&P)EL(p@#w_2Ln{eDK!(4fxzYl!&j6^XL-1t_EJM^QZCI=P`Gu z)8|lJiVv&qh42W`8}qs|iJb0aZQ_?5vw6>)wpaF$@2}KXDO~)Raj6dLZ)fxp`D{Gh z@t2$(@#t(^;t$ZL=mR^++uIrstpi63c2%qfot}N}cI^Su@15dt7KWn4zcH8cA!skV zUApEa=tKB3c7u~h9Xc8KM5n$*&*E06L3d)ks=mSh^a^zcH)Oq}Jt3VJ{1I@#Uq#1V zid(Y#Y{0_VD%N1j{lIiI_}oM{`DOUo2A?|u`JnTHkBJAsFKNrhvLO?D6nm`mH}xsH zzKL@z`M_-V}Zc;yB@1W%%3R zw+`in+ZjX3YM)MJR95AB!9g%pt|V1XJZ~&|)(DU69z_eR~~z8`)+CW}+MF8SBc*I$LgiHs>++Jl0FO={Eky<{ z(Xse}d{Y77lq`a8gdA`qpU#!Y|M!vm2l*DSz$fPZgFPC}dr8CGilMxBC~e0khwnD< zl5M_>pH_pvXQ-pHExru*uc`VstthM5N_!tbTj-I;x{DXCjYE6Vd9`*WM?_CA4Ur4! zXD{$fbj954)Ee!TtZ9ha`)1Ui_5#u}$IA5+BW$kMWz1iMIu3fA13y~Adi^Tnrp!)5 z{@QrzT@>Dsj`!i+0rTcG*P}zLld$LKbnHe390rH@-xR}2Zj7UM%UAq9KEfYOmu`FX z?qK%8`?cmITkU*LAMQ3Y->bi49+1q_oFVUD`akdhaQ{>Ks{aFhBa?Q>uTV<6DpSf@ zReANJ|6%?o2XF0ZCa1D&blY}pxce4(tD#&)YHiEMVCQI^&h&XY(4fEQrBBuwn*&+r zl5`({&T7(jo$t|DPrTL)#FzPO{u<@EQGS|_S7&yt$FDA3XiY=7V>s|i)|HRr%oB2~ z3g1N(zY09ueUki1_Sr^!sCOyfszmUlXYQmUClmZ4YqPE_#=Pw>I*uQ zXA9h0z9zZw6mv7!ijNLINxRQfMyLF-*oU0y_fHD7<1=vZBUinN-v+z#L4SXF%Rfn1 zDom6e{r25abbCK>X6^V>qmQNXRAAdLfEJW5zZV-J$auH2$H|)Qa`Ny;XB)S?)NI+# zeqR_{q=dG+v28lHBioQSC(r{FWBo(mx^D{d7G32VtjF5D=eJ3x*L;&(V$3hbB6DdE zIoB3v?q#3&n%5l^{R}QEeI9-b9>yk=f3BJJrF;|)J}5mqgEHWEpqhNO4*EOe?%WQ} ztHF7cd^CgKp-=9JbD%Zorm~&0ebw2(pUqwmeDy>M4~M}Kx##cRAX~wo5mNj>Z65dc zFb)$lu5=FN!bT^r!;S&=afzFdOY1fm_jbV#p7#KMH#yR;056dZlXuB)AK6f{OZ%1? z^j~E%R-&iX*Tju0`L+?9Y=iIL2|a5r)PIualD+ldNPZd3SAaRtJ*Z3Z5mfWL20L&G zHlTbJ^1rjzLi&z^yB1`1z3T1sudd`R*3X3ST4-(2;RL;XE;g5ZS)l{`Ujocg`o{lb%WD6&ntpwhaoCGn2kh(-g`CmE zI8$CamhkZ)F^m4M~j2Xm~kmHk*9QIbrTMV?5?k4`0Hs`e~sZp1*`` zQPj%3EIDmnbS6GMFUs?!`OsLfv$O|oeW$|tZrUkvd`D`W+wRx6H-eY%gBQ+plvO#- z$`}IWn*C-)HU4RS z4=k8k{rQ+DW4f4=F%Ip8xnsnz_fVY??yAW{M`ImF!6WsN>Au8s#N`FZD`7r2W2D1( z(jP$HIH5Dl#2o#XO=C=EDASxd`9F+VsQ97X*czf+OOx529w%P#?6lPSr(fZy20c4$ z@B#5#d!xJId78gwzi&kZd{vo=_FMGw3)+p}h3*7jr%wHS@M?H&{vMtW`ZHeY8#RLS z+!=0PuD_#?a}#~oX?>gpmp<6H2pZswaI%Oq-e1=5+K%3dIs@)>^o^R|(O071zK%n+ z#zoHc9Gb$J?`fO?KZ`Tq=W+&oj?RFOh;!zL z==-$?Ms^%7s_i%g42Lp27!Co$Az(OMzTapz1G7)- zHyxWSU7!!t=+YYb({)v57~+|9Tav=(SgDtivkqV&y}7?;L3ig7Wvnclc` zhGrz=c@Eq^ZhY=2CtNv=^4Vkf&zN3hOgk9UtBgtQ-9`Pww6oES&K>=d#xg4RCmPEQ z-dMiH|3knutmy{kV_5FL3wEB3>SZkT8w!@0jNFTO-pUwjXh&@d{!zySKjj5~xV3%c%Go)fT#RvC<-xCV3n;hL z1VbMFDQEFdInmX84}O&sT~(W@ArJQ>JeoS&gTDpbZ-myPj+0vhjZT4{Gcs~!`0{dR zh%Z=r>mTmk2Hj;($aV7~8|w0Yy?xc!(H&=e{d{*s{DHc^M}D|!u-17g3!ak`NB<1K zJJ4Uq3mX#u{f9r3cukX-Kb<_C0p>Gk+%H#z2QGz|Gk5#H%s$dP&glL2_r>9XCCC!} z-q%vnzi*5gkbg$?A7Kw!^&jQ)1U!D;|6F!f?mT^Q${Dd}rLweD0qL|3B=^6zKWabowf~&koQ@#4YIevItoWZ>u4`%u?k#?pPtZ8|%hpE@E;H44KMO3c z0*iD2A37g%n1C1TN9GOmzBgD8-Yx%DY@lR=Y)aXq%Hutbcp(Qo1Pe`m09ss1j#izs zL1$a!K(pvNZSNr)-+-rXn`|0?gFK3yiEn{%UyckjdEI}Gu#YXXDn@@zx{CzbY{xElgAh&XvtDIf69h1RH9`GpcHQKPWKS=v6 z4W<2>((b}ePjB-@wqt}5&_E@$i)ytilbqZjYlzkPho{_h6%ZGJRk z-~LA?&EJ15GyqQ9mIp*nnQi*L^nCCGjMcucJ#+)-kVbDWbu-O%5548jOZ?qGGVzW- zCvn(6Ch@v|a^ektZXz3)TNmux++s%EUQ@Aef9)gt_HTEl-VT4;?|l7+et21%WZklc zhW>2mx5UX|PW)|$OxAwpqiy?b&up%_;hFtGGraBVCi8Zl-(K_JGy7Rj``_}9NWe?l zrqKUxeBV>}&3v{6rRVYN*ZyH`*E*SPlE)YNvf5_({B84{j5cVc?G9%|+pzJz4)rl+ zw7It82rit9HKGCH#-Nc;O5tc*m@F&vtXDC*C%)Y0-@QNVw}Qd@-;4 zM}^+>Peyi*487*h50$N5vFmMQ=?%P(2UFVp>I9=jqeqVCN@L$pEZTK;+rMpeR?C0TzJU6*5P*)Jj=KG z5zZE7LN8-j6WCRIEYB*)6)nE*WaYM-{9NBvh8VWVxmkJev1_n`tPRAE&b$mIGJDEAaxNtlFmkb9^@-rVQBNrAqMwb3*>8@peT813)E$rjYF8zPm z$L}ySYQ`;GwtfThz@NM9Po=w--70{u$23#*~z#p2zz3`n0-l7%Z zu17`dJb&6)TJI{oxTTUYT=mStWj_DHmL5kwL!PUhIZy zpObrrFEe+TZ&b|cY}?8c(;AvlXputW_0Y{_CQZ{(Ub4){=xot ztF!vvbStJM#0{_Y^C3K>L84vygwet!0e%&&K68`y89|5T8?`1wPtIOzwx|X2E|^ zC!YEbU{3E7485<@(~a$!O!+D89^UuRpJQ1UbgE(nH^4<(Ox0tOHP$vPWg?LU&i;c zOV75vrWL>cwS2b6d~H7NCxVZ=Rnv{-?;f82!{WIBo_;!>BR(H@!~2eC-wGTKoW%BM zMJ~nI*O9*=mc{-+vB{r6jPLz5j{E;M2kafS1y0R@&-$P>2Sf3{7<|eHa0>sY>IH%3Il>GzNbdYuLTx{6m^Bsw@ z=9k_yd2tJ{%a>zww~n@c-P9Qf&%Y>nE<0ZGTyh;7$l_`&GF37EMT|d4u29MKC^2WH zVW+Y$CD-G=K%0D#$MQL6N8XgTz~53|xT6}mZjhmpyH>Vm<#kB5=Q9?SL$23Ju19LT zI11?-HI(&jH2vhcvGL(cM^<;Vjx-&mdHQzvuHoB9ev#UaSeD=BrLnk7<&D#Pw@&c# z1!&Ls1zCnR;aT?2W~* z`7=VzCi937J`xoVp^QPN--6tf&p>{Sq(7e=b^hlsB~DP|(i;2Tie(jwg{xk%v?3_J zMb0ukPp_fy{uC@W$DET896sQ1&& za8@LLk z{r_f9_qJiLZywq4+5@9H-nf+*VCcwT%RW`0_&|IE=qsmu1Na4`LuCk8v0U_+(LcA$T&4f*Bq`5Z9QXIWk7 z(7{bTQ;2OYG5#ayE_E~LtCqdi!-IGA%- zYj>_YEPG!uaW9)5W&E%EO(;A2x#G8C8593T{F|?DBk>Y@iX+5aDqb{zZ`FJoUDbT| z{%5nhi@T|tbzjEBaKm-p`wZR>-&b72`|P-$H+avpO=Xg@dYdq_-uLLv*j5}H~tyL=O60b*n@siCp>?O<6C<+7JL@R;CDu`x0

8N{&n%NhObo&(%v-2 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.&T+ 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

q=+15IM4#{0 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�mm8m#KP@- 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�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 literal 0 HcmV?d00001 diff --git a/doc/source/img/micofe-portability-matrix.png b/doc/source/img/micofe-portability-matrix.png new file mode 100644 index 0000000000000000000000000000000000000000..78f548e5b44823f8f4f14c2ca654b29a32c7063d GIT binary patch literal 277135 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 b19vsPBy!|SxDq`>z^_LSlw|Xy4SfC&O%aGK literal 0 HcmV?d00001 diff --git a/doc/source/img/micofe-showcase-architecture.png b/doc/source/img/micofe-showcase-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..61c667884f409c0c6cdf7810be67eacc7676351b GIT binary patch literal 75905 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