soundstream: replace wfi busy loops
Add api's to wait for certain events rather than busy-waiting. Raise
the priority of the interrupt threads to minimize scheduling latency
(just a guess).
Bug: 330741645
Bypass-Presubmit-Reason: no sencha CI tests
Change-Id: Ic492294b0e19129943f3e0408321ea203be7686e
diff --git a/sw/device/cheriot/soundstream/compat.h b/sw/device/cheriot/soundstream/compat.h
index 70b1193..5d28227 100644
--- a/sw/device/cheriot/soundstream/compat.h
+++ b/sw/device/cheriot/soundstream/compat.h
@@ -83,7 +83,4 @@
} \
} while (false)
-// TODO(sleffler): need a scheduler yield kinda call
-inline void wait_for_interrupt(void) { asm volatile("wfi"); }
-
#endif // EXAMPLES_SOUNDSTREAM_COMPAT_H_
diff --git a/sw/device/cheriot/soundstream/i2s.cc b/sw/device/cheriot/soundstream/i2s.cc
index e5a5efb..e20358f 100644
--- a/sw/device/cheriot/soundstream/i2s.cc
+++ b/sw/device/cheriot/soundstream/i2s.cc
@@ -87,6 +87,16 @@
return was_seen;
}
+void i2s_wait_for_rx_watermark(void) {
+ const uint32_t *rxWatermarkFutex = interrupt_futex_get(
+ STATIC_SEALED_VALUE(i2sRxWatermarkInterruptCapability));
+ uint32_t last = *rxWatermarkFutex;
+ while (!i2s_rx_watermark_seen()) {
+ Debug::Assert(futex_wait(rxWatermarkFutex, last) == 0, "futex_wait");
+ last = *rxWatermarkFutex;
+ }
+}
+
static void i2s_irq_acknowledge(i2s_irq_t irq_id) {
CHECK_INIT();
CHECK_DIF_OK(dif_i2s_irq_acknowledge(&i2s, irq_id));
diff --git a/sw/device/cheriot/soundstream/i2s.h b/sw/device/cheriot/soundstream/i2s.h
index 08f6565..a920ad1 100644
--- a/sw/device/cheriot/soundstream/i2s.h
+++ b/sw/device/cheriot/soundstream/i2s.h
@@ -32,6 +32,7 @@
void __cheri_compartment("i2s")
i2s_irq_set_enabled(i2s_irq_t irq_id, bool enabled);
bool __cheri_compartment("i2s") i2s_rx_watermark_seen(void);
+void __cheri_compartment("i2s") i2s_wait_for_rx_watermark(void);
void __cheri_compartment("i2s") i2s_rxfifo_clear(void);
bool __cheri_compartment("i2s") i2s_rxfifo_is_empty(void);
void __cheri_compartment("i2s") i2s_record_begin(void);
diff --git a/sw/device/cheriot/soundstream/mailbox.cc b/sw/device/cheriot/soundstream/mailbox.cc
index 8861bbc..5f15111 100644
--- a/sw/device/cheriot/soundstream/mailbox.cc
+++ b/sw/device/cheriot/soundstream/mailbox.cc
@@ -93,6 +93,17 @@
// XXX temp until gpio's on the SEC can be used (either in simulation or for real)
void mailbox_set_button_pressed(bool pressed) { button_pressed = pressed; }
+// Wait until the record switch is pushed
+void mailbox_wait_for_button_pressed(void) {
+ const uint32_t *mailboxRtFutex =
+ interrupt_futex_get(STATIC_SEALED_VALUE(mailboxRtInterruptCapability));
+ uint32_t last = *mailboxRtFutex;
+ while (!mailbox_button_pressed()) {
+ Debug::Assert(futex_wait(mailboxRtFutex, last) == 0, "futex_wait");
+ last = *mailboxRtFutex;
+ }
+}
+
void mailbox_set_led(bool enabled) {
CHECK_INIT();
// NB: this is not the TockOS mailbox protocol.
diff --git a/sw/device/cheriot/soundstream/mailbox.h b/sw/device/cheriot/soundstream/mailbox.h
index 6663fca..3220187 100644
--- a/sw/device/cheriot/soundstream/mailbox.h
+++ b/sw/device/cheriot/soundstream/mailbox.h
@@ -27,6 +27,7 @@
void __cheri_compartment("mailbox") mailbox_init(void);
void __cheri_compartment("mailbox") mailbox_isr(void);
bool __cheri_compartment("mailbox") mailbox_button_pressed(void);
+void __cheri_compartment("mailbox") mailbox_wait_for_button_pressed(void);
// XXX temp
void __cheri_compartment("mailbox") mailbox_set_button_pressed(bool);
void __cheri_compartment("mailbox") mailbox_set_led(bool enabled);
diff --git a/sw/device/cheriot/soundstream/ml_top.cc b/sw/device/cheriot/soundstream/ml_top.cc
index 38d51bf..bd30f55 100644
--- a/sw/device/cheriot/soundstream/ml_top.cc
+++ b/sw/device/cheriot/soundstream/ml_top.cc
@@ -111,6 +111,16 @@
return was_done;
}
+void ml_top_wait_for_finish(void) {
+ const uint32_t* mlTopFinishFutex =
+ interrupt_futex_get(STATIC_SEALED_VALUE(mlTopFinishInterruptCapability));
+ uint32_t last = *mlTopFinishFutex;
+ while (!ml_top_finish_done()) {
+ Debug::Assert(futex_wait(mlTopFinishFutex, last) == 0, "futex_wait");
+ last = *mlTopFinishFutex;
+ }
+}
+
void ml_top_irq_acknowledge_all() {
CHECK_INIT();
CHECK_DIF_OK(dif_ml_top_irq_acknowledge_all(&ml_top));
diff --git a/sw/device/cheriot/soundstream/ml_top.h b/sw/device/cheriot/soundstream/ml_top.h
index b860d5f..be93516 100644
--- a/sw/device/cheriot/soundstream/ml_top.h
+++ b/sw/device/cheriot/soundstream/ml_top.h
@@ -38,6 +38,7 @@
void __cheri_compartment("ml_top")
ml_top_irq_set_enabled(ml_top_irq_t irq_id, bool enabled);
bool __cheri_compartment("ml_top") ml_top_finish_done(void);
+void __cheri_compartment("ml_top") ml_top_wait_for_finish(void);
void __cheri_compartment("ml_top") ml_top_resume_ctrl_en(uint32_t resume_pc);
void __cheri_compartment("ml_top")
ml_top_set_input(void* const data, size_t data_len_bytes);
diff --git a/sw/device/cheriot/soundstream/soundstream.cc b/sw/device/cheriot/soundstream/soundstream.cc
index 897a921..45dd2a9 100644
--- a/sw/device/cheriot/soundstream/soundstream.cc
+++ b/sw/device/cheriot/soundstream/soundstream.cc
@@ -89,9 +89,7 @@
// Wait until the record switch is pushed
Debug::log("Wait for button press...");
- while (!mailbox_button_pressed()) {
- wait_for_interrupt();
- }
+ mailbox_wait_for_button_pressed();
mailbox_set_led(/*enabled=*/true);
Debug::log("Start recording (max {} samples)...", kSamples);
@@ -101,9 +99,8 @@
int sample = 0;
while (sample < kSamples && mailbox_button_pressed()) {
i2s_irq_set_enabled(kI2sIrqRxWatermark, /*enabled=*/true);
- while (!i2s_rx_watermark_seen()) {
- wait_for_interrupt();
- }
+
+ i2s_wait_for_rx_watermark();
while (!i2s_rxfifo_is_empty()) {
uint32_t reg_val = i2s_get_rdata();
@@ -190,10 +187,7 @@
(void) ml_top_finish_done(); // NB: reset state
ml_top_resume_ctrl_en(header.resume_pc);
- // wfi
- while (!ml_top_finish_done()) {
- wait_for_interrupt();
- }
+ ml_top_wait_for_finish();
ml_top_get_output_header(&header);
CHECK(header.length == sizeof(result_buffer), "Unexpected ML result size");
diff --git a/sw/device/cheriot/soundstream/xmake.lua b/sw/device/cheriot/soundstream/xmake.lua
index 3d2d1da..5ab5325 100644
--- a/sw/device/cheriot/soundstream/xmake.lua
+++ b/sw/device/cheriot/soundstream/xmake.lua
@@ -88,21 +88,21 @@
-- NB: stack sizes bumped for logging
{
compartment = "i2s",
- priority = 1,
+ priority = 10,
entry_point = "i2s_isr",
stack_size = 0x400, -- 512B
trusted_stack_frames = 3
},
{
compartment = "ml_top",
- priority = 1,
+ priority = 10,
entry_point = "ml_top_isr",
stack_size = 0x400, -- 512B
trusted_stack_frames = 3
},
{
compartment = "mailbox",
- priority = 1,
+ priority = 10,
entry_point = "mailbox_isr",
stack_size = 0x400, -- 512B
trusted_stack_frames = 3