On Mon, Jul 22, 2013 at 11:52 AM, Bruce Ashfield <bruce.ashfi...@gmail.com> wrote: > 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.
Yes; I flag would be good indeed. >> 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" -- Otavio Salvador O.S. Systems http://www.ossystems.com.br http://projetos.ossystems.com.br Mobile: +55 (53) 9981-7854 Mobile: +1 (347) 903-9750 _______________________________________________ Openembedded-core mailing list Openembedded-core@lists.openembedded.org http://lists.openembedded.org/mailman/listinfo/openembedded-core