diff --git a/helpers/dtoverlay/dtoverlay.c b/helpers/dtoverlay/dtoverlay.c index 146d912..0a20acc 100644 --- a/helpers/dtoverlay/dtoverlay.c +++ b/helpers/dtoverlay/dtoverlay.c @@ -51,7 +51,7 @@ typedef enum #define DTOVERRIDE_BYTE_STRING 6 static int dtoverlay_extract_override(const char *override_name, - char *override_value, int value_size, + char *override_value, int value_size, int *phandle_ptr, const char **datap, const char *dataendp, const char **namep, int *namelenp, @@ -61,7 +61,7 @@ static const char *dtoverlay_lookup_key(const char *lookup_string, const char *d const char *key, char *buf, int buf_len); static int dtoverlay_set_node_name(DTBLOB_T *dtb, int node_off, - const char *name); + const char *name); static void dtoverlay_stdio_logging(dtoverlay_logging_type_t type, const char *fmt, va_list args); @@ -336,7 +336,7 @@ static void dynstring_free(struct dynstring *ds) } static int dtoverlay_set_node_name(DTBLOB_T *dtb, int node_off, - const char *name) + const char *name) { struct dynstring path_buf; struct dynstring prop_buf; @@ -515,20 +515,20 @@ int dtoverlay_create_prop_fragment(DTBLOB_T *dtb, int idx, int target_phandle, const char *prop_name, const void *prop_data, int prop_len) { - char fragment_name[20]; - int frag_off, ovl_off; - int ret; - snprintf(fragment_name, sizeof(fragment_name), "fragment-%u", idx); - frag_off = fdt_add_subnode(dtb->fdt, 0, fragment_name); - if (frag_off < 0) - return frag_off; - ret = fdt_setprop_u32(dtb->fdt, frag_off, "target", target_phandle); - if (ret < 0) - return ret; - ovl_off = fdt_add_subnode(dtb->fdt, frag_off, "__overlay__"); - if (ovl_off < 0) - return ovl_off; - return fdt_setprop(dtb->fdt, ovl_off, prop_name, prop_data, prop_len); + char fragment_name[20]; + int frag_off, ovl_off; + int ret; + snprintf(fragment_name, sizeof(fragment_name), "fragment-%u", idx); + frag_off = fdt_add_subnode(dtb->fdt, 0, fragment_name); + if (frag_off < 0) + return frag_off; + ret = fdt_setprop_u32(dtb->fdt, frag_off, "target", target_phandle); + if (ret < 0) + return ret; + ovl_off = fdt_add_subnode(dtb->fdt, frag_off, "__overlay__"); + if (ovl_off < 0) + return ovl_off; + return fdt_setprop(dtb->fdt, ovl_off, prop_name, prop_data, prop_len); } // Returns 0 on success, otherwise <0 error code @@ -568,7 +568,7 @@ static int dtoverlay_merge_fragment(DTBLOB_T *base_dtb, int target_off, /* Skip these system properties (only phandles in the first level) */ if ((strcmp(prop_name, "name") == 0) || ((depth == 0) && ((strcmp(prop_name, "phandle") == 0) || - (strcmp(prop_name, "linux,phandle") == 0)))) + (strcmp(prop_name, "linux,phandle") == 0)))) continue; dtoverlay_debug(" +prop(%s)", prop_name); @@ -1439,11 +1439,11 @@ int hex_digit(char c) } int dtoverlay_override_one_target(int override_type, - const char *override_value, - DTBLOB_T *dtb, int node_off, - const char *prop_name, int target_phandle, - int target_off, int target_size, - void *callback_state) + const char *override_value, + DTBLOB_T *dtb, int node_off, + const char *prop_name, int target_phandle, + int target_off, int target_size, + void *callback_state) { int err = 0; @@ -1454,19 +1454,19 @@ int dtoverlay_override_one_target(int override_type, /* Replace the whole property with the string */ if ((strcmp(prop_name, "bootargs") == 0) && - ((prop_val = fdt_getprop_w(dtb->fdt, node_off, prop_name, - &prop_len)) != NULL) && - (prop_len > 0) && prop_val[0]) + ((prop_val = fdt_getprop_w(dtb->fdt, node_off, prop_name, + &prop_len)) != NULL) && + (prop_len > 0) && prop_val[0]) { - prop_val[prop_len - 1] = ' '; - err = fdt_appendprop_string(dtb->fdt, node_off, prop_name, override_value); + prop_val[prop_len - 1] = ' '; + err = fdt_appendprop_string(dtb->fdt, node_off, prop_name, override_value); } else if (strcmp(prop_name, "name") == 0) // "name" is a pseudo-property { err = dtoverlay_set_node_name(dtb, node_off, override_value); } else - err = fdt_setprop_string(dtb->fdt, node_off, prop_name, override_value); + err = fdt_setprop_string(dtb->fdt, node_off, prop_name, override_value); } else if (override_type == DTOVERRIDE_BYTE_STRING) { @@ -1540,44 +1540,44 @@ int dtoverlay_override_one_target(int override_type, switch (override_type) { case DTOVERRIDE_INTEGER: - /* Patch a word within the property */ - prop_val = (void *)fdt_getprop(dtb->fdt, node_off, prop_name, - &prop_len); - new_prop_len = target_off + target_size; - if (prop_len < new_prop_len) - { - /* This property either doesn't exist or isn't long enough. - Create a buffer containing any existing property data - with zero padding, which will later be patched and written - back. */ - prop_buf = calloc(1, new_prop_len); - if (!prop_buf) - { - dtoverlay_error(" out of memory"); - return NON_FATAL(FDT_ERR_NOSPACE); - } - if (prop_len > 0) - memcpy(prop_buf, prop_val, prop_len); - prop_val = prop_buf; - } + /* Patch a word within the property */ + prop_val = (void *)fdt_getprop(dtb->fdt, node_off, prop_name, + &prop_len); + new_prop_len = target_off + target_size; + if (prop_len < new_prop_len) + { + /* This property either doesn't exist or isn't long enough. + Create a buffer containing any existing property data + with zero padding, which will later be patched and written + back. */ + prop_buf = calloc(1, new_prop_len); + if (!prop_buf) + { + dtoverlay_error(" out of memory"); + return NON_FATAL(FDT_ERR_NOSPACE); + } + if (prop_len > 0) + memcpy(prop_buf, prop_val, prop_len); + prop_val = prop_buf; + } - switch (target_size) - { - case 1: - dtoverlay_write_u8(prop_val, target_off, (uint32_t)override_int); - break; - case 2: - dtoverlay_write_u16(prop_val, target_off, (uint32_t)override_int); - break; - case 4: - dtoverlay_write_u32(prop_val, target_off, (uint32_t)override_int); - break; - case 8: - dtoverlay_write_u64(prop_val, target_off, override_int); - break; - default: - break; - } + switch (target_size) + { + case 1: + dtoverlay_write_u8(prop_val, target_off, (uint32_t)override_int); + break; + case 2: + dtoverlay_write_u16(prop_val, target_off, (uint32_t)override_int); + break; + case 4: + dtoverlay_write_u32(prop_val, target_off, (uint32_t)override_int); + break; + case 8: + dtoverlay_write_u64(prop_val, target_off, override_int); + break; + default: + break; + } if (prop_buf) { @@ -1602,76 +1602,76 @@ int dtoverlay_override_one_target(int override_type, free(new_name); } } - break; + break; case DTOVERRIDE_BOOLEAN: case DTOVERRIDE_BOOLEAN_INV: - /* This is a boolean property (present->true, absent->false) */ - if (override_int ^ (override_type == DTOVERRIDE_BOOLEAN_INV)) - err = fdt_setprop(dtb->fdt, node_off, prop_name, NULL, 0); - else - { - err = fdt_delprop(dtb->fdt, node_off, prop_name); - if (err == -FDT_ERR_NOTFOUND) - err = 0; - } - break; + /* This is a boolean property (present->true, absent->false) */ + if (override_int ^ (override_type == DTOVERRIDE_BOOLEAN_INV)) + err = fdt_setprop(dtb->fdt, node_off, prop_name, NULL, 0); + else + { + err = fdt_delprop(dtb->fdt, node_off, prop_name); + if (err == -FDT_ERR_NOTFOUND) + err = 0; + } + break; case DTOVERRIDE_OVERLAY: - /* Apply the overlay-wide override. The supported options are ( is a fragment number): - + Enable a fragment - - Disable a fragment - = Enable/disable the fragment according to the override value - ! Disable/enable the fragment according to the inverse of the override value */ - p = prop_name; - while (*p && !err) - { - char type = *p; - int frag_off; - switch (type) - { - case '+': - case '-': - case '=': - case '!': - frag_num = strtoul(p + 1, &end, 0); - if (end != p) - { - /* Change fragment@/__overlay__<->__dormant__ as necessary */ - const char *states[2] = { "__dormant__", "__overlay__" }; - char node_name[24]; - int active = (type == '+') || - ((type == '=') && (override_int != 0)) || - ((type == '!') && (override_int == 0)); - snprintf(node_name, sizeof(node_name), "/fragment@%u", frag_num); - frag_off = fdt_path_offset(dtb->fdt, node_name); - if (frag_off < 0) - { - snprintf(node_name, sizeof(node_name), "/fragment-%u", frag_num); - frag_off = fdt_path_offset(dtb->fdt, node_name); - } - if (frag_off >= 0) - { - frag_off = fdt_subnode_offset(dtb->fdt, frag_off, states[!active]); - if (frag_off >= 0) - (void)dtoverlay_set_node_name(dtb, frag_off, states[active]); - } - else - { - dtoverlay_error(" fragment %u not found", frag_num); - err = NON_FATAL(frag_off); - } - p = end; - } - else - { - dtoverlay_error(" invalid overlay override '%s'", prop_name); - err = NON_FATAL(FDT_ERR_BADVALUE); - } - break; - } - } - break; + /* Apply the overlay-wide override. The supported options are ( is a fragment number): + + Enable a fragment + - Disable a fragment + = Enable/disable the fragment according to the override value + ! Disable/enable the fragment according to the inverse of the override value */ + p = prop_name; + while (*p && !err) + { + char type = *p; + int frag_off; + switch (type) + { + case '+': + case '-': + case '=': + case '!': + frag_num = strtoul(p + 1, &end, 0); + if (end != p) + { + /* Change fragment@/__overlay__<->__dormant__ as necessary */ + const char *states[2] = { "__dormant__", "__overlay__" }; + char node_name[24]; + int active = (type == '+') || + ((type == '=') && (override_int != 0)) || + ((type == '!') && (override_int == 0)); + snprintf(node_name, sizeof(node_name), "/fragment@%u", frag_num); + frag_off = fdt_path_offset(dtb->fdt, node_name); + if (frag_off < 0) + { + snprintf(node_name, sizeof(node_name), "/fragment-%u", frag_num); + frag_off = fdt_path_offset(dtb->fdt, node_name); + } + if (frag_off >= 0) + { + frag_off = fdt_subnode_offset(dtb->fdt, frag_off, states[!active]); + if (frag_off >= 0) + (void)dtoverlay_set_node_name(dtb, frag_off, states[active]); + } + else + { + dtoverlay_error(" fragment %u not found", frag_num); + err = NON_FATAL(frag_off); + } + p = end; + } + else + { + dtoverlay_error(" invalid overlay override '%s'", prop_name); + err = NON_FATAL(FDT_ERR_BADVALUE); + } + break; + } + } + break; } } @@ -1704,10 +1704,10 @@ Translation: // Returns 0 on success, -ve for fatal errors and +ve for non-fatal errors // After calling this, assume all node offsets are no longer valid int dtoverlay_foreach_override_target(DTBLOB_T *dtb, const char *override_name, - const char *override_data, int data_len, - const char *override_value, - override_callback_t callback, - void *callback_state) + const char *override_data, int data_len, + const char *override_value, + override_callback_t callback, + void *callback_state) { int err = 0; int target_phandle = 0; @@ -1775,7 +1775,7 @@ int dtoverlay_foreach_override_target(DTBLOB_T *dtb, const char *override_name, } err = callback(override_type, target_value, dtb, node_off, prop_name, - target_phandle, target_off, target_size, callback_state); + target_phandle, target_off, target_size, callback_state); if (override_type == DTOVERRIDE_END) break; @@ -1792,10 +1792,10 @@ int dtoverlay_apply_override(DTBLOB_T *dtb, const char *override_name, const char *override_value) { return dtoverlay_foreach_override_target(dtb, override_name, - override_data, data_len, - override_value, - dtoverlay_override_one_target, - NULL); + override_data, data_len, + override_value, + dtoverlay_override_one_target, + NULL); } /* Returns an override type (DTOVERRIDE_INTEGER, DTOVERRIDE_BOOLEAN, DTOVERRIDE_STRING, DTOVERRIDE_OVERLAY), @@ -1805,7 +1805,7 @@ static int dtoverlay_extract_override(const char *override_name, int *phandle_ptr, const char **datap, const char *data_end, const char **namep, int *namelenp, - int *offp, int *sizep) + int *offp, int *sizep) { const char *data; const char *prop_name, *override_end; @@ -1820,7 +1820,7 @@ static int dtoverlay_extract_override(const char *override_name, if (len <= 0) { if (len < 0) - return len; + return len; *phandle_ptr = 0; *namep = NULL; return DTOVERRIDE_END; @@ -1897,7 +1897,7 @@ static int dtoverlay_extract_override(const char *override_name, else if (sep == '!') { /* The target is a boolean parameter (present->true, absent->false), - * but the sense of the value is inverted */ + * but the sense of the value is inverted */ *offp = 0; *sizep = 0; type = DTOVERRIDE_BOOLEAN_INV; diff --git a/helpers/dtoverlay/dtoverlay.h b/helpers/dtoverlay/dtoverlay.h index 7ef8e85..7136d90 100644 --- a/helpers/dtoverlay/dtoverlay.h +++ b/helpers/dtoverlay/dtoverlay.h @@ -90,11 +90,11 @@ typedef void DTOVERLAY_LOGGING_FUNC(dtoverlay_logging_type_t type, const char *fmt, va_list args); typedef int (*override_callback_t)(int override_type, - const char *override_value, - DTBLOB_T *dtb, int node_off, - const char *prop_name, int target_phandle, - int target_off, int target_size, - void *callback_state); + const char *override_value, + DTBLOB_T *dtb, int node_off, + const char *prop_name, int target_phandle, + int target_off, int target_size, + void *callback_state); uint8_t dtoverlay_read_u8(const void *src, int off); uint16_t dtoverlay_read_u16(const void *src, int off); @@ -143,7 +143,7 @@ int dtoverlay_foreach_override_target(DTBLOB_T *dtb, const char *override_name, const char *override_data, int data_len, const char *override_value, override_callback_t callback, - void *callback_value); + void *callback_value); int dtoverlay_apply_override(DTBLOB_T *dtb, const char *override_name, const char *override_data, int data_len, diff --git a/host_applications/linux/apps/dtmerge/dtmerge.c b/host_applications/linux/apps/dtmerge/dtmerge.c index 9243da1..0da5dca 100644 --- a/host_applications/linux/apps/dtmerge/dtmerge.c +++ b/host_applications/linux/apps/dtmerge/dtmerge.c @@ -102,9 +102,9 @@ int main(int argc, char **argv) { overlay_dtb = dtoverlay_load_dtb(overlay_file, max_dtb_size); if (overlay_dtb) - err = dtoverlay_fixup_overlay(base_dtb, overlay_dtb); + err = dtoverlay_fixup_overlay(base_dtb, overlay_dtb); else - err = -1; + err = -1; } while (!err && (argn < argc)) diff --git a/host_applications/linux/apps/dtoverlay/dtoverlay_main.c b/host_applications/linux/apps/dtoverlay/dtoverlay_main.c index 9733520..5cc83a0 100755 --- a/host_applications/linux/apps/dtoverlay/dtoverlay_main.c +++ b/host_applications/linux/apps/dtoverlay/dtoverlay_main.c @@ -153,88 +153,88 @@ int main(int argc, const char **argv) (strcmp(arg, "--listall") == 0) || (strcmp(arg, "--all") == 0)) { - if (opt != OPT_ADD) - usage(); - opt = OPT_LIST_ALL; - } - else if (strcmp(arg, "-d") == 0) - { - if (argn == argc) - usage(); - overlay_src_dir = argv[argn++]; - } - else if (strcmp(arg, "-v") == 0) - { - opt_verbose = 1; - } - else if (strcmp(arg, "-h") == 0) - { - opt = OPT_HELP; - } - else - { - fprintf(stderr, "* unknown option '%s'\n", arg); - usage(); - } + if (opt != OPT_ADD) + usage(); + opt = OPT_LIST_ALL; + } + else if (strcmp(arg, "-d") == 0) + { + if (argn == argc) + usage(); + overlay_src_dir = argv[argn++]; + } + else if (strcmp(arg, "-v") == 0) + { + opt_verbose = 1; + } + else if (strcmp(arg, "-h") == 0) + { + opt = OPT_HELP; + } + else + { + fprintf(stderr, "* unknown option '%s'\n", arg); + usage(); + } } if ((opt == OPT_ADD) || (opt == OPT_REMOVE) || - (opt == OPT_REMOVE_FROM) || (opt == OPT_HELP)) + (opt == OPT_REMOVE_FROM) || (opt == OPT_HELP)) { - if ((argn == argc) && - ((!is_dtparam && - ((opt == OPT_ADD) || (opt == OPT_HELP))) || - (is_dtparam && (opt == OPT_HELP)))) - usage(); - if (is_dtparam && (opt == OPT_ADD) && (argn == argc)) - opt = OPT_HELP; - if (is_dtparam && - ((opt == OPT_ADD) || (opt == OPT_HELP))) - overlay = "dtparam"; - else if (argn < argc) - overlay = argv[argn++]; + if ((argn == argc) && + ((!is_dtparam && + ((opt == OPT_ADD) || (opt == OPT_HELP))) || + (is_dtparam && (opt == OPT_HELP)))) + usage(); + if (is_dtparam && (opt == OPT_ADD) && (argn == argc)) + opt = OPT_HELP; + if (is_dtparam && + ((opt == OPT_ADD) || (opt == OPT_HELP))) + overlay = "dtparam"; + else if (argn < argc) + overlay = argv[argn++]; } if ((opt == OPT_HELP) && (argn < argc)) { - params = &argv[argn]; - argn = argc; + params = &argv[argn]; + argn = argc; } if ((opt != OPT_ADD) && (argn != argc)) - usage(); + usage(); dtoverlay_enable_debug(opt_verbose); if (!overlay_src_dir) { - /* Find the overlays and README */ - int i; + /* Find the overlays and README */ + int i; - for (i = 0; boot_dirs[i]; i++) - { - overlay_src_dir = sprintf_dup("%s/" OVERLAY_SRC_SUBDIR, - boot_dirs[i]); - if (dir_exists(overlay_src_dir)) - break; - free_string(overlay_src_dir); - overlay_src_dir = NULL; - } + for (i = 0; boot_dirs[i]; i++) + { + overlay_src_dir = sprintf_dup("%s/" OVERLAY_SRC_SUBDIR, + boot_dirs[i]); + if (dir_exists(overlay_src_dir)) + break; + free_string(overlay_src_dir); + overlay_src_dir = NULL; + } - if (!overlay_src_dir) - fatal_error("Failed to find overlays directory"); + if (!overlay_src_dir) + fatal_error("Failed to find overlays directory"); } if (opt == OPT_HELP) { - overlay_help(overlay, params); - goto orderly_exit; + overlay_help(overlay, params); + goto orderly_exit; } if (!dir_exists(work_dir)) { - if (mkdir(work_dir, DIR_MODE) != 0) - fatal_error("Failed to create '%s' - %d", work_dir, errno); + if (mkdir(work_dir, DIR_MODE) != 0) + fatal_error("Failed to create '%s' - %d", work_dir, errno); } error_file = sprintf_dup("%s/%s", work_dir, "error.dtb"); @@ -242,26 +242,26 @@ int main(int argc, const char **argv) cfg_dir = CFG_DIR_1 DT_SUBDIR; if (!dry_run && !dir_exists(cfg_dir)) { - root_check(); + root_check(); - cfg_dir = CFG_DIR_2; - if (!dir_exists(cfg_dir)) - { - if (mkdir(cfg_dir, DIR_MODE) != 0) - fatal_error("Failed to create '%s' - %d", cfg_dir, errno); - } + cfg_dir = CFG_DIR_2; + if (!dir_exists(cfg_dir)) + { + if (mkdir(cfg_dir, DIR_MODE) != 0) + fatal_error("Failed to create '%s' - %d", cfg_dir, errno); + } - cfg_dir = CFG_DIR_2 DT_SUBDIR; - if (!dir_exists(cfg_dir) && - (run_cmd("mount -t configfs none '%s'", cfg_dir) != 0)) - fatal_error("Failed to mount configfs - %d", errno); + cfg_dir = CFG_DIR_2 DT_SUBDIR; + if (!dir_exists(cfg_dir) && + (run_cmd("mount -t configfs none '%s'", cfg_dir) != 0)) + fatal_error("Failed to mount configfs - %d", errno); } if (!dry_run) { - dt_overlays_dir = sprintf_dup("%s/%s", cfg_dir, DT_OVERLAYS_SUBDIR); - if (!dir_exists(dt_overlays_dir)) - fatal_error("configfs overlays folder not found - incompatible kernel"); + dt_overlays_dir = sprintf_dup("%s/%s", cfg_dir, DT_OVERLAYS_SUBDIR); + if (!dir_exists(dt_overlays_dir)) + fatal_error("configfs overlays folder not found - incompatible kernel"); state = read_state(work_dir); if (!state) @@ -280,29 +280,29 @@ int main(int argc, const char **argv) } break; default: - break; + break; } switch (opt) { case OPT_ADD: - ret = dtoverlay_add(state, overlay, argc - argn, argv + argn); - break; + ret = dtoverlay_add(state, overlay, argc - argn, argv + argn); + break; case OPT_REMOVE: - ret = dtoverlay_remove(state, overlay, 0); - break; + ret = dtoverlay_remove(state, overlay, 0); + break; case OPT_REMOVE_FROM: - ret = dtoverlay_remove(state, overlay, 1); - break; + ret = dtoverlay_remove(state, overlay, 1); + break; case OPT_LIST: - ret = dtoverlay_list(state); - break; + ret = dtoverlay_list(state); + break; case OPT_LIST_ALL: - ret = dtoverlay_list_all(state); - break; + ret = dtoverlay_list_all(state); + break; default: - ret = 1; - break; + ret = 1; + break; } switch (opt) @@ -310,48 +310,48 @@ int main(int argc, const char **argv) case OPT_ADD: case OPT_REMOVE: case OPT_REMOVE_FROM: - if (!dry_run) - run_cmd("which dtoverlay-post >/dev/null 2>&1 && dtoverlay-post"); - break; + if (!dry_run) + run_cmd("which dtoverlay-post >/dev/null 2>&1 && dtoverlay-post"); + break; default: - break; + break; } orderly_exit: if (state) - free_state(state); + free_state(state); free_strings(); if ((ret == 0) && error_file) - unlink(error_file); + unlink(error_file); return ret; } int dtparam_callback(int override_type, const char *override_value, - DTBLOB_T *dtb, int node_off, - const char *prop_name, int target_phandle, - int target_off, int target_size, - void *callback_state) + DTBLOB_T *dtb, int node_off, + const char *prop_name, int target_phandle, + int target_off, int target_size, + void *callback_state) { STRING_VEC_T *used_props = callback_state; char prop_id[80]; int err; err = dtoverlay_override_one_target(override_type, - override_value, - dtb, node_off, - prop_name, target_phandle, - target_off, target_size, - callback_state); + override_value, + dtb, node_off, + prop_name, target_phandle, + target_off, target_size, + callback_state); if ((err == 0) && (target_phandle != 0)) { - if (snprintf(prop_id, sizeof(prop_id), "%08x%s", target_phandle, - prop_name) < 0) - err = FDT_ERR_INTERNAL; - else if (string_vec_find(used_props, prop_id, 0) < 0) - string_vec_add(used_props, prop_id, 0); + if (snprintf(prop_id, sizeof(prop_id), "%08x%s", target_phandle, + prop_name) < 0) + err = FDT_ERR_INTERNAL; + else if (string_vec_find(used_props, prop_id, 0) < 0) + string_vec_add(used_props, prop_id, 0); } return err; @@ -359,8 +359,8 @@ int dtparam_callback(int override_type, const char *override_value, // Returns 0 on success, -ve for fatal errors and +ve for non-fatal errors int dtparam_apply(DTBLOB_T *dtb, const char *override_name, - const char *override_data, int data_len, - const char *override_value, STRING_VEC_T *used_props) + const char *override_data, int data_len, + const char *override_value, STRING_VEC_T *used_props) { void *data; int err; @@ -369,25 +369,25 @@ int dtparam_apply(DTBLOB_T *dtb, const char *override_name, data = malloc(data_len); if (data) { - memcpy(data, override_data, data_len); - err = dtoverlay_foreach_override_target(dtb, override_name, - data, data_len, - override_value, - dtparam_callback, - used_props); - free(data); + memcpy(data, override_data, data_len); + err = dtoverlay_foreach_override_target(dtb, override_name, + data, data_len, + override_value, + dtparam_callback, + used_props); + free(data); } else { - dtoverlay_error("out of memory"); - err = NON_FATAL(FDT_ERR_NOSPACE); + dtoverlay_error("out of memory"); + err = NON_FATAL(FDT_ERR_NOSPACE); } return err; } static int dtoverlay_add(STATE_T *state, const char *overlay, - int argc, const char **argv) + int argc, const char **argv) { const char *overlay_name; const char *overlay_file; @@ -405,92 +405,92 @@ static int dtoverlay_add(STATE_T *state, const char *overlay, if (is_dtparam) { /* Convert /proc/device-tree to a .dtb and load it */ - overlay_file = sprintf_dup("%s/%s", work_dir, "base.dtb"); - if (run_cmd("dtc -I fs -O dtb -o '%s' /proc/device-tree 1>/dev/null 2>&1", - overlay_file) != 0) + overlay_file = sprintf_dup("%s/%s", work_dir, "base.dtb"); + if (run_cmd("dtc -I fs -O dtb -o '%s' /proc/device-tree 1>/dev/null 2>&1", + overlay_file) != 0) return error("Failed to read active DTB"); } else if ((len > 0) && (strcmp(overlay + len, ".dtbo") == 0)) { - const char *p; - overlay_file = overlay; - p = strrchr(overlay, '/'); - if (p) - { - overlay = p + 1; - len = strlen(overlay) - 5; - } + const char *p; + overlay_file = overlay; + p = strrchr(overlay, '/'); + if (p) + { + overlay = p + 1; + len = strlen(overlay) - 5; + } - overlay = sprintf_dup("%.*s", len, overlay); + overlay = sprintf_dup("%.*s", len, overlay); } else { - overlay_file = sprintf_dup("%s/%s.dtbo", overlay_src_dir, overlay); + overlay_file = sprintf_dup("%s/%s.dtbo", overlay_src_dir, overlay); } if (dry_run) overlay_name = "dry_run"; else - overlay_name = sprintf_dup("%d_%s", state->count, overlay); + overlay_name = sprintf_dup("%d_%s", state->count, overlay); overlay_dtb = dtoverlay_load_dtb(overlay_file, DTOVERLAY_PADDING(4096)); if (!overlay_dtb) - return error("Failed to read '%s'", overlay_file); + return error("Failed to read '%s'", overlay_file); if (is_dtparam) { base_dtb = overlay_dtb; - string_vec_init(&used_props); + string_vec_init(&used_props); } /* Apply any parameters next */ for (i = 0; i < argc; i++) { - const char *arg = argv[i]; - const char *param_val = strchr(arg, '='); - const char *param, *override; - char *p = NULL; - int override_len; - if (param_val) - { - int len = (param_val - arg); - p = sprintf_dup("%.*s", len, arg); - param = p; - param_val++; - } - else - { - /* Use the default parameter value - true */ - param = arg; - param_val = "true"; - } + const char *arg = argv[i]; + const char *param_val = strchr(arg, '='); + const char *param, *override; + char *p = NULL; + int override_len; + if (param_val) + { + int len = (param_val - arg); + p = sprintf_dup("%.*s", len, arg); + param = p; + param_val++; + } + else + { + /* Use the default parameter value - true */ + param = arg; + param_val = "true"; + } - override = dtoverlay_find_override(overlay_dtb, param, &override_len); + override = dtoverlay_find_override(overlay_dtb, param, &override_len); - if (!override) - return error("Unknown parameter '%s'", param); + if (!override) + return error("Unknown parameter '%s'", param); - if (is_dtparam) - err = dtparam_apply(overlay_dtb, param, - override, override_len, - param_val, &used_props); - else - err = dtoverlay_apply_override(overlay_dtb, param, - override, override_len, - param_val); - if (err != 0) - return error("Failed to set %s=%s", param, param_val); + if (is_dtparam) + err = dtparam_apply(overlay_dtb, param, + override, override_len, + param_val, &used_props); + else + err = dtoverlay_apply_override(overlay_dtb, param, + override, override_len, + param_val); + if (err != 0) + return error("Failed to set %s=%s", param, param_val); - param_string = sprintf_dup("%s %s=%s", - param_string ? param_string : "", - param, param_val); + param_string = sprintf_dup("%s %s=%s", + param_string ? param_string : "", + param, param_val); - free_string(p); + free_string(p); } /* Apply any intra-overlay fragments, filtering the symbols */ err = dtoverlay_merge_overlay(NULL, overlay_dtb); if (err != 0) - return error("Failed to apply intra-overlay fragments"); + return error("Failed to apply intra-overlay fragments"); if (is_dtparam) { @@ -518,8 +518,8 @@ static int dtoverlay_add(STATE_T *state, const char *overlay, } if (param_string) - dtoverlay_dtb_set_trailer(overlay_dtb, param_string, - strlen(param_string) + 1); + dtoverlay_dtb_set_trailer(overlay_dtb, param_string, + strlen(param_string) + 1); /* Create a filename with the sequence number */ overlay_file = sprintf_dup("%s/%s.dtbo", work_dir, overlay_name); @@ -531,12 +531,12 @@ static int dtoverlay_add(STATE_T *state, const char *overlay, if (!dry_run && !apply_overlay(overlay_file, overlay_name)) { - if (error_file) - { - rename(overlay_file, error_file); - free_string(error_file); - } - return 1; + if (error_file) + { + rename(overlay_file, error_file); + free_string(error_file); + } + return 1; } return 0; @@ -553,81 +553,81 @@ static int dtoverlay_remove(STATE_T *state, const char *overlay, int and_later) int i; if (chdir(work_dir) != 0) - fatal_error("Failed to chdir to '%s'", work_dir); + fatal_error("Failed to chdir to '%s'", work_dir); if (overlay) { - overlay_len = strlen(overlay); + overlay_len = strlen(overlay); - rmpos = strtoul(overlay, &end, 10); - if (end && (*end == '\0')) - { - if (rmpos >= count) - return error("Overlay index (%d) too large", rmpos); - dir_name = state->namelist[rmpos]->d_name; - } - /* Locate the most recent reference to the overlay */ - else for (rmpos = count - 1; rmpos >= 0; rmpos--) - { - const char *left, *right; - dir_name = state->namelist[rmpos]->d_name; - left = strchr(dir_name, '_'); - if (!left) - return error("Internal error"); - left++; - right = strchr(left, '.'); - if (!right) - return error("Internal error"); - if (((right - left) == overlay_len) && - (memcmp(overlay, left, overlay_len) == 0)) - break; - dir_name = NULL; - } + rmpos = strtoul(overlay, &end, 10); + if (end && (*end == '\0')) + { + if (rmpos >= count) + return error("Overlay index (%d) too large", rmpos); + dir_name = state->namelist[rmpos]->d_name; + } + /* Locate the most recent reference to the overlay */ + else for (rmpos = count - 1; rmpos >= 0; rmpos--) + { + const char *left, *right; + dir_name = state->namelist[rmpos]->d_name; + left = strchr(dir_name, '_'); + if (!left) + return error("Internal error"); + left++; + right = strchr(left, '.'); + if (!right) + return error("Internal error"); + if (((right - left) == overlay_len) && + (memcmp(overlay, left, overlay_len) == 0)) + break; + dir_name = NULL; + } - if (rmpos < 0) - return error("Overlay '%s' is not loaded", overlay); + if (rmpos < 0) + return error("Overlay '%s' is not loaded", overlay); } else { - if (!count) - return error("No overlays loaded"); - rmpos = and_later ? 0 : (count - 1); - dir_name = state->namelist[rmpos]->d_name; + if (!count) + return error("No overlays loaded"); + rmpos = and_later ? 0 : (count - 1); + dir_name = state->namelist[rmpos]->d_name; } if (rmpos < count) { - /* Unload it and all subsequent overlays in reverse order */ - for (i = count - 1; i >= rmpos; i--) - { - const char *left, *right; - left = state->namelist[i]->d_name; - right = strrchr(left, '.'); - if (!right) - return error("Internal error"); + /* Unload it and all subsequent overlays in reverse order */ + for (i = count - 1; i >= rmpos; i--) + { + const char *left, *right; + left = state->namelist[i]->d_name; + right = strrchr(left, '.'); + if (!right) + return error("Internal error"); - overlay_dir = sprintf_dup("%s/%.*s", dt_overlays_dir, - right - left, left); - if (rmdir(overlay_dir) != 0) - return error("Failed to remove directory '%s'", overlay_dir); + overlay_dir = sprintf_dup("%s/%.*s", dt_overlays_dir, + right - left, left); + if (rmdir(overlay_dir) != 0) + return error("Failed to remove directory '%s'", overlay_dir); - free_string(overlay_dir); - } + free_string(overlay_dir); + } - /* Replay the sequence, deleting files for the specified overlay, - and renumbering and reloading all other overlays. */ - for (i = rmpos, state->count = rmpos; i < count; i++) - { - const char *left, *right; - const char *filename = state->namelist[i]->d_name; + /* Replay the sequence, deleting files for the specified overlay, + and renumbering and reloading all other overlays. */ + for (i = rmpos, state->count = rmpos; i < count; i++) + { + const char *left, *right; + const char *filename = state->namelist[i]->d_name; - left = strchr(filename, '_'); - if (!left) - return error("Internal error"); - left++; - right = strchr(left, '.'); - if (!right) - return error("Internal error"); + left = strchr(filename, '_'); + if (!left) + return error("Internal error"); + left++; + right = strchr(left, '.'); + if (!right) + return error("Internal error"); if (and_later || (i == rmpos)) { @@ -639,85 +639,85 @@ static int dtoverlay_remove(STATE_T *state, const char *overlay, int and_later) /* Keep this one - renumber and reload */ int len = right - left; char *new_name = sprintf_dup("%d_%.*s", state->count, - len, left); - char *new_file = sprintf_dup("%s.dtbo", new_name); - int ret = 0; + len, left); + char *new_file = sprintf_dup("%s.dtbo", new_name); + int ret = 0; if ((len == 7) && (memcmp(left, "dtparam", 7) == 0)) - { - /* Regenerate the overlay in case multiple overlays target + { + /* Regenerate the overlay in case multiple overlays target different parts of the same property. */ - DTBLOB_T *dtb; - char *params; - const char **paramv; - int paramc; - int j; - char *p; + DTBLOB_T *dtb; + char *params; + const char **paramv; + int paramc; + int j; + char *p; /* Extract the parameters */ - dtb = dtoverlay_load_dtb(filename, 0); - unlink(filename); + dtb = dtoverlay_load_dtb(filename, 0); + unlink(filename); - if (!dtb) - { - error("Failed to re-apply dtparam"); - continue; - } + if (!dtb) + { + error("Failed to re-apply dtparam"); + continue; + } - params = (char *)dtoverlay_dtb_trailer(dtb); - if (!params) - { - error("Failed to re-apply dtparam"); - dtoverlay_free_dtb(dtb); - continue; - } + params = (char *)dtoverlay_dtb_trailer(dtb); + if (!params) + { + error("Failed to re-apply dtparam"); + dtoverlay_free_dtb(dtb); + continue; + } - /* Count and NUL-separate the params */ - p = params; - paramc = 0; - while (*p) - { - int paramlen; - *(p++) = '\0'; - paramlen = strcspn(p, " "); - paramc++; - p += paramlen; - } + /* Count and NUL-separate the params */ + p = params; + paramc = 0; + while (*p) + { + int paramlen; + *(p++) = '\0'; + paramlen = strcspn(p, " "); + paramc++; + p += paramlen; + } - paramv = malloc((paramc + 1) * sizeof(const char *)); - if (!paramv) - { - error("out of memory re-applying dtparam"); - dtoverlay_free_dtb(dtb); - continue; - } + paramv = malloc((paramc + 1) * sizeof(const char *)); + if (!paramv) + { + error("out of memory re-applying dtparam"); + dtoverlay_free_dtb(dtb); + continue; + } - for (j = 0, p = params + 1; j < paramc; j++) - { - paramv[j] = p; - p += strlen(p) + 1; - } - paramv[j] = NULL; + for (j = 0, p = params + 1; j < paramc; j++) + { + paramv[j] = p; + p += strlen(p) + 1; + } + paramv[j] = NULL; - /* Create the new overlay */ - ret = dtoverlay_add(state, "dtparam", paramc, paramv); - free(paramv); - dtoverlay_free_dtb(dtb); - } - else - { - rename(filename, new_file); - ret = !apply_overlay(new_file, new_name); - } - if (ret != 0) - { - error("Failed to re-apply dtparam"); - continue; - } - state->count++; - } - } + /* Create the new overlay */ + ret = dtoverlay_add(state, "dtparam", paramc, paramv); + free(paramv); + dtoverlay_free_dtb(dtb); + } + else + { + rename(filename, new_file); + ret = !apply_overlay(new_file, new_name); + } + if (ret != 0) + { + error("Failed to re-apply dtparam"); + continue; + } + state->count++; + } + } } return 0; @@ -727,38 +727,38 @@ static int dtoverlay_list(STATE_T *state) { if (state->count == 0) { - printf("No overlays loaded\n"); + printf("No overlays loaded\n"); } else { - int i; - printf("Overlays (in load order):\n"); - for (i = 0; i < state->count; i++) - { - const char *name, *left, *right; - const char *saved_overlay; - DTBLOB_T *dtb; - name = state->namelist[i]->d_name; - left = strchr(name, '_'); - if (!left) - return error("Internal error"); - left++; - right = strchr(left, '.'); - if (!right) - return error("Internal error"); + int i; + printf("Overlays (in load order):\n"); + for (i = 0; i < state->count; i++) + { + const char *name, *left, *right; + const char *saved_overlay; + DTBLOB_T *dtb; + name = state->namelist[i]->d_name; + left = strchr(name, '_'); + if (!left) + return error("Internal error"); + left++; + right = strchr(left, '.'); + if (!right) + return error("Internal error"); - saved_overlay = sprintf_dup("%s/%s", work_dir, name); - dtb = dtoverlay_load_dtb(saved_overlay, 0); + saved_overlay = sprintf_dup("%s/%s", work_dir, name); + dtb = dtoverlay_load_dtb(saved_overlay, 0); - if (dtoverlay_dtb_trailer(dtb)) - printf("%d: %.*s %.*s\n", i, (int)(right - left), left, - dtoverlay_dtb_trailer_len(dtb), - (char *)dtoverlay_dtb_trailer(dtb)); - else - printf("%d: %.*s\n", i, (int)(right - left), left); + if (dtoverlay_dtb_trailer(dtb)) + printf("%d: %.*s %.*s\n", i, (int)(right - left), left, + dtoverlay_dtb_trailer_len(dtb), + (char *)dtoverlay_dtb_trailer(dtb)); + else + printf("%d: %.*s\n", i, (int)(right - left), left); - dtoverlay_free_dtb(dtb); - } + dtoverlay_free_dtb(dtb); + } } return 0; @@ -777,10 +777,10 @@ static int dtoverlay_list_all(STATE_T *state) dh = opendir(overlay_src_dir); while ((de = readdir(dh)) != NULL) { - int len = strlen(de->d_name) - 5; - if ((len >= 0) && strcmp(de->d_name + len, ".dtbo") == 0) + int len = strlen(de->d_name) - 5; + if ((len >= 0) && strcmp(de->d_name + len, ".dtbo") == 0) { - char *str = string_vec_add(&strings, de->d_name, len + 2); + char *str = string_vec_add(&strings, de->d_name, len + 2); str[len] = '\0'; str[len + 1] = ' '; } @@ -790,52 +790,52 @@ static int dtoverlay_list_all(STATE_T *state) /* Merge in active overlays, marking them */ for (i = 0; i < state->count; i++) { - const char *left, *right; - char *str; - int len, idx; + const char *left, *right; + char *str; + int len, idx; - left = strchr(state->namelist[i]->d_name, '_'); - if (!left) - return error("Internal error"); - left++; - right = strchr(left, '.'); - if (!right) - return error("Internal error"); + left = strchr(state->namelist[i]->d_name, '_'); + if (!left) + return error("Internal error"); + left++; + right = strchr(left, '.'); + if (!right) + return error("Internal error"); len = right - left; if ((len == 7) && (memcmp(left, "dtparam", 7) == 0)) continue; - idx = string_vec_find(&strings, left, len); - if (idx >= 0) - { - str = strings.strings[idx]; - len = strlen(str); - } - else + idx = string_vec_find(&strings, left, len); + if (idx >= 0) { - str = string_vec_add(&strings, left, len + 2); + str = strings.strings[idx]; + len = strlen(str); + } + else + { + str = string_vec_add(&strings, left, len + 2); str[len] = '\0'; } - str[len + 1] = '*'; + str[len + 1] = '*'; } if (strings.num_strings == 0) { - printf("No overlays found\n"); + printf("No overlays found\n"); } else { - /* Sort */ - string_vec_sort(&strings); + /* Sort */ + string_vec_sort(&strings); - /* Display */ - printf("All overlays (* = loaded):\n"); + /* Display */ + printf("All overlays (* = loaded):\n"); - for (i = 0; i < strings.num_strings; i++) - { + for (i = 0; i < strings.num_strings; i++) + { const char *str = strings.strings[i]; - printf("%c %s\n", str[strlen(str)+1], str); - } + printf("%c %s\n", str[strlen(str)+1], str); + } } string_vec_uninit(&strings); @@ -848,36 +848,36 @@ static void usage(void) printf("Usage:\n"); if (strcmp(cmd_name, "dtparam") == 0) { - printf(" %s Display help on all parameters\n", cmd_name); - printf(" %s =...\n", cmd_name); - printf(" %*s Add an overlay (with parameters)\n", (int)strlen(cmd_name), ""); - printf(" %s -D [] Dry-run (prepare overlay, but don't apply -\n", - cmd_name); - printf(" %*s save it as dry-run.dtbo)\n", (int)strlen(cmd_name), ""); - printf(" %s -r [] Remove an overlay (by index, or the last)\n", cmd_name); - printf(" %s -R [] Remove from an overlay (by index, or all)\n", - cmd_name); - printf(" %s -l List active overlays/dtparams\n", cmd_name); - printf(" %s -a List all overlays/dtparams (marking the active)\n", cmd_name); - printf(" %s -h Show this usage message\n", cmd_name); - printf(" %s -h ... Display help on the listed parameters\n", cmd_name); + printf(" %s Display help on all parameters\n", cmd_name); + printf(" %s =...\n", cmd_name); + printf(" %*s Add an overlay (with parameters)\n", (int)strlen(cmd_name), ""); + printf(" %s -D [] Dry-run (prepare overlay, but don't apply -\n", + cmd_name); + printf(" %*s save it as dry-run.dtbo)\n", (int)strlen(cmd_name), ""); + printf(" %s -r [] Remove an overlay (by index, or the last)\n", cmd_name); + printf(" %s -R [] Remove from an overlay (by index, or all)\n", + cmd_name); + printf(" %s -l List active overlays/dtparams\n", cmd_name); + printf(" %s -a List all overlays/dtparams (marking the active)\n", cmd_name); + printf(" %s -h Show this usage message\n", cmd_name); + printf(" %s -h ... Display help on the listed parameters\n", cmd_name); } else { - printf(" %s [=...]\n", cmd_name); - printf(" %*s Add an overlay (with parameters)\n", (int)strlen(cmd_name), ""); - printf(" %s -D [] Dry-run (prepare overlay, but don't apply -\n", - cmd_name); - printf(" %*s save it as dry-run.dtbo)\n", (int)strlen(cmd_name), ""); - printf(" %s -r [] Remove an overlay (by name, index or the last)\n", cmd_name); - printf(" %s -R [] Remove from an overlay (by name, index or all)\n", - cmd_name); - printf(" %s -l List active overlays/params\n", cmd_name); - printf(" %s -a List all overlays (marking the active)\n", cmd_name); - printf(" %s -h Show this usage message\n", cmd_name); - printf(" %s -h Display help on an overlay\n", cmd_name); - printf(" %s -h .. Or its parameters\n", cmd_name); - printf(" where is the name of an overlay or 'dtparam' for dtparams\n"); + printf(" %s [=...]\n", cmd_name); + printf(" %*s Add an overlay (with parameters)\n", (int)strlen(cmd_name), ""); + printf(" %s -D [] Dry-run (prepare overlay, but don't apply -\n", + cmd_name); + printf(" %*s save it as dry-run.dtbo)\n", (int)strlen(cmd_name), ""); + printf(" %s -r [] Remove an overlay (by name, index or the last)\n", cmd_name); + printf(" %s -R [] Remove from an overlay (by name, index or all)\n", + cmd_name); + printf(" %s -l List active overlays/params\n", cmd_name); + printf(" %s -a List all overlays (marking the active)\n", cmd_name); + printf(" %s -h Show this usage message\n", cmd_name); + printf(" %s -h Display help on an overlay\n", cmd_name); + printf(" %s -h .. Or its parameters\n", cmd_name); + printf(" where is the name of an overlay or 'dtparam' for dtparams\n"); } printf("Options applicable to most variants:\n"); printf(" -d Specify an alternate location for the overlays\n"); @@ -892,79 +892,79 @@ static void usage(void) static void root_check(void) { if (getuid() != 0) - fatal_error("Must be run as root - try 'sudo %s ...'", cmd_name); + fatal_error("Must be run as root - try 'sudo %s ...'", cmd_name); } static void overlay_help(const char *overlay, const char **params) { OVERLAY_HELP_STATE_T *state; const char *readme_path = sprintf_dup("%s/%s", overlay_src_dir, - README_FILE); + README_FILE); state = overlay_help_open(readme_path); free_string(readme_path); if (state) { - if (strcmp(overlay, "dtparam") == 0) - overlay = ""; + if (strcmp(overlay, "dtparam") == 0) + overlay = ""; - if (overlay_help_find(state, overlay)) - { - if (params && overlay_help_find_field(state, "Params")) - { - int in_param = 0; + if (overlay_help_find(state, overlay)) + { + if (params && overlay_help_find_field(state, "Params")) + { + int in_param = 0; - while (1) - { - const char *line = overlay_help_field_data(state); - if (!line) - break; - if (line[0] == '\0') - continue; - if (line[0] != ' ') - { - /* This is a parameter name */ - int param_len = strcspn(line, " "); - const char **p = params; - const char **q = p; - in_param = 0; - while (*p) - { - if ((param_len == strlen(*p)) && - (memcmp(line, *p, param_len) == 0)) - in_param = 1; - else - *(q++) = *p; - p++; - } - *(q++) = 0; - } - if (in_param) - printf("%s\n", line); - } - /* This only shows the first unknown parameter, but - * that is enough. */ - if (*params) - fatal_error("Unknown parameter '%s'", *params); - } - else - { - printf("Name: %s\n\n", overlay); - overlay_help_print_field(state, "Info", "Info:", 8, 0); - overlay_help_print_field(state, "Load", "Usage:", 8, 0); - overlay_help_print_field(state, "Params", "Params:", 8, 0); - } - } - else - { - fatal_error("No help found for overlay '%s'", overlay); - } - overlay_help_close(state); + while (1) + { + const char *line = overlay_help_field_data(state); + if (!line) + break; + if (line[0] == '\0') + continue; + if (line[0] != ' ') + { + /* This is a parameter name */ + int param_len = strcspn(line, " "); + const char **p = params; + const char **q = p; + in_param = 0; + while (*p) + { + if ((param_len == strlen(*p)) && + (memcmp(line, *p, param_len) == 0)) + in_param = 1; + else + *(q++) = *p; + p++; + } + *(q++) = 0; + } + if (in_param) + printf("%s\n", line); + } + /* This only shows the first unknown parameter, but + * that is enough. */ + if (*params) + fatal_error("Unknown parameter '%s'", *params); + } + else + { + printf("Name: %s\n\n", overlay); + overlay_help_print_field(state, "Info", "Info:", 8, 0); + overlay_help_print_field(state, "Load", "Usage:", 8, 0); + overlay_help_print_field(state, "Params", "Params:", 8, 0); + } + } + else + { + fatal_error("No help found for overlay '%s'", overlay); + } + overlay_help_close(state); } else { - fatal_error("Help file not found"); + fatal_error("Help file not found"); } } @@ -974,37 +974,37 @@ static int apply_overlay(const char *overlay_file, const char *overlay) int ret = 0; if (dir_exists(overlay_dir)) { - error("Overlay '%s' is already loaded", overlay); + error("Overlay '%s' is already loaded", overlay); } else if (mkdir(overlay_dir, DIR_MODE) == 0) { - DTBLOB_T *dtb = dtoverlay_load_dtb(overlay_file, 0); - if (!dtb) - { - error("Failed to apply overlay '%s' (load)", overlay); - } - else - { - const char *dest_file = sprintf_dup("%s/dtbo", overlay_dir); + DTBLOB_T *dtb = dtoverlay_load_dtb(overlay_file, 0); + if (!dtb) + { + error("Failed to apply overlay '%s' (load)", overlay); + } + else + { + const char *dest_file = sprintf_dup("%s/dtbo", overlay_dir); - /* then write the overlay to the file */ - if (dtoverlay_save_dtb(dtb, dest_file) != 0) - error("Failed to apply overlay '%s' (save)", overlay); - else if (!overlay_applied(overlay_dir)) - error("Failed to apply overlay '%s' (kernel)", overlay); - else - ret = 1; + /* then write the overlay to the file */ + if (dtoverlay_save_dtb(dtb, dest_file) != 0) + error("Failed to apply overlay '%s' (save)", overlay); + else if (!overlay_applied(overlay_dir)) + error("Failed to apply overlay '%s' (kernel)", overlay); + else + ret = 1; - free_string(dest_file); - dtoverlay_free_dtb(dtb); - } + free_string(dest_file); + dtoverlay_free_dtb(dtb); + } - if (!ret) - rmdir(overlay_dir); + if (!ret) + rmdir(overlay_dir); } else { - error("Failed to create overlay directory"); + error("Failed to create overlay directory"); } return ret; @@ -1018,12 +1018,12 @@ static int overlay_applied(const char *overlay_dir) int bytes = 0; if (fp) { - bytes = fread(status, 1, sizeof(status), fp); - fclose(fp); + bytes = fread(status, 1, sizeof(status), fp); + fclose(fp); } free_string(status_path); return (bytes == sizeof(status)) && - (memcmp(status, "applied", sizeof(status)) == 0); + (memcmp(status, "applied", sizeof(status)) == 0); } int seq_filter(const struct dirent *de) @@ -1037,11 +1037,11 @@ int seq_compare(const struct dirent **de1, const struct dirent **de2) int num1 = atoi((*de1)->d_name); int num2 = atoi((*de2)->d_name); if (num1 < num2) - return -1; + return -1; else if (num1 == num2) - return 0; + return 0; else - return 1; + return 1; } static STATE_T *read_state(const char *dir) @@ -1051,14 +1051,14 @@ static STATE_T *read_state(const char *dir) if (state) { - state->count = scandir(dir, &state->namelist, seq_filter, seq_compare); + state->count = scandir(dir, &state->namelist, seq_filter, seq_compare); - for (i = 0; i < state->count; i++) - { - int num = atoi(state->namelist[i]->d_name); - if (i != num) - error("Overlay sequence error"); - } + for (i = 0; i < state->count; i++) + { + int num = atoi(state->namelist[i]->d_name); + if (i != num) + error("Overlay sequence error"); + } } return state; } @@ -1068,7 +1068,7 @@ static void free_state(STATE_T *state) int i; for (i = 0; i < state->count; i++) { - free(state->namelist[i]); + free(state->namelist[i]); } free(state->namelist); free(state);