the documented boot protocol using a device tree.
 
        config MIPS_RAW_APPENDED_DTB
-               bool "vmlinux.bin"
+               bool "vmlinux.bin or vmlinuz.bin"
                help
                  With this option, the boot code will look for a device tree binary
-                 DTB) appended to raw vmlinux.bin (without decompressor).
+                 DTB) appended to raw vmlinux.bin or vmlinuz.bin.
                  (e.g. cat vmlinux.bin <filename>.dtb > vmlinux_w_dtb).
 
                  This is meant as a backward compatibility convenience for those
                  look like a DTB header after a reboot if no actual DTB is appended
                  to vmlinux.bin.  Do not leave this option active in a production kernel
                  if you don't intend to always append a DTB.
-
-       config MIPS_ZBOOT_APPENDED_DTB
-               bool "vmlinuz.bin"
-               depends on SYS_SUPPORTS_ZBOOT
-               help
-                 With this option, the boot code will look for a device tree binary
-                 DTB) appended to raw vmlinuz.bin (with decompressor).
-                 (e.g. cat vmlinuz.bin <filename>.dtb > vmlinuz_w_dtb).
-
-                 This is meant as a backward compatibility convenience for those
-                 systems with a bootloader that can't be upgraded to accommodate
-                 the documented boot protocol using a device tree.
-
-                 Beware that there is very little in terms of protection against
-                 this option being confused by leftover garbage in memory that might
-                 look like a DTB header after a reboot if no actual DTB is appended
-                 to vmlinuz.bin.  Do not leave this option active in a production kernel
-                 if you don't intend to always append a DTB.
 endchoice
 
 choice
 
 #include <linux/types.h>
 #include <linux/kernel.h>
 #include <linux/string.h>
+#include <linux/libfdt.h>
 
 #include <asm/addrspace.h>
 
 #define puthex(val) do {} while (0)
 #endif
 
+extern char __appended_dtb[];
+
 void error(char *x)
 {
        puts("\n\n");
        __decompress((char *)zimage_start, zimage_size, 0, 0,
                   (void *)VMLINUX_LOAD_ADDRESS_ULL, 0, 0, error);
 
+       if (IS_ENABLED(CONFIG_MIPS_RAW_APPENDED_DTB) &&
+           fdt_magic((void *)&__appended_dtb) == FDT_MAGIC) {
+               unsigned int image_size, dtb_size;
+
+               dtb_size = fdt_totalsize((void *)&__appended_dtb);
+
+               /* last four bytes is always image size in little endian */
+               image_size = le32_to_cpup((void *)&__image_end - 4);
+
+               /* copy dtb to where the booted kernel will expect it */
+               memcpy((void *)VMLINUX_LOAD_ADDRESS_ULL + image_size,
+                      __appended_dtb, dtb_size);
+       }
+
        /* FIXME: should we flush cache here? */
        puts("Now, booting the kernel...\n");
 }