On Mon, Jul 22, 2013 at 10:02 AM, André Draszik <andre.dras...@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.dras...@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@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" _______________________________________________ Openembedded-core mailing list Openembedded-core@lists.openembedded.org http://lists.openembedded.org/mailman/listinfo/openembedded-core