Skip to content

uefi-raw: Add ScsiIoProtocol #1517

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 12, 2025
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
3 changes: 2 additions & 1 deletion uefi-raw/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
# uefi-raw - [Unreleased]

## Changed
## Added

- Added `protocol::string::UnicodeCollationProtocol`.
- Added `protocol::tcg` module, containing the TCG v1 and v2 protocols.
- Added `DriverBindingProtocol`.
- Added `FirmwareVolume2Protocol`.
- Added `FirmwareVolumeBlock2Protocol`.
- Added `HiiDatabaseProtocol`.
- Added `ScsiIoProtocol`.


# uefi-raw - 0.9.0 (2024-10-23)
Expand Down
1 change: 1 addition & 0 deletions uefi-raw/src/protocol/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ pub mod memory_protection;
pub mod misc;
pub mod network;
pub mod rng;
pub mod scsi;
pub mod shell_params;
pub mod string;
pub mod tcg;
111 changes: 111 additions & 0 deletions uefi-raw/src/protocol/scsi.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
use crate::{guid, Event, Guid, Status};
use core::ffi::c_void;

newtype_enum! {
/// Corresponds to the `EFI_SCSI_IO_TYPE_*` defines.
#[derive(Default)]
pub enum ScsiIoType: u8 => {
DISK = 0x00,
TAPE = 0x01,
PRINTER = 0x02,
PROCESSOR = 0x03,
WRITE_ONCE_READ_MULTIPLE = 0x04,
CDROM = 0x05,
SCANNER = 0x06,
OPTICAL = 0x07,
MEDIUM_CHANGER = 0x08,
COMMUNICATION = 0x09,
RAID = 0x0c,
ENCLOSURE_SERVICES = 0x0d,
REDUCED_BLOCK_COMMANDS = 0x0e,
OPTICAL_CARD_READER_WRITER = 0x0f,
BRIDGE_CONTROLLER = 0x10,
OBJECT_BASED_STORAGE = 0x11,
RESERVED_LOW = 0x12,
RESERVED_HIGH = 0x1e,
UNKNOWN = 0x1f,
}
}

newtype_enum! {
/// Corresponds to the `EFI_SCSI_IO_DATA_DIRECTION_*` defines.
#[derive(Default)]
pub enum ScsiIoDataDirection: u8 => {
READ = 0,
WRITE = 1,
BIDIRECTIONAL = 2,
}
}

newtype_enum! {
/// Corresponds to the `EFI_SCSI_IO_STATUS_HOST_ADAPTER_*` defines.
#[derive(Default)]
pub enum ScsiIoHostAdapterStatus: u8 => {
OK = 0x00,
TIMEOUT_COMMAND = 0x09,
TIMEOUT = 0x0b,
MESSAGE_REJECT = 0x0d,
BUS_RESET = 0x0e,
PARITY_ERROR = 0x0f,
REQUEST_SENSE_FAILED = 0x10,
SELECTION_TIMEOUT = 0x11,
DATA_OVERRUN_UNDERRUN = 0x12,
BUS_FREE = 0x13,
PHASE_ERROR = 0x14,
OTHER = 0x7f,
}
}

newtype_enum! {
/// Corresponds to the `EFI_SCSI_IO_STATUS_TARGET_*` defines.
#[derive(Default)]
pub enum ScsiIoTargetStatus: u8 => {
GOOD = 0x00,
CHECK_CONDITION = 0x02,
CONDITION_MET = 0x04,
BUSY = 0x08,
INTERMEDIATE = 0x10,
INTERMEDIATE_CONDITION_MET = 0x14,
RESERVATION_CONFLICT = 0x18,
COMMAND_TERMINATED = 0x22,
QUEUE_FULL = 0x28,
}
}

#[derive(Debug, Copy, Clone)]
#[repr(C)]
pub struct ScsiIoScsiRequestPacket {
pub timeout: u64,
pub in_data_buffer: *mut c_void,
pub out_data_buffer: *mut c_void,
pub sense_data: *mut c_void,
pub cdb: *mut c_void,
pub in_transfer_length: u32,
pub out_transfer_length: u32,
pub cdb_length: u8,
pub data_direction: ScsiIoDataDirection,
pub host_adapter_status: ScsiIoHostAdapterStatus,
pub target_status: ScsiIoTargetStatus,
pub sense_data_length: u8,
}

#[derive(Debug)]
#[repr(C)]
pub struct ScsiIoProtocol {
pub get_device_type:
unsafe extern "efiapi" fn(this: *const Self, device_type: *mut ScsiIoType) -> Status,
pub get_device_location:
unsafe extern "efiapi" fn(this: *const Self, target: *mut *mut u8, lun: *mut u64) -> Status,
pub reset_bus: unsafe extern "efiapi" fn(this: *mut Self) -> Status,
pub reset_device: unsafe extern "efiapi" fn(this: *mut Self) -> Status,
pub execute_scsi_command: unsafe extern "efiapi" fn(
this: *const Self,
packet: *mut ScsiIoScsiRequestPacket,
event: Event,
) -> Status,
pub io_align: u32,
}

impl ScsiIoProtocol {
pub const GUID: Guid = guid!("932f47e6-2362-4002-803e-3cd54b138f85");
}
Loading