[OE-core] [PATCH] linux-dtb: allow to build dtb using support from kernel
Bruce Ashfield
bruce.ashfield at gmail.com
Mon Jul 22 14:52:15 UTC 2013
On Mon, Jul 22, 2013 at 10:02 AM, André Draszik
<andre.draszik at linaro.org> wrote:
> Currently, OE is unable to use the linux kernel's built-in
> support to generate a device tree blob (dtb). This is an
> issue for device tree source (dts) files that need to be run
> through CPP (dtsp).
It's not clear to me (from the commit message), why the dtc recipe can't
provide what we need. I don't object to using the in kernel tree dtc, but
all the reasons why there are no other options need to be in the commit
message.
>
> The kernel build system has built-in support for device tree
> source files that /include/ additional files and it also
> supports the source file to be pre-processed using CPP.
>
> This commits lets OE use kbuild if $KERNEL_DEVICETREE points
> to file(s) that are located in arch/${ARCH}/boot/dts/, e.g.
> KERNEL_DEVICETREE = "<machine>.dts". In this case, no
> dependency is added on dtc-native, as that is not needed any
> more.
>
What happens with SDK builds ? i.e. if nativsdk versions of the dtc recipe are
used, we'll still have the functional gap.
> The previous way of handling dts files, i.e. compilation via
> the stand-alone dtc-native, is still supported - it is triggered
> by specifying the full path to the dts file, as before, e.g.
> KERNEL_DEVICETREE = "arch/${ARCH}/boot/dts/<machine>.dts"
>
> Signed-off-by: André Draszik <andre.draszik at linaro.org>
> ---
> meta/recipes-kernel/linux/linux-dtb.inc | 75 +++++++++++++++++++++++++++------
> 1 file changed, 63 insertions(+), 12 deletions(-)
>
> diff --git a/meta/recipes-kernel/linux/linux-dtb.inc b/meta/recipes-kernel/linux/linux-dtb.inc
> index 7747718..75b8b76 100644
> --- a/meta/recipes-kernel/linux/linux-dtb.inc
> +++ b/meta/recipes-kernel/linux/linux-dtb.inc
> @@ -1,28 +1,66 @@
> +inherit kernel-arch
> +
> # Support for device tree generation
> FILES_kernel-devicetree = "/boot/devicetree*"
> KERNEL_DEVICETREE_FLAGS ?= "-R 8 -p 0x3000"
>
> python __anonymous () {
> + from os import path
> +
> devicetree = d.getVar("KERNEL_DEVICETREE", True) or ''
> if devicetree:
> - depends = d.getVar("DEPENDS", True)
> - d.setVar("DEPENDS", "%s dtc-native" % depends)
> + S = d.getVar("S", True)
> + for DTS_FILE in devicetree.split():
> + DTS_FILE = S + "/" + DTS_FILE
> + if os.path.exists(DTS_FILE):
> + # full path given, use dtc-native
> + print "old style KERNEL_DEVICETREE, adding depend on dtc-native"
> + depends = d.getVar("DEPENDS", True)
> + d.setVar("DEPENDS", "%s dtc-native" % depends)
> + else:
> + # new style - it's just a file name, under arch/${ARCH}/boot/dts
> + # we don't need dtc-native, as we use the kernel's compiler
> + print "new style KERNEL_DEVICETREE"
There really needs to be a flag or other option to override this detection.
> packages = d.getVar("PACKAGES", True)
> d.setVar("PACKAGES", "%s kernel-devicetree" % packages)
> }
>
> -do_install_append() {
> +do_compile_append() {
> if test -n "${KERNEL_DEVICETREE}"; then
> for DTS_FILE in ${KERNEL_DEVICETREE}; do
> if [ ! -f ${DTS_FILE} ]; then
> - echo "Warning: ${DTS_FILE} is not available!"
> - continue
> + if [ ! -f arch/${ARCH}/boot/dts/${DTS_FILE} ]; then
> + echo "Warning: ${DTS_FILE} is not available!"
> + continue
> + fi
> +
> + # standard build using kbuild
> + echo "Info: standard kbuild for device tree blob"
> + DTS_BASE_NAME=`basename ${DTS_FILE} | awk -F "." '{print $1}'`
> +
> + unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS MACHINE
> + oe_runmake ${DTS_BASE_NAME}.dtb CC="${KERNEL_CC}" LD="${KERNEL_LD}" ${KERNEL_EXTRA_ARGS}
> fi
> + done
> + fi
> +}
> +
> +do_install_append() {
> + if test -n "${KERNEL_DEVICETREE}"; then
> + for DTS_FILE in ${KERNEL_DEVICETREE}; do
> DTS_BASE_NAME=`basename ${DTS_FILE} | awk -F "." '{print $1}'`
> - DTB_NAME=`echo ${KERNEL_IMAGE_BASE_NAME} | sed "s/${MACHINE}/${DTS_BASE_NAME}/g"`
> DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed "s/${MACHINE}/${DTS_BASE_NAME}/g"`
> - dtc -I dts -O dtb ${KERNEL_DEVICETREE_FLAGS} -o ${DTS_BASE_NAME} ${DTS_FILE}
> - install -m 0644 ${DTS_BASE_NAME} ${D}/boot/devicetree-${DTB_SYMLINK_NAME}.dtb
> + if [ ! -f ${DTS_FILE} ]; then
Since install comes after compile, it would be better to test on the results of
the compile phase (i.e. is there a dtb already), and keep the checking on the
existence of the DTS in as few places as possible. In particular, since there
should still be an opt-out flag, having as few touches as possible is better.
> + if [ ! -f arch/${ARCH}/boot/dts/${DTS_FILE} ]; then
> + echo "Warning: ${DTS_FILE} is not available!"
> + continue
> + fi
> +
> + install -m 0644 arch/${ARCH}/boot/${DTS_BASE_NAME}.dtb ${D}/boot/devicetree-${DTB_SYMLINK_NAME}.dtb
> + continue
> + fi
> + dtc -I dts -O dtb ${KERNEL_DEVICETREE_FLAGS} -o ${DTS_BASE_NAME}.dtb ${DTS_FILE}
> + install -m 0644 ${DTS_BASE_NAME}.dtb ${D}/boot/devicetree-${DTB_SYMLINK_NAME}.dtb
> done
> fi
> }
> @@ -30,15 +68,28 @@ do_install_append() {
> do_deploy_append() {
> if test -n "${KERNEL_DEVICETREE}"; then
> for DTS_FILE in ${KERNEL_DEVICETREE}; do
> + DTS_BASE_NAME=`basename ${DTS_FILE} | awk -F "." '{print $1}'`
> if [ ! -f ${DTS_FILE} ]; then
> - echo "Warning: ${DTS_FILE} is not available!"
> - continue
> + if [ ! -f arch/${ARCH}/boot/dts/${DTS_FILE} ]; then
> + echo "Warning: ${DTS_FILE} is not available!"
> + continue
> + fi
> +
> + # standard build using kbuild
> + echo "Info: standard kbuild for device tree blob"
> fi
> - DTS_BASE_NAME=`basename ${DTS_FILE} | awk -F "." '{print $1}'`
> +
> DTB_NAME=`echo ${KERNEL_IMAGE_BASE_NAME} | sed "s/${MACHINE}/${DTS_BASE_NAME}/g"`
> DTB_SYMLINK_NAME=`echo ${KERNEL_IMAGE_SYMLINK_NAME} | sed "s/${MACHINE}/${DTS_BASE_NAME}/g"`
> +
> install -d ${DEPLOYDIR}
> - install -m 0644 ${B}/${DTS_BASE_NAME} ${DEPLOYDIR}/${DTB_NAME}.dtb
> +
> + if [ -f arch/${ARCH}/boot/dts/${DTS_FILE} ]; then
This should really be testing on the dtb, not the DTS. We could also
have a single install
line, if any testing is done at the top of the routine and a single
variable set to point to
the dtb, wherever it may be.
Cheers,
Bruce
> + install -m 0644 ${B}/arch/${ARCH}/boot/${DTS_BASE_NAME}.dtb ${DEPLOYDIR}/${DTB_NAME}.dtb
> + else
> + install -m 0644 ${B}/${DTS_BASE_NAME}.dtb ${DEPLOYDIR}/${DTB_NAME}.dtb
> + fi
> +
> cd ${DEPLOYDIR}
> ln -sf ${DTB_NAME}.dtb ${DTB_SYMLINK_NAME}.dtb
> cd -
> --
> 1.8.2
>
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core at lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/openembedded-core
--
"Thou shalt not follow the NULL pointer, for chaos and madness await
thee at its end"
More information about the Openembedded-core
mailing list