Update kelvin linker script * Use linker script to check code to be < 3MB * Add model header at the fixed location in the linker script * Fix HPS executable stack to 256kB (sim_kelvin failed on blown stack) Fix: 269616844 Change-Id: I80f55032b317490cb8b9c6de8ef67cbf5d01e23d (cherry picked from commit f34fbb1d2359e1d53a3727970c7f6b8d6726ad9d)
diff --git a/sw/device/lib/testing/test_framework/kelvin.ld b/sw/device/lib/testing/test_framework/kelvin.ld index 048db0d..076aa68 100644 --- a/sw/device/lib/testing/test_framework/kelvin.ld +++ b/sw/device/lib/testing/test_framework/kelvin.ld
@@ -15,10 +15,11 @@ */ MEMORY { - TCM(rwx): ORIGIN = 0x00000000, LENGTH = LENGTH(ram_ml_dmem) + TCM(rwx): ORIGIN = 0x00000000, LENGTH = 3M + MODEL_DATA(rw): ORIGIN = LENGTH(TCM), LENGTH = LENGTH(ram_ml_dmem) - LENGTH(TCM) } -_stack_size = 0x4000; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x4000; __heap_size__ = 0x1000; ENTRY(_start) @@ -85,7 +86,26 @@ .stack : ALIGN(4) { __stack_start__ = .; - . += _stack_size; + . += STACK_SIZE; __stack_end__ = .; } > TCM } + +SECTIONS { + . = ORIGIN(MODEL_DATA); + .model_data (NOLOAD) : ALIGN(4) { + __model_data_start__ = .; + *(.model_data) + __model_data_end__ = .; + } > MODEL_DATA + + /* + * Model header information (model input/output addresses) is + * always at the end of DMEM. + */ + .model_header LENGTH(ram_ml_dmem) - 4096 (NOLOAD) : ALIGN(4) { + __model_header_start__ = .; + *(.model_header*) + __model_header_end__ = .; + } > MODEL_DATA +}
diff --git a/sw/device/tests/kelvin/hps-c-port/BUILD b/sw/device/tests/kelvin/hps-c-port/BUILD index fb282e6..dcccb99 100644 --- a/sw/device/tests/kelvin/hps-c-port/BUILD +++ b/sw/device/tests/kelvin/hps-c-port/BUILD
@@ -57,4 +57,7 @@ "//sw/device/tests/kelvin/hps-c-port/model/inc:tfc_opt_util.h", "//sw/device/tests/kelvin/hps-c-port/model/inc:tfc_reshape.h", ], + linkopts = [ + "-Wl,--defsym,__stack_size__=256k", + ], )
diff --git a/sw/device/tests/kelvin/hps-c-port/main_fpga.cc b/sw/device/tests/kelvin/hps-c-port/main_fpga.cc index 4755b93..a42fe33 100644 --- a/sw/device/tests/kelvin/hps-c-port/main_fpga.cc +++ b/sw/device/tests/kelvin/hps-c-port/main_fpga.cc
@@ -1,24 +1,24 @@ -#include "sw/device/tests/kelvin/hps-c-port/sw/init/kelvin.h" -#include "sw/device/tests/kelvin/hps-c-port/model/inc/model.h" #include "sw/device/tests/kelvin/hps-c-port/ml_input.h" +#include "sw/device/tests/kelvin/hps-c-port/model/inc/model.h" +#include "sw/device/tests/kelvin/hps-c-port/sw/init/kelvin.h" constexpr int kImageLen = 240 * 320; -constexpr uint32_t kCommand = 0x3FF000; // +4.0MB - 4KB - struct command_t { uint32_t input_addr; uint32_t output_addr; uint32_t padding[1024 - 2]; }; -static_assert(sizeof(command_t) == 4096); static int8_t input_[kImageLen] __aligned__ __noinit__; +// .model_header is at the DMEM - 4KB +command_t command __attribute__((section(".model_header"))); +static_assert(sizeof(command) == 4096); + int main(void) { - const command_t *command = reinterpret_cast<const command_t*>(kCommand); - const uint8_t *image = reinterpret_cast<const uint8_t*>(command->input_addr); - int8_t *output = reinterpret_cast<int8_t*>(command->output_addr); + const uint8_t *image = reinterpret_cast<const uint8_t *>(command.input_addr); + int8_t *output = reinterpret_cast<int8_t *>(command.output_addr); ml_input(kImageLen, image, input_); model(input_, output);