x86: zImage: pass device tree setup data to the kernel
PATCH 1/1 x86: zImage: pass device tree setup data to the kernel
Make a copy of DTB data with setup_data header and insert new item into the the setup data linked list.
Signed-off-by Ivan Gorinov <[email protected]>
--- arch/x86/include/asm/bootparam.h | 1 + arch/x86/lib/zimage.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+)
arch/x86/include/asm/bootparam.h +1 -0
@@ -12,6 +12,7 @@/* setup data types */ #define SETUP_NONE 0#define SETUP_E820_EXT 1 +#define SETUP_DTB 2/* extensible setup data list node */ struct setup_data {
arch/x86/lib/zimage.c +32 -0
@@ -14,6 +14,8 @@*/ #include <common.h> +#include <malloc.h> +#include <asm/global_data.h> #include <asm/acpi_table.h> #include <asm/io.h> #include <asm/ptrace.h>
@@ -95,6 +97,35 @@ static int get_boot_protocol(struct setup_header *hdr) } } +static int setup_device_tree (struct setup_header *hdr) +{ +const void *fdt_blob = gd->fdt_blob; +struct setup_data *sd; +int size; + +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) {
@@ -262,6 +293,7 @@ int setup_zimage(struct boot_params *setup_base, char *cmd_line, int auto_boot,#endif setup_video (&setup_base->screen_info); +setup_device_tree (hdr);return 0 ; }
Signature · 1 line
2.7.4
PATCH 1/1 x86: zImage: pass device tree setup data to the kernel
Quoted 2 lines · Ivan Gorinov
Make a copy of DTB data with
setup_dataheader and insert new item into the the setup data linked list.
This doesn't explain "Why?" you are doing that.
What the problem? Why it's a problem?
Quoted 81 lines
Signed-off-by Ivan Gorinov <[email protected]>--- arch/x86/include/asm/bootparam.h | 1 + arch/x86/lib/zimage.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+)arch/x86/include/asm/bootparam.h +1
-0@@ -12,6 +12,7 @@/* setup data types */ #define SETUP_NONE 0#define SETUP_E820_EXT 1 +#define SETUP_DTB 2/* extensible setup data list node */ struct setup_data {arch/x86/lib/zimage.c +31
-0@@ -14,6 +14,8 @@*/ #include <common.h> +#include <malloc.h> +#include <asm/global_data.h> #include <asm/acpi_table.h> #include <asm/io.h> #include <asm/ptrace.h> @@ -95,6 +97,35 @@ static int get_boot_protocol(struct setup_header *hdr) } } +static int setup_device_tree (struct setup_header *hdr) +{ +const void *fdt_blob = gd->fdt_blob; +struct setup_data *sd; +int size; + +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,arch/x86/lib/zimage.c +1
-0ulong *load_addressp) {@@ -262,6 +293,7 @@ int setup_zimage(struct boot_params *setup_base, char *cmd_line, int auto_boot, #endif setup_video(&setup_base->screen_info); +setup_device_tree (hdr);return 0 ;}
Signature · 2 lines
Andy Shevchenko <[email protected]> Intel Finland Oy