Patrick Georgi | afd4c87 | 2020-05-05 23:43:18 +0200 | [diff] [blame] | 1 | /* Taken from depthcharge: src/boot/fit.h */ |
Patrick Georgi | ac95903 | 2020-05-05 22:49:26 +0200 | [diff] [blame] | 2 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
Patrick Rudolph | a45e9f8 | 2018-04-19 14:39:07 +0200 | [diff] [blame] | 3 | |
Patrick Rudolph | a892cde | 2018-04-19 14:39:07 +0200 | [diff] [blame] | 4 | #ifndef __LIB_FIT_H__ |
| 5 | #define __LIB_FIT_H__ |
Patrick Rudolph | a45e9f8 | 2018-04-19 14:39:07 +0200 | [diff] [blame] | 6 | |
| 7 | #include <stddef.h> |
| 8 | #include <stdint.h> |
Patrick Rudolph | a892cde | 2018-04-19 14:39:07 +0200 | [diff] [blame] | 9 | #include <device_tree.h> |
| 10 | #include <list.h> |
| 11 | #include <program_loading.h> |
Patrick Rudolph | a45e9f8 | 2018-04-19 14:39:07 +0200 | [diff] [blame] | 12 | |
Julius Werner | 21b0b1a | 2019-05-16 16:12:04 -0700 | [diff] [blame] | 13 | struct fit_image_node { |
Patrick Rudolph | a45e9f8 | 2018-04-19 14:39:07 +0200 | [diff] [blame] | 14 | const char *name; |
Julius Werner | b379f19 | 2019-05-13 16:34:16 -0700 | [diff] [blame] | 15 | void *data; |
Patrick Rudolph | a45e9f8 | 2018-04-19 14:39:07 +0200 | [diff] [blame] | 16 | uint32_t size; |
Patrick Rudolph | a892cde | 2018-04-19 14:39:07 +0200 | [diff] [blame] | 17 | int compression; |
Patrick Rudolph | a45e9f8 | 2018-04-19 14:39:07 +0200 | [diff] [blame] | 18 | |
Patrick Rudolph | a892cde | 2018-04-19 14:39:07 +0200 | [diff] [blame] | 19 | struct list_node list_node; |
| 20 | }; |
Patrick Rudolph | a45e9f8 | 2018-04-19 14:39:07 +0200 | [diff] [blame] | 21 | |
Julius Werner | 21b0b1a | 2019-05-16 16:12:04 -0700 | [diff] [blame] | 22 | struct fit_config_node { |
Patrick Rudolph | a45e9f8 | 2018-04-19 14:39:07 +0200 | [diff] [blame] | 23 | const char *name; |
Julius Werner | b379f19 | 2019-05-13 16:34:16 -0700 | [diff] [blame] | 24 | struct fit_image_node *kernel; |
| 25 | struct fit_image_node *fdt; |
Julius Werner | 21b0b1a | 2019-05-16 16:12:04 -0700 | [diff] [blame] | 26 | struct list_node overlays; |
Julius Werner | b379f19 | 2019-05-13 16:34:16 -0700 | [diff] [blame] | 27 | struct fit_image_node *ramdisk; |
Patrick Rudolph | a892cde | 2018-04-19 14:39:07 +0200 | [diff] [blame] | 28 | struct fdt_property compat; |
Patrick Rudolph | a45e9f8 | 2018-04-19 14:39:07 +0200 | [diff] [blame] | 29 | int compat_rank; |
| 30 | int compat_pos; |
Patrick Rudolph | a892cde | 2018-04-19 14:39:07 +0200 | [diff] [blame] | 31 | const char *compat_string; |
Patrick Rudolph | a45e9f8 | 2018-04-19 14:39:07 +0200 | [diff] [blame] | 32 | |
Patrick Rudolph | a892cde | 2018-04-19 14:39:07 +0200 | [diff] [blame] | 33 | struct list_node list_node; |
| 34 | }; |
| 35 | |
Julius Werner | 21b0b1a | 2019-05-16 16:12:04 -0700 | [diff] [blame] | 36 | struct fit_overlay_chain { |
| 37 | struct fit_image_node *overlay; |
| 38 | struct list_node list_node; |
| 39 | }; |
| 40 | |
Patrick Rudolph | a892cde | 2018-04-19 14:39:07 +0200 | [diff] [blame] | 41 | /* |
| 42 | * Updates the cmdline in the devicetree. |
| 43 | */ |
Patrick Rudolph | 0a7d690 | 2018-08-22 09:55:15 +0200 | [diff] [blame] | 44 | void fit_update_chosen(struct device_tree *tree, const char *cmd_line); |
Patrick Rudolph | a892cde | 2018-04-19 14:39:07 +0200 | [diff] [blame] | 45 | |
| 46 | /* |
| 47 | * Add a compat string to the list of supported board ids. |
| 48 | * Has to be called before fit_load(). |
| 49 | * The most common use-case would be to implement it on board level. |
| 50 | * Strings that were added first have a higher priority on finding a match. |
| 51 | */ |
| 52 | void fit_add_compat_string(const char *str); |
| 53 | |
| 54 | /* |
| 55 | * Updates the memory section in the devicetree. |
| 56 | */ |
| 57 | void fit_update_memory(struct device_tree *tree); |
| 58 | |
| 59 | /* |
| 60 | * Do architecture specific payload placements and fixups. |
| 61 | * Set entrypoint and first argument (if any). |
| 62 | * @param payload The payload, to set the entry point |
| 63 | * @param config The extracted FIT config |
| 64 | * @param kernel out-argument where to place the kernel |
| 65 | * @param fdt out-argument where to place the devicetree |
| 66 | * @param initrd out-argument where to place the initrd (optional) |
| 67 | * @return True if all config nodes could be placed, the corresponding |
| 68 | * regions have been updated and the entry point has been set. |
| 69 | * False on error. |
| 70 | */ |
| 71 | bool fit_payload_arch(struct prog *payload, struct fit_config_node *config, |
| 72 | struct region *kernel, |
| 73 | struct region *fdt, |
| 74 | struct region *initrd); |
Patrick Rudolph | a45e9f8 | 2018-04-19 14:39:07 +0200 | [diff] [blame] | 75 | |
| 76 | /* |
| 77 | * Unpack a FIT image into memory, choosing the right configuration through the |
Patrick Rudolph | a892cde | 2018-04-19 14:39:07 +0200 | [diff] [blame] | 78 | * compatible string set by fit_add_compat() and return the selected config |
| 79 | * node. |
Patrick Rudolph | a45e9f8 | 2018-04-19 14:39:07 +0200 | [diff] [blame] | 80 | */ |
Patrick Rudolph | a892cde | 2018-04-19 14:39:07 +0200 | [diff] [blame] | 81 | struct fit_config_node *fit_load(void *fit); |
Patrick Rudolph | a45e9f8 | 2018-04-19 14:39:07 +0200 | [diff] [blame] | 82 | |
Patrick Rudolph | a892cde | 2018-04-19 14:39:07 +0200 | [diff] [blame] | 83 | void fit_add_ramdisk(struct device_tree *tree, void *ramdisk_addr, |
| 84 | size_t ramdisk_size); |
Patrick Rudolph | a45e9f8 | 2018-04-19 14:39:07 +0200 | [diff] [blame] | 85 | |
Patrick Rudolph | a892cde | 2018-04-19 14:39:07 +0200 | [diff] [blame] | 86 | #endif /* __LIB_FIT_H__ */ |