[PATCH 3/8] FIT: Let user specify the configuration to use
Sascha Hauer
s.hauer at pengutronix.de
Wed Jan 31 03:11:11 PST 2018
The images in FIT images can be opened in two different ways. They
can be either opened directly based on their names in the images/
node or as part of a configuration based on their names in the
corresponding /configuration/ node.
So far we only supported the latter. To prepare supporting the former
we return a cookie belonging to the configuration from
fit_open_configuration() which we use in fit_open_image() to refer
to the desired configuration.
While at it document fit_open_configuration().
Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
---
common/bootm.c | 25 ++++++++++++++-----------
common/image-fit.c | 37 ++++++++++++++++++++++++-------------
include/bootm.h | 1 +
include/image-fit.h | 11 ++++++-----
4 files changed, 45 insertions(+), 29 deletions(-)
diff --git a/common/bootm.c b/common/bootm.c
index 8961c58c8b..6f6178575f 100644
--- a/common/bootm.c
+++ b/common/bootm.c
@@ -152,7 +152,7 @@ bool bootm_has_initrd(struct image_data *data)
return false;
if (IS_ENABLED(CONFIG_FITIMAGE) && data->os_fit &&
- fit_has_image(data->os_fit, "ramdisk"))
+ fit_has_image(data->os_fit, data->fit_config, "ramdisk"))
return true;
if (data->initrd_file)
@@ -214,12 +214,12 @@ int bootm_load_initrd(struct image_data *data, unsigned long load_address)
return 0;
if (IS_ENABLED(CONFIG_FITIMAGE) && data->os_fit &&
- fit_has_image(data->os_fit, "ramdisk")) {
+ fit_has_image(data->os_fit, data->fit_config, "ramdisk")) {
const void *initrd;
unsigned long initrd_size;
- ret = fit_open_image(data->os_fit, "ramdisk", &initrd,
- &initrd_size);
+ ret = fit_open_image(data->os_fit, data->fit_config, "ramdisk",
+ &initrd, &initrd_size);
data->initrd_res = request_sdram_region("initrd",
load_address,
@@ -344,11 +344,12 @@ int bootm_load_devicetree(struct image_data *data, unsigned long load_address)
return 0;
if (IS_ENABLED(CONFIG_FITIMAGE) && data->os_fit &&
- fit_has_image(data->os_fit, "dtb")) {
+ fit_has_image(data->os_fit, data->fit_config, "dtb")) {
const void *of_tree;
unsigned long of_size;
- ret = fit_open_image(data->os_fit, "dtb", &of_tree, &of_size);
+ ret = fit_open_image(data->os_fit, data->fit_config, "dtb",
+ &of_tree, &of_size);
if (ret)
return ret;
@@ -591,17 +592,19 @@ int bootm_boot(struct bootm_data *bootm_data)
data->os_fit = fit;
- ret = fit_open_configuration(data->os_fit, data->os_part);
- if (ret) {
+ data->fit_config = fit_open_configuration(data->os_fit,
+ data->os_part);
+ if (IS_ERR(data->fit_config)) {
printf("Cannot open FIT image configuration '%s'\n",
data->os_part ? data->os_part : "default");
+ ret = PTR_ERR(data->fit_config);
goto err_out;
}
- ret = fit_open_image(data->os_fit, "kernel", &data->fit_kernel,
- &data->fit_kernel_size);
+ ret = fit_open_image(data->os_fit, data->fit_config, "kernel",
+ &data->fit_kernel, &data->fit_kernel_size);
if (ret)
- goto err_out;;
+ goto err_out;
}
if (os_type == filetype_uimage) {
diff --git a/common/image-fit.c b/common/image-fit.c
index 8715689cfb..138696ab78 100644
--- a/common/image-fit.c
+++ b/common/image-fit.c
@@ -397,10 +397,11 @@ err_digest_free:
return ret;
}
-int fit_has_image(struct fit_handle *handle, const char *name)
+int fit_has_image(struct fit_handle *handle, void *configuration,
+ const char *name)
{
const char *unit;
- struct device_node *conf_node = handle->conf_node;
+ struct device_node *conf_node = configuration;
if (!conf_node)
return -EINVAL;
@@ -411,15 +412,16 @@ int fit_has_image(struct fit_handle *handle, const char *name)
return 1;
}
-int fit_open_image(struct fit_handle *handle, const char *name,
- const void **outdata, unsigned long *outsize)
+int fit_open_image(struct fit_handle *handle, void *configuration,
+ const char *name, const void **outdata,
+ unsigned long *outsize)
{
struct device_node *image = NULL, *hash;
const char *unit, *type = NULL, *desc= "(no description)";
const void *data;
int data_len;
int ret = 0;
- struct device_node *conf_node = handle->conf_node;
+ struct device_node *conf_node = configuration;
if (!conf_node)
return -EINVAL;
@@ -546,7 +548,18 @@ default_unit:
return -ENOENT;
}
-int fit_open_configuration(struct fit_handle *handle, const char *name)
+/**
+ * fit_open_configuration - open a FIT configuration
+ * @handle: The FIT image handle
+ * @name: The name of the configuration
+ *
+ * This opens a FIT configuration and eventually checks the signature
+ * depending on the verify mode the FIT image is opened with.
+ *
+ * Return: If successful a pointer to a valid configuration node,
+ * otherwise a ERR_PTR()
+ */
+void *fit_open_configuration(struct fit_handle *handle, const char *name)
{
struct device_node *conf_node = NULL;
const char *unit, *desc = "(no description)";
@@ -554,7 +567,7 @@ int fit_open_configuration(struct fit_handle *handle, const char *name)
conf_node = of_get_child_by_name(handle->root, "configurations");
if (!conf_node)
- return -ENOENT;
+ return ERR_PTR(-ENOENT);
if (name) {
unit = name;
@@ -562,14 +575,14 @@ int fit_open_configuration(struct fit_handle *handle, const char *name)
ret = fit_find_compatible_unit(conf_node, &unit);
if (ret) {
pr_info("Couldn't get a valid configuration. Aborting.\n");
- return ret;
+ return ERR_PTR(ret);
}
}
conf_node = of_get_child_by_name(conf_node, unit);
if (!conf_node) {
pr_err("configuration '%s' not found\n", unit);
- return -ENOENT;
+ return ERR_PTR(-ENOENT);
}
of_property_read_string(conf_node, "description", &desc);
@@ -577,11 +590,9 @@ int fit_open_configuration(struct fit_handle *handle, const char *name)
ret = fit_config_verify_signature(handle, conf_node);
if (ret)
- return ret;
+ return ERR_PTR(ret);
- handle->conf_node = conf_node;
-
- return 0;
+ return conf_node;
}
struct fit_handle *fit_open(const char *filename, bool verbose,
diff --git a/include/bootm.h b/include/bootm.h
index 7ba7b8b96f..35c18dc276 100644
--- a/include/bootm.h
+++ b/include/bootm.h
@@ -75,6 +75,7 @@ struct image_data {
const void *fit_kernel;
unsigned long fit_kernel_size;
+ void *fit_config;
struct device_node *of_root_node;
struct fdt_header *oftree;
diff --git a/include/image-fit.h b/include/image-fit.h
index 0e26a40ef7..31e23b235a 100644
--- a/include/image-fit.h
+++ b/include/image-fit.h
@@ -29,15 +29,16 @@ struct fit_handle {
enum bootm_verify verify;
struct device_node *root;
- struct device_node *conf_node;
};
struct fit_handle *fit_open(const char *filename, bool verbose,
enum bootm_verify verify);
-int fit_open_configuration(struct fit_handle *handle, const char *name);
-int fit_has_image(struct fit_handle *handle, const char *name);
-int fit_open_image(struct fit_handle *handle, const char *name,
- const void **outdata, unsigned long *outsize);
+void *fit_open_configuration(struct fit_handle *handle, const char *name);
+int fit_has_image(struct fit_handle *handle, void *configuration,
+ const char *name);
+int fit_open_image(struct fit_handle *handle, void *configuration,
+ const char *name, const void **outdata,
+ unsigned long *outsize);
void fit_close(struct fit_handle *handle);
--
2.15.1
More information about the barebox
mailing list