lib/stai: Fix STAI NPU memory allocation.

The ST Neural ART code generator marks the HyperRAM mpool as cacheable
(CACHEABLE_ON), which causes the NPU stream engines to issue cacheable
accesses. However, the N6 memory subsystem does not support cacheable
accesses to internal memories, only external ones. Because of this,
relocating the HyperRAM region to internal memory results in invalid
access behavior: only base addresses are updated during relocation, not
the cacheable attributes.

In short, buffers generated for HyperRAM must remain in external memory.
Marking HyperRAM as non-cacheable is a possible workaround, but may
reduce performance if buffers are placed in AXI RAM instead.

Forcing the ext_ram_sz allocation to 1MB ensures that the ext_ram_sz
is allocated in SDRAM.
This commit is contained in:
Kwabena W. Agyeman 2025-11-01 18:28:22 -07:00
parent 2783fec7c2
commit 30da5a062f

View File

@ -49,6 +49,10 @@
#include "ll_aton_caches_interface.h"
#include "ll_aton_reloc_network.h"
// Due to limitations with the STM32N6 NPU design, the ext_ram_sz memory pool
// must be in external SDRAM and not in internal SRAM. Forcing a minimum of a
// 1MB allocation ensures that the ext_ram_sz buffer ends up in SDRAM.
#define AI_MIN_EXT_RAM_SZ (1048576)
#define AI_RELOC_ALIGNMENT (32)
typedef struct ml_backend_state {
@ -132,6 +136,10 @@ int ml_backend_init_model(py_ml_model_obj_t *model) {
return -1;
}
if (rt.ext_ram_sz) {
rt.ext_ram_sz = OMV_MAX(rt.ext_ram_sz, AI_MIN_EXT_RAM_SZ);
}
// Allocate executable memory.
state->exec_ram_size = OMV_ALIGN_TO(rt.rt_ram_xip, AI_RELOC_ALIGNMENT);
state->exec_ram_addr = m_new(uint8_t, state->exec_ram_size + AI_RELOC_ALIGNMENT);