On 8/4/25 5:07 PM, Lucien.Jheng wrote:

+/**
+ * request_firmware_into_buf_via_script() -
+ * Load firmware using a U-Boot script and copy to buffer
+ * @buf: Pointer to a pointer where the firmware buffer will be stored.
+ * @max_size: Maximum allowed size for the firmware to be loaded.
+ * @script_name: Name of the U-Boot script to execute for firmware loading.
+ *
+ * Executes a U-Boot script (@script_name) that loads firmware into
+ * memory and sets the environment variables 'fw_addr' (address) and
+ * 'fw_size' (size in bytes)

- Allocates a buffer, copies the firmware
- from the given address, and returns the pointer via @buf.

+ On success, copies the firmware
+ from the given address to user buffer @buf.

+ *
+ * The script must set these environment variables:
+ *   fw_addr - Address where firmware is loaded in memory
+ *   fw_size - Size of the firmware in bytes
+ *
+ * The script should be defined in the U-Boot environment, for example:
+ *   env set script_name 'load mmc 0:1 ${loadaddr} firmware.bin &&
+ *   env set fw_addr ${loadaddr} && env set fw_size ${filesize}
+ * Return: 0 on success, negative value on error.
+ */

This function description can be present only in one copy in the header file include/fs_loader.h , drop this redundant copy.

+int request_firmware_into_buf_via_script(void **buf, size_t max_size,
+                                        const char *script_name)
+{
+       ulong addr, size;
+       int ret;
+       char cmd[32];
+
+       if (!buf || !script_name || !max_size)
+               return -EINVAL;
+
+       /* Create command to run the firmware loading script */
+       snprintf(cmd, sizeof(cmd), "run %s", script_name);
+
+       /* Run the firmware loading script */
+       ret = run_command_list(cmd, -1, 0);
+       if (ret) {
+               log_err("Firmware loading script '%s' not defined or failed.\n",
+                       script_name);
+               return -EINVAL;
+       }
+
+       /* Find out where the firmware got loaded and how long it is */
+       addr = env_get_hex("fw_addr", 0);
+       size = env_get_hex("fw_size", 0);
+
+       /* Clear the variables set by the firmware loading script */
+       env_set("fw_addr", NULL);
+       env_set("fw_size", NULL);
+
+       if (!addr || !size) {
+               log_err("Firmware address (0x%lx) or size (0x%lx) are 
invalid.\n",
+                       addr, size);
+               return -EINVAL;
+       }

Please also add one more check:

if (size > max_size) {
log_err("Loaded firmware size 0x%lx exceeded maximum allowed size 0x%lx.\n", size, max_size);
  return -E2BIG;
}

+       memcpy(*buf, (void *)addr, min(size, max_size));
+
+       return 0;
+}
With these two nitpicks above fixed, it looks perfect. Thanks !

Reply via email to