Skip to content
Merged
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
27 changes: 14 additions & 13 deletions esp-alloc/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ clippy-configs = [

[package.metadata.docs.rs]
default-target = "riscv32imc-unknown-none-elf"
features = ["nightly"]
features = ["esp32c6", "nightly"]

[lib]
bench = false
Expand All @@ -44,7 +44,8 @@ linked_list_allocator = { version = "0.10.5", default-features = false, features
rlsf = { version = "0.2", features = ["unstable"] }

[build-dependencies]
esp-config = { version = "0.7.0", path = "../esp-config", features = ["build"] }
esp-config = { version = "0.7.0", path = "../esp-config", features = ["build"] }
esp-metadata-generated = { version = "0.4.0", path = "../esp-metadata-generated", features = ["build-script"] }

[features]
default = ["compat", "global-allocator"]
Expand Down Expand Up @@ -109,24 +110,24 @@ alloc-hooks = []
#! One of the following features must be enabled to select the target chip:

##
esp32c2 = ["esp-sync/esp32c2"]
esp32c2 = ["esp-sync/esp32c2", "esp-metadata-generated/esp32c2"]
##
esp32c3 = ["esp-sync/esp32c3"]
esp32c3 = ["esp-sync/esp32c3", "esp-metadata-generated/esp32c3"]
##
esp32c5 = ["esp-sync/esp32c5"]
esp32c5 = ["esp-sync/esp32c5", "esp-metadata-generated/esp32c5"]
##
esp32c6 = ["esp-sync/esp32c6"]
esp32c6 = ["esp-sync/esp32c6", "esp-metadata-generated/esp32c6"]
##
esp32c61 = ["esp-sync/esp32c61"]
esp32c61 = ["esp-sync/esp32c61", "esp-metadata-generated/esp32c61"]
##
esp32h2 = ["esp-sync/esp32h2"]
esp32h2 = ["esp-sync/esp32h2", "esp-metadata-generated/esp32h2"]
##
esp32p4 = ["esp-sync/esp32p4"]
esp32p4 = ["esp-sync/esp32p4", "esp-metadata-generated/esp32p4"]
##
esp32s31 = ["esp-sync/esp32s31"]
esp32s31 = ["esp-sync/esp32s31", "esp-metadata-generated/esp32s31"]
##
esp32 = ["esp-sync/esp32"]
esp32 = ["esp-sync/esp32", "esp-metadata-generated/esp32"]
##
esp32s2 = ["esp-sync/esp32s2"]
esp32s2 = ["esp-sync/esp32s2", "esp-metadata-generated/esp32s2"]
##
esp32s3 = ["esp-sync/esp32s3"]
esp32s3 = ["esp-sync/esp32s3", "esp-metadata-generated/esp32s3"]
12 changes: 11 additions & 1 deletion esp-alloc/build.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,19 @@
use std::error::Error;

use esp_config::generate_config_from_yaml_definition;

fn main() {
fn main() -> Result<(), Box<dyn Error>> {
// Ensure that exactly one chip has been specified:
let chip = esp_metadata_generated::Chip::from_cargo_feature()?;

// Define all necessary configuration symbols for the configured device:
chip.define_cfgs();

// emit config
println!("cargo:rerun-if-changed=./esp_config.yml");
let cfg_yaml = std::fs::read_to_string("./esp_config.yml")
.expect("Failed to read esp_config.yml for esp-alloc");
generate_config_from_yaml_definition(&cfg_yaml, true, true, None).unwrap();

Ok(())
}
106 changes: 106 additions & 0 deletions esp-alloc/src/allocators.rs
Original file line number Diff line number Diff line change
Expand Up @@ -133,3 +133,109 @@ unsafe impl CoreAllocator for ExternalMemory {
}
}
}

/// A DMA-compatible allocator that uses internal memory only.
///
/// This allocator adjusts the allocation alignment and size to be safe for use with DMA.
pub struct DmaCompatibleInternalMemory;

fn align(layout: Layout, min_alignment: usize) -> Layout {
let alignment = layout.align().max(min_alignment);
Layout::from_size_align(layout.size().next_multiple_of(alignment), alignment).unwrap()
}

impl DmaCompatibleInternalMemory {
fn align(layout: Layout) -> Layout {
align(
layout,
cfg_select! {
soc_internal_memory_cached => 64,
_ => 4,
},
)
}
}

unsafe impl Allocator for DmaCompatibleInternalMemory {
fn allocate(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError> {
allocate_caps(
EnumSet::from(MemoryCapability::Internal),
Self::align(layout),
)
}

unsafe fn deallocate(&self, ptr: NonNull<u8>, layout: Layout) {
unsafe {
crate::HEAP.dealloc(ptr.as_ptr(), Self::align(layout));
}
}
}

#[cfg(feature = "nightly")]
unsafe impl CoreAllocator for DmaCompatibleInternalMemory {
fn allocate(&self, layout: Layout) -> Result<NonNull<[u8]>, CoreAllocError> {
allocate_caps(
EnumSet::from(MemoryCapability::Internal),
Self::align(layout),
)
.map_err(|_| CoreAllocError)
}

unsafe fn deallocate(&self, ptr: NonNull<u8>, layout: Layout) {
unsafe {
crate::HEAP.dealloc(ptr.as_ptr(), Self::align(layout));
}
}
}

/// A DMA-compatible allocator that uses external (PSRAM) memory only.
///
/// This allocator adjusts the allocation alignment and size to be safe for use with DMA.
pub struct DmaCompatibleExternalMemory;

impl DmaCompatibleExternalMemory {
fn align(layout: Layout) -> Layout {
// Pessimistic alignment based on maximum possible cache line size
// TODO: relax by stealing the `data-cache-size` config from esp-hal
align(
layout,
cfg_select! {
esp32p4 => 128,
any(esp32s3, esp32s31) => 64,
_ => 32,
},
)
}
}

unsafe impl Allocator for DmaCompatibleExternalMemory {
fn allocate(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError> {
allocate_caps(
EnumSet::from(MemoryCapability::External),
Self::align(layout),
)
}

unsafe fn deallocate(&self, ptr: NonNull<u8>, layout: Layout) {
unsafe {
crate::HEAP.dealloc(ptr.as_ptr(), Self::align(layout));
}
}
}

#[cfg(feature = "nightly")]
unsafe impl CoreAllocator for DmaCompatibleExternalMemory {
fn allocate(&self, layout: Layout) -> Result<NonNull<[u8]>, CoreAllocError> {
allocate_caps(
EnumSet::from(MemoryCapability::External),
Self::align(layout),
)
.map_err(|_| CoreAllocError)
}

unsafe fn deallocate(&self, ptr: NonNull<u8>, layout: Layout) {
unsafe {
crate::HEAP.dealloc(ptr.as_ptr(), Self::align(layout));
}
}
}
1 change: 1 addition & 0 deletions esp-hal/src/dma/aligned.rs
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ pub(crate) fn region_dma_alignment(addr: usize) -> Option<usize> {
// larger, always-safe value until the L2 line size is
// available.
soc_internal_memory_cached => 128,
esp32s31 => 64,
any(esp32, esp32c5, esp32c61) => 32, /* TODO: fixed 32-bytes, metadata-ify */
_ => crate::soc::CONFIG_DATA_CACHE_LINE_SIZE,
});
Expand Down
9 changes: 9 additions & 0 deletions esp-radio/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,7 @@ print-logs-from-driver = [
esp32 = [
"dep:esp32",
"esp-hal/esp32",
"esp-alloc?/esp32",
"esp-rtos/esp32",
"esp-radio-rtos-driver/esp32",
"esp-phy/esp32",
Expand All @@ -176,6 +177,7 @@ esp32 = [
esp32c2 = [
"dep:esp32c2",
"esp-hal/esp32c2",
"esp-alloc?/esp32c2",
"esp-rtos/esp32c2",
"esp-radio-rtos-driver/esp32c2",
"esp-phy/esp32c2",
Expand All @@ -186,6 +188,7 @@ esp32c2 = [
esp32c3 = [
"dep:esp32c3",
"esp-hal/esp32c3",
"esp-alloc?/esp32c3",
"esp-rtos/esp32c3",
"esp-radio-rtos-driver/esp32c3",
"esp-phy/esp32c3",
Expand All @@ -196,6 +199,7 @@ esp32c3 = [
esp32c5 = [
"dep:esp32c5",
"esp-hal/esp32c5",
"esp-alloc?/esp32c5",
"esp-rtos/esp32c5",
"esp-radio-rtos-driver/esp32c5",
"esp-phy/esp32c5",
Expand All @@ -206,6 +210,7 @@ esp32c5 = [
esp32c6 = [
"dep:esp32c6",
"esp-hal/esp32c6",
"esp-alloc?/esp32c6",
"esp-rtos/esp32c6",
"esp-radio-rtos-driver/esp32c6",
"esp-phy/esp32c6",
Expand All @@ -216,6 +221,7 @@ esp32c6 = [
esp32c61 = [
"dep:esp32c61",
"esp-hal/esp32c61",
"esp-alloc?/esp32c61",
"esp-rtos/esp32c61",
"esp-radio-rtos-driver/esp32c61",
"esp-phy/esp32c61",
Expand All @@ -226,6 +232,7 @@ esp32c61 = [
esp32h2 = [
"dep:esp32h2",
"esp-hal/esp32h2",
"esp-alloc?/esp32h2",
"esp-rtos/esp32h2",
"esp-radio-rtos-driver/esp32h2",
"esp-phy/esp32h2",
Expand All @@ -236,6 +243,7 @@ esp32h2 = [
esp32s2 = [
"dep:esp32s2",
"esp-hal/esp32s2",
"esp-alloc?/esp32s2",
"esp-rtos/esp32s2",
"esp-radio-rtos-driver/esp32s2",
"esp-phy/esp32s2",
Expand All @@ -247,6 +255,7 @@ esp32s2 = [
esp32s3 = [
"dep:esp32s3",
"esp-hal/esp32s3",
"esp-alloc?/esp32s3",
"esp-rtos/esp32s3",
"esp-radio-rtos-driver/esp32s3",
"esp-phy/esp32s3",
Expand Down
79 changes: 67 additions & 12 deletions esp-rtos/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -107,31 +107,86 @@ rtos-trace = ["dep:rtos-trace"]
#! One of the following features must be enabled to select the target chip:

##
esp32 = ["esp-hal/esp32", "esp-metadata-generated/esp32", "esp-rom-sys/esp32"]
esp32 = [
"esp-hal/esp32",
"esp-alloc?/esp32",
"esp-metadata-generated/esp32",
"esp-rom-sys/esp32",
]
##
esp32c2 = ["esp-hal/esp32c2", "esp-metadata-generated/esp32c2", "esp-rom-sys/esp32c2"]
esp32c2 = [
"esp-hal/esp32c2",
"esp-alloc?/esp32c2",
"esp-metadata-generated/esp32c2",
"esp-rom-sys/esp32c2",
]
##
esp32c3 = ["esp-hal/esp32c3", "esp-metadata-generated/esp32c3", "esp-rom-sys/esp32c3"]
esp32c3 = [
"esp-hal/esp32c3",
"esp-alloc?/esp32c3",
"esp-metadata-generated/esp32c3",
"esp-rom-sys/esp32c3",
]
##
esp32c5 = ["esp-hal/esp32c5", "esp-metadata-generated/esp32c5", "esp-rom-sys/esp32c5"]
esp32c5 = [
"esp-hal/esp32c5",
"esp-alloc?/esp32c5",
"esp-metadata-generated/esp32c5",
"esp-rom-sys/esp32c5",
]
##
esp32c6 = ["esp-hal/esp32c6", "esp-metadata-generated/esp32c6", "esp-rom-sys/esp32c6"]
esp32c6 = [
"esp-hal/esp32c6",
"esp-alloc?/esp32c6",
"esp-metadata-generated/esp32c6",
"esp-rom-sys/esp32c6",
]
##
esp32c61 = ["esp-hal/esp32c61", "esp-metadata-generated/esp32c61", "esp-rom-sys/esp32c61"]
esp32c61 = [
"esp-hal/esp32c61",
"esp-alloc?/esp32c61",
"esp-metadata-generated/esp32c61",
"esp-rom-sys/esp32c61",
]
##
esp32h2 = ["esp-hal/esp32h2", "esp-metadata-generated/esp32h2", "esp-rom-sys/esp32h2"]
esp32h2 = [
"esp-hal/esp32h2",
"esp-alloc?/esp32h2",
"esp-metadata-generated/esp32h2",
"esp-rom-sys/esp32h2",
]
##
esp32p4 = ["esp-hal/esp32p4", "esp-metadata-generated/esp32p4", "esp-rom-sys/esp32p4"]
esp32p4 = [
"esp-hal/esp32p4",
"esp-alloc?/esp32p4",
"esp-metadata-generated/esp32p4",
"esp-rom-sys/esp32p4",
]
##
esp32s2 = ["esp-hal/esp32s2", "esp-metadata-generated/esp32s2", "esp-rom-sys/esp32s2"]
esp32s2 = [
"esp-hal/esp32s2",
"esp-alloc?/esp32s2",
"esp-metadata-generated/esp32s2",
"esp-rom-sys/esp32s2",
]
##
esp32s3 = ["esp-hal/esp32s3", "esp-metadata-generated/esp32s3", "esp-rom-sys/esp32s3"]
esp32s3 = [
"esp-hal/esp32s3",
"esp-alloc?/esp32s3",
"esp-metadata-generated/esp32s3",
"esp-rom-sys/esp32s3",
]
##
esp32s31 = ["esp-hal/esp32s31", "esp-metadata-generated/esp32s31", "esp-rom-sys/esp32s31"]
esp32s31 = [
"esp-hal/esp32s31",
"esp-alloc?/esp32s31",
"esp-metadata-generated/esp32s31",
"esp-rom-sys/esp32s31",
]

#! ### Logging Feature Flags
## Enable logging output using version 0.4 of the `log` crate.
log-04 = ["dep:log-04", "esp-hal/log-04"]

## Enable logging output using `defmt` and implement `defmt::Format` on certain types.
defmt = ["dep:defmt", "esp-hal/defmt"]
defmt = ["dep:defmt", "esp-hal/defmt"]
2 changes: 2 additions & 0 deletions examples/async/embassy_ethernet/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ static_cell = "2.1.0"

[features]
esp32 = [
"esp-alloc/esp32",
"esp-println/esp32",
"esp-backtrace/esp32",
"esp-bootloader-esp-idf/esp32",
Expand All @@ -39,6 +40,7 @@ esp32 = [
]

esp32p4 = [
"esp-alloc/esp32p4",
"esp-println/esp32p4",
"esp-backtrace/esp32p4",
"esp-bootloader-esp-idf/esp32p4",
Expand Down
Loading
Loading