Skip to content

Commit 005dd18

Browse files
committed
Have drivers own transport rather than taking a reference to it.
There's not much point in the caller keeping it around.
1 parent 40e8533 commit 005dd18

File tree

6 files changed

+27
-30
lines changed

6 files changed

+27
-30
lines changed

examples/riscv/src/main.rs

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,8 @@ fn virtio_device(transport: impl Transport) {
8383
}
8484
}
8585

86-
fn virtio_blk<T: Transport>(mut transport: T) {
87-
let mut blk =
88-
VirtIOBlk::<HalImpl, T>::new(&mut transport).expect("failed to create blk driver");
86+
fn virtio_blk<T: Transport>(transport: T) {
87+
let mut blk = VirtIOBlk::<HalImpl, T>::new(transport).expect("failed to create blk driver");
8988
let mut input = vec![0xffu8; 512];
9089
let mut output = vec![0; 512];
9190
for i in 0..32 {
@@ -99,9 +98,8 @@ fn virtio_blk<T: Transport>(mut transport: T) {
9998
info!("virtio-blk test finished");
10099
}
101100

102-
fn virtio_gpu<T: Transport>(mut transport: T) {
103-
let mut gpu =
104-
VirtIOGpu::<HalImpl, T>::new(&mut transport).expect("failed to create gpu driver");
101+
fn virtio_gpu<T: Transport>(transport: T) {
102+
let mut gpu = VirtIOGpu::<HalImpl, T>::new(transport).expect("failed to create gpu driver");
105103
let fb = gpu.setup_framebuffer().expect("failed to get fb");
106104
for y in 0..768 {
107105
for x in 0..1024 {
@@ -115,20 +113,19 @@ fn virtio_gpu<T: Transport>(mut transport: T) {
115113
info!("virtio-gpu test finished");
116114
}
117115

118-
fn virtio_input<T: Transport>(mut transport: T) {
116+
fn virtio_input<T: Transport>(transport: T) {
119117
//let mut event_buf = [0u64; 32];
120118
let mut _input =
121-
VirtIOInput::<HalImpl, T>::new(&mut transport).expect("failed to create input driver");
119+
VirtIOInput::<HalImpl, T>::new(transport).expect("failed to create input driver");
122120
// loop {
123121
// input.ack_interrupt().expect("failed to ack");
124122
// info!("mouse: {:?}", input.mouse_xy());
125123
// }
126124
// TODO: handle external interrupt
127125
}
128126

129-
fn virtio_net<T: Transport>(mut transport: T) {
130-
let mut net =
131-
VirtIONet::<HalImpl, T>::new(&mut transport).expect("failed to create net driver");
127+
fn virtio_net<T: Transport>(transport: T) {
128+
let mut net = VirtIONet::<HalImpl, T>::new(transport).expect("failed to create net driver");
132129
let mut buf = [0u8; 0x100];
133130
let len = net.recv(&mut buf).expect("failed to recv");
134131
info!("recv: {:?}", &buf[..len]);

src/blk.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ use volatile::Volatile;
1111
/// Read and write requests (and other exotic requests) are placed in the queue,
1212
/// and serviced (probably out of order) by the device except where noted.
1313
pub struct VirtIOBlk<'a, H: Hal, T: Transport> {
14-
transport: &'a mut T,
14+
transport: T,
1515
queue: VirtQueue<'a, H>,
1616
capacity: usize,
1717
}
1818

1919
impl<'a, H: Hal, T: Transport> VirtIOBlk<'a, H, T> {
2020
/// Create a new VirtIO-Blk driver.
21-
pub fn new(transport: &'a mut T) -> Result<Self> {
21+
pub fn new(mut transport: T) -> Result<Self> {
2222
transport.begin_init(|features| {
2323
let features = BlkFeature::from_bits_truncate(features);
2424
info!("device features: {:?}", features);
@@ -36,7 +36,7 @@ impl<'a, H: Hal, T: Transport> VirtIOBlk<'a, H, T> {
3636
config.capacity.read() / 2
3737
);
3838

39-
let queue = VirtQueue::new(transport, 0, 16)?;
39+
let queue = VirtQueue::new(&mut transport, 0, 16)?;
4040
transport.finish_init();
4141

4242
Ok(VirtIOBlk {

src/console.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ const QUEUE_SIZE: u16 = 2;
1313
/// Virtio console. Only one single port is allowed since ``alloc'' is disabled.
1414
/// Emergency and cols/rows unimplemented.
1515
pub struct VirtIOConsole<'a, H: Hal, T: Transport> {
16-
transport: &'a mut T,
16+
transport: T,
1717
receiveq: VirtQueue<'a, H>,
1818
transmitq: VirtQueue<'a, H>,
1919
queue_buf_dma: DMA<H>,
@@ -24,7 +24,7 @@ pub struct VirtIOConsole<'a, H: Hal, T: Transport> {
2424

2525
impl<'a, H: Hal, T: Transport> VirtIOConsole<'a, H, T> {
2626
/// Create a new VirtIO-Console driver.
27-
pub fn new(transport: &'a mut T) -> Result<Self> {
27+
pub fn new(mut transport: T) -> Result<Self> {
2828
transport.begin_init(|features| {
2929
let features = Features::from_bits_truncate(features);
3030
info!("Device features {:?}", features);
@@ -34,8 +34,8 @@ impl<'a, H: Hal, T: Transport> VirtIOConsole<'a, H, T> {
3434
let config_space = transport.config_space().cast::<Config>();
3535
let config = unsafe { config_space.as_ref() };
3636
info!("Config: {:?}", config);
37-
let receiveq = VirtQueue::new(transport, QUEUE_RECEIVEQ_PORT_0, QUEUE_SIZE)?;
38-
let transmitq = VirtQueue::new(transport, QUEUE_TRANSMITQ_PORT_0, QUEUE_SIZE)?;
37+
let receiveq = VirtQueue::new(&mut transport, QUEUE_RECEIVEQ_PORT_0, QUEUE_SIZE)?;
38+
let transmitq = VirtQueue::new(&mut transport, QUEUE_TRANSMITQ_PORT_0, QUEUE_SIZE)?;
3939
let queue_buf_dma = DMA::new(1)?;
4040
let queue_buf_rx = unsafe { &mut queue_buf_dma.as_buf()[0..] };
4141
transport.finish_init();

src/gpu.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use volatile::{ReadOnly, Volatile, WriteOnly};
1414
/// In 2D mode the virtio-gpu device provides support for ARGB Hardware cursors
1515
/// and multiple scanouts (aka heads).
1616
pub struct VirtIOGpu<'a, H: Hal, T: Transport> {
17-
transport: &'a mut T,
17+
transport: T,
1818
rect: Rect,
1919
/// DMA area of frame buffer.
2020
frame_buffer_dma: Option<DMA<H>>,
@@ -34,7 +34,7 @@ pub struct VirtIOGpu<'a, H: Hal, T: Transport> {
3434

3535
impl<'a, H: Hal, T: Transport> VirtIOGpu<'a, H, T> {
3636
/// Create a new VirtIO-Gpu driver.
37-
pub fn new(transport: &'a mut T) -> Result<Self> {
37+
pub fn new(mut transport: T) -> Result<Self> {
3838
transport.begin_init(|features| {
3939
let features = Features::from_bits_truncate(features);
4040
info!("Device features {:?}", features);
@@ -47,8 +47,8 @@ impl<'a, H: Hal, T: Transport> VirtIOGpu<'a, H, T> {
4747
let config = unsafe { config_space.as_ref() };
4848
info!("Config: {:?}", config);
4949

50-
let control_queue = VirtQueue::new(transport, QUEUE_TRANSMIT, 2)?;
51-
let cursor_queue = VirtQueue::new(transport, QUEUE_CURSOR, 2)?;
50+
let control_queue = VirtQueue::new(&mut transport, QUEUE_TRANSMIT, 2)?;
51+
let cursor_queue = VirtQueue::new(&mut transport, QUEUE_CURSOR, 2)?;
5252

5353
let queue_buf_dma = DMA::new(2)?;
5454
let queue_buf_send = unsafe { &mut queue_buf_dma.as_buf()[..PAGE_SIZE] };

src/input.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@ use volatile::{ReadOnly, WriteOnly};
1111
/// Device behavior mirrors that of the evdev layer in Linux,
1212
/// making pass-through implementations on top of evdev easy.
1313
pub struct VirtIOInput<'a, H: Hal, T: Transport> {
14-
transport: &'a mut T,
14+
transport: T,
1515
event_queue: VirtQueue<'a, H>,
1616
status_queue: VirtQueue<'a, H>,
1717
event_buf: Box<[InputEvent; 32]>,
1818
}
1919

2020
impl<'a, H: Hal, T: Transport> VirtIOInput<'a, H, T> {
2121
/// Create a new VirtIO-Input driver.
22-
pub fn new(transport: &'a mut T) -> Result<Self> {
22+
pub fn new(mut transport: T) -> Result<Self> {
2323
let mut event_buf = Box::new([InputEvent::default(); QUEUE_SIZE]);
2424
transport.begin_init(|features| {
2525
let features = Feature::from_bits_truncate(features);
@@ -29,8 +29,8 @@ impl<'a, H: Hal, T: Transport> VirtIOInput<'a, H, T> {
2929
(features & supported_features).bits()
3030
});
3131

32-
let mut event_queue = VirtQueue::new(transport, QUEUE_EVENT, QUEUE_SIZE as u16)?;
33-
let status_queue = VirtQueue::new(transport, QUEUE_STATUS, QUEUE_SIZE as u16)?;
32+
let mut event_queue = VirtQueue::new(&mut transport, QUEUE_EVENT, QUEUE_SIZE as u16)?;
33+
let status_queue = VirtQueue::new(&mut transport, QUEUE_STATUS, QUEUE_SIZE as u16)?;
3434
for (i, event) in event_buf.as_mut().iter_mut().enumerate() {
3535
let token = event_queue.add(&[], &[event.as_buf_mut()])?;
3636
assert_eq!(token, i as u16);

src/net.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,15 @@ use volatile::{ReadOnly, Volatile};
1515
/// outgoing packets are enqueued into another for transmission in that order.
1616
/// A third command queue is used to control advanced filtering features.
1717
pub struct VirtIONet<'a, H: Hal, T: Transport> {
18-
transport: &'a mut T,
18+
transport: T,
1919
mac: EthernetAddress,
2020
recv_queue: VirtQueue<'a, H>,
2121
send_queue: VirtQueue<'a, H>,
2222
}
2323

2424
impl<'a, H: Hal, T: Transport> VirtIONet<'a, H, T> {
2525
/// Create a new VirtIO-Net driver.
26-
pub fn new(transport: &'a mut T) -> Result<Self> {
26+
pub fn new(mut transport: T) -> Result<Self> {
2727
transport.begin_init(|features| {
2828
let features = Features::from_bits_truncate(features);
2929
info!("Device features {:?}", features);
@@ -37,8 +37,8 @@ impl<'a, H: Hal, T: Transport> VirtIONet<'a, H, T> {
3737
debug!("Got MAC={:?}, status={:?}", mac, config.status.read());
3838

3939
let queue_num = 2; // for simplicity
40-
let recv_queue = VirtQueue::new(transport, QUEUE_RECEIVE, queue_num)?;
41-
let send_queue = VirtQueue::new(transport, QUEUE_TRANSMIT, queue_num)?;
40+
let recv_queue = VirtQueue::new(&mut transport, QUEUE_RECEIVE, queue_num)?;
41+
let send_queue = VirtQueue::new(&mut transport, QUEUE_TRANSMIT, queue_num)?;
4242

4343
transport.finish_init();
4444

0 commit comments

Comments
 (0)