21b0b1adec
This patch adds support to boot FIT image configurations consisting of a base device tree and one or more overlays. Since extracting the right compatible string from overlay FDTs is problematic, we'll only support this for FIT images that have the compatible string pulled out into the config node. This patch was adapted from depthcharge's http://crosreview.com/1555293 Change-Id: I0943f9a1869c9e416887c7ff16e33f7d91b74989 Signed-off-by: Julius Werner <jwerner@chromium.org> Reviewed-on: https://review.coreboot.org/c/coreboot/+/32873 Reviewed-by: Hung-Te Lin <hungte@chromium.org> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
100 lines
2.8 KiB
C
100 lines
2.8 KiB
C
/*
|
|
* Copyright 2013 Google Inc.
|
|
* Copyright 2018-present Facebook, Inc.
|
|
*
|
|
* Taken from depthcharge: src/boot/fit.h
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License as
|
|
* published by the Free Software Foundation; either version 2 of
|
|
* the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but without any warranty; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*/
|
|
|
|
#ifndef __LIB_FIT_H__
|
|
#define __LIB_FIT_H__
|
|
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
#include <device_tree.h>
|
|
#include <list.h>
|
|
#include <program_loading.h>
|
|
|
|
struct fit_image_node {
|
|
const char *name;
|
|
void *data;
|
|
uint32_t size;
|
|
int compression;
|
|
|
|
struct list_node list_node;
|
|
};
|
|
|
|
struct fit_config_node {
|
|
const char *name;
|
|
struct fit_image_node *kernel;
|
|
struct fit_image_node *fdt;
|
|
struct list_node overlays;
|
|
struct fit_image_node *ramdisk;
|
|
struct fdt_property compat;
|
|
int compat_rank;
|
|
int compat_pos;
|
|
const char *compat_string;
|
|
|
|
struct list_node list_node;
|
|
};
|
|
|
|
struct fit_overlay_chain {
|
|
struct fit_image_node *overlay;
|
|
struct list_node list_node;
|
|
};
|
|
|
|
/*
|
|
* Updates the cmdline in the devicetree.
|
|
*/
|
|
void fit_update_chosen(struct device_tree *tree, const char *cmd_line);
|
|
|
|
/*
|
|
* Add a compat string to the list of supported board ids.
|
|
* Has to be called before fit_load().
|
|
* The most common use-case would be to implement it on board level.
|
|
* Strings that were added first have a higher priority on finding a match.
|
|
*/
|
|
void fit_add_compat_string(const char *str);
|
|
|
|
/*
|
|
* Updates the memory section in the devicetree.
|
|
*/
|
|
void fit_update_memory(struct device_tree *tree);
|
|
|
|
/*
|
|
* Do architecture specific payload placements and fixups.
|
|
* Set entrypoint and first argument (if any).
|
|
* @param payload The payload, to set the entry point
|
|
* @param config The extracted FIT config
|
|
* @param kernel out-argument where to place the kernel
|
|
* @param fdt out-argument where to place the devicetree
|
|
* @param initrd out-argument where to place the initrd (optional)
|
|
* @return True if all config nodes could be placed, the corresponding
|
|
* regions have been updated and the entry point has been set.
|
|
* False on error.
|
|
*/
|
|
bool fit_payload_arch(struct prog *payload, struct fit_config_node *config,
|
|
struct region *kernel,
|
|
struct region *fdt,
|
|
struct region *initrd);
|
|
|
|
/*
|
|
* Unpack a FIT image into memory, choosing the right configuration through the
|
|
* compatible string set by fit_add_compat() and return the selected config
|
|
* node.
|
|
*/
|
|
struct fit_config_node *fit_load(void *fit);
|
|
|
|
void fit_add_ramdisk(struct device_tree *tree, void *ramdisk_addr,
|
|
size_t ramdisk_size);
|
|
|
|
#endif /* __LIB_FIT_H__ */
|