"Das U-Boot" Source Tree
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

boot: extension: Move overlay apply custom logic to command level

The extension_overlay_cmd environment variable approach is specific to
the U-Boot extension_board command, while other boot flows (pxe_utils,
bootstd) handle overlay loading differently.

Move the extension_overlay_cmd execution out of the core extension
framework to the command level. This decouples the framework from
command-specific behavior and prepares for future extension support
in other boot flows.

Signed-off-by: Kory Maincent (TI.com) <kory.maincent@bootlin.com>
Reviewed-by: Simon Glass <sjg@chromium.org>

authored by

Kory Maincent (TI.com) and committed by
Tom Rini
f9b13934 2d12958e

+98 -74
+5 -63
boot/extension-uclass.c
··· 59 59 return ops->scan(dev, extension_list); 60 60 } 61 61 62 - static int _extension_apply(const struct extension *extension) 62 + int extension_apply(struct fdt_header *working_fdt, ulong size) 63 63 { 64 - ulong extrasize, overlay_addr; 65 64 struct fdt_header *blob; 66 - char *overlay_cmd; 65 + ulong overlay_addr; 67 66 int ret; 68 - 69 - if (!working_fdt) { 70 - printf("No FDT memory address configured. Please configure\n" 71 - "the FDT address via \"fdt addr <address>\" command.\n"); 72 - return -EINVAL; 73 - } 74 - 75 - overlay_cmd = env_get("extension_overlay_cmd"); 76 - if (!overlay_cmd) { 77 - printf("Environment extension_overlay_cmd is missing\n"); 78 - return -EINVAL; 79 - } 80 67 81 68 overlay_addr = env_get_hex("extension_overlay_addr", 0); 82 69 if (!overlay_addr) { ··· 84 71 return -EINVAL; 85 72 } 86 73 87 - env_set("extension_overlay_name", extension->overlay); 88 - ret = run_command(overlay_cmd, 0); 89 - if (ret) 90 - return ret; 91 - 92 - extrasize = env_get_hex("filesize", 0); 93 - if (!extrasize) 94 - return -EINVAL; 95 - 96 - fdt_shrink_to_minimum(working_fdt, extrasize); 74 + fdt_shrink_to_minimum(working_fdt, size); 97 75 98 76 blob = map_sysmem(overlay_addr, 0); 99 77 if (!fdt_valid(&blob)) { 100 - printf("Invalid overlay devicetree %s\n", extension->overlay); 78 + printf("Invalid overlay devicetree\n"); 101 79 return -EINVAL; 102 80 } 103 81 104 82 /* Apply method prints messages on error */ 105 83 ret = fdt_overlay_apply_verbose(working_fdt, blob); 106 84 if (ret) 107 - printf("Failed to apply overlay %s\n", extension->overlay); 85 + printf("Failed to apply overlay\n"); 108 86 109 87 return ret; 110 - } 111 - 112 - int extension_apply(int extension_num) 113 - { 114 - struct alist *extension_list = extension_get_list(); 115 - const struct extension *extension; 116 - 117 - if (!extension_list) 118 - return -ENOENT; 119 - 120 - extension = alist_get(extension_list, extension_num, 121 - struct extension); 122 - if (!extension) { 123 - printf("Wrong extension number\n"); 124 - return -EINVAL; 125 - } 126 - 127 - return _extension_apply(extension); 128 - } 129 - 130 - int extension_apply_all(void) 131 - { 132 - struct alist *extension_list = extension_get_list(); 133 - const struct extension *extension; 134 - int ret; 135 - 136 - if (!extension_list) 137 - return -ENOENT; 138 - 139 - alist_for_each(extension, extension_list) { 140 - ret = _extension_apply(extension); 141 - if (ret) 142 - return ret; 143 - } 144 - 145 - return 0; 146 88 } 147 89 148 90 UCLASS_DRIVER(extension) = {
+90 -2
cmd/extension_board.c
··· 7 7 #include <alist.h> 8 8 #include <exports.h> 9 9 #include <command.h> 10 + #include <env.h> 10 11 #include <extension_board.h> 11 12 13 + static int 14 + cmd_extension_load_overlay_from_env(const struct extension *extension, 15 + ulong *filesize) 16 + { 17 + ulong size, overlay_addr; 18 + char *overlay_cmd; 19 + int ret; 20 + 21 + overlay_cmd = env_get("extension_overlay_cmd"); 22 + if (!overlay_cmd) { 23 + printf("Environment extension_overlay_cmd is missing\n"); 24 + return -EINVAL; 25 + } 26 + 27 + overlay_addr = env_get_hex("extension_overlay_addr", 0); 28 + if (!overlay_addr) { 29 + printf("Environment extension_overlay_addr is missing\n"); 30 + return -EINVAL; 31 + } 32 + 33 + env_set("extension_overlay_name", extension->overlay); 34 + ret = run_command(overlay_cmd, 0); 35 + if (ret) 36 + return ret; 37 + 38 + size = env_get_hex("filesize", 0); 39 + if (!size) 40 + return -EINVAL; 41 + 42 + *filesize = size; 43 + return 0; 44 + } 45 + 46 + static int cmd_extension_apply(int extension_num) 47 + { 48 + struct alist *extension_list = extension_get_list(); 49 + const struct extension *extension; 50 + ulong size; 51 + int ret; 52 + 53 + if (!extension_list) 54 + return -ENODEV; 55 + 56 + extension = alist_get(extension_list, extension_num, 57 + struct extension); 58 + if (!extension) { 59 + printf("Wrong extension number\n"); 60 + return -ENODEV; 61 + } 62 + 63 + ret = cmd_extension_load_overlay_from_env(extension, &size); 64 + if (ret) 65 + return ret; 66 + 67 + return extension_apply(working_fdt, size); 68 + } 69 + 70 + static int cmd_extension_apply_all(void) 71 + { 72 + struct alist *extension_list = extension_get_list(); 73 + const struct extension *extension; 74 + int ret; 75 + 76 + if (!extension_list) 77 + return -ENODEV; 78 + 79 + alist_for_each(extension, extension_list) { 80 + ulong size; 81 + 82 + ret = cmd_extension_load_overlay_from_env(extension, &size); 83 + if (ret) 84 + return ret; 85 + 86 + ret = extension_apply(working_fdt, size); 87 + if (ret) 88 + return ret; 89 + } 90 + 91 + return 0; 92 + } 93 + 12 94 static int do_extension_list(struct cmd_tbl *cmdtp, int flag, 13 95 int argc, char *const argv[]) 14 96 { ··· 55 137 if (argc < 2) 56 138 return CMD_RET_USAGE; 57 139 140 + if (!working_fdt) { 141 + printf("No FDT memory address configured. Please configure\n" 142 + "the FDT address via \"fdt addr <address>\" command.\n"); 143 + return -EINVAL; 144 + } 145 + 58 146 if (strcmp(argv[1], "all") == 0) { 59 - if (extension_apply_all()) 147 + if (cmd_extension_apply_all()) 60 148 return CMD_RET_FAILURE; 61 149 } else { 62 150 extension_id = simple_strtol(argv[1], NULL, 10); 63 - if (extension_apply(extension_id)) 151 + if (cmd_extension_apply(extension_id)) 64 152 return CMD_RET_FAILURE; 65 153 } 66 154
+3 -9
include/extension_board.h
··· 44 44 45 45 /** 46 46 * extension_apply - Apply extension board overlay to the devicetree 47 - * @extension_num: Extension number to be applied 48 - * Return: Zero on success, negative on failure. 49 - */ 50 - int extension_apply(int extension_num); 51 - 52 - /** 53 - * extension_apply_all - Apply all extension board overlays to the 54 - * devicetree 47 + * @working_fdt: Pointer to working flattened device tree 48 + * @size: Size of the devicetree overlay 55 49 * Return: Zero on success, negative on failure. 56 50 */ 57 - int extension_apply_all(void); 51 + int extension_apply(struct fdt_header *working_fdt, ulong size); 58 52 59 53 /** 60 54 * extension - Description fields of an extension board