Changeset View
Changeset View
Standalone View
Standalone View
stand/fdt/fdt_overlay.c
Show First 20 Lines • Show All 403 Lines • ▼ Show 20 Lines | for (depth = 0; (o >= 0) && (depth >= 0); o = fdt_next_node(overlay_fdtp, o, &depth)) { | ||||
fdt_apply_fragment(main_fdtp, overlay_fdtp, o); | fdt_apply_fragment(main_fdtp, overlay_fdtp, o); | ||||
} | } | ||||
return (0); | return (0); | ||||
} | } | ||||
int | int | ||||
fdt_overlay_apply(void *main_fdtp, void *overlay_fdtp, size_t overlay_length) | fdt_overlay_apply(void *main_fdtp, void *overlay_fdtp) | ||||
{ | { | ||||
void *overlay_copy; | |||||
int rv; | |||||
rv = 0; | if (fdt_overlay_do_fixups(main_fdtp, overlay_fdtp) < 0) { | ||||
printf("failed to perform fixups in overlay\n"); | |||||
/* We modify overlay in-place, so we need writable copy */ | |||||
overlay_copy = malloc(overlay_length); | |||||
if (overlay_copy == NULL) { | |||||
printf("failed to allocate memory for overlay copy\n"); | |||||
return (-1); | return (-1); | ||||
} | } | ||||
memcpy(overlay_copy, overlay_fdtp, overlay_length); | if (fdt_overlay_do_local_fixups(main_fdtp, overlay_fdtp) < 0) { | ||||
if (fdt_overlay_do_fixups(main_fdtp, overlay_copy) < 0) { | |||||
printf("failed to perform fixups in overlay\n"); | |||||
rv = -1; | |||||
goto out; | |||||
} | |||||
if (fdt_overlay_do_local_fixups(main_fdtp, overlay_copy) < 0) { | |||||
printf("failed to perform local fixups in overlay\n"); | printf("failed to perform local fixups in overlay\n"); | ||||
rv = -1; | return (-1); | ||||
goto out; | |||||
} | } | ||||
if (fdt_overlay_apply_fragments(main_fdtp, overlay_copy) < 0) { | if (fdt_overlay_apply_fragments(main_fdtp, overlay_fdtp) < 0) { | ||||
printf("failed to apply fragments\n"); | printf("failed to apply fragments\n"); | ||||
rv = -1; | return (-1); | ||||
} | } | ||||
out: | return (0); | ||||
free(overlay_copy); | |||||
return (rv); | |||||
} | } |