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
6 changes: 3 additions & 3 deletions MODULE.bazel.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions sw/device/tests/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -4382,6 +4382,7 @@ opentitan_test(
exec_env = {
"//hw/top_earlgrey:fpga_hyper310_rom_with_fake_keys": None,
"//hw/top_earlgrey:fpga_cw340_rom_with_fake_keys": None,
"//hw/top_earlgrey:sim_qemu_rom_with_fake_keys": None,
},
fpga = fpga_params(
# We run this as part of the manuf test suite as we want to run it in
Expand All @@ -4397,6 +4398,14 @@ opentitan_test(
""",
test_harness = "//sw/host/tests/chip/ottf_console_with_gpio_tx_indicator",
),
qemu = qemu_params(
test_cmd = """
--bootstrap="{firmware}"
"{firmware:elf}"
--console-tx-indicator-pin=0
""",
test_harness = "//sw/host/tests/chip/ottf_console_with_gpio_tx_indicator",
),
deps = [
"//hw/top_earlgrey/sw/autogen:top_earlgrey",
"//sw/device/lib/runtime:hart",
Expand Down
21 changes: 21 additions & 0 deletions sw/host/opentitanlib/src/console/spi.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ pub struct SpiConsoleDevice<'a> {
next_read_address: Cell<u32>,
device_tx_ready_pin: Option<&'a Rc<dyn GpioPin>>,
ignore_frame_num: bool,
wait_tx_ready_deassert: bool,
}

impl<'a> SpiConsoleDevice<'a> {
Expand All @@ -36,10 +37,16 @@ impl<'a> SpiConsoleDevice<'a> {
spi: &'a dyn Target,
device_tx_ready_pin: Option<&'a Rc<dyn GpioPin>>,
ignore_frame_num: bool,
interface: Option<&str>,
) -> Result<Self> {
let flash = SpiFlash {
..Default::default()
};
// QEMU is currently the only interface that requires additional
// synchronization on the TX-ready indicator pin to avoid timing
// & synchronization issues for small transactions, due to its
// nature as an emulated interface.
let wait_tx_ready_deassert = interface == Some("qemu");
Ok(Self {
spi,
flash,
Expand All @@ -48,6 +55,7 @@ impl<'a> SpiConsoleDevice<'a> {
next_read_address: Cell::new(0),
device_tx_ready_pin,
ignore_frame_num,
wait_tx_ready_deassert,
})
}

Expand Down Expand Up @@ -75,6 +83,19 @@ impl<'a> SpiConsoleDevice<'a> {
let mut header = vec![0u8; SpiConsoleDevice::SPI_FRAME_HEADER_SIZE];
self.read_data(read_address, &mut header)?;

// When using small (<= 4 byte) SPI transactions on emulation targets,
// sometimes the entire transaction can occur before the logic low
// transmission of the TX-indicator GPIO is issued, causing the host
// to erroneously see the device as ready and start another transaction
// whilst the device is still processing the previous. For such targets,
// add additional synchronization by waiting for the TX-indicator pin
// to go low after reading the header.
if let Some(ready_pin) = self.get_tx_ready_pin()? {
if self.wait_tx_ready_deassert {
while ready_pin.read()? {}
}
}

let magic_number: u32 = u32::from_le_bytes(header[0..4].try_into().unwrap());
let frame_number: u32 = u32::from_le_bytes(header[4..8].try_into().unwrap());
let data_len_bytes: usize = u32::from_le_bytes(header[8..12].try_into().unwrap()) as usize;
Expand Down
1 change: 1 addition & 0 deletions sw/host/provisioning/cp/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ fn main() -> Result<()> {
&*spi,
Some(device_console_tx_ready_pin),
/*ignore_frame_num=*/ false,
Some(opts.init.backend_opts.interface.as_str()),
)?;

let provisioning_data = ManufCpProvisioningData {
Expand Down
1 change: 1 addition & 0 deletions sw/host/provisioning/ft/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@ fn main() -> Result<()> {
&*spi,
Some(device_console_tx_ready_pin),
/*ignore_frame_num=*/ false,
Some(opts.init.backend_opts.interface.as_str()),
)?;
InitializeTest::print_result("load_bitstream", opts.init.load_bitstream.init(&transport))?;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,18 +34,24 @@ struct Opts {
/// Path to the firmware's ELF file, for querying symbol addresses.
#[arg(value_name = "FIRMWARE_ELF")]
firmware_elf: PathBuf,

/// Name of the SPI interface to connect to the OTTF console.
#[arg(long, default_value = "IOA5")]
console_tx_indicator_pin: String,
}

fn spi_device_console_test(opts: &Opts, transport: &TransportWrapper) -> Result<()> {
// Setup the SPI console with the GPIO TX indicator pin.
let spi = transport.spi(&opts.console_spi)?;
let device_console_tx_ready_pin = &transport.gpio_pin("IOA5")?;
let device_console_tx_ready_pin =
&transport.gpio_pin(opts.console_tx_indicator_pin.as_str())?;
device_console_tx_ready_pin.set_mode(PinMode::Input)?;
device_console_tx_ready_pin.set_pull_mode(PullMode::None)?;
let spi_console_device = SpiConsoleDevice::new(
&*spi,
Some(device_console_tx_ready_pin),
/*ignore_frame_num=*/ false,
Some(opts.init.backend_opts.interface.as_str()),
)?;

// Load the ELF binary and get the expect data.
Expand Down
7 changes: 6 additions & 1 deletion sw/host/tests/chip/spi_device_ottf_console/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,12 @@ fn spi_device_console_test(opts: &Opts, transport: &TransportWrapper) -> Result<
let mut stdout = std::io::stdout();
let spi = transport.spi(&opts.console_spi)?;

let spi_console_device = SpiConsoleDevice::new(&*spi, None, /*ignore_frame_num=*/ false)?;
let spi_console_device = SpiConsoleDevice::new(
&*spi,
None,
/*ignore_frame_num=*/ false,
Some(opts.init.backend_opts.interface.as_str()),
)?;
let _ = UartConsole::wait_for(&spi_console_device, r"Running [^\r\n]*", opts.timeout)?;

/* Load the ELF binary and get the expect data.*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,12 @@ fn main() -> Result<()> {

let transport = opts.init.init_target()?;
let spi = transport.spi(&opts.console_spi)?;
let spi_console_device = SpiConsoleDevice::new(&*spi, None, /*ignore_frame_num=*/ false)?;
let spi_console_device = SpiConsoleDevice::new(
&*spi,
None,
/*ignore_frame_num=*/ false,
Some(opts.init.backend_opts.interface.as_str()),
)?;
let _ = UartConsole::wait_for(&spi_console_device, r"Running [^\r\n]*", opts.timeout)?;

execute_test!(test_perso_blob_strcut, &opts, &spi_console_device);
Expand Down
7 changes: 6 additions & 1 deletion sw/host/tests/crypto/aes_gcm_nist_kat/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,12 @@ fn run_aes_gcm_testcase(

fn test_aes_gcm(opts: &Opts, transport: &TransportWrapper) -> Result<()> {
let spi = transport.spi("BOOTSTRAP")?;
let spi_console_device = SpiConsoleDevice::new(&*spi, None, /*ignore_frame_num=*/ false)?;
let spi_console_device = SpiConsoleDevice::new(
&*spi,
None,
/*ignore_frame_num=*/ false,
Some(opts.init.backend_opts.interface.as_str()),
)?;
let _ = UartConsole::wait_for(&spi_console_device, r"Running [^\r\n]*", opts.timeout)?;

let mut test_counter = 0u32;
Expand Down
7 changes: 6 additions & 1 deletion sw/host/tests/crypto/aes_nist_kat/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,12 @@ fn run_aes_testcase(

fn test_aes(opts: &Opts, transport: &TransportWrapper) -> Result<()> {
let spi = transport.spi("BOOTSTRAP")?;
let spi_console_device = SpiConsoleDevice::new(&*spi, None, /*ignore_frame_num=*/ false)?;
let spi_console_device = SpiConsoleDevice::new(
&*spi,
None,
/*ignore_frame_num=*/ false,
Some(opts.init.backend_opts.interface.as_str()),
)?;
let _ = UartConsole::wait_for(&spi_console_device, r"Running [^\r\n]*", opts.timeout)?;

let mut test_counter = 0u32;
Expand Down
7 changes: 6 additions & 1 deletion sw/host/tests/crypto/drbg_kat/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,12 @@ fn run_drbg_testcase(

fn test_drbg(opts: &Opts, transport: &TransportWrapper) -> Result<()> {
let spi = transport.spi("BOOTSTRAP")?;
let spi_console_device = SpiConsoleDevice::new(&*spi, None, /*ignore_frame_num=*/ false)?;
let spi_console_device = SpiConsoleDevice::new(
&*spi,
None,
/*ignore_frame_num=*/ false,
Some(opts.init.backend_opts.interface.as_str()),
)?;
let _ = UartConsole::wait_for(&spi_console_device, r"Running [^\r\n]*", opts.timeout)?;

let mut test_counter = 0u32;
Expand Down
7 changes: 6 additions & 1 deletion sw/host/tests/crypto/ecdh_kat/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,12 @@ fn run_ecdh_testcase(

fn test_ecdh(opts: &Opts, transport: &TransportWrapper) -> Result<()> {
let spi = transport.spi("BOOTSTRAP")?;
let spi_console_device = SpiConsoleDevice::new(&*spi, None, /*ignore_frame_num=*/ false)?;
let spi_console_device = SpiConsoleDevice::new(
&*spi,
None,
/*ignore_frame_num=*/ false,
Some(opts.init.backend_opts.interface.as_str()),
)?;
let _ = UartConsole::wait_for(&spi_console_device, r"Running [^\r\n]*", opts.timeout)?;

let mut test_counter = 0u32;
Expand Down
7 changes: 6 additions & 1 deletion sw/host/tests/crypto/ecdsa_kat/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -512,7 +512,12 @@ fn run_ecdsa_testcase(

fn test_ecdsa(opts: &Opts, transport: &TransportWrapper) -> Result<()> {
let spi = transport.spi("BOOTSTRAP")?;
let spi_console_device = SpiConsoleDevice::new(&*spi, None, /*ignore_frame_num=*/ false)?;
let spi_console_device = SpiConsoleDevice::new(
&*spi,
None,
/*ignore_frame_num=*/ false,
Some(opts.init.backend_opts.interface.as_str()),
)?;
let _ = UartConsole::wait_for(&spi_console_device, r"Running [^\r\n]*", opts.timeout)?;

let mut test_counter = 0u32;
Expand Down
7 changes: 6 additions & 1 deletion sw/host/tests/crypto/hash_kat/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,12 @@ fn run_hash_testcase(

fn test_hash(opts: &Opts, transport: &TransportWrapper) -> Result<()> {
let spi = transport.spi("BOOTSTRAP")?;
let spi_console_device = SpiConsoleDevice::new(&*spi, None, /*ignore_frame_num=*/ false)?;
let spi_console_device = SpiConsoleDevice::new(
&*spi,
None,
/*ignore_frame_num=*/ false,
Some(opts.init.backend_opts.interface.as_str()),
)?;
let _ = UartConsole::wait_for(&spi_console_device, r"Running [^\r\n]*", opts.timeout)?;

let mut test_counter = 0u32;
Expand Down
7 changes: 6 additions & 1 deletion sw/host/tests/crypto/hmac_kat/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,12 @@ fn run_hmac_testcase(

fn test_hmac(opts: &Opts, transport: &TransportWrapper) -> Result<()> {
let spi = transport.spi("BOOTSTRAP")?;
let spi_console_device = SpiConsoleDevice::new(&*spi, None, /*ignore_frame_num=*/ false)?;
let spi_console_device = SpiConsoleDevice::new(
&*spi,
None,
/*ignore_frame_num=*/ false,
Some(opts.init.backend_opts.interface.as_str()),
)?;
let _ = UartConsole::wait_for(&spi_console_device, r"Running [^\r\n]*", opts.timeout)?;

let mut test_counter = 0u32;
Expand Down
7 changes: 6 additions & 1 deletion sw/host/tests/crypto/kmac_kat/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,12 @@ fn run_kmac_testcase(

fn test_kmac(opts: &Opts, transport: &TransportWrapper) -> Result<()> {
let spi = transport.spi("BOOTSTRAP")?;
let spi_console_device = SpiConsoleDevice::new(&*spi, None, /*ignore_frame_num=*/ false)?;
let spi_console_device = SpiConsoleDevice::new(
&*spi,
None,
/*ignore_frame_num=*/ false,
Some(opts.init.backend_opts.interface.as_str()),
)?;
let _ = UartConsole::wait_for(&spi_console_device, r"Running [^\r\n]*", opts.timeout)?;

let mut test_counter = 0u32;
Expand Down
7 changes: 6 additions & 1 deletion sw/host/tests/crypto/rsa_kat/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,12 @@ fn run_rsa_testcase(

fn test_rsa(opts: &Opts, transport: &TransportWrapper) -> Result<()> {
let spi = transport.spi("BOOTSTRAP")?;
let spi_console_device = SpiConsoleDevice::new(&*spi, None, /*ignore_frame_num=*/ false)?;
let spi_console_device = SpiConsoleDevice::new(
&*spi,
None,
/*ignore_frame_num=*/ false,
Some(opts.init.backend_opts.interface.as_str()),
)?;
let _ = UartConsole::wait_for(&spi_console_device, r"Running [^\r\n]*", opts.timeout)?;

let test_vector_files = &opts.rsa_json;
Expand Down
7 changes: 6 additions & 1 deletion sw/host/tests/crypto/sphincsplus_kat/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,12 @@ fn run_sphincsplus_testcase(

fn test_sphincsplus(opts: &Opts, transport: &TransportWrapper) -> Result<()> {
let spi = transport.spi("BOOTSTRAP")?;
let spi_console_device = SpiConsoleDevice::new(&*spi, None, /*ignore_frame_num=*/ false)?;
let spi_console_device = SpiConsoleDevice::new(
&*spi,
None,
/*ignore_frame_num=*/ false,
Some(opts.init.backend_opts.interface.as_str()),
)?;
let _ = UartConsole::wait_for(&spi_console_device, r"Running [^\r\n]*", opts.timeout)?;

let mut test_counter = 0u32;
Expand Down
1 change: 1 addition & 0 deletions sw/host/tests/manuf/cp_provision_functest/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,7 @@ fn main() -> Result<()> {
&*spi,
Some(device_console_tx_ready_pin),
/*ignore_frame_num=*/ false,
Some(opts.init.backend_opts.interface.as_str()),
)?;

// Transition from RAW to TEST_UNLOCKED0.
Expand Down
1 change: 1 addition & 0 deletions sw/host/tests/manuf/manuf_ujson_msg_padding/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ fn main() -> Result<()> {
&*spi,
Some(device_console_tx_ready_pin),
/*ignore_frame_num=*/ false,
Some(opts.init.backend_opts.interface.as_str()),
)?;

// Receive the payloads from the device.
Expand Down
1 change: 1 addition & 0 deletions sw/host/tests/manuf/manuf_ujson_msg_size/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ fn main() -> Result<()> {
&*spi,
Some(device_console_tx_ready_pin),
/*ignore_frame_num=*/ false,
Some(opts.init.backend_opts.interface.as_str()),
)?;

// Receive the payloads from the device.
Expand Down
4 changes: 2 additions & 2 deletions third_party/qemu/extensions.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ qemu_bazel_build_or_forward = repository_rule(
)

def _qemu_opentitan_repos():
QEMU_VERSION = "v9.2.0-2025-11-10"
QEMU_VERSION = "v9.2.0-2025-11-18"

url = "/".join([
"https://github.com/lowRISC/qemu/releases/download",
Expand All @@ -93,7 +93,7 @@ def _qemu_opentitan_repos():
name = "qemu_opentitan_src",
url = url,
build_file = Label(":BUILD.qemu_opentitan.bazel"),
sha256 = "46037913a160c46f1a12ff8fe4eb746bf37d390848ace88b6401876c4c064669",
sha256 = "7a285ffd4c34d98c20f288390cb4efba78a57af8fb5d7342545780726b36063b",
patch_cmds = ["touch {}".format(_ARCHIVE_MARKER_FILE)],
)

Expand Down
Loading