Patchwork linux-dtb: allow to build dtb using support from kernel

login
register
mail settings
Submitter André Draszik
Date July 22, 2013, 2:02 p.m.
Message ID <1374501746-23540-1-git-send-email-andre.draszik@linaro.org>
Download mbox | patch
Permalink /patch/54181/
State New
Headers show

Comments

André Draszik - July 22, 2013, 2:02 p.m.
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).

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.

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@linaro.org>
---
 meta/recipes-kernel/linux/linux-dtb.inc | 75 +++++++++++++++++++++++++++------
 1 file changed, 63 insertions(+), 12 deletions(-)
Bruce Ashfield - July 22, 2013, 2:52 p.m.
On Mon, Jul 22, 2013 at 10:02 AM, André Draszik
<andre.draszik@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@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"
Otavio Salvador - July 22, 2013, 3:23 p.m.
On Mon, Jul 22, 2013 at 11:52 AM, Bruce Ashfield
<bruce.ashfield@gmail.com> wrote:
> On Mon, Jul 22, 2013 at 10:02 AM, André Draszik
> <andre.draszik@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@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

Patch

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"
         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
+				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
+				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 -