From 8e4827479e530aee84ad62e49cf2a4726d0f5810 Mon Sep 17 00:00:00 2001 From: Dylan Knutson Date: Fri, 26 Jun 2026 01:05:00 +0000 Subject: [PATCH] dev-qemu: select MCTP medium via sp-serial feature Add an off-by-default sp-serial cargo feature to dev-qemu. The default build keeps SmbusEspiMedium (default_smbusespi), so ec-test-cli and the in-repo integration-test job keep working; sp-serial selects MctpSerialMedium via uart_service::default_mctp_serial for the two-QEMU SP<->EC serial link. Both arms are one-liners over uart-service's per-medium constructors, so dev-qemu holds no wire addressing and needs no direct mctp-rs dependency. Enabling serial pulls in crc + crc-catalog (DSP0253 FCS-16); add the cargo-vet exemptions. TEMPORARY: a [patch] block pins the embedded-services crates to a dymk fork commit = the EC's current pin (62d4ea9) + only the default_mctp_serial constructor, so this builds with zero platform-common churn. Remove the [patch] once default_mctp_serial merges upstream and the EC is modernized to embedded-services main (separate epic). Assisted-by: GitHub Copilot:claude-opus-4.8 --- platform/dev-qemu/Cargo.lock | 44 +++++++++++++++------- platform/dev-qemu/Cargo.toml | 32 ++++++++++++++++ platform/dev-qemu/src/main.rs | 23 +++++++++-- platform/dev-qemu/supply-chain/config.toml | 8 ++++ 4 files changed, 90 insertions(+), 17 deletions(-) diff --git a/platform/dev-qemu/Cargo.lock b/platform/dev-qemu/Cargo.lock index 7a3aa39..88171d4 100644 --- a/platform/dev-qemu/Cargo.lock +++ b/platform/dev-qemu/Cargo.lock @@ -29,7 +29,7 @@ dependencies = [ [[package]] name = "battery-service" version = "0.1.0" -source = "git+https://github.com/OpenDevicePartnership/embedded-services?branch=main#62d4ea9a87588c6096e1c2f149ac3263064cbde9" +source = "git+https://github.com/dymk/embedded-services?rev=ac26892ab25a1af9872d0d28208f8e290bffdfc7#ac26892ab25a1af9872d0d28208f8e290bffdfc7" dependencies = [ "battery-service-interface", "defmt 0.3.100", @@ -45,7 +45,7 @@ dependencies = [ [[package]] name = "battery-service-interface" version = "0.1.0" -source = "git+https://github.com/OpenDevicePartnership/embedded-services?branch=main#62d4ea9a87588c6096e1c2f149ac3263064cbde9" +source = "git+https://github.com/dymk/embedded-services?rev=ac26892ab25a1af9872d0d28208f8e290bffdfc7#ac26892ab25a1af9872d0d28208f8e290bffdfc7" dependencies = [ "defmt 0.3.100", "embedded-batteries-async", @@ -54,7 +54,7 @@ dependencies = [ [[package]] name = "battery-service-relay" version = "0.1.0" -source = "git+https://github.com/OpenDevicePartnership/embedded-services?branch=main#62d4ea9a87588c6096e1c2f149ac3263064cbde9" +source = "git+https://github.com/dymk/embedded-services?rev=ac26892ab25a1af9872d0d28208f8e290bffdfc7#ac26892ab25a1af9872d0d28208f8e290bffdfc7" dependencies = [ "battery-service-interface", "defmt 0.3.100", @@ -170,6 +170,21 @@ dependencies = [ "volatile-register", ] +[[package]] +name = "crc" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853" + [[package]] name = "critical-section" version = "1.2.0" @@ -612,7 +627,7 @@ dependencies = [ [[package]] name = "embedded-services" version = "0.1.0" -source = "git+https://github.com/OpenDevicePartnership/embedded-services?branch=main#62d4ea9a87588c6096e1c2f149ac3263064cbde9" +source = "git+https://github.com/dymk/embedded-services?rev=ac26892ab25a1af9872d0d28208f8e290bffdfc7#ac26892ab25a1af9872d0d28208f8e290bffdfc7" dependencies = [ "bitfield 0.17.0", "cortex-m", @@ -768,9 +783,10 @@ dependencies = [ [[package]] name = "mctp-rs" version = "0.1.0" -source = "git+https://github.com/OpenDevicePartnership/embedded-services?branch=main#62d4ea9a87588c6096e1c2f149ac3263064cbde9" +source = "git+https://github.com/dymk/embedded-services?rev=ac26892ab25a1af9872d0d28208f8e290bffdfc7#ac26892ab25a1af9872d0d28208f8e290bffdfc7" dependencies = [ "bit-register 0.1.0 (git+https://github.com/OpenDevicePartnership/odp-utilities)", + "crc", "defmt 0.3.100", "embedded-batteries", "espi-device", @@ -842,7 +858,7 @@ dependencies = [ [[package]] name = "odp-service-common" version = "0.1.0" -source = "git+https://github.com/OpenDevicePartnership/embedded-services?branch=main#62d4ea9a87588c6096e1c2f149ac3263064cbde9" +source = "git+https://github.com/dymk/embedded-services?rev=ac26892ab25a1af9872d0d28208f8e290bffdfc7#ac26892ab25a1af9872d0d28208f8e290bffdfc7" dependencies = [ "embedded-services", "static_cell", @@ -907,7 +923,7 @@ checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "power-policy-interface" version = "0.1.0" -source = "git+https://github.com/OpenDevicePartnership/embedded-services?branch=main#62d4ea9a87588c6096e1c2f149ac3263064cbde9" +source = "git+https://github.com/dymk/embedded-services?rev=ac26892ab25a1af9872d0d28208f8e290bffdfc7#ac26892ab25a1af9872d0d28208f8e290bffdfc7" dependencies = [ "bitfield 0.17.0", "defmt 0.3.100", @@ -1211,7 +1227,7 @@ dependencies = [ [[package]] name = "thermal-service" version = "0.1.0" -source = "git+https://github.com/OpenDevicePartnership/embedded-services?branch=main#62d4ea9a87588c6096e1c2f149ac3263064cbde9" +source = "git+https://github.com/dymk/embedded-services?rev=ac26892ab25a1af9872d0d28208f8e290bffdfc7#ac26892ab25a1af9872d0d28208f8e290bffdfc7" dependencies = [ "defmt 0.3.100", "embassy-futures", @@ -1228,7 +1244,7 @@ dependencies = [ [[package]] name = "thermal-service-interface" version = "0.1.0" -source = "git+https://github.com/OpenDevicePartnership/embedded-services?branch=main#62d4ea9a87588c6096e1c2f149ac3263064cbde9" +source = "git+https://github.com/dymk/embedded-services?rev=ac26892ab25a1af9872d0d28208f8e290bffdfc7#ac26892ab25a1af9872d0d28208f8e290bffdfc7" dependencies = [ "defmt 0.3.100", "embassy-time", @@ -1239,7 +1255,7 @@ dependencies = [ [[package]] name = "thermal-service-relay" version = "0.1.0" -source = "git+https://github.com/OpenDevicePartnership/embedded-services?branch=main#62d4ea9a87588c6096e1c2f149ac3263064cbde9" +source = "git+https://github.com/dymk/embedded-services?rev=ac26892ab25a1af9872d0d28208f8e290bffdfc7#ac26892ab25a1af9872d0d28208f8e290bffdfc7" dependencies = [ "defmt 0.3.100", "embedded-services", @@ -1280,7 +1296,7 @@ dependencies = [ [[package]] name = "time-alarm-service" version = "0.1.0" -source = "git+https://github.com/OpenDevicePartnership/embedded-services?branch=main#62d4ea9a87588c6096e1c2f149ac3263064cbde9" +source = "git+https://github.com/dymk/embedded-services?rev=ac26892ab25a1af9872d0d28208f8e290bffdfc7#ac26892ab25a1af9872d0d28208f8e290bffdfc7" dependencies = [ "defmt 0.3.100", "embassy-futures", @@ -1296,7 +1312,7 @@ dependencies = [ [[package]] name = "time-alarm-service-interface" version = "0.1.0" -source = "git+https://github.com/OpenDevicePartnership/embedded-services?branch=main#62d4ea9a87588c6096e1c2f149ac3263064cbde9" +source = "git+https://github.com/dymk/embedded-services?rev=ac26892ab25a1af9872d0d28208f8e290bffdfc7#ac26892ab25a1af9872d0d28208f8e290bffdfc7" dependencies = [ "bitfield 0.17.0", "defmt 0.3.100", @@ -1308,7 +1324,7 @@ dependencies = [ [[package]] name = "time-alarm-service-relay" version = "0.1.0" -source = "git+https://github.com/OpenDevicePartnership/embedded-services?branch=main#62d4ea9a87588c6096e1c2f149ac3263064cbde9" +source = "git+https://github.com/dymk/embedded-services?rev=ac26892ab25a1af9872d0d28208f8e290bffdfc7#ac26892ab25a1af9872d0d28208f8e290bffdfc7" dependencies = [ "defmt 0.3.100", "embedded-mcu-hal 0.2.0", @@ -1381,7 +1397,7 @@ dependencies = [ [[package]] name = "uart-service" version = "0.1.0" -source = "git+https://github.com/OpenDevicePartnership/embedded-services?branch=main#62d4ea9a87588c6096e1c2f149ac3263064cbde9" +source = "git+https://github.com/dymk/embedded-services?rev=ac26892ab25a1af9872d0d28208f8e290bffdfc7#ac26892ab25a1af9872d0d28208f8e290bffdfc7" dependencies = [ "defmt 0.3.100", "embassy-sync 0.8.0", diff --git a/platform/dev-qemu/Cargo.toml b/platform/dev-qemu/Cargo.toml index a641ae2..30ba8d4 100644 --- a/platform/dev-qemu/Cargo.toml +++ b/platform/dev-qemu/Cargo.toml @@ -10,6 +10,14 @@ bench = false name = "dev-qemu" test = false +[features] +default = [] +# sp-serial off (default): SmbusEspiMedium (the framing ec-test-cli +# speaks). On: MctpSerialMedium / DSP0253 (the framing the SP speaks +# over the two-QEMU link). Pure compile-time selector — both medium +# constructors already exist in uart-service. +sp-serial = [] + [profile.release] lto = true # better optimizations codegen-units = 1 @@ -62,3 +70,27 @@ static_cell = "2.1.0" defmt = "0.3.6" defmt-semihosting = "0.3.0" semihosting = { version = "0.1", features = ["panic-handler"] } + +# TEMPORARY (F1.1 placeholder): redirect embedded-services crates to a +# dymk fork commit = the EC's current pin (62d4ea9) + ONLY the +# uart_service::default_mctp_serial constructor (F1.0). This keeps the +# rest of embedded-services at 62d4ea9, so dev-qemu builds with zero +# platform-common churn. Remove this whole block once F1.0 merges +# upstream AND the EC is modernized to embedded-services main (tracked +# as a separate epic); the branch=main deps will then resolve the +# constructor directly via a Cargo.lock bump. +[patch."https://github.com/OpenDevicePartnership/embedded-services"] +battery-service = { git = "https://github.com/dymk/embedded-services", rev = "ac26892ab25a1af9872d0d28208f8e290bffdfc7" } +battery-service-interface = { git = "https://github.com/dymk/embedded-services", rev = "ac26892ab25a1af9872d0d28208f8e290bffdfc7" } +battery-service-relay = { git = "https://github.com/dymk/embedded-services", rev = "ac26892ab25a1af9872d0d28208f8e290bffdfc7" } +embedded-services = { git = "https://github.com/dymk/embedded-services", rev = "ac26892ab25a1af9872d0d28208f8e290bffdfc7" } +mctp-rs = { git = "https://github.com/dymk/embedded-services", rev = "ac26892ab25a1af9872d0d28208f8e290bffdfc7" } +odp-service-common = { git = "https://github.com/dymk/embedded-services", rev = "ac26892ab25a1af9872d0d28208f8e290bffdfc7" } +power-policy-interface = { git = "https://github.com/dymk/embedded-services", rev = "ac26892ab25a1af9872d0d28208f8e290bffdfc7" } +thermal-service = { git = "https://github.com/dymk/embedded-services", rev = "ac26892ab25a1af9872d0d28208f8e290bffdfc7" } +thermal-service-interface = { git = "https://github.com/dymk/embedded-services", rev = "ac26892ab25a1af9872d0d28208f8e290bffdfc7" } +thermal-service-relay = { git = "https://github.com/dymk/embedded-services", rev = "ac26892ab25a1af9872d0d28208f8e290bffdfc7" } +time-alarm-service = { git = "https://github.com/dymk/embedded-services", rev = "ac26892ab25a1af9872d0d28208f8e290bffdfc7" } +time-alarm-service-interface = { git = "https://github.com/dymk/embedded-services", rev = "ac26892ab25a1af9872d0d28208f8e290bffdfc7" } +time-alarm-service-relay = { git = "https://github.com/dymk/embedded-services", rev = "ac26892ab25a1af9872d0d28208f8e290bffdfc7" } +uart-service = { git = "https://github.com/dymk/embedded-services", rev = "ac26892ab25a1af9872d0d28208f8e290bffdfc7" } diff --git a/platform/dev-qemu/src/main.rs b/platform/dev-qemu/src/main.rs index b57d1ed..8bcfdd0 100644 --- a/platform/dev-qemu/src/main.rs +++ b/platform/dev-qemu/src/main.rs @@ -13,12 +13,29 @@ use platform_common::mock::MockOdpRelayHandler; use semihosting as _; // Panic handler use static_cell::StaticCell; +// MCTP medium for the uart-service, selected at build time: SmbusEspi +// by default (the framing ec-test-cli speaks), MctpSerialMedium under +// sp-serial (the framing the SP speaks over the two-QEMU link). Both +// constructors live in uart-service; dev-qemu holds no wire addressing. +#[cfg(not(feature = "sp-serial"))] +type EcUartService = uart_service::DefaultService; +#[cfg(feature = "sp-serial")] +type EcUartService = uart_service::MctpSerialService; + +#[cfg(not(feature = "sp-serial"))] +fn new_uart_service(relay: MockOdpRelayHandler) -> EcUartService { + uart_service::DefaultService::default_smbusespi(relay).unwrap() +} +#[cfg(feature = "sp-serial")] +fn new_uart_service(relay: MockOdpRelayHandler) -> EcUartService { + uart_service::MctpSerialService::default_mctp_serial(relay).unwrap() +} + #[embassy_executor::task] async fn uart_service(uart: buffered::Uart<'static, Async>, relay: MockOdpRelayHandler) { info!("Starting uart service"); - static UART_SERVICE: StaticCell> = StaticCell::new(); - let uart_service = uart_service::DefaultService::default_smbusespi(relay).unwrap(); - let uart_service = UART_SERVICE.init(uart_service); + static UART_SERVICE: StaticCell = StaticCell::new(); + let uart_service = UART_SERVICE.init(new_uart_service(relay)); let Err(e) = uart_service::task::uart_service(uart_service, uart).await; panic!("uart-service error: {:?}", e); } diff --git a/platform/dev-qemu/supply-chain/config.toml b/platform/dev-qemu/supply-chain/config.toml index 645e891..71a8b52 100644 --- a/platform/dev-qemu/supply-chain/config.toml +++ b/platform/dev-qemu/supply-chain/config.toml @@ -36,6 +36,14 @@ criteria = "safe-to-deploy" version = "1.0.4" criteria = "safe-to-deploy" +[[exemptions.crc]] +version = "3.4.0" +criteria = "safe-to-deploy" + +[[exemptions.crc-catalog]] +version = "2.5.0" +criteria = "safe-to-deploy" + [[exemptions.darling]] version = "0.20.11" criteria = "safe-to-deploy"