soundstream: ml fixups
Fixes for kelvin handling. With the soundstream model loaded from renode
(see below) the full demo works as intended.
Changes:
- enable ml_top irq's
- correct interrupt handling; in particular update the multiwaiter
events marked as triggered
- correct ml_top_dmem pointer calculations
NB: for testing add something like this to sencha.resc:
$kelvin_bin?=@out/cheriot/sim/kelvin.bin
sysbus LoadBinary $kelvin_bin 0x5A000000
Bug: 330741645
Bypass-Presubmit-Reason: no sencha presubmit tests
Change-Id: I0bbe80d745803db185f013f2429cc13bcce9cca5
diff --git a/sw/device/cheriot/soundstream/ml_top.cc b/sw/device/cheriot/soundstream/ml_top.cc
index dc931ce..a7b04c8 100644
--- a/sw/device/cheriot/soundstream/ml_top.cc
+++ b/sw/device/cheriot/soundstream/ml_top.cc
@@ -55,6 +55,8 @@
CHECK_DIF_OK(dif_ml_top_init(mmio_region_from_addr((uintptr_t)MMIO_CAPABILITY(
ml_top_mmio_t, ml_top_core)),
&ml_top));
+ ml_top_irq_set_enabled(kMlTopIrqFinish, /*enabled=*/true);
+ ml_top_irq_set_enabled(kMlTopIrqFault, /*enabled=*/true);
semaphore_put(&startup);
}
@@ -83,15 +85,20 @@
for (;;) {
Debug::Assert(multiwaiter_wait(&unlimited, mw, events, 2) == 0, "multiwaiter_wait");
- Debug::log("ml_top_isr: Finish:{} Fault:{}", events[0].value, events[1].value);
if (events[1].value == 1) { // Fault signaled
- LOG_FATAL("ML_TOP fault!");
+ Debug::log("ml_top_isr: Fault, Finish:{}", events[0].value);
abort();
+
+ events[1].value = *mlTopFaultFutex;
}
if (events[0].value == 1) { // Finish signaled
+ Debug::log("ml_top_isr: Finish");
finish_done = true;
- interrupt_complete(STATIC_SEALED_VALUE(mlTopFinishInterruptCapability));
CHECK_DIF_OK(dif_ml_top_reset_ctrl_en(&ml_top));
+ CHECK_DIF_OK(dif_ml_top_irq_acknowledge(&ml_top, kMlTopIrqFinish));
+ interrupt_complete(STATIC_SEALED_VALUE(mlTopFinishInterruptCapability));
+
+ events[0].value = *mlTopFinishFutex;
}
}
}
@@ -104,11 +111,6 @@
return was_done;
}
-void ml_top_irq_acknowledge(ml_top_irq_t irq_id) {
- CHECK_INIT();
- CHECK_DIF_OK(dif_ml_top_irq_acknowledge(&ml_top, irq_id));
-}
-
void ml_top_irq_acknowledge_all() {
CHECK_INIT();
CHECK_DIF_OK(dif_ml_top_irq_acknowledge_all(&ml_top));
@@ -126,14 +128,14 @@
}
void ml_top_set_input(void* const data, size_t data_len_bytes) {
- void* input_ptr = (void*)(MMIO_CAPABILITY(ml_top_dmem_t, ml_top_dmem) +
- TOP_MATCHA_RAM_ML_DMEM_SIZE_BYTES - 4096);
+ uint8_t* ml_top_dmem_base = (uint8_t*) MMIO_CAPABILITY(ml_top_dmem_t, ml_top_dmem);
+ void* input_ptr = ml_top_dmem_base + (TOP_MATCHA_RAM_ML_DMEM_SIZE_BYTES - 4096);
memcpy(input_ptr, data, data_len_bytes);
}
void ml_top_get_output_header(struct output_header* header) {
- uint8_t* ml_top_dmem_base = (uint8_t*) MMIO_CAPABILITY(ml_top_dmem_t, ml_top_dmem);
- struct output_header* output_header_ptr = (struct output_header*)
+ const uint8_t* ml_top_dmem_base = (uint8_t*) MMIO_CAPABILITY(ml_top_dmem_t, ml_top_dmem);
+ const struct output_header* output_header_ptr = (const struct output_header*)
(ml_top_dmem_base + (TOP_MATCHA_RAM_ML_DMEM_SIZE_BYTES - 0x40));
header->return_code = output_header_ptr->return_code;
header->output_ptr = output_header_ptr->output_ptr;
@@ -148,7 +150,6 @@
}
void ml_top_get_output_data(struct output_header* const header, void* buffer) {
- const void* src = (const void*)(MMIO_CAPABILITY(ml_top_dmem_t, ml_top_dmem) +
- header->output_ptr);
- memcpy(buffer, src, header->length);
+ const uint8_t* ml_top_dmem_base = (const uint8_t*) MMIO_CAPABILITY(ml_top_dmem_t, ml_top_dmem);
+ memcpy(buffer, ml_top_dmem_base + header->output_ptr, header->length);
}
diff --git a/sw/device/cheriot/soundstream/ml_top.h b/sw/device/cheriot/soundstream/ml_top.h
index 5555576..b860d5f 100644
--- a/sw/device/cheriot/soundstream/ml_top.h
+++ b/sw/device/cheriot/soundstream/ml_top.h
@@ -22,7 +22,8 @@
#include "sw/device/lib/dif/dif_ml_top.h"
typedef dif_ml_top_irq_t ml_top_irq_t;
-const uint32_t kMlTopIrqFinish = kDifMlTopIrqFinish;
+const ml_top_irq_t kMlTopIrqFinish = kDifMlTopIrqFinish;
+const ml_top_irq_t kMlTopIrqFault = kDifMlTopIrqFault;
struct output_header {
uint32_t return_code; // Populated in kelvin_start