lib: Add FIT payload support
* Add support for parsing and booting FIT payloads. * Build fit loader code from depthcharge. * Fix coding style. * Add Kconfig option to add compiletime support for FIT. * Add support for initrd. * Add default compat strings * Apply optional devicetree fixups using dt_apply_fixups Starting at this point the CBFS payload/ can be either SELF or FIT. Tested on Cavium SoC: Parses and loads a Linux kernel 4.16.3. Tested on Cavium SoC: Parses and loads a Linux kernel 4.15.0. Tested on Cavium SoC: Parses and loads a Linux kernel 4.1.52. Change-Id: I0f27b92a5e074966f893399eb401eb97d784850d Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com> Reviewed-on: https://review.coreboot.org/25019 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Philipp Deppenwiese <zaolin.daisuki@gmail.com>
This commit is contained in:
committed by
Philipp Deppenwiese
parent
8c986ab263
commit
a892cde653
@ -1,8 +1,8 @@
|
||||
/*
|
||||
* Copyright 2013 Google Inc.
|
||||
* Copyright 2018-present Facebook, Inc.
|
||||
*
|
||||
* See file CREDITS for list of people who contributed to this
|
||||
* project.
|
||||
* 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
|
||||
@ -15,64 +15,85 @@
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef __BOOT_FIT_H__
|
||||
#define __BOOT_FIT_H__
|
||||
#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>
|
||||
|
||||
#include "base/device_tree.h"
|
||||
#include "base/list.h"
|
||||
|
||||
typedef enum CompressionType
|
||||
{
|
||||
CompressionInvalid,
|
||||
CompressionNone,
|
||||
CompressionLzma,
|
||||
CompressionLz4,
|
||||
} CompressionType;
|
||||
|
||||
typedef struct FitImageNode
|
||||
struct fit_image_node
|
||||
{
|
||||
const char *name;
|
||||
void *data;
|
||||
uint32_t size;
|
||||
CompressionType compression;
|
||||
int compression;
|
||||
|
||||
ListNode list_node;
|
||||
} FitImageNode;
|
||||
struct list_node list_node;
|
||||
};
|
||||
|
||||
typedef struct FitConfigNode
|
||||
struct fit_config_node
|
||||
{
|
||||
const char *name;
|
||||
const char *kernel;
|
||||
FitImageNode *kernel_node;
|
||||
struct fit_image_node *kernel_node;
|
||||
const char *fdt;
|
||||
FitImageNode *fdt_node;
|
||||
struct fit_image_node *fdt_node;
|
||||
const char *ramdisk;
|
||||
FitImageNode *ramdisk_node;
|
||||
FdtProperty compat;
|
||||
struct fit_image_node *ramdisk_node;
|
||||
struct fdt_property compat;
|
||||
int compat_rank;
|
||||
int compat_pos;
|
||||
const char *compat_string;
|
||||
|
||||
ListNode list_node;
|
||||
} FitConfigNode;
|
||||
struct list_node list_node;
|
||||
};
|
||||
|
||||
/*
|
||||
* Updates the cmdline in the devicetree.
|
||||
*/
|
||||
void fit_update_chosen(struct device_tree *tree, 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 unflattening the corresponding
|
||||
* kernel device tree.
|
||||
* compatible string set by fit_add_compat() and return the selected config
|
||||
* node.
|
||||
*/
|
||||
FitImageNode *fit_load(void *fit, char *cmd_line, DeviceTree **dt);
|
||||
struct fit_config_node *fit_load(void *fit);
|
||||
|
||||
/*
|
||||
* Add a compatible string for the preferred kernel DT to the list for this
|
||||
* platform. This should be called before the first fit_load() so it will be
|
||||
* ranked as a better match than the default compatible strings. |compat| must
|
||||
* stay accessible throughout depthcharge's runtime (i.e. not stack-allocated)!
|
||||
*/
|
||||
void fit_add_compat(const char *compat);
|
||||
void fit_add_ramdisk(struct device_tree *tree, void *ramdisk_addr,
|
||||
size_t ramdisk_size);
|
||||
|
||||
void fit_add_ramdisk(DeviceTree *tree, void *ramdisk_addr, size_t ramdisk_size);
|
||||
|
||||
#endif /* __BOOT_FIT_H__ */
|
||||
#endif /* __LIB_FIT_H__ */
|
||||
|
Reference in New Issue
Block a user