Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions hal/blocking/flash/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ rust_library(
visibility = ["//visibility:public"],
deps = [
":driver",
"//util/blocking",
"//util/io",
"//util/types",
],
Expand Down
7 changes: 4 additions & 3 deletions hal/blocking/flash/flash.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@
use core::{cmp::min, num::NonZero};
pub use hal_flash_driver::FlashAddress;
use hal_flash_driver::FlashDriver;
use util_blocking::Blocking;
use util_io::RandomRead;
use util_types::{Blocking, PowerOf2Usize};
use util_types::PowerOf2Usize;

/// High-level flash interface.
///
Expand Down Expand Up @@ -157,7 +158,7 @@ impl<TDriver: FlashDriver, TBlocking: Blocking> Flash for BlockingFlash<TDriver,
/// until the operation completes.
fn erase(&mut self, start_addr: FlashAddress, size: PowerOf2Usize) -> Result<(), Self::Error> {
self.driver.start_erase(start_addr, size)?;
self.blocking.wait_for_notification();
let _token = self.blocking.wait_for_notification();
self.driver.complete_op()
}
/// Programs data into flash.
Expand All @@ -179,7 +180,7 @@ impl<TDriver: FlashDriver, TBlocking: Blocking> Flash for BlockingFlash<TDriver,
TDriver::PROGRAM_WINDOW_SIZE - ((addr.offset() & window_mask as u32) as usize),
)];
self.driver.start_program(addr, chunk)?;
self.blocking.wait_for_notification();
let _token = self.blocking.wait_for_notification();
self.driver.complete_op()?;
data = &data[chunk.len()..];
addr += chunk.len();
Expand Down
2 changes: 1 addition & 1 deletion target/earlgrey/firmware/hwe/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -86,9 +86,9 @@ rust_process(
"//target/earlgrey/drivers:eflash_driver",
"//target/earlgrey/registers:flash_ctrl_core",
"//target/earlgrey/util",
"//util/blocking",
"//util/error",
"//util/ipc",
"//util/types",
"//util/zfmt",
"@pigweed//pw_kernel/userspace",
"@pigweed//pw_status/rust:pw_status",
Expand Down
26 changes: 5 additions & 21 deletions target/earlgrey/firmware/hwe/flash_server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,27 +15,8 @@ use earlgrey_util::EarlgreyFlashAddress;
use eflash_driver::{EmbeddedFlash, Permission};
use hal_flash::{BlockingFlash, FlashAddress};
use services_flash_server::FlashIpcServer;
use util_blocking::BlockingInterrupt;
use util_ipc::IpcHandle;
use util_types::Blocking;

struct FlashCtrlInterrupt;

impl Blocking for FlashCtrlInterrupt {
fn wait_for_notification(&self) {
loop {
if let Ok(w) = syscall::object_wait(
handle::FLASH_INTERRUPTS,
signals::FLASH_CTRL_OP_DONE,
Instant::MAX,
) {
if w.pending_signals.contains(signals::FLASH_CTRL_OP_DONE) {
break;
}
}
}
let _ = syscall::interrupt_ack(handle::FLASH_INTERRUPTS, signals::FLASH_CTRL_OP_DONE);
}
}

fn flash_server() -> Result<(), ErrorCode> {
let mut driver =
Expand All @@ -47,7 +28,10 @@ fn flash_server() -> Result<(), ErrorCode> {
}
let flash = BlockingFlash {
driver,
blocking: FlashCtrlInterrupt,
blocking: BlockingInterrupt {
handle: handle::FLASH_INTERRUPTS,
signals: signals::FLASH_CTRL_OP_DONE,
},
};
let mut flash_server = FlashIpcServer::new(flash);
let mut buf = [0u8; 2064];
Expand Down
1 change: 1 addition & 0 deletions target/earlgrey/firmware/transport/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ rust_process(
"//target/earlgrey/registers:flash_ctrl_core",
"//target/earlgrey/registers:spi_host",
"//target/earlgrey/util",
"//util/blocking",
"//util/error",
"//util/ipc",
"//util/types",
Expand Down
26 changes: 5 additions & 21 deletions target/earlgrey/firmware/transport/flash_server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ use hal_flash::{BlockingFlash, FlashAddress};
use services_flash_server::FlashIpcServer;
use spi_flash::SpiFlash;
use spi_host::SpiHost0;
use util_blocking::BlockingInterrupt;
use util_ipc::IpcHandle;
use util_types::Blocking;

#[derive(Zfmt)]
#[zfmt(format = "SPI Host init failed: {code:08x}")]
Expand All @@ -33,25 +33,6 @@ struct SpiFlashInitFailed {
code: u32,
}

struct FlashCtrlInterrupt;

impl Blocking for FlashCtrlInterrupt {
fn wait_for_notification(&self) {
loop {
if let Ok(w) = syscall::object_wait(
handle::FLASH_INTERRUPTS,
signals::FLASH_CTRL_OP_DONE,
Instant::MAX,
) {
if w.pending_signals.contains(signals::FLASH_CTRL_OP_DONE) {
break;
}
}
}
let _ = syscall::interrupt_ack(handle::FLASH_INTERRUPTS, signals::FLASH_CTRL_OP_DONE);
}
}

fn flash_server() -> Result<(), ErrorCode> {
let mut eflash_driver =
EmbeddedFlash::new_with_interrupts(unsafe { flash_ctrl_core::FlashCtrl::new() });
Expand All @@ -62,7 +43,10 @@ fn flash_server() -> Result<(), ErrorCode> {
}
let eflash = BlockingFlash {
driver: eflash_driver,
blocking: FlashCtrlInterrupt,
blocking: BlockingInterrupt {
handle: handle::FLASH_INTERRUPTS,
signals: signals::FLASH_CTRL_OP_DONE,
},
};
let mut eflash_server = FlashIpcServer::new(eflash);

Expand Down
2 changes: 1 addition & 1 deletion target/earlgrey/tests/bootinfo/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,10 @@ rust_app(
"//target/earlgrey/drivers:eflash_driver",
"//target/earlgrey/registers:flash_ctrl_core",
"//target/earlgrey/util",
"//util/blocking",
"//util/error",
"//util/ipc",
"//util/panic",
"//util/types",
"@pigweed//pw_kernel/userspace",
"@pigweed//pw_log/rust:pw_log",
"@pigweed//pw_status/rust:pw_status",
Expand Down
26 changes: 5 additions & 21 deletions target/earlgrey/tests/bootinfo/flash_server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,28 +13,9 @@ use earlgrey_util::flash::EarlgreyFlashAddress;
use eflash_driver::{EmbeddedFlash, Permission};
use hal_flash::{BlockingFlash, FlashAddress};
use services_flash_server::FlashIpcServer;
use util_blocking::BlockingInterrupt;
use util_error::ErrorCode;
use util_ipc::IpcHandle;
use util_types::Blocking;

struct FlashCtrlInterrupt;

impl Blocking for FlashCtrlInterrupt {
fn wait_for_notification(&self) {
loop {
if let Ok(w) = syscall::object_wait(
handle::FLASH_INTERRUPTS,
signals::FLASH_CTRL_OP_DONE,
Instant::MAX,
) {
if w.pending_signals.contains(signals::FLASH_CTRL_OP_DONE) {
break;
}
}
}
let _ = syscall::interrupt_ack(handle::FLASH_INTERRUPTS, signals::FLASH_CTRL_OP_DONE);
}
}

fn flash_server() -> Result<(), ErrorCode> {
let mut driver =
Expand All @@ -46,7 +27,10 @@ fn flash_server() -> Result<(), ErrorCode> {
}
let flash = BlockingFlash {
driver,
blocking: FlashCtrlInterrupt,
blocking: BlockingInterrupt {
handle: handle::FLASH_INTERRUPTS,
signals: signals::FLASH_CTRL_OP_DONE,
},
};
let mut flash_server = FlashIpcServer::new(flash);
let mut buf = [0u8; 2064];
Expand Down
2 changes: 1 addition & 1 deletion target/earlgrey/tests/eflash/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,10 @@ rust_app(
"//target/earlgrey/drivers:eflash_driver",
"//target/earlgrey/registers:flash_ctrl_core",
"//target/earlgrey/util",
"//util/blocking",
"//util/error",
"//util/ipc",
"//util/panic",
"//util/types",
"@pigweed//pw_kernel/userspace",
"@pigweed//pw_log/rust:pw_log",
"@pigweed//pw_status/rust:pw_status",
Expand Down
26 changes: 5 additions & 21 deletions target/earlgrey/tests/eflash/flash_server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,28 +13,9 @@ use earlgrey_util::EarlgreyFlashAddress;
use eflash_driver::{EmbeddedFlash, Permission};
use hal_flash::{BlockingFlash, FlashAddress};
use services_flash_server::FlashIpcServer;
use util_blocking::BlockingInterrupt;
use util_error::ErrorCode;
use util_ipc::IpcHandle;
use util_types::Blocking;

struct FlashCtrlInterrupt;

impl Blocking for FlashCtrlInterrupt {
fn wait_for_notification(&self) {
loop {
if let Ok(w) = syscall::object_wait(
handle::FLASH_INTERRUPTS,
signals::FLASH_CTRL_OP_DONE,
Instant::MAX,
) {
if w.pending_signals.contains(signals::FLASH_CTRL_OP_DONE) {
break;
}
}
}
let _ = syscall::interrupt_ack(handle::FLASH_INTERRUPTS, signals::FLASH_CTRL_OP_DONE);
}
}

fn flash_server() -> Result<(), ErrorCode> {
pw_log::info!("flash_server: initializing driver");
Expand All @@ -47,7 +28,10 @@ fn flash_server() -> Result<(), ErrorCode> {
}
let flash = BlockingFlash {
driver,
blocking: FlashCtrlInterrupt,
blocking: BlockingInterrupt {
handle: handle::FLASH_INTERRUPTS,
signals: signals::FLASH_CTRL_OP_DONE,
},
};
let mut flash_server = FlashIpcServer::new(flash);
let mut buf = [0u8; 2064];
Expand Down
2 changes: 1 addition & 1 deletion target/earlgrey/tests/spi_flash/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,10 @@ rust_app(
"//target/earlgrey/registers:flash_ctrl_core",
"//target/earlgrey/registers:spi_host",
"//target/earlgrey/util",
"//util/blocking",
"//util/error",
"//util/ipc",
"//util/panic",
"//util/types",
"@pigweed//pw_kernel/userspace",
"@pigweed//pw_log/rust:pw_log",
"@pigweed//pw_status/rust:pw_status",
Expand Down
27 changes: 5 additions & 22 deletions target/earlgrey/tests/spi_flash/combined_flash_server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,30 +15,10 @@ use spi_flash::SpiFlash;
use spi_host::SpiHost0;
use userspace::time::Instant;
use userspace::{entry, syscall};
use util_blocking::BlockingInterrupt;
use util_error::ErrorCode;
use util_ipc::IpcHandle;
use util_panic as _;
use util_types::Blocking;

// EFlash Interrupt Blocker
struct FlashCtrlInterrupt;

impl Blocking for FlashCtrlInterrupt {
fn wait_for_notification(&self) {
loop {
if let Ok(w) = syscall::object_wait(
handle::FLASH_INTERRUPTS,
signals::FLASH_CTRL_OP_DONE,
Instant::MAX,
) {
if w.pending_signals.contains(signals::FLASH_CTRL_OP_DONE) {
break;
}
}
}
let _ = syscall::interrupt_ack(handle::FLASH_INTERRUPTS, signals::FLASH_CTRL_OP_DONE);
}
}

fn run_server() -> Result<(), ErrorCode> {
// 1. Initialize EFlash driver.
Expand All @@ -55,7 +35,10 @@ fn run_server() -> Result<(), ErrorCode> {

let eflash = BlockingFlash {
driver: eflash_driver,
blocking: FlashCtrlInterrupt,
blocking: BlockingInterrupt {
handle: handle::FLASH_INTERRUPTS,
signals: signals::FLASH_CTRL_OP_DONE,
},
};
let mut eflash_server = FlashIpcServer::new(eflash);

Expand Down
2 changes: 1 addition & 1 deletion target/earlgrey/tests/usbdfu/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,10 @@ rust_app(
"//target/earlgrey/drivers:eflash_driver",
"//target/earlgrey/registers:flash_ctrl_core",
"//target/earlgrey/util",
"//util/blocking",
"//util/error",
"//util/ipc",
"//util/panic",
"//util/types",
"@pigweed//pw_kernel/userspace",
"@pigweed//pw_log/rust:pw_log",
"@pigweed//pw_status/rust:pw_status",
Expand Down
26 changes: 5 additions & 21 deletions target/earlgrey/tests/usbdfu/flash_server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,28 +13,9 @@ use earlgrey_util::flash::EarlgreyFlashAddress;
use eflash_driver::{EmbeddedFlash, Permission};
use hal_flash::{BlockingFlash, FlashAddress};
use services_flash_server::FlashIpcServer;
use util_blocking::BlockingInterrupt;
use util_error::ErrorCode;
use util_ipc::IpcHandle;
use util_types::Blocking;

struct FlashCtrlInterrupt;

impl Blocking for FlashCtrlInterrupt {
fn wait_for_notification(&self) {
loop {
if let Ok(w) = syscall::object_wait(
handle::FLASH_INTERRUPTS,
signals::FLASH_CTRL_OP_DONE,
Instant::MAX,
) {
if w.pending_signals.contains(signals::FLASH_CTRL_OP_DONE) {
break;
}
}
}
let _ = syscall::interrupt_ack(handle::FLASH_INTERRUPTS, signals::FLASH_CTRL_OP_DONE);
}
}

fn flash_server() -> Result<(), ErrorCode> {
let mut driver =
Expand All @@ -46,7 +27,10 @@ fn flash_server() -> Result<(), ErrorCode> {
}
let flash = BlockingFlash {
driver,
blocking: FlashCtrlInterrupt,
blocking: BlockingInterrupt {
handle: handle::FLASH_INTERRUPTS,
signals: signals::FLASH_CTRL_OP_DONE,
},
};
let mut flash_server = FlashIpcServer::new(flash);
let mut buf = [0u8; 2056];
Expand Down
24 changes: 24 additions & 0 deletions util/blocking/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Licensed under the Apache-2.0 license
# SPDX-License-Identifier: Apache-2.0

load("@rules_rust//rust:defs.bzl", "rust_library")

rust_library(
name = "blocking",
srcs = [
"lib.rs",
],
crate_name = "util_blocking",
edition = "2024",
visibility = ["//visibility:public"],
deps = [
"@pigweed//pw_status/rust:pw_status",
] + select({
"@platforms//os:none": [
"@pigweed//pw_kernel/userspace",
],
"//conditions:default": [
"@pigweed//pw_time/rust:pw_time",
],
}),
)
Loading