|
@@ -1,10 +1,10 @@
|
|
|
//! Driver for VirtIO GPU devices.
|
|
|
|
|
|
-use crate::hal::{Dma, Hal};
|
|
|
+use crate::hal::{BufferDirection, Dma, Hal};
|
|
|
use crate::queue::VirtQueue;
|
|
|
use crate::transport::Transport;
|
|
|
use crate::volatile::{volread, ReadOnly, Volatile, WriteOnly};
|
|
|
-use crate::{pages, Error, Result, PAGE_SIZE};
|
|
|
+use crate::{pages, Error, Result};
|
|
|
use bitflags::bitflags;
|
|
|
use log::info;
|
|
|
|
|
@@ -26,8 +26,10 @@ pub struct VirtIOGpu<'a, H: Hal, T: Transport> {
|
|
|
control_queue: VirtQueue<H>,
|
|
|
/// Queue for sending cursor commands.
|
|
|
cursor_queue: VirtQueue<H>,
|
|
|
- /// Queue buffer DMA
|
|
|
- queue_buf_dma: Dma<H>,
|
|
|
+ /// DMA region for sending data to the device.
|
|
|
+ dma_send: Dma<H>,
|
|
|
+ /// DMA region for receiving data from the device.
|
|
|
+ dma_recv: Dma<H>,
|
|
|
/// Send buffer for queue.
|
|
|
queue_buf_send: &'a mut [u8],
|
|
|
/// Recv buffer for queue.
|
|
@@ -58,9 +60,10 @@ impl<H: Hal, T: Transport> VirtIOGpu<'_, H, T> {
|
|
|
let control_queue = VirtQueue::new(&mut transport, QUEUE_TRANSMIT, 2)?;
|
|
|
let cursor_queue = VirtQueue::new(&mut transport, QUEUE_CURSOR, 2)?;
|
|
|
|
|
|
- let queue_buf_dma = Dma::new(2)?;
|
|
|
- let queue_buf_send = unsafe { &mut queue_buf_dma.as_buf()[..PAGE_SIZE] };
|
|
|
- let queue_buf_recv = unsafe { &mut queue_buf_dma.as_buf()[PAGE_SIZE..] };
|
|
|
+ let dma_send = Dma::new(1, BufferDirection::DriverToDevice)?;
|
|
|
+ let dma_recv = Dma::new(1, BufferDirection::DeviceToDriver)?;
|
|
|
+ let queue_buf_send = unsafe { dma_send.as_buf() };
|
|
|
+ let queue_buf_recv = unsafe { dma_recv.as_buf() };
|
|
|
|
|
|
transport.finish_init();
|
|
|
|
|
@@ -71,7 +74,8 @@ impl<H: Hal, T: Transport> VirtIOGpu<'_, H, T> {
|
|
|
rect: None,
|
|
|
control_queue,
|
|
|
cursor_queue,
|
|
|
- queue_buf_dma,
|
|
|
+ dma_send,
|
|
|
+ dma_recv,
|
|
|
queue_buf_send,
|
|
|
queue_buf_recv,
|
|
|
})
|
|
@@ -104,7 +108,7 @@ impl<H: Hal, T: Transport> VirtIOGpu<'_, H, T> {
|
|
|
|
|
|
// alloc continuous pages for the frame buffer
|
|
|
let size = display_info.rect.width * display_info.rect.height * 4;
|
|
|
- let frame_buffer_dma = Dma::new(pages(size as usize))?;
|
|
|
+ let frame_buffer_dma = Dma::new(pages(size as usize), BufferDirection::DriverToDevice)?;
|
|
|
|
|
|
// resource_attach_backing
|
|
|
self.resource_attach_backing(RESOURCE_ID_FB, frame_buffer_dma.paddr() as u64, size)?;
|
|
@@ -140,7 +144,7 @@ impl<H: Hal, T: Transport> VirtIOGpu<'_, H, T> {
|
|
|
if cursor_image.len() != size as usize {
|
|
|
return Err(Error::InvalidParam);
|
|
|
}
|
|
|
- let cursor_buffer_dma = Dma::new(pages(size as usize))?;
|
|
|
+ let cursor_buffer_dma = Dma::new(pages(size as usize), BufferDirection::DriverToDevice)?;
|
|
|
let buf = unsafe { cursor_buffer_dma.as_buf() };
|
|
|
buf.copy_from_slice(cursor_image);
|
|
|
|