non volatile variables and incremental envrironment

Sascha Hauer s.hauer at pengutronix.de
Thu Nov 6 04:59:27 PST 2014


This series brings in two changes: non volatile variables and incremental
envrironment

Non volatile variables can be used to store informations over reboot,
they are basically a persistent variant of the globalvars. The non
volatile variables make it possible to change settings like for
example the autoboot timeout or bootsource without changing text
files. Also it makes it possible to change settings from program
code or scripts. Here is the documentation also contained in the
patches:

Non volatile variables
----------------------

Additionally to global variables barebox also has non volatile (nv) variables.
Unlike the global variables the config variables are persistent over reboots.

Each nv variable is linked with the global variable of the same name.
Whenever the nv variable changes its value the corresponding global
variable also changes its value. The other way round though is not true:
Changing a global variable does not change the corresponding nv variable.
This means that changing a global variable changes the behaviour for the
currently running barebox, while changing a nv variable changes the
behaviour persistently over reboots.

nv variables can be created or removed with the :ref:`command_nv`
command. The nv variables are made persistent using the environment
facilities of barebox, so a :ref:`saveenv` must be issued to store the actual
values.

examples:

.. code-block:: sh

  barebox at Phytec phyCARD-i.MX27:/ devinfo nv
  barebox at Phytec phyCARD-i.MX27:/ nv model=myboard
  barebox at myboard:/ devinfo nv
  Parameters:
    model: myboard
  barebox at myboard:/ devinfo global
  Parameters:
    [...]
    model: myboard
    [...]
  barebox at myboard:/ global.model=yourboard
  barebox at yourboard:/ devinfo nv
  Parameters:
    model: myboard
  barebox at yourboard:/


The second change in this series is that the environment code now
only stores the files which are changed from the default environment.
This means when an environment is unchanged, 'saveenv' will write
an empty environment. This has multiple effects:

- When scripts are unchanged (which should normally be the case in
  production environments) they will never be stored on any storage
  device. This means after a barebox update the (possibly updated)
  scripts from the newer default environment are used while the
  changes are still preserved.
- Together with non volatile variables it becomes possible to keep
  the program logic (scripts) in the default environment where they
  get updates while the configuration (non volatile variables) can
  still be saved. Still a developer can change scripts in the
  environment.
- The downside of this is that the saved scripts may not fit to
  the default scripts from an updated barebox. while previously
  a saved env may be incompatible with the currently running barebox
  it is now possible to create an environment which is inconsistent
  in itself.

Due to the last point it may be possible to convince me that the
incremental storage needs to be optional. However, it makes the
handling more complex, so I try without first ;)

Sascha

The following changes since commit 592d35a47ce4ef2ffffd9805a1a534771882f3a6:

  Merge branch 'for-next/xz' (2014-11-05 15:47:39 +0100)

are available in the git repository at:

  git://git.penguitronix.de/git/barebox.git

for you to fetch changes up to 7962e7a0b423a5dfba251622f64d3891f69a55c0:

  defaultenv-2: Make use of nonvolatile variables (2014-11-06 12:23:12 +0100)

----------------------------------------------------------------
Sascha Hauer (11):
      environment: drop unnecessary casts
      environment: remove unused variable
      environment: refactor saveenv
      environment: Only save changes to the defaultenv
      magicvar: Add support for dynamically added magicvars
      Add support for non volatile variables
      libfile: Add copy_recursive
      cp: Add recursive copy
      Add defaultenv command
      globalvar: Add support for printing all global variables
      defaultenv-2: Make use of nonvolatile variables

 Documentation/user/variables.rst                   |  41 ++++
 arch/arm/boards/archosg9/env/init/bootsource       |   4 +
 arch/arm/boards/at91sam9m10ihd/env/config          |  19 --
 .../boards/at91sam9m10ihd/env/init/config-board    |   8 -
 arch/arm/boards/at91sam9m10ihd/env/nv/boot.default |   1 +
 arch/arm/boards/at91sam9m10ihd/env/nv/hostname     |   1 +
 .../at91sam9m10ihd/env/nv/linux.bootargs.base      |   1 +
 .../boards/avnet-zedboard/env/init/config-board    |   6 -
 .../avnet-zedboard/env/init/nv/linux.bootargs.base |   1 +
 arch/arm/boards/beagle/env/config-board            |   6 -
 arch/arm/boards/beagle/env/nv/linux.bootargs.base  |   1 +
 arch/arm/boards/ccxmx51/env/config-board           |  10 -
 arch/arm/boards/ccxmx51/env/nv/autoboot_timeout    |   1 +
 arch/arm/boards/ccxmx51/env/nv/boot.default        |   1 +
 arch/arm/boards/ccxmx51/env/nv/linux.bootargs.base |   1 +
 arch/arm/boards/clep7212/env/config-board          |  12 -
 arch/arm/boards/clep7212/env/init/bootsource       |   9 +
 arch/arm/boards/clep7212/env/nv/autoboot_timeout   |   1 +
 .../arm/boards/clep7212/env/nv/linux.bootargs.base |   1 +
 .../boards/crystalfontz-cfa10036/env/config-board  |   6 -
 .../boards/crystalfontz-cfa10036/env/init/general  |  12 -
 .../crystalfontz-cfa10036/env/nv/boot.default      |   1 +
 .../env/nv/linux.bootargs.base                     |   1 +
 arch/arm/boards/efika-mx-smartbook/env/config      |  29 ---
 .../boards/efika-mx-smartbook/env/init/bootsource  |   4 +
 .../efika-mx-smartbook/env/nv/autoboot_timeout     |   1 +
 .../efika-mx-smartbook/env/nv/linux.bootargs.base  |   1 +
 .../efika-mx-smartbook/env/nv/linux.bootargs.lpj   |   1 +
 .../efika-mx-smartbook/env/nv/linux.bootargs.quiet |   1 +
 .../boards/embedsky-e9/defaultenv-e9/config-board  |   7 -
 .../embedsky-e9/defaultenv-e9/init/bootsource      |   7 +
 .../boards/embedsky-e9/defaultenv-e9/nv/hostname   |   1 +
 arch/arm/boards/gk802/env/config-board             |   6 -
 arch/arm/boards/guf-vincell/env/init/config-board  |   7 -
 arch/arm/boards/guf-vincell/env/init/nv/hostname   |   1 +
 .../guf-vincell/env/init/nv/linux.bootargs.base    |   1 +
 arch/arm/boards/highbank/env/config-board          |  10 -
 arch/arm/boards/highbank/env/nv/boot.default       |   1 +
 arch/arm/boards/highbank/env/nv/bootargs.base      |   1 +
 arch/arm/boards/highbank/env/nv/bootm.oftree       |   1 +
 arch/arm/boards/mx31moboard/env/config-board       |   7 -
 arch/arm/boards/mx31moboard/env/nv/boot.default    |   1 +
 .../boards/mx31moboard/env/nv/linux.bootargs.base  |   1 +
 arch/arm/boards/panda/env/config-board             |   6 -
 arch/arm/boards/panda/env/nv/linux.bootargs.base   |   1 +
 .../defaultenv-phycard-imx6/config-board           |   9 -
 .../defaultenv-phycard-imx6/nv/boot.default        |   1 +
 .../defaultenv-phycard-imx6/nv/bootargs.base       |   1 +
 .../defaultenv-phycard-imx6/nv/hostname            |   1 +
 .../{config-board => init/bootsource}              |   8 +-
 .../defaultenv-phycore-am335x/init/init-usbserial  |   4 +
 .../defaultenv-phycore-am335x/nv/bootargs.base     |   1 +
 .../defaultenv-phycore-am335x/nv/hostname          |   1 +
 .../boards/phytec-phycore-imx31/env/config-board   |   6 -
 .../env/nv/linux.bootargs.base                     |   1 +
 .../boards/phytec-phycore-imx35/env/config-board   |   6 -
 .../env/nv/linux.bootargs.base                     |   1 +
 .../{config-board => init/bootsource}              |   8 +-
 .../defaultenv-phyflex-am335x/nv/hostname          |   1 +
 .../nv/linux.bootargs.base                         |   1 +
 .../defaultenv-phyflex-imx6/config-board           |   9 -
 .../defaultenv-phyflex-imx6/nv/boot.default        |   1 +
 .../defaultenv-phyflex-imx6/nv/hostname            |   1 +
 .../defaultenv-phyflex-imx6/nv/linux.bootargs.base |   1 +
 arch/arm/boards/radxa-rock/env/config-board        |   6 -
 .../boards/radxa-rock/env/nv/linux.bootargs.base   |   1 +
 arch/arm/boards/telit-evk-pro3/env/config-board    |   8 -
 arch/arm/boards/telit-evk-pro3/env/nv/boot.default |   1 +
 .../arm/boards/telit-evk-pro3/env/nv/bootargs.base |   1 +
 arch/arm/boards/telit-evk-pro3/env/nv/hostname     |   1 +
 commands/Kconfig                                   |  21 ++
 commands/Makefile                                  |   2 +
 commands/cp.c                                      |  36 +--
 commands/defaultenv.c                              |  95 ++++++++
 commands/global.c                                  |   5 +
 commands/loadenv.c                                 |  11 +-
 commands/magicvar.c                                | 111 ++++++++--
 commands/nv.c                                      |  84 +++++++
 common/Kconfig                                     |   1 +
 common/environment.c                               | 246 +++++++++++++++------
 common/globalvar.c                                 | 178 +++++++++++++++
 common/startup.c                                   |  13 +-
 defaultenv/defaultenv-2-base/bin/init              |   3 +
 defaultenv/defaultenv-2-base/config                |  22 +-
 defaultenv/defaultenv-2-base/nv/allow_color        |   1 +
 defaultenv/defaultenv-2-base/nv/autoboot_timeout   |   1 +
 defaultenv/defaultenv-2-base/nv/user               |   1 +
 include/globalvar.h                                |  13 ++
 include/libfile.h                                  |   2 +
 lib/libfile.c                                      |  40 ++++
 90 files changed, 875 insertions(+), 332 deletions(-)
 delete mode 100644 arch/arm/boards/at91sam9m10ihd/env/config
 delete mode 100644 arch/arm/boards/at91sam9m10ihd/env/init/config-board
 create mode 100644 arch/arm/boards/at91sam9m10ihd/env/nv/boot.default
 create mode 100644 arch/arm/boards/at91sam9m10ihd/env/nv/hostname
 create mode 100644 arch/arm/boards/at91sam9m10ihd/env/nv/linux.bootargs.base
 delete mode 100644 arch/arm/boards/avnet-zedboard/env/init/config-board
 create mode 100644 arch/arm/boards/avnet-zedboard/env/init/nv/linux.bootargs.base
 delete mode 100644 arch/arm/boards/beagle/env/config-board
 create mode 100644 arch/arm/boards/beagle/env/nv/linux.bootargs.base
 delete mode 100644 arch/arm/boards/ccxmx51/env/config-board
 create mode 100644 arch/arm/boards/ccxmx51/env/nv/autoboot_timeout
 create mode 100644 arch/arm/boards/ccxmx51/env/nv/boot.default
 create mode 100644 arch/arm/boards/ccxmx51/env/nv/linux.bootargs.base
 delete mode 100644 arch/arm/boards/clep7212/env/config-board
 create mode 100644 arch/arm/boards/clep7212/env/init/bootsource
 create mode 100644 arch/arm/boards/clep7212/env/nv/autoboot_timeout
 create mode 100644 arch/arm/boards/clep7212/env/nv/linux.bootargs.base
 delete mode 100644 arch/arm/boards/crystalfontz-cfa10036/env/config-board
 delete mode 100644 arch/arm/boards/crystalfontz-cfa10036/env/init/general
 create mode 100644 arch/arm/boards/crystalfontz-cfa10036/env/nv/boot.default
 create mode 100644 arch/arm/boards/crystalfontz-cfa10036/env/nv/linux.bootargs.base
 delete mode 100644 arch/arm/boards/efika-mx-smartbook/env/config
 create mode 100644 arch/arm/boards/efika-mx-smartbook/env/nv/autoboot_timeout
 create mode 100644 arch/arm/boards/efika-mx-smartbook/env/nv/linux.bootargs.base
 create mode 100644 arch/arm/boards/efika-mx-smartbook/env/nv/linux.bootargs.lpj
 create mode 100644 arch/arm/boards/efika-mx-smartbook/env/nv/linux.bootargs.quiet
 delete mode 100644 arch/arm/boards/embedsky-e9/defaultenv-e9/config-board
 create mode 100644 arch/arm/boards/embedsky-e9/defaultenv-e9/init/bootsource
 create mode 100644 arch/arm/boards/embedsky-e9/defaultenv-e9/nv/hostname
 delete mode 100644 arch/arm/boards/gk802/env/config-board
 delete mode 100644 arch/arm/boards/guf-vincell/env/init/config-board
 create mode 100644 arch/arm/boards/guf-vincell/env/init/nv/hostname
 create mode 100644 arch/arm/boards/guf-vincell/env/init/nv/linux.bootargs.base
 delete mode 100644 arch/arm/boards/highbank/env/config-board
 create mode 100644 arch/arm/boards/highbank/env/nv/boot.default
 create mode 100644 arch/arm/boards/highbank/env/nv/bootargs.base
 create mode 100644 arch/arm/boards/highbank/env/nv/bootm.oftree
 delete mode 100644 arch/arm/boards/mx31moboard/env/config-board
 create mode 100644 arch/arm/boards/mx31moboard/env/nv/boot.default
 create mode 100644 arch/arm/boards/mx31moboard/env/nv/linux.bootargs.base
 delete mode 100644 arch/arm/boards/panda/env/config-board
 create mode 100644 arch/arm/boards/panda/env/nv/linux.bootargs.base
 delete mode 100644 arch/arm/boards/phytec-phycard-imx6/defaultenv-phycard-imx6/config-board
 create mode 100644 arch/arm/boards/phytec-phycard-imx6/defaultenv-phycard-imx6/nv/boot.default
 create mode 100644 arch/arm/boards/phytec-phycard-imx6/defaultenv-phycard-imx6/nv/bootargs.base
 create mode 100644 arch/arm/boards/phytec-phycard-imx6/defaultenv-phycard-imx6/nv/hostname
 rename arch/arm/boards/phytec-phycore-am335x/defaultenv-phycore-am335x/{config-board => init/bootsource} (66%)
 create mode 100644 arch/arm/boards/phytec-phycore-am335x/defaultenv-phycore-am335x/init/init-usbserial
 create mode 100644 arch/arm/boards/phytec-phycore-am335x/defaultenv-phycore-am335x/nv/bootargs.base
 create mode 100644 arch/arm/boards/phytec-phycore-am335x/defaultenv-phycore-am335x/nv/hostname
 delete mode 100644 arch/arm/boards/phytec-phycore-imx31/env/config-board
 create mode 100644 arch/arm/boards/phytec-phycore-imx31/env/nv/linux.bootargs.base
 delete mode 100644 arch/arm/boards/phytec-phycore-imx35/env/config-board
 create mode 100644 arch/arm/boards/phytec-phycore-imx35/env/nv/linux.bootargs.base
 rename arch/arm/boards/phytec-phyflex-am335x/defaultenv-phyflex-am335x/{config-board => init/bootsource} (66%)
 create mode 100644 arch/arm/boards/phytec-phyflex-am335x/defaultenv-phyflex-am335x/nv/hostname
 create mode 100644 arch/arm/boards/phytec-phyflex-am335x/defaultenv-phyflex-am335x/nv/linux.bootargs.base
 delete mode 100644 arch/arm/boards/phytec-phyflex-imx6/defaultenv-phyflex-imx6/config-board
 create mode 100644 arch/arm/boards/phytec-phyflex-imx6/defaultenv-phyflex-imx6/nv/boot.default
 create mode 100644 arch/arm/boards/phytec-phyflex-imx6/defaultenv-phyflex-imx6/nv/hostname
 create mode 100644 arch/arm/boards/phytec-phyflex-imx6/defaultenv-phyflex-imx6/nv/linux.bootargs.base
 delete mode 100644 arch/arm/boards/radxa-rock/env/config-board
 create mode 100644 arch/arm/boards/radxa-rock/env/nv/linux.bootargs.base
 delete mode 100644 arch/arm/boards/telit-evk-pro3/env/config-board
 create mode 100644 arch/arm/boards/telit-evk-pro3/env/nv/boot.default
 create mode 100644 arch/arm/boards/telit-evk-pro3/env/nv/bootargs.base
 create mode 100644 arch/arm/boards/telit-evk-pro3/env/nv/hostname
 create mode 100644 commands/defaultenv.c
 create mode 100644 commands/nv.c
 create mode 100644 defaultenv/defaultenv-2-base/nv/allow_color
 create mode 100644 defaultenv/defaultenv-2-base/nv/autoboot_timeout
 create mode 100644 defaultenv/defaultenv-2-base/nv/user



More information about the barebox mailing list