[PATCH] devicetree improvements

Sascha Hauer s.hauer at pengutronix.de
Fri Jan 11 08:24:20 EST 2013


This series contains several improvements in how barebox handles
devicetrees. In short barebox has an internal storage place for
devicetrees which can be used to a) probe barebox itself from
the devicetree and b) pass it to the kernel. This is not new,
but the following series implements this much more consistently.
Also with this series it's possible to manipulate (create/update/delete
properties and nodes) the devicetree.

I've already written Documentation for this (hurray!), it can be found
here:

http://wiki.barebox.org/doku.php?id=user:devicetree&do=edit&rev=

Below is what I checked into the Wiki (There's also documentation
for of_node and of_property in the Wiki, not in this mail).

====== devicetree handling in barebox ======

NOTE: This page contains information for patches currently under review.

==== General overview ====

barebox handles devicetrees for two different purposes. First barebox itself
can be probed from devicetrees. This feature is currently under development and
is not generally used. Second barebox can pass devicetrees to the Linux Kernel.
This feature is ready to use on ARM and PowerPC.

barebox has a single internal place for storing a devicetree. This is further
referred to as internal devicetree storage or short internal storage. This
storage place is used to probe barebox from the devicetree and to pass a
devicetree to the Kernel. The devicetree manipulation commands generally work
on the internal storage. For just starting a kernel with devicetree the
internal storage can completely be bypassed when a dtb file is given to the
bootm command, but then the devicetree manipulation commands can't be used.

==== barebox internal devicetree storage ====

Unless barebox itself is probed from the devicetree the internal storage will
be empty after startup. A devicetree can be loaded to internal storage using
the oftree command:

  oftree -l /env/oftree

After executing this command the internal devicetree storage can be shown with:

  oftree -d
   {
          #address-cells: <0x1>
          #size-cells: <0x1>
          model: "Freescale i.MX51 Babbage Board"
          compatible: "fsl,imx51-babbage", "fsl,imx51"
          chosen {
          };
          ...
    };

Further arguments exist to show only parts of the devicetree, see
[[commands:oftree]] for more details.

By default the [[commands:bootm]] command uses this devicetree to start the
kernel with.

==== Manipulating the devicetree ====

the [[commands:of_node]] and [[commands:of_property]] commands exist to
manipulate the internal devicetree storage. [[commands:of_node]] is used to
create or delete nodes:

  # create a node /soc/foo:
  of_node -c /soc/foo
  # and delete it again:
  of_node -d /soc/foo

The [[commands:of_property]] command is used to create/modify/delete
properties:

  # add/modify a property:
  of_property -s /soc/aips at 70000000/serial at 73fc0000 status okay
  # delete a property:
  of_property -d /soc/aips at 70000000/serial at 73fc0000 status

the [[commands:of_property]] command understands several formats for specifying
the value of the property for specifying cells, bytestreams and cells, see the
command help for more details.

==== devicetree overlays ====

Basic support for devicetree overlays exist, but this is currently not
complete. phandles are not handled currently, so this can only be used for
updates which does not contain phandles. Overlays can be done simply by calling
oftree -l multiple times:

  oftree -l /env/base.dtb
  oftree -l /env/overlay.dtb

==== probing devices from the devicetree ====

Once a devicetree has been loaded into internal storage the devices found there
can be probed using the -p option to the oftree command. barebox will only
probe devices which are not probed already from platform devices. For detecting
whether a device is probed already the physical address is used. This means
that only platform devices with a physical address can be handled this way. If
a node describes a i2c bus the (additional) i2c devices will not be probed.
After probing each existing device which has a correspondent device in the
devicetree will have a devicenode attached to it. This can be examined using
the devinfo command:

  barebox at Freescale i.MX51 PDK:/ devinfo 73fc0000.serial
  resources:
  num   : 0
  start : 0x73fc0000
  size  : 0x00004000
  driver: imx_serial
  bus: platform
  
  no info available for 73fc0000.serial
  no parameters available
  
  device node: /soc/aips at 70000000/serial at 73fc0000
  serial at 73fc0000 {
          compatible: "fsl,imx51-uart", "fsl,imx21-uart"
          reg: <0x73fc0000 0x4000>
          interrupts: <0x20>
          clocks: <0x2 0x1e 0x2 0x1f>
          clock-names: "ipg", "per"
          status: "okay"
          pinctrl-names: "default"
          pinctrl-0: <0xb>
  };


barebox will only use the internal devicetree during probe, so after the
devicetree has been probed it can (but of course does not have to) be freed
again using oftree -f. The newly probed devices will continue to exist, just
the additional devicenode is gone.


The following changes since commit 46dae550cdccfee407f8ced183f9102296cb79b7:

  ARM am33xx: the hsmmc is a omap4 type mmc controller (2013-01-10 20:41:42 +0100)

are available in the git repository at:

  git://git.pengutronix.de/git/barebox.git pu/oftree

for you to fetch changes up to 8d84eb6090e46c6013dfd1890b09a78096b5ca46:

  commands: Add of_node command (2013-01-11 14:10:17 +0100)

----------------------------------------------------------------
Sascha Hauer (16):
      of: make of_get_fixed_tree more universally usable
      of: Fix invalid path for of_find_node_by_path
      ARM android image: remove double of_fix_tree
      of: of_free fixes
      of of_free: remove old node from allnodes list
      of: return root node when looking for a node with path /
      of: rename of_parse_dtb to of_unflatten_dtb
      of: Add support for converting the unflattened tree back to a dtb
      of: remove unused barebox_fdt
      ARM bootm: only use concatenated oftree when no other is available
      of: unflatten: allow overlay dtbs
      oftree command: refactor
      of: add of_delete_property
      of: rename new_device_node to of_new_node and export it
      commands: Add of_property command
      commands: Add of_node command

 arch/arm/lib/bootm.c   |    9 +-
 arch/arm/lib/bootu.c   |    2 +-
 arch/arm/lib/bootz.c   |    2 +-
 commands/Kconfig       |   15 +++
 commands/Makefile      |    2 +
 commands/bootm.c       |   32 ++----
 commands/of_node.c     |  111 +++++++++++++++++++
 commands/of_property.c |  280 ++++++++++++++++++++++++++++++++++++++++++++++++
 commands/oftree.c      |  110 ++++++++++++-------
 common/oftree.c        |   59 ++++++++--
 drivers/of/base.c      |  143 ++++++++++++++++++++++---
 include/of.h           |   11 +-
 12 files changed, 677 insertions(+), 99 deletions(-)
 create mode 100644 commands/of_node.c
 create mode 100644 commands/of_property.c



More information about the barebox mailing list