// SPDX-License-Identifier: GPL-2.0+ /* * Copyright (c) 2020 Linaro Limited */ #include #include #include #include #define MTDPARTS_LEN 256 #define MTDIDS_LEN 128 static void board_get_mtdparts(const char *dev, const char *partition, char *mtdids, char *mtdparts) { /* mtdids: "=, ...." */ if (mtdids[0] != '\0') strcat(mtdids, ","); strcat(mtdids, dev); strcat(mtdids, "="); strcat(mtdids, dev); /* mtdparts: "mtdparts=:>;..." */ if (mtdparts[0] != '\0') strncat(mtdparts, ";", MTDPARTS_LEN); else strcat(mtdparts, "mtdparts="); strncat(mtdparts, dev, MTDPARTS_LEN); strncat(mtdparts, ":", MTDPARTS_LEN); strncat(mtdparts, partition, MTDPARTS_LEN); } void board_mtdparts_default(const char **mtdids, const char **mtdparts) { struct mtd_info *mtd; struct udevice *dev; const char *mtd_partition; static char parts[3 * MTDPARTS_LEN + 1]; static char ids[MTDIDS_LEN + 1]; static bool mtd_initialized; if (mtd_initialized) { *mtdids = ids; *mtdparts = parts; return; } memset(parts, 0, sizeof(parts)); memset(ids, 0, sizeof(ids)); /* Currently mtdparts is needed on Qemu ARM64 for capsule updates */ if (IS_ENABLED(CONFIG_EFI_CAPSULE_FIRMWARE_MANAGEMENT) && IS_ENABLED(CONFIG_TARGET_QEMU_ARM_64BIT)) { /* probe all MTD devices */ for (uclass_first_device(UCLASS_MTD, &dev); dev; uclass_next_device(&dev)) { debug("mtd device = %s\n", dev->name); } mtd = get_mtd_device_nm("nor0"); if (!IS_ERR_OR_NULL(mtd)) { mtd_partition = CONFIG_MTDPARTS_NOR0; board_get_mtdparts("nor0", mtd_partition, ids, parts); put_mtd_device(mtd); } mtd = get_mtd_device_nm("nor1"); if (!IS_ERR_OR_NULL(mtd)) { mtd_partition = CONFIG_MTDPARTS_NOR1; board_get_mtdparts("nor1", mtd_partition, ids, parts); put_mtd_device(mtd); } } mtd_initialized = true; *mtdids = ids; *mtdparts = parts; debug("%s:mtdids=%s & mtdparts=%s\n", __func__, ids, parts); }