drivers/graphics/ihdgd: Replace DeviceFb with GpuBuffer for dumb buffers

Dumb buffers only have a size like GpuBuffer, not width, height and
stride like DeviceFb.
This commit is contained in:
bjorn3
2026-03-22 20:05:26 +01:00
parent 221d228f36
commit 8fdd5f3998
3 changed files with 45 additions and 68 deletions
+15 -11
View File
@@ -13,6 +13,7 @@ mod aux;
mod bios;
use self::bios::*;
mod buffer;
use self::buffer::*;
mod ddi;
use self::ddi::*;
mod dpll;
@@ -436,7 +437,7 @@ impl Device {
})
}
fn add_kms_pipe(objects: &mut KmsObjects<Self>, pipe_idx: usize, fb: DeviceFb) {
fn add_kms_pipe(objects: &mut KmsObjects<Self>, pipe_idx: usize, fb: KmsFramebuffer<Self>) {
let crtc_id = objects.add_crtc(Crtc { pipe_idx }, ());
let connector_id = objects.add_connector((), (), &[crtc_id]);
@@ -445,15 +446,7 @@ impl Device {
connector.update_from_size(fb.width, fb.height);
drop(connector);
let fb_id = objects.add_framebuffer(KmsFramebuffer {
width: fb.width,
height: fb.height,
pitch: fb.stride,
bpp: 32,
depth: 24,
buffer: Arc::new(fb),
driver_data: (),
});
let fb_id = objects.add_framebuffer(fb);
objects
.get_crtc(crtc_id)
.unwrap()
@@ -758,7 +751,18 @@ impl Device {
let width = timing.horizontal_active_pixels as u32;
let height = timing.vertical_active_lines as u32;
let fb = DeviceFb::alloc(&self.gm, &mut self.ggtt, width, height)?;
let (buffer, stride) =
GpuBuffer::alloc_dumb(&self.gm, &mut self.ggtt, width, height)?;
let fb = KmsFramebuffer {
width,
height,
pitch: stride,
bpp: 32,
depth: 32,
buffer: Arc::new(buffer),
driver_data: (),
};
plane.modeset(&mut self.alloc_buffers)?;
plane.set_framebuffer(Some(&fb));
+22 -47
View File
@@ -1,58 +1,19 @@
use std::sync::Arc;
use common::io::{Io, MmioPtr};
use driver_graphics::kms::objects::KmsFramebuffer;
use range_alloc::RangeAllocator;
use syscall::error::Result;
use syscall::{Error, EIO};
use super::buffer::GpuBuffer;
use super::{GlobalGtt, MmioRegion};
use super::{Device, GlobalGtt, MmioRegion};
pub const PLANE_CTL_ENABLE: u32 = 1 << 31;
pub const PLANE_WM_ENABLE: u32 = 1 << 31;
pub const PLANE_WM_LINES_SHIFT: u32 = 14;
#[derive(Debug)]
pub struct DeviceFb {
pub buffer: GpuBuffer,
pub width: u32,
pub height: u32,
pub stride: u32,
}
impl DeviceFb {
pub unsafe fn new(
gm: &MmioRegion,
surf: u32,
width: u32,
height: u32,
stride: u32,
clear: bool,
) -> Self {
Self {
buffer: unsafe { GpuBuffer::new(gm, surf, stride * height, clear) },
width,
height,
stride,
}
}
pub fn alloc(
gm: &MmioRegion,
ggtt: &mut GlobalGtt,
width: u32,
height: u32,
) -> syscall::Result<Self> {
let (buffer, stride) = GpuBuffer::alloc_dumb(gm, ggtt, width, height)?;
Ok(DeviceFb {
buffer,
width,
height,
stride,
})
}
}
pub struct Plane {
pub name: &'static str,
pub index: usize,
@@ -112,7 +73,11 @@ impl Plane {
Ok(())
}
pub fn fetch_framebuffer(&self, gm: &MmioRegion, ggtt: &mut GlobalGtt) -> DeviceFb {
pub fn fetch_framebuffer(
&self,
gm: &MmioRegion,
ggtt: &mut GlobalGtt,
) -> KmsFramebuffer<Device> {
let size = self.size.read();
let width = (size & 0xFFFF) + 1;
let height = ((size >> 16) & 0xFFFF) + 1;
@@ -124,17 +89,27 @@ impl Plane {
let surf_size = (stride * height).next_multiple_of(4096);
ggtt.reserve(surf, surf_size);
unsafe { DeviceFb::new(gm, surf, width, height, stride, true) }
let buffer = unsafe { GpuBuffer::new(gm, surf, stride * height, true) };
KmsFramebuffer {
width,
height,
pitch: stride,
bpp: 32,
depth: 32,
buffer: Arc::new(buffer),
driver_data: (),
}
}
pub fn set_framebuffer(&mut self, fb: Option<&DeviceFb>) {
pub fn set_framebuffer(&mut self, fb: Option<&KmsFramebuffer<Device>>) {
let Some(fb) = fb else {
self.ctl.write(0); // Disable plane
return;
};
//TODO: documentation on this is not great
let stride_64 = fb.stride / 64;
let stride_64 = fb.pitch / 64;
self.size.write((fb.width - 1) | ((fb.height - 1) << 16));
self.stride.write(stride_64);
+8 -10
View File
@@ -10,7 +10,7 @@ use drm_sys::{
};
use syscall::error::EINVAL;
use super::pipe::DeviceFb;
use super::buffer::GpuBuffer;
use super::Device;
#[derive(Debug)]
@@ -22,9 +22,9 @@ impl KmsCrtcDriver for Crtc {
type State = ();
}
impl Buffer for DeviceFb {
impl Buffer for GpuBuffer {
fn size(&self) -> usize {
(self.stride * self.height) as usize
self.size as usize
}
}
@@ -32,7 +32,7 @@ impl GraphicsAdapter for Device {
type Connector = ();
type Crtc = Crtc;
type Buffer = DeviceFb;
type Buffer = GpuBuffer;
type Framebuffer = ();
fn name(&self) -> &'static [u8] {
@@ -70,13 +70,11 @@ impl GraphicsAdapter for Device {
}
fn create_dumb_buffer(&mut self, width: u32, height: u32) -> (Self::Buffer, u32) {
let fb = DeviceFb::alloc(&self.gm, &mut self.ggtt, width, height).unwrap();
let stride = fb.stride;
(fb, stride)
GpuBuffer::alloc_dumb(&self.gm, &mut self.ggtt, width, height).unwrap()
}
fn map_dumb_buffer(&mut self, framebuffer: &Self::Buffer) -> *mut u8 {
framebuffer.buffer.virt
fn map_dumb_buffer(&mut self, buffer: &Self::Buffer) -> *mut u8 {
buffer.virt
}
fn create_framebuffer(&mut self, _buffer: &Self::Buffer) -> Self::Framebuffer {
@@ -98,7 +96,7 @@ impl GraphicsAdapter for Device {
crtc.state = state;
if let Some(primary_plane) = self.pipes[crtc.driver_data.pipe_idx].planes.first_mut() {
primary_plane.set_framebuffer(fb.as_ref().map(|fb| &*fb.buffer));
primary_plane.set_framebuffer(fb);
}
Ok(())