opentitanlib/transport/
errors.rs

1// Copyright lowRISC contributors (OpenTitan project).
2// Licensed under the Apache License, Version 2.0, see LICENSE for details.
3// SPDX-License-Identifier: Apache-2.0
4
5use serde::{Deserialize, Serialize};
6use thiserror::Error;
7
8use super::Capability;
9use crate::impl_serializable_error;
10
11/// Contains all the errors that any method on the `Transport` trait could generate.  This
12/// struct is serializable, such that it can be transmitted across a network for instance as
13/// part of the session proxy functionality.
14#[derive(Error, Debug, Serialize, Deserialize)]
15pub enum TransportError {
16    #[error("Found no USB device. Search criteria was: {0}")]
17    NoDevice(String),
18    #[error("Found multiple USB devices ({0}), use --usb-serial. Search criteria was: {1}")]
19    MultipleDevices(String, String),
20    #[error("USB error: {0}")]
21    UsbGenericError(String),
22    #[error("Error opening USB device: {0}")]
23    UsbOpenError(String),
24    #[error("Transport does not support {0:?}")]
25    InvalidInterface(TransportInterfaceType),
26    #[error("Transport does not support {0:?} instance {1}")]
27    InvalidInstance(TransportInterfaceType, String),
28    #[error("Encountered non-unicode device path")]
29    UnicodePathError,
30    #[error("Error opening {0}: {1}")]
31    OpenError(String, String),
32    #[error("Error reading from {0}: {1}")]
33    ReadError(String, String),
34    #[error("FPGA programming failed: {0}")]
35    FpgaProgramFailed(String),
36    #[error("Firmware programming failed: {0}")]
37    FirmwareProgramFailed(String),
38    #[error("Error clearing FPGA bitstream")]
39    ClearBitstreamFailed(),
40    #[error("PLL programming failed: {0}")]
41    PllProgramFailed(String),
42    #[error("Invalid pin strapping name \"{0}\"")]
43    InvalidStrappingName(String),
44    #[error("Invalid IO expander name \"{0}\"")]
45    InvalidIoExpanderName(String),
46    #[error("Invalid pin {1} for IO expander \"{0}\"")]
47    InvalidIoExpanderPinNo(String, u32),
48    #[error("Transport does not support the requested operation")]
49    UnsupportedOperation,
50    #[error("Requested operation invalid at this time")]
51    InvalidOperation,
52    #[error("Error communicating with FTDI: {0}")]
53    FtdiError(String),
54    #[error("Error communicating with debugger: {0}")]
55    CommunicationError(String),
56    #[error("Proxy unable to connect to `{0}`: {1}")]
57    ProxyConnectError(String, String),
58    #[error("Requested capabilities {0:?}, but capabilities {1:?} are supplied")]
59    MissingCapabilities(Capability, Capability),
60    #[error("Inconsistent configuration for {0:?} instance \"{1}\"")]
61    InconsistentConf(TransportInterfaceType, String),
62    #[error("Inconsistent configuration of transport interface \"{0}\" vs. \"{1}\"")]
63    InconsistentInterfaceConf(String, String),
64    #[error("Strapping \"{0}\" pin \"{1}\" cannot declare \"alias_of\"")]
65    InvalidConfStrapAlias(String, String),
66    #[error("Strapping \"{0}\" pin \"{1}\" cannot declare \"invert\"")]
67    InvalidConfStrapInvert(String, String),
68    #[error("Expected value \"{1}\" for key \"{0}\", found \"{2}\"")]
69    RequiresUnequal(String, String, String),
70    #[error("Expected value \"{1}\" for key \"{0}\", found none")]
71    RequiresMissing(String, String),
72}
73impl_serializable_error!(TransportError);
74
75/// Enum value used by `TransportError::InvalidInstance`.
76#[derive(Debug, serde::Serialize, serde::Deserialize)]
77pub enum TransportInterfaceType {
78    Gpio,
79    Uart,
80    Spi,
81    I2c,
82    Jtag,
83    Emulator,
84    FpgaOps,
85    ProxyOps,
86    GpioMonitoring,
87    GpioBitbanging,
88    IoExpander,
89    Provides,
90}