x86: zImage: Pass working device tree data to the kernel
PATCH v3 1/1 x86: zImage: Pass working device tree data to the kernel
On x86 platforms, U-Boot does not pass Device Tree data to the kernel. This prevents the kernel from using FDT loaded by U-Boot.
Read the working FDT address from the "fdtaddr" environment variable and add a copy of the FDT data to the kernel setup_data list.
--- arch/x86/include/asm/bootparam.h | 7 +++++-- arch/x86/lib/zimage.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-)
arch/x86/include/asm/bootparam.h +5 -2
@@ -10,8 +10,11 @@#include <asm/video/edid.h> /* setup data types */ -#define SETUP_NONE 0 -#define SETUP_E820_EXT 1 +enum { +SETUP_NONE =0 , +SETUP_E820_EXT , +SETUP_DTB , +};/* extensible setup data list node */ struct setup_data {
arch/x86/lib/zimage.c +34 -0
@@ -14,6 +14,7 @@*/ #include <common.h> +#include <malloc.h> #include <asm/acpi_table.h> #include <asm/io.h> #include <asm/ptrace.h>
@@ -95,6 +96,38 @@ static int get_boot_protocol(struct setup_header *hdr) } } +static int setup_device_tree (struct setup_header *hdr,const void *fdt_blob) +{ +int bootproto =get_boot_protocol (hdr); +struct setup_data *sd; +int size; + +if (bootproto <0x0209 ) +return -ENOTSUPP ; + +if (!fdt_blob) +return 0 ; + + size =fdt_totalsize (fdt_blob); +if (size <0 ) +return -EINVAL ; + + size +=sizeof (struct setup_data ); + sd = (struct setup_data *)malloc (size); +if (!sd) { +printf ("Not enough memory for DTB setup data\n" ); +return -ENOMEM ; + } + + sd->next = hdr->setup_data; + sd->type =SETUP_DTB ; + sd->len =fdt_totalsize (fdt_blob); +memcpy (sd->data, fdt_blob, sd->len); + hdr->setup_data = (unsigned long )sd; + +return 0 ; +} +struct boot_params *load_zimage (char *image,unsigned long kernel_size,ulong *load_addressp) {
@@ -261,6 +294,7 @@ int setup_zimage(struct boot_params *setup_base, char *cmd_line, int auto_boot, hdr->acpi_rsdp_addr =acpi_get_rsdp_addr ();#endif +setup_device_tree (hdr, (const void *)env_get_hex ("fdtaddr" ,0 ));setup_video (&setup_base->screen_info);return 0 ;
Signature · 1 line
2.7.4
PATCH v3 1/1 x86: zImage: Pass working device tree data to the kernel
Quoted 12 lines · Ivan Gorinov
On x86 platforms, U-Boot does not pass Device Tree data to the kernel. This prevents the kernel from using FDT loaded by U-Boot.
Read the working FDT address from the "fdtaddr" environment variable and add a copy of the FDT data to the kernel
setup_datalist.Signed-off-by Ivan Gorinov <[email protected]>--- arch/x86/include/asm/bootparam.h | 7 +++++-- arch/x86/lib/zimage.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-)
PATCH v3 1/1 x86: zImage: Pass working device tree data to the kernel
Quoted 7 lines · Bin Meng
Quoted 6 lines · Ivan Gorinov
On x86 platforms, U-Boot does not pass Device Tree data to the kernel. This prevents the kernel from using FDT loaded by U-Boot.
Read the working FDT address from the "fdtaddr" environment variable and add a copy of the FDT data to the kernel
setup_datalist.
Quoted 8 lines
Quoted 6 lines
Signed-off-by Ivan Gorinov <[email protected]>--- arch/x86/include/asm/bootparam.h | 7 +++++-- arch/x86/lib/zimage.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-)Reviewed-by Bin Meng <[email protected]>
applied to u-boot-x86, thanks!
PATCH v3 1/1 x86: zImage: Pass working device tree data to the kernel
In reply to Ivan GorinovQuoted 35 lines · Ivan Gorinov
On x86 platforms, U-Boot does not pass Device Tree data to the kernel. This prevents the kernel from using FDT loaded by U-Boot.
Read the working FDT address from the "fdtaddr" environment variable and add a copy of the FDT data to the kernel
setup_datalist.Signed-off-by Ivan Gorinov <[email protected]>--- arch/x86/include/asm/bootparam.h | 7 +++++-- arch/x86/lib/zimage.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-)arch/x86/include/asm/bootparam.h +5
-2@@ -10,8 +10,11 @@#include <asm/video/edid.h> /* setup data types */ -#define SETUP_NONE 0 -#define SETUP_E820_EXT 1 +enum { +SETUP_NONE =0 , +SETUP_E820_EXT , +SETUP_DTB , +};/* extensible setup data list node */ struct setup_data {arch/x86/lib/zimage.c +0
-0
arch/x86/lib/zimage.c line 20
Quoted 7 lines
arch/x86/lib/zimage.c +1
-0@@ -14,6 +14,7 @@*/ #include <common.h> +#include <malloc.h> #include <asm/acpi_table.h> #include <asm/io.h> #include <asm/ptrace.h>
Sorry to mention that I added "#include <linux/libfdt.h>" here to fix build error seen on several x86 boards during a buildman testing. Changed applied to u-boot-x86.
arch/x86/lib/zimage.c static int get_boot_protocol(struct setup_header *hdr) · line 98
Quoted 4 lines
arch/x86/lib/zimage.c +0
-0@@ -95,6 +96,38 @@ static int get_boot_protocol(struct setup_header *hdr) } }
Regards,
Bin