diff mbox series

[v2,2/2] arm64: zynqmp: Add MTD partition handling for dfu_alt_info generation

Message ID db58d9f3fc142004d833bb115bfba0e26d660b66.1711109356.git.michal.simek@amd.com
State Accepted
Commit c01f5949951256b7f31056fe0e2ea215c04f405d
Delegated to: Michal Simek
Headers show
Series [v2,1/2] arm64: zynqmp: Generate desc when SPL_FS_LOAD_PAYLOAD_NAME is valid | expand

Commit Message

Michal Simek March 22, 2024, 12:09 p.m. UTC
Generate dfu_alt_info generation based on information from MTD partitions.
mtd_found_part() is trying to identify MTD partition which code is running
from. If partitions are not defined and location is not found it is going
to previous behavior.

Signed-off-by: Michal Simek <michal.simek@amd.com>
---

Changes in v2:
- Update logic based on 1/2 patch

 board/xilinx/zynqmp/zynqmp.c | 55 ++++++++++++++++++++++++++++++------
 1 file changed, 46 insertions(+), 9 deletions(-)

Comments

Michal Simek April 2, 2024, 1:08 p.m. UTC | #1
On 3/22/24 13:09, Michal Simek wrote:
> Generate dfu_alt_info generation based on information from MTD partitions.
> mtd_found_part() is trying to identify MTD partition which code is running
> from. If partitions are not defined and location is not found it is going
> to previous behavior.
> 
> Signed-off-by: Michal Simek <michal.simek@amd.com>
> ---
> 
> Changes in v2:
> - Update logic based on 1/2 patch
> 
>   board/xilinx/zynqmp/zynqmp.c | 55 ++++++++++++++++++++++++++++++------
>   1 file changed, 46 insertions(+), 9 deletions(-)
> 
> diff --git a/board/xilinx/zynqmp/zynqmp.c b/board/xilinx/zynqmp/zynqmp.c
> index 3844a9c9a8ff..2522024b4082 100644
> --- a/board/xilinx/zynqmp/zynqmp.c
> +++ b/board/xilinx/zynqmp/zynqmp.c
> @@ -626,6 +626,31 @@ enum env_location env_get_location(enum env_operation op, int prio)
>   
>   #define DFU_ALT_BUF_LEN		SZ_1K
>   
> +static void mtd_found_part(u32 *base, u32 *size)
> +{
> +	struct mtd_info *part, *mtd;
> +
> +	mtd_probe_devices();
> +
> +	mtd = get_mtd_device_nm("nor0");
> +	if (!IS_ERR_OR_NULL(mtd)) {
> +		list_for_each_entry(part, &mtd->partitions, node) {
> +			debug("0x%012llx-0x%012llx : \"%s\"\n",
> +			      part->offset, part->offset + part->size,
> +			      part->name);
> +
> +			if (*base >= part->offset &&
> +			    *base < part->offset + part->size) {
> +				debug("Found my partition: %d/%s\n",
> +				      part->index, part->name);
> +				*base = part->offset;
> +				*size = part->size;
> +				break;
> +			}
> +		}
> +	}
> +}
> +
>   void set_dfu_alt_info(char *interface, char *devstr)
>   {
>   	int multiboot, bootseq = 0, len = 0;
> @@ -670,17 +695,29 @@ void set_dfu_alt_info(char *interface, char *devstr)
>   		break;
>   	case QSPI_MODE_24BIT:
>   	case QSPI_MODE_32BIT:
> -		len += snprintf(buf + len, DFU_ALT_BUF_LEN,
> -			       "sf 0:0=boot.bin raw %x 0x1500000",
> -			       multiboot * SZ_32K);
> -#if defined(CONFIG_SPL_FS_LOAD_PAYLOAD_NAME) && defined(CONFIG_SYS_SPI_U_BOOT_OFFS)
> -		if (strlen(CONFIG_SPL_FS_LOAD_PAYLOAD_NAME))
> +		{
> +			u32 base = multiboot * SZ_32K;
> +			u32 size = 0x1500000;
> +			u32 limit = size;
> +
> +			mtd_found_part(&base, &limit);
> +
> +#if defined(CONFIG_SYS_SPI_U_BOOT_OFFS)
> +			size = limit;
> +			limit = CONFIG_SYS_SPI_U_BOOT_OFFS;
> +#endif
> +
>   			len += snprintf(buf + len, DFU_ALT_BUF_LEN,
> -					";%s raw 0x%x 0x500000",
> -					CONFIG_SPL_FS_LOAD_PAYLOAD_NAME,
> -					multiboot * SZ_32K +
> -					CONFIG_SYS_SPI_U_BOOT_OFFS);
> +					"sf 0:0=boot.bin raw 0x%x 0x%x",
> +					base, limit);
> +#if defined(CONFIG_SPL_FS_LOAD_PAYLOAD_NAME) && defined(CONFIG_SYS_SPI_U_BOOT_OFFS)
> +			if (strlen(CONFIG_SPL_FS_LOAD_PAYLOAD_NAME))
> +				len += snprintf(buf + len, DFU_ALT_BUF_LEN,
> +						";%s raw 0x%x 0x%x",
> +						CONFIG_SPL_FS_LOAD_PAYLOAD_NAME,
> +						base + limit, size - limit);
>   #endif
> +		}
>   		break;
>   	default:
>   		return;

Applied.
M
diff mbox series

Patch

diff --git a/board/xilinx/zynqmp/zynqmp.c b/board/xilinx/zynqmp/zynqmp.c
index 3844a9c9a8ff..2522024b4082 100644
--- a/board/xilinx/zynqmp/zynqmp.c
+++ b/board/xilinx/zynqmp/zynqmp.c
@@ -626,6 +626,31 @@  enum env_location env_get_location(enum env_operation op, int prio)
 
 #define DFU_ALT_BUF_LEN		SZ_1K
 
+static void mtd_found_part(u32 *base, u32 *size)
+{
+	struct mtd_info *part, *mtd;
+
+	mtd_probe_devices();
+
+	mtd = get_mtd_device_nm("nor0");
+	if (!IS_ERR_OR_NULL(mtd)) {
+		list_for_each_entry(part, &mtd->partitions, node) {
+			debug("0x%012llx-0x%012llx : \"%s\"\n",
+			      part->offset, part->offset + part->size,
+			      part->name);
+
+			if (*base >= part->offset &&
+			    *base < part->offset + part->size) {
+				debug("Found my partition: %d/%s\n",
+				      part->index, part->name);
+				*base = part->offset;
+				*size = part->size;
+				break;
+			}
+		}
+	}
+}
+
 void set_dfu_alt_info(char *interface, char *devstr)
 {
 	int multiboot, bootseq = 0, len = 0;
@@ -670,17 +695,29 @@  void set_dfu_alt_info(char *interface, char *devstr)
 		break;
 	case QSPI_MODE_24BIT:
 	case QSPI_MODE_32BIT:
-		len += snprintf(buf + len, DFU_ALT_BUF_LEN,
-			       "sf 0:0=boot.bin raw %x 0x1500000",
-			       multiboot * SZ_32K);
-#if defined(CONFIG_SPL_FS_LOAD_PAYLOAD_NAME) && defined(CONFIG_SYS_SPI_U_BOOT_OFFS)
-		if (strlen(CONFIG_SPL_FS_LOAD_PAYLOAD_NAME))
+		{
+			u32 base = multiboot * SZ_32K;
+			u32 size = 0x1500000;
+			u32 limit = size;
+
+			mtd_found_part(&base, &limit);
+
+#if defined(CONFIG_SYS_SPI_U_BOOT_OFFS)
+			size = limit;
+			limit = CONFIG_SYS_SPI_U_BOOT_OFFS;
+#endif
+
 			len += snprintf(buf + len, DFU_ALT_BUF_LEN,
-					";%s raw 0x%x 0x500000",
-					CONFIG_SPL_FS_LOAD_PAYLOAD_NAME,
-					multiboot * SZ_32K +
-					CONFIG_SYS_SPI_U_BOOT_OFFS);
+					"sf 0:0=boot.bin raw 0x%x 0x%x",
+					base, limit);
+#if defined(CONFIG_SPL_FS_LOAD_PAYLOAD_NAME) && defined(CONFIG_SYS_SPI_U_BOOT_OFFS)
+			if (strlen(CONFIG_SPL_FS_LOAD_PAYLOAD_NAME))
+				len += snprintf(buf + len, DFU_ALT_BUF_LEN,
+						";%s raw 0x%x 0x%x",
+						CONFIG_SPL_FS_LOAD_PAYLOAD_NAME,
+						base + limit, size - limit);
 #endif
+		}
 		break;
 	default:
 		return;