From 709526007ff5f499ca6a6a63b2dbc3b0b8d9a60c Mon Sep 17 00:00:00 2001 From: Jamie McCrae Date: Tue, 20 May 2025 09:49:52 +0100 Subject: [PATCH] storage: flash_map: Add support for sub-partitions Adds support for sub-partitions to the default flash map Signed-off-by: Jamie McCrae --- subsys/storage/flash_map/flash_map_default.c | 36 ++++++++++++++------ 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/subsys/storage/flash_map/flash_map_default.c b/subsys/storage/flash_map/flash_map_default.c index 55b4ba7490f..c0514d28a12 100644 --- a/subsys/storage/flash_map/flash_map_default.c +++ b/subsys/storage/flash_map/flash_map_default.c @@ -6,39 +6,40 @@ * SPDX-License-Identifier: Apache-2.0 */ -#define DT_DRV_COMPAT fixed_partitions - #include #include #include #if CONFIG_FLASH_MAP_LABELS -#define FLASH_AREA_FOO(part) \ +#define FLASH_AREA_FOO(part, mtd_from_partition) \ {.fa_id = DT_FIXED_PARTITION_ID(part), \ .fa_off = DT_REG_ADDR(part), \ - .fa_dev = DEVICE_DT_GET(DT_MTD_FROM_FIXED_PARTITION(part)), \ + .fa_dev = DEVICE_DT_GET(mtd_from_partition(part)), \ .fa_size = DT_REG_SIZE(part), \ .fa_label = DT_PROP_OR(part, label, NULL), }, #else -#define FLASH_AREA_FOO(part) \ +#define FLASH_AREA_FOO(part, mtd_from_partition) \ {.fa_id = DT_FIXED_PARTITION_ID(part), \ .fa_off = DT_REG_ADDR(part), \ - .fa_dev = DEVICE_DT_GET(DT_MTD_FROM_FIXED_PARTITION(part)), \ + .fa_dev = DEVICE_DT_GET(mtd_from_partition(part)), \ .fa_size = DT_REG_SIZE(part), }, #endif #define FLASH_AREA_FOOO(part) \ - COND_CODE_1(DT_NODE_HAS_STATUS_OKAY(DT_MTD_FROM_FIXED_PARTITION(part)), \ - (FLASH_AREA_FOO(part)), ()) + COND_CODE_1(DT_NODE_HAS_COMPAT(DT_PARENT(part), fixed_partitions), (\ + COND_CODE_1(DT_NODE_HAS_STATUS_OKAY(DT_MTD_FROM_FIXED_PARTITION(part)), \ + (FLASH_AREA_FOO(part, DT_MTD_FROM_FIXED_PARTITION)), ())), ( \ + COND_CODE_1(DT_NODE_HAS_STATUS_OKAY(DT_MTD_FROM_FIXED_SUBPARTITION(part)), \ + (FLASH_AREA_FOO(part, DT_MTD_FROM_FIXED_SUBPARTITION)), ()))) -#define FOREACH_PARTITION(n) DT_FOREACH_CHILD(DT_DRV_INST(n), FLASH_AREA_FOOO) +#define FOREACH_PARTITION(n) DT_FOREACH_CHILD(n, FLASH_AREA_FOOO) /* We iterate over all compatible 'fixed-partitions' nodes and * use DT_FOREACH_CHILD to iterate over all the partitions for that * 'fixed-partitions' node. This way we build a global partition map */ const struct flash_area default_flash_map[] = { - DT_INST_FOREACH_STATUS_OKAY(FOREACH_PARTITION) + DT_FOREACH_STATUS_OKAY(fixed_partitions, FOREACH_PARTITION) }; const int flash_map_entries = ARRAY_SIZE(default_flash_map); @@ -61,3 +62,18 @@ const struct flash_area *flash_map = default_flash_map; #define FOR_EACH_PARTITION_TABLE(table) DT_FOREACH_CHILD(table, DEFINE_PARTITION) DT_FOREACH_STATUS_OKAY(fixed_partitions, FOR_EACH_PARTITION_TABLE) + +#define DEFINE_SUB_PARTITION(part) DEFINE_SUB_PARTITION_1(part, DT_DEP_ORD(part)) +#define DEFINE_SUB_PARTITION_1(part, ord) \ + COND_CODE_1(DT_NODE_HAS_STATUS_OKAY(DT_MTD_FROM_FIXED_SUBPARTITION(part)), \ + (DEFINE_SUB_PARTITION_0(part, ord)), ()) +#define DEFINE_SUB_PARTITION_0(part, ord) \ + const struct flash_area DT_CAT(global_fixed_subpartition_ORD_, ord) = { \ + .fa_id = DT_FIXED_PARTITION_ID(part), \ + .fa_off = DT_REG_ADDR(part), \ + .fa_dev = DEVICE_DT_GET(DT_MTD_FROM_FIXED_SUBPARTITION(part)), \ + .fa_size = DT_REG_SIZE(part), \ + }; + +#define FOR_EACH_SUB_PARTITION_TABLE(table) DT_FOREACH_CHILD(table, DEFINE_SUB_PARTITION) +DT_FOREACH_STATUS_OKAY(fixed_subpartitions, FOR_EACH_SUB_PARTITION_TABLE)