lib/fit: support booting initrd placed above 4GiB
Store initrd offset as 64bit integer. Tested on Cavium CN81XX EVB: The initrd could be loaded when placed above 4GiB. Previously it failed to find the initrd. Change-Id: I5d1ae860ae4a4465546bc0ef89937d611d1e56ab Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com> Reviewed-on: https://review.coreboot.org/28002 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Aaron Durbin <adurbin@chromium.org> Reviewed-by: Philipp Deppenwiese <zaolin.daisuki@gmail.com>
This commit is contained in:
parent
6539edef41
commit
3fca4ed45e
|
@ -158,6 +158,7 @@ void dt_add_bin_prop(struct device_tree_node *node, const char *name, void *data
|
||||||
size_t size);
|
size_t size);
|
||||||
void dt_add_string_prop(struct device_tree_node *node, const char *name, char *str);
|
void dt_add_string_prop(struct device_tree_node *node, const char *name, char *str);
|
||||||
void dt_add_u32_prop(struct device_tree_node *node, const char *name, u32 val);
|
void dt_add_u32_prop(struct device_tree_node *node, const char *name, u32 val);
|
||||||
|
void dt_add_u64_prop(struct device_tree_node *node, const char *name, u64 val);
|
||||||
void dt_add_reg_prop(struct device_tree_node *node, u64 *addrs, u64 *sizes,
|
void dt_add_reg_prop(struct device_tree_node *node, u64 *addrs, u64 *sizes,
|
||||||
int count, u32 addr_cells, u32 size_cells);
|
int count, u32 addr_cells, u32 size_cells);
|
||||||
int dt_set_bin_prop_by_path(struct device_tree *tree, const char *path,
|
int dt_set_bin_prop_by_path(struct device_tree *tree, const char *path,
|
||||||
|
|
|
@ -881,6 +881,22 @@ void dt_add_u32_prop(struct device_tree_node *node, const char *name, u32 val)
|
||||||
dt_add_bin_prop(node, name, val_ptr, sizeof(*val_ptr));
|
dt_add_bin_prop(node, name, val_ptr, sizeof(*val_ptr));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Add a 64-bit integer property to a node, or update it if it already exists.
|
||||||
|
*
|
||||||
|
* @param node The device tree node to add to.
|
||||||
|
* @param name The name of the new property.
|
||||||
|
* @param val The integer to be stored in the property.
|
||||||
|
*/
|
||||||
|
void dt_add_u64_prop(struct device_tree_node *node, const char *name, u64 val)
|
||||||
|
{
|
||||||
|
u64 *val_ptr = malloc(sizeof(val));
|
||||||
|
if (!val_ptr)
|
||||||
|
return;
|
||||||
|
*val_ptr = htobe64(val);
|
||||||
|
dt_add_bin_prop(node, name, val_ptr, sizeof(*val_ptr));
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Add a 'reg' address list property to a node, or update it if it exists.
|
* Add a 'reg' address list property to a node, or update it if it exists.
|
||||||
*
|
*
|
||||||
|
|
|
@ -212,12 +212,11 @@ void fit_add_ramdisk(struct device_tree *tree, void *ramdisk_addr,
|
||||||
struct device_tree_node *node;
|
struct device_tree_node *node;
|
||||||
node = dt_find_node(tree->root, path, NULL, NULL, 1);
|
node = dt_find_node(tree->root, path, NULL, NULL, 1);
|
||||||
|
|
||||||
/* Warning: this assumes the ramdisk is currently located below 4GiB. */
|
u64 start = (uintptr_t)ramdisk_addr;
|
||||||
u32 start = (uintptr_t)ramdisk_addr;
|
u64 end = start + ramdisk_size;
|
||||||
u32 end = start + ramdisk_size;
|
|
||||||
|
|
||||||
dt_add_u32_prop(node, "linux,initrd-start", start);
|
dt_add_u64_prop(node, "linux,initrd-start", start);
|
||||||
dt_add_u32_prop(node, "linux,initrd-end", end);
|
dt_add_u64_prop(node, "linux,initrd-end", end);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void update_reserve_map(uint64_t start, uint64_t end,
|
static void update_reserve_map(uint64_t start, uint64_t end,
|
||||||
|
|
Loading…
Reference in New Issue