Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

MIPS: of: Introduce helper function to get DTB

Selection of the DTB to be used was burried in more or less readable
code in head.S. Move this code into a inline helper function and
use it.

Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
Acked-by: Florian Fainelli <f.fainelli@gmail.com>

+39 -77
+7 -6
arch/mips/ath79/setup.c
··· 213 213 214 214 void __init plat_mem_setup(void) 215 215 { 216 - unsigned long fdt_start; 216 + void *dtb; 217 217 218 218 set_io_port_base(KSEG1); 219 219 220 220 /* Get the position of the FDT passed by the bootloader */ 221 - fdt_start = fw_getenvl("fdt_start"); 222 - if (fdt_start) 223 - __dt_setup_arch((void *)KSEG0ADDR(fdt_start)); 224 - else if (fw_passed_dtb) 225 - __dt_setup_arch((void *)KSEG0ADDR(fw_passed_dtb)); 221 + dtb = (void *)fw_getenvl("fdt_start"); 222 + if (dtb == NULL) 223 + dtb = get_fdt(); 224 + 225 + if (dtb) 226 + __dt_setup_arch((void *)KSEG0ADDR(dtb)); 226 227 227 228 ath79_reset_base = ioremap(AR71XX_RESET_BASE, 228 229 AR71XX_RESET_SIZE);
+3 -4
arch/mips/bmips/setup.c
··· 161 161 /* intended to somewhat resemble ARM; see Documentation/arm/booting.rst */ 162 162 if (fw_arg0 == 0 && fw_arg1 == 0xffffffff) 163 163 dtb = phys_to_virt(fw_arg2); 164 - else if (fw_passed_dtb) /* UHI interface or appended dtb */ 165 - dtb = (void *)fw_passed_dtb; 166 - else if (&__dtb_start != &__dtb_end) 167 - dtb = (void *)__dtb_start; 168 164 else 165 + dtb = get_fdt(); 166 + 167 + if (!dtb) 169 168 panic("no dtb found"); 170 169 171 170 __dt_setup_arch(dtb);
+2 -3
arch/mips/generic/init.c
··· 39 39 /* Already set up */ 40 40 return (void *)fdt; 41 41 42 - if (fw_passed_dtb && !fdt_check_header((void *)fw_passed_dtb)) { 42 + fdt = (void *)get_fdt(); 43 + if (fdt && !fdt_check_header(fdt)) { 43 44 /* 44 45 * We have been provided with the appropriate device tree for 45 46 * the board. Make use of it & search for any machine struct 46 47 * based upon the root compatible string. 47 48 */ 48 - fdt = (void *)fw_passed_dtb; 49 - 50 49 for_each_mips_machine(check_mach) { 51 50 match = mips_machine_is_compatible(check_mach, fdt); 52 51 if (match) {
+21 -1
arch/mips/include/asm/bootinfo.h
··· 112 112 extern unsigned long fw_arg0, fw_arg1, fw_arg2, fw_arg3; 113 113 114 114 #ifdef CONFIG_USE_OF 115 - extern unsigned long fw_passed_dtb; 115 + #include <linux/libfdt.h> 116 + #include <linux/of_fdt.h> 117 + 118 + extern char __appended_dtb[]; 119 + 120 + static inline void *get_fdt(void) 121 + { 122 + if (IS_ENABLED(CONFIG_MIPS_RAW_APPENDED_DTB) || 123 + IS_ENABLED(CONFIG_MIPS_ELF_APPENDED_DTB)) 124 + if (fdt_magic(&__appended_dtb) == FDT_MAGIC) 125 + return &__appended_dtb; 126 + 127 + if (fw_arg0 == -2) /* UHI interface */ 128 + return (void *)fw_arg1; 129 + 130 + if (IS_ENABLED(CONFIG_BUILTIN_DTB)) 131 + if (&__dtb_start != &__dtb_end) 132 + return &__dtb_start; 133 + 134 + return NULL; 135 + } 116 136 #endif 117 137 118 138 /*
-1
arch/mips/include/asm/octeon/octeon.h
··· 282 282 extern void octeon_check_cpu_bist(void); 283 283 284 284 int octeon_prune_device_tree(void); 285 - extern const char __appended_dtb; 286 285 extern const char __dtb_octeon_3xxx_begin; 287 286 extern const char __dtb_octeon_68xx_begin; 288 287
-31
arch/mips/kernel/head.S
··· 93 93 jr t0 94 94 0: 95 95 96 - #ifdef CONFIG_USE_OF 97 - #if defined(CONFIG_MIPS_RAW_APPENDED_DTB) || \ 98 - defined(CONFIG_MIPS_ELF_APPENDED_DTB) 99 - 100 - PTR_LA t2, __appended_dtb 101 - 102 - #ifdef CONFIG_CPU_BIG_ENDIAN 103 - li t1, 0xd00dfeed 104 - #else /* !CONFIG_CPU_BIG_ENDIAN */ 105 - li t1, 0xedfe0dd0 106 - #endif /* !CONFIG_CPU_BIG_ENDIAN */ 107 - lw t0, (t2) 108 - beq t0, t1, dtb_found 109 - #endif /* CONFIG_MIPS_RAW_APPENDED_DTB || CONFIG_MIPS_ELF_APPENDED_DTB */ 110 - li t1, -2 111 - move t2, a1 112 - beq a0, t1, dtb_found 113 - 114 - #ifdef CONFIG_BUILTIN_DTB 115 - PTR_LA t2, __dtb_start 116 - PTR_LA t1, __dtb_end 117 - bne t1, t2, dtb_found 118 - #endif /* CONFIG_BUILTIN_DTB */ 119 - 120 - li t2, 0 121 - dtb_found: 122 - #endif /* CONFIG_USE_OF */ 123 96 PTR_LA t0, __bss_start # clear .bss 124 97 LONG_S zero, (t0) 125 98 PTR_LA t1, __bss_stop - LONGSIZE ··· 105 132 LONG_S a1, fw_arg1 106 133 LONG_S a2, fw_arg2 107 134 LONG_S a3, fw_arg3 108 - 109 - #ifdef CONFIG_USE_OF 110 - LONG_S t2, fw_passed_dtb 111 - #endif 112 135 113 136 MTC0 zero, CP0_CONTEXT # clear context register 114 137 #ifdef CONFIG_64BIT
-4
arch/mips/kernel/setup.c
··· 792 792 unsigned long kernelsp[NR_CPUS]; 793 793 unsigned long fw_arg0, fw_arg1, fw_arg2, fw_arg3; 794 794 795 - #ifdef CONFIG_USE_OF 796 - unsigned long fw_passed_dtb; 797 - #endif 798 - 799 795 #ifdef CONFIG_DEBUG_FS 800 796 struct dentry *mips_debugfs_dir; 801 797 static int __init debugfs_mips(void)
+2 -5
arch/mips/lantiq/prom.c
··· 73 73 74 74 set_io_port_base((unsigned long) KSEG1); 75 75 76 - if (fw_passed_dtb) /* UHI interface */ 77 - dtb = (void *)fw_passed_dtb; 78 - else if (&__dtb_start != &__dtb_end) 79 - dtb = (void *)__dtb_start; 80 - else 76 + dtb = get_fdt(); 77 + if (dtb == NULL) 81 78 panic("no dtb found"); 82 79 83 80 /*
+1 -14
arch/mips/pic32/pic32mzda/init.c
··· 21 21 return "PIC32MZDA"; 22 22 } 23 23 24 - static ulong get_fdtaddr(void) 25 - { 26 - ulong ftaddr = 0; 27 - 28 - if (fw_passed_dtb && !fw_arg2 && !fw_arg3) 29 - return (ulong)fw_passed_dtb; 30 - 31 - if (&__dtb_start < &__dtb_end) 32 - ftaddr = (ulong)__dtb_start; 33 - 34 - return ftaddr; 35 - } 36 - 37 24 void __init plat_mem_setup(void) 38 25 { 39 26 void *dtb; 40 27 41 - dtb = (void *)get_fdtaddr(); 28 + dtb = get_fdt(); 42 29 if (!dtb) { 43 30 pr_err("pic32: no DTB found.\n"); 44 31 return;
+3 -8
arch/mips/ralink/of.c
··· 64 64 65 65 void __init plat_mem_setup(void) 66 66 { 67 - void *dtb = NULL; 67 + void *dtb; 68 68 69 69 set_io_port_base(KSEG1); 70 70 71 71 /* 72 72 * Load the builtin devicetree. This causes the chosen node to be 73 - * parsed resulting in our memory appearing. fw_passed_dtb is used 74 - * by CONFIG_MIPS_APPENDED_RAW_DTB as well. 73 + * parsed resulting in our memory appearing. 75 74 */ 76 - if (fw_passed_dtb) 77 - dtb = (void *)fw_passed_dtb; 78 - else if (&__dtb_start != &__dtb_end) 79 - dtb = (void *)__dtb_start; 80 - 75 + dtb = get_fdt(); 81 76 __dt_setup_arch(dtb); 82 77 83 78 of_scan_flat_dt(early_init_dt_find_memory, NULL);