From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ivan Gorinov Date: Fri, 16 Mar 2018 10:38:36 -0700 Subject: [U-Boot] [PATCH v2] x86: zImage: pass device tree setup data to the kernel Message-ID: <20180316173836.GA1813@intel.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On x86 platforms, U-Boot does not provide Device Tree data to the kernel. This prevents the kernel from using the same hardware description. 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 --- arch/x86/include/asm/bootparam.h | 1 + arch/x86/lib/zimage.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/arch/x86/include/asm/bootparam.h b/arch/x86/include/asm/bootparam.h index 90768a9..ea25cf7 100644 --- a/arch/x86/include/asm/bootparam.h +++ b/arch/x86/include/asm/bootparam.h @@ -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 { diff --git a/arch/x86/lib/zimage.c b/arch/x86/lib/zimage.c index 2a82bc8..41ad4c7 100644 --- a/arch/x86/lib/zimage.c +++ b/arch/x86/lib/zimage.c @@ -14,6 +14,8 @@ */ #include +#include +#include #include #include #include @@ -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; } -- 2.7.4