Skip to content

Commit 1390d64

Browse files
timothytrippelpamaury
authored andcommitted
[opentitanlib] add option to ignore SPI console frame numbers
When opentitanlib is invoked via an external C/C++ wrapper library, the SpiConsoleDevice object is reinstantiated repeatedly to comply with Rust's ownership rules (and satisfy the borrow checker). On each reinstantiation of the SpiConsoleDevice struct, the next expected frame number is reset to 0. This causes the SpiConsoleDevice to ignore a valid frame when used through an external wrapper library, as is the case with the OtlibWrapper used in the opentitan-provisioning repo. This was causing CI issues in lowRISC/opentitan-provisioning#165. As such, this provides a mechanism for users of the SpiConsoleDevice to ignore the frame number, which frankly is not necessary when the SpiConsoleDevice is used alongside the TX-indicator GPIO feature. This feature does not make use of a circular transmit buffer, but rather transmits only a single frame in the buffer at a time. Signed-off-by: Tim Trippel <[email protected]> (cherry picked from commit 9ca5d54)
1 parent 00ae587 commit 1390d64

File tree

18 files changed

+37
-18
lines changed

18 files changed

+37
-18
lines changed

sw/host/opentitanlib/src/console/spi.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ pub struct SpiConsoleDevice<'a> {
2020
rx_buf: RefCell<VecDeque<u8>>,
2121
next_read_address: Cell<u32>,
2222
device_tx_ready_pin: Option<&'a Rc<dyn GpioPin>>,
23+
ignore_frame_num: bool,
2324
}
2425

2526
impl<'a> SpiConsoleDevice<'a> {
@@ -34,6 +35,7 @@ impl<'a> SpiConsoleDevice<'a> {
3435
pub fn new(
3536
spi: &'a dyn Target,
3637
device_tx_ready_pin: Option<&'a Rc<dyn GpioPin>>,
38+
ignore_frame_num: bool,
3739
) -> Result<Self> {
3840
let flash = SpiFlash {
3941
..Default::default()
@@ -45,6 +47,7 @@ impl<'a> SpiConsoleDevice<'a> {
4547
console_next_frame_number: Cell::new(0),
4648
next_read_address: Cell::new(0),
4749
device_tx_ready_pin,
50+
ignore_frame_num,
4851
})
4952
}
5053

@@ -76,7 +79,7 @@ impl<'a> SpiConsoleDevice<'a> {
7679
let frame_number: u32 = u32::from_le_bytes(header[4..8].try_into().unwrap());
7780
let data_len_bytes: usize = u32::from_le_bytes(header[8..12].try_into().unwrap()) as usize;
7881
if magic_number != SpiConsoleDevice::SPI_FRAME_MAGIC_NUMBER
79-
|| frame_number != self.console_next_frame_number.get()
82+
|| (!self.ignore_frame_num && frame_number != self.console_next_frame_number.get())
8083
|| data_len_bytes > SpiConsoleDevice::SPI_MAX_DATA_LENGTH
8184
{
8285
if self.device_tx_ready_pin.is_none() {

sw/host/provisioning/cp/src/main.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,11 @@ fn main() -> Result<()> {
5050
let device_console_tx_ready_pin = &transport.gpio_pin(&opts.console_tx_indicator_pin)?;
5151
device_console_tx_ready_pin.set_mode(PinMode::Input)?;
5252
device_console_tx_ready_pin.set_pull_mode(PullMode::None)?;
53-
let spi_console_device = SpiConsoleDevice::new(&*spi, Some(device_console_tx_ready_pin))?;
53+
let spi_console_device = SpiConsoleDevice::new(
54+
&*spi,
55+
Some(device_console_tx_ready_pin),
56+
/*ignore_frame_num=*/ false,
57+
)?;
5458

5559
let provisioning_data = ManufCpProvisioningData {
5660
wafer_auth_secret: hex_string_to_u32_arrayvec::<8>(

sw/host/provisioning/ft/src/main.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,11 @@ fn main() -> Result<()> {
129129
let device_console_tx_ready_pin = &transport.gpio_pin(&opts.console_tx_indicator_pin)?;
130130
device_console_tx_ready_pin.set_mode(PinMode::Input)?;
131131
device_console_tx_ready_pin.set_pull_mode(PullMode::None)?;
132-
let spi_console = SpiConsoleDevice::new(&*spi, Some(device_console_tx_ready_pin))?;
132+
let spi_console = SpiConsoleDevice::new(
133+
&*spi,
134+
Some(device_console_tx_ready_pin),
135+
/*ignore_frame_num=*/ false,
136+
)?;
133137
InitializeTest::print_result(
134138
"load_bitstream",
135139
opts.init.load_bitstream.init(&transport).map(|_| None),

sw/host/tests/chip/ottf_console_with_gpio_tx_indicator/src/main.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,11 @@ fn spi_device_console_test(opts: &Opts, transport: &TransportWrapper) -> Result<
4242
let device_console_tx_ready_pin = &transport.gpio_pin("IOA5")?;
4343
device_console_tx_ready_pin.set_mode(PinMode::Input)?;
4444
device_console_tx_ready_pin.set_pull_mode(PullMode::None)?;
45-
let spi_console_device = SpiConsoleDevice::new(&*spi, Some(device_console_tx_ready_pin))?;
45+
let spi_console_device = SpiConsoleDevice::new(
46+
&*spi,
47+
Some(device_console_tx_ready_pin),
48+
/*ignore_frame_num=*/ false,
49+
)?;
4650

4751
// Load the ELF binary and get the expect data.
4852
let elf_binary = fs::read(&opts.firmware_elf)?;

sw/host/tests/chip/spi_device_ottf_console/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ fn spi_device_console_test(opts: &Opts, transport: &TransportWrapper) -> Result<
4545
);
4646
let spi = transport.spi(&opts.console_spi)?;
4747

48-
let spi_console_device = SpiConsoleDevice::new(&*spi, None)?;
48+
let spi_console_device = SpiConsoleDevice::new(&*spi, None, /*ignore_frame_num=*/ false)?;
4949
let _ = UartConsole::wait_for(&spi_console_device, r"Running ", opts.timeout)?;
5050

5151
/* Load the ELF binary and get the expect data.*/

sw/host/tests/chip/spi_device_ujson_console_test/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ fn main() -> Result<()> {
109109

110110
let transport = opts.init.init_target()?;
111111
let spi = transport.spi(&opts.console_spi)?;
112-
let spi_console_device = SpiConsoleDevice::new(&*spi, None)?;
112+
let spi_console_device = SpiConsoleDevice::new(&*spi, None, /*ignore_frame_num=*/ false)?;
113113
let _ = UartConsole::wait_for(&spi_console_device, r"Running ", opts.timeout)?;
114114

115115
execute_test!(test_perso_blob_strcut, &opts, &spi_console_device);

sw/host/tests/crypto/acvp/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ fn run<R: std::io::Read, W: std::io::Write>(
6868
output: Option<W>,
6969
) -> Result<()> {
7070
let spi = transport.spi("BOOTSTRAP")?;
71-
let spi_console_device = SpiConsoleDevice::new(&*spi, None)?;
71+
let spi_console_device = SpiConsoleDevice::new(&*spi, None, /*ignore_frame_num=*/ false)?;
7272
let _ = UartConsole::wait_for(&spi_console_device, r"Running ", opts.timeout)?;
7373

7474
let acvp_vectors: Vec<AcvpVectors> = serde_json::from_reader(input)?;

sw/host/tests/crypto/aes_gcm_nist_kat/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ fn run_aes_gcm_testcase(
137137

138138
fn test_aes_gcm(opts: &Opts, transport: &TransportWrapper) -> Result<()> {
139139
let spi = transport.spi("BOOTSTRAP")?;
140-
let spi_console_device = SpiConsoleDevice::new(&*spi, None)?;
140+
let spi_console_device = SpiConsoleDevice::new(&*spi, None, /*ignore_frame_num=*/ false)?;
141141
let _ = UartConsole::wait_for(&spi_console_device, r"Running ", opts.timeout)?;
142142

143143
let mut test_counter = 0u32;

sw/host/tests/crypto/aes_nist_kat/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ fn run_aes_testcase(
130130

131131
fn test_aes(opts: &Opts, transport: &TransportWrapper) -> Result<()> {
132132
let spi = transport.spi("BOOTSTRAP")?;
133-
let spi_console_device = SpiConsoleDevice::new(&*spi, None)?;
133+
let spi_console_device = SpiConsoleDevice::new(&*spi, None, /*ignore_frame_num=*/ false)?;
134134
let _ = UartConsole::wait_for(&spi_console_device, r"Running ", opts.timeout)?;
135135

136136
let mut test_counter = 0u32;

sw/host/tests/crypto/drbg_kat/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ fn run_drbg_testcase(
128128

129129
fn test_drbg(opts: &Opts, transport: &TransportWrapper) -> Result<()> {
130130
let spi = transport.spi("BOOTSTRAP")?;
131-
let spi_console_device = SpiConsoleDevice::new(&*spi, None)?;
131+
let spi_console_device = SpiConsoleDevice::new(&*spi, None, /*ignore_frame_num=*/ false)?;
132132
let _ = UartConsole::wait_for(&spi_console_device, r"Running ", opts.timeout)?;
133133

134134
let mut test_counter = 0u32;

0 commit comments

Comments
 (0)