From 9c02bf670deab5af4cd7e2810b3bab88c931036b Mon Sep 17 00:00:00 2001 From: edvard Date: Thu, 28 May 2026 13:36:42 +0200 Subject: [PATCH 1/4] vmem: vmem block funcs now able to lazy init devices --- src/vmem/vmem_block.c | 52 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 43 insertions(+), 9 deletions(-) diff --git a/src/vmem/vmem_block.c b/src/vmem/vmem_block.c index 2ef50c76e..e7204ba4a 100644 --- a/src/vmem/vmem_block.c +++ b/src/vmem/vmem_block.c @@ -24,6 +24,7 @@ static int32_t cache_read(const vmem_block_driver_t *drv, vmem_block_cache_t *ca static int32_t cache_write(const vmem_block_driver_t *drv, vmem_block_cache_t *cache, uint64_t address, uintptr_t data, uint32_t *length); static void cache_flush(const vmem_block_driver_t *drv, vmem_block_cache_t *cache); static bool address_in_cache(const vmem_block_driver_t *drv, vmem_block_cache_t *cache, uint64_t address); +static int32_t _vmem_block_init(const vmem_block_device_t *dev); static bool address_in_cache(const vmem_block_driver_t *drv, vmem_block_cache_t *cache, uint64_t address) { @@ -42,6 +43,13 @@ static bool address_in_cache(const vmem_block_driver_t *drv, vmem_block_cache_t static void cache_flush(const vmem_block_driver_t *drv, vmem_block_cache_t *cache) { + if(drv->device->state == VMEM_BLOCK_STATE_UNKNOWN) { + int32_t res = _vmem_block_init(drv->device); + if (res < 0) { + return; + } + } + if (cache->is_modified && cache->is_valid) { int32_t res; //printf("::cache_flush() The cache is modified, write it to device\n"); @@ -67,6 +75,14 @@ static int32_t cache_write(const vmem_block_driver_t *drv, vmem_block_cache_t *c if (data == (uintptr_t)NULL || (*length) == 0) { return 0; } + + if(drv->device->state == VMEM_BLOCK_STATE_UNKNOWN) { + int32_t res = _vmem_block_init(drv->device); + if (res < 0) { + return 0; + } + } + if (!cache) { int32_t res; uint32_t len = 0; @@ -163,6 +179,13 @@ static int32_t cache_read(const vmem_block_driver_t *drv, vmem_block_cache_t *ca return 0; } + if(drv->device->state == VMEM_BLOCK_STATE_UNKNOWN) { + int32_t res = _vmem_block_init(drv->device); + if (res < 0) { + return 0; + } + } + if (!cache) { int32_t res; uint32_t len = 0; @@ -333,22 +356,33 @@ int vmem_block_flush(vmem_t * vmem) { return res; } +static int32_t _vmem_block_init(const vmem_block_device_t * dev) { + + /* Print some specifics for the particular block device */ + int32_t res = -1; + printf("Initializing VMEM block device: '%s'\n", dev->name); + printf(" block size : %" PRIu32 " bytes\n", dev->bsize); + printf(" number of blocks: %" PRIu32 "\n", dev->total_nblocks); + printf(" total size : %" PRIu64 " bytes\n", ((uint64_t)dev->bsize * (uint64_t)dev->total_nblocks)); + + /* Then initialize it */ + if (dev->init) { + res = (*dev->init)(dev); + } + + return res; +} + void vmem_block_init(void) { /* Calling these methods requires that the FreeRTOS scheduler is started, since it uses usleep() */ if ((&__start_vmem_bdevice) && (&__stop_vmem_bdevice)) { for(vmem_block_device_t *dev = (vmem_block_device_t *)&__start_vmem_bdevice; dev < (vmem_block_device_t *)&__stop_vmem_bdevice; dev++) { - /* Print some specifics for the particular block device */ - printf("Initializing VMEM block device: '%s'\n", dev->name); - printf(" block size : %"PRIu32" bytes\n", dev->bsize); - printf(" number of blocks: %"PRIu32"\n", dev->total_nblocks); - printf(" total size : %"PRIu64" bytes\n", ((uint64_t)dev->bsize * (uint64_t)dev->total_nblocks)); - /* Then initialize it */ - if (dev->init) { - (*dev->init)(dev); + int32_t res = _vmem_block_init(dev); + if (res < 0) { + printf("Error, could not initialize block device '%s'\n", dev->name); } } } - } From d485da1e17e3d673f23c0fad69aaf17cae467bde Mon Sep 17 00:00:00 2001 From: edvard Date: Thu, 28 May 2026 14:54:33 +0200 Subject: [PATCH 2/4] vmem: add dereference on init var --- src/vmem/vmem_block.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vmem/vmem_block.c b/src/vmem/vmem_block.c index e7204ba4a..432f01187 100644 --- a/src/vmem/vmem_block.c +++ b/src/vmem/vmem_block.c @@ -43,7 +43,7 @@ static bool address_in_cache(const vmem_block_driver_t *drv, vmem_block_cache_t static void cache_flush(const vmem_block_driver_t *drv, vmem_block_cache_t *cache) { - if(drv->device->state == VMEM_BLOCK_STATE_UNKNOWN) { + if(*(drv->device->state) == VMEM_BLOCK_STATE_UNKNOWN) { int32_t res = _vmem_block_init(drv->device); if (res < 0) { return; @@ -76,7 +76,7 @@ static int32_t cache_write(const vmem_block_driver_t *drv, vmem_block_cache_t *c return 0; } - if(drv->device->state == VMEM_BLOCK_STATE_UNKNOWN) { + if(*(drv->device->state) == VMEM_BLOCK_STATE_UNKNOWN) { int32_t res = _vmem_block_init(drv->device); if (res < 0) { return 0; @@ -179,7 +179,7 @@ static int32_t cache_read(const vmem_block_driver_t *drv, vmem_block_cache_t *ca return 0; } - if(drv->device->state == VMEM_BLOCK_STATE_UNKNOWN) { + if(*(drv->device->state) == VMEM_BLOCK_STATE_UNKNOWN) { int32_t res = _vmem_block_init(drv->device); if (res < 0) { return 0; From 31a9d44f6e4d79621117fc03cbcd5ee9074564e5 Mon Sep 17 00:00:00 2001 From: edvard Date: Thu, 28 May 2026 15:28:01 +0200 Subject: [PATCH 3/4] vmem: return length 0 if lazy init failed --- src/vmem/vmem_block.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vmem/vmem_block.c b/src/vmem/vmem_block.c index 432f01187..23ae9dcab 100644 --- a/src/vmem/vmem_block.c +++ b/src/vmem/vmem_block.c @@ -79,6 +79,7 @@ static int32_t cache_write(const vmem_block_driver_t *drv, vmem_block_cache_t *c if(*(drv->device->state) == VMEM_BLOCK_STATE_UNKNOWN) { int32_t res = _vmem_block_init(drv->device); if (res < 0) { + (*length) = 0; return 0; } } @@ -182,6 +183,7 @@ static int32_t cache_read(const vmem_block_driver_t *drv, vmem_block_cache_t *ca if(*(drv->device->state) == VMEM_BLOCK_STATE_UNKNOWN) { int32_t res = _vmem_block_init(drv->device); if (res < 0) { + (*length) = 0; return 0; } } From 3a1ca866b858ddb04bfe45942f27c3b0b0713a87 Mon Sep 17 00:00:00 2001 From: edvard Date: Fri, 29 May 2026 09:24:19 +0200 Subject: [PATCH 4/4] vmem block: removed vmem_block_init --- include/vmem/vmem_block.h | 2 +- src/vmem/vmem_block.c | 14 -------------- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/include/vmem/vmem_block.h b/include/vmem/vmem_block.h index 79b068a75..fdf9539a1 100644 --- a/include/vmem/vmem_block.h +++ b/include/vmem/vmem_block.h @@ -129,7 +129,7 @@ typedef struct vmem_block_region_s { extern void vmem_block_read(vmem_t * vmem, uint64_t addr, void * dataout, uint32_t len); extern void vmem_block_write(vmem_t * vmem, uint64_t addr, const void * datain, uint32_t len); extern int vmem_block_flush(vmem_t * vmem); -extern void vmem_block_init(void); +void vmem_block_init(void) __attribute__((error("vmem_block_init() has been removed. Block devices now use lazy initialization."))); #ifdef __cplusplus } diff --git a/src/vmem/vmem_block.c b/src/vmem/vmem_block.c index 23ae9dcab..9293f5fbd 100644 --- a/src/vmem/vmem_block.c +++ b/src/vmem/vmem_block.c @@ -374,17 +374,3 @@ static int32_t _vmem_block_init(const vmem_block_device_t * dev) { return res; } - -void vmem_block_init(void) { - - /* Calling these methods requires that the FreeRTOS scheduler is started, since it uses usleep() */ - if ((&__start_vmem_bdevice) && (&__stop_vmem_bdevice)) { - for(vmem_block_device_t *dev = (vmem_block_device_t *)&__start_vmem_bdevice; dev < (vmem_block_device_t *)&__stop_vmem_bdevice; dev++) { - int32_t res = _vmem_block_init(dev); - if (res < 0) { - printf("Error, could not initialize block device '%s'\n", dev->name); - } - } - } -} -