1*c566df45SLoGin use core::intrinsics::unlikely; 2*c566df45SLoGin 308a2ee40SLoGin use alloc::{ 4*c566df45SLoGin string::{String, ToString}, 508a2ee40SLoGin sync::{Arc, Weak}, 608a2ee40SLoGin }; 7*c566df45SLoGin 891e9d4abSLoGin use system_error::SystemError; 991e9d4abSLoGin use unified_init::macros::unified_init; 1008a2ee40SLoGin 11*c566df45SLoGin use crate::{ 12*c566df45SLoGin driver::base::{ 1308a2ee40SLoGin class::{class_manager, Class}, 14*c566df45SLoGin device::{ 15*c566df45SLoGin bus::Bus, 16*c566df45SLoGin device_manager, 17*c566df45SLoGin device_number::{DeviceNumber, Major}, 18*c566df45SLoGin driver::Driver, 19*c566df45SLoGin sys_dev_char_kset, Device, DeviceType, IdTable, 20*c566df45SLoGin }, 21*c566df45SLoGin kobject::{KObjType, KObject, KObjectState, LockedKObjectState}, 22*c566df45SLoGin kset::KSet, 2308a2ee40SLoGin subsys::SubSysPrivate, 24*c566df45SLoGin }, 25*c566df45SLoGin filesystem::{kernfs::KernFSInode, sysfs::AttributeGroup}, 26*c566df45SLoGin init::initcall::INITCALL_SUBSYS, 27*c566df45SLoGin libs::{ 28*c566df45SLoGin rwlock::{RwLock, RwLockReadGuard, RwLockWriteGuard}, 29*c566df45SLoGin spinlock::SpinLock, 30*c566df45SLoGin }, 3108a2ee40SLoGin }; 3208a2ee40SLoGin 33*c566df45SLoGin use super::{fbcon::fb_console_init, fbsysfs::FbDeviceAttrGroup, FbId, FrameBuffer}; 3408a2ee40SLoGin 3508a2ee40SLoGin /// `/sys/class/graphics` 的 class 实例 3608a2ee40SLoGin static mut CLASS_GRAPHICS_INSTANCE: Option<Arc<GraphicsClass>> = None; 3708a2ee40SLoGin 38*c566df45SLoGin lazy_static! { 39*c566df45SLoGin /// 帧缓冲区管理器 40*c566df45SLoGin static ref FRAME_BUFFER_MANAGER: FrameBufferManager = FrameBufferManager::new(); 41*c566df45SLoGin } 42*c566df45SLoGin 4308a2ee40SLoGin /// 获取 `/sys/class/graphics` 的 class 实例 4408a2ee40SLoGin #[inline(always)] 4508a2ee40SLoGin #[allow(dead_code)] 4608a2ee40SLoGin pub fn sys_class_graphics_instance() -> Option<&'static Arc<GraphicsClass>> { 4708a2ee40SLoGin unsafe { CLASS_GRAPHICS_INSTANCE.as_ref() } 4808a2ee40SLoGin } 4908a2ee40SLoGin 50*c566df45SLoGin #[inline(always)] 51*c566df45SLoGin pub fn frame_buffer_manager() -> &'static FrameBufferManager { 52*c566df45SLoGin &FRAME_BUFFER_MANAGER 53*c566df45SLoGin } 54*c566df45SLoGin 5508a2ee40SLoGin /// 初始化帧缓冲区子系统 56*c566df45SLoGin #[unified_init(INITCALL_SUBSYS)] 5708a2ee40SLoGin pub fn fbmem_init() -> Result<(), SystemError> { 5808a2ee40SLoGin let graphics_class = GraphicsClass::new(); 5908a2ee40SLoGin class_manager().class_register(&(graphics_class.clone() as Arc<dyn Class>))?; 6008a2ee40SLoGin 6108a2ee40SLoGin unsafe { 6208a2ee40SLoGin CLASS_GRAPHICS_INSTANCE = Some(graphics_class); 6308a2ee40SLoGin } 6408a2ee40SLoGin 6508a2ee40SLoGin fb_console_init()?; 6608a2ee40SLoGin return Ok(()); 6708a2ee40SLoGin } 6808a2ee40SLoGin 6908a2ee40SLoGin /// `/sys/class/graphics` 类 7008a2ee40SLoGin #[derive(Debug)] 7108a2ee40SLoGin pub struct GraphicsClass { 7208a2ee40SLoGin subsystem: SubSysPrivate, 7308a2ee40SLoGin } 7408a2ee40SLoGin 7508a2ee40SLoGin impl GraphicsClass { 7608a2ee40SLoGin const NAME: &'static str = "graphics"; 7708a2ee40SLoGin pub fn new() -> Arc<Self> { 7808a2ee40SLoGin let r = Self { 7908a2ee40SLoGin subsystem: SubSysPrivate::new(Self::NAME.to_string(), None, None, &[]), 8008a2ee40SLoGin }; 8108a2ee40SLoGin let r = Arc::new(r); 8208a2ee40SLoGin r.subsystem() 8308a2ee40SLoGin .set_class(Some(Arc::downgrade(&r) as Weak<dyn Class>)); 8408a2ee40SLoGin 8508a2ee40SLoGin return r; 8608a2ee40SLoGin } 8708a2ee40SLoGin } 8808a2ee40SLoGin 8908a2ee40SLoGin impl Class for GraphicsClass { 9008a2ee40SLoGin fn name(&self) -> &'static str { 9108a2ee40SLoGin return Self::NAME; 9208a2ee40SLoGin } 9308a2ee40SLoGin 9408a2ee40SLoGin fn dev_kobj(&self) -> Option<Arc<dyn KObject>> { 9508a2ee40SLoGin Some(sys_dev_char_kset() as Arc<dyn KObject>) 9608a2ee40SLoGin } 9708a2ee40SLoGin 9808a2ee40SLoGin fn set_dev_kobj(&self, _kobj: Arc<dyn KObject>) { 9908a2ee40SLoGin unimplemented!("GraphicsClass::set_dev_kobj"); 10008a2ee40SLoGin } 10108a2ee40SLoGin 10208a2ee40SLoGin fn subsystem(&self) -> &SubSysPrivate { 10308a2ee40SLoGin return &self.subsystem; 10408a2ee40SLoGin } 10508a2ee40SLoGin } 106*c566df45SLoGin 107*c566df45SLoGin /// 帧缓冲区管理器 108*c566df45SLoGin #[derive(Debug)] 109*c566df45SLoGin pub struct FrameBufferManager { 110*c566df45SLoGin inner: RwLock<InnerFrameBufferManager>, 111*c566df45SLoGin } 112*c566df45SLoGin 113*c566df45SLoGin #[derive(Debug)] 114*c566df45SLoGin struct InnerFrameBufferManager { 115*c566df45SLoGin /// 已经注册的帧缓冲区 116*c566df45SLoGin registered_fbs: [Option<Arc<dyn FrameBuffer>>; FrameBufferManager::FB_MAX], 117*c566df45SLoGin } 118*c566df45SLoGin 119*c566df45SLoGin impl FrameBufferManager { 120*c566df45SLoGin pub const FB_MAX: usize = 32; 121*c566df45SLoGin pub fn new() -> Self { 122*c566df45SLoGin Self { 123*c566df45SLoGin inner: RwLock::new(InnerFrameBufferManager { 124*c566df45SLoGin registered_fbs: Default::default(), 125*c566df45SLoGin }), 126*c566df45SLoGin } 127*c566df45SLoGin } 128*c566df45SLoGin 129*c566df45SLoGin /// 注册一个帧缓冲区 130*c566df45SLoGin /// 131*c566df45SLoGin /// # 参数 132*c566df45SLoGin /// 133*c566df45SLoGin /// - fb: 帧缓冲区 134*c566df45SLoGin pub fn register_fb(&self, fb: Arc<dyn FrameBuffer>) -> Result<FbId, SystemError> { 135*c566df45SLoGin let id = self.generate_fb_id().expect("no more fb id"); 136*c566df45SLoGin fb.set_fb_id(id); 137*c566df45SLoGin let fb_device = FbDevice::new(Arc::downgrade(&fb) as Weak<dyn FrameBuffer>, id); 138*c566df45SLoGin device_manager().device_default_initialize(&(fb_device.clone() as Arc<dyn Device>)); 139*c566df45SLoGin fb_device.set_parent(Some(Arc::downgrade(&(fb.clone() as Arc<dyn KObject>)))); 140*c566df45SLoGin 141*c566df45SLoGin fb.set_fb_device(Some(fb_device.clone())); 142*c566df45SLoGin 143*c566df45SLoGin device_manager().add_device(fb_device.clone() as Arc<dyn Device>)?; 144*c566df45SLoGin 145*c566df45SLoGin // todo: 从Modedb中获取信息 146*c566df45SLoGin // 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/video/fbdev/core/fbmem.c#1584 147*c566df45SLoGin 148*c566df45SLoGin let mut inner = self.inner.write(); 149*c566df45SLoGin inner.registered_fbs[id.data() as usize] = Some(fb.clone() as Arc<dyn FrameBuffer>); 150*c566df45SLoGin 151*c566df45SLoGin // todo: 把fb跟fbcon关联起来 152*c566df45SLoGin return Ok(id); 153*c566df45SLoGin } 154*c566df45SLoGin 155*c566df45SLoGin /// 注销一个帧缓冲区 156*c566df45SLoGin /// 157*c566df45SLoGin /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/video/fbdev/core/fbmem.c#1726 158*c566df45SLoGin #[allow(dead_code)] 159*c566df45SLoGin pub fn unregister_fb(&self, _fb: Arc<dyn FrameBuffer>) -> Result<(), SystemError> { 160*c566df45SLoGin todo!("unregister_fb") 161*c566df45SLoGin } 162*c566df45SLoGin 163*c566df45SLoGin /// 根据id查找帧缓冲区 164*c566df45SLoGin pub fn find_fb_by_id(&self, id: FbId) -> Result<Option<Arc<dyn FrameBuffer>>, SystemError> { 165*c566df45SLoGin if unlikely(!id.is_valid()) { 166*c566df45SLoGin return Err(SystemError::EINVAL); 167*c566df45SLoGin } 168*c566df45SLoGin 169*c566df45SLoGin let inner = self.inner.read(); 170*c566df45SLoGin return Ok(inner.registered_fbs[id.data() as usize].clone()); 171*c566df45SLoGin } 172*c566df45SLoGin 173*c566df45SLoGin fn generate_fb_id(&self) -> Option<FbId> { 174*c566df45SLoGin for i in 0..Self::FB_MAX { 175*c566df45SLoGin if self.inner.read().registered_fbs[i].is_none() { 176*c566df45SLoGin return Some(FbId::new(i as u32)); 177*c566df45SLoGin } 178*c566df45SLoGin } 179*c566df45SLoGin return None; 180*c566df45SLoGin } 181*c566df45SLoGin } 182*c566df45SLoGin 183*c566df45SLoGin /// 抽象的帧缓冲区设备 184*c566df45SLoGin /// 185*c566df45SLoGin /// 对应于`/sys/class/graphics/fb(x)`目录下的设备, 其中`(x)`为帧缓冲区的id 186*c566df45SLoGin /// 187*c566df45SLoGin /// 该设备的父设备为真实的帧缓冲区设备 188*c566df45SLoGin #[derive(Debug)] 189*c566df45SLoGin #[cast_to([sync] Device)] 190*c566df45SLoGin pub struct FbDevice { 191*c566df45SLoGin inner: SpinLock<InnerFbDevice>, 192*c566df45SLoGin kobj_state: LockedKObjectState, 193*c566df45SLoGin } 194*c566df45SLoGin 195*c566df45SLoGin impl FbDevice { 196*c566df45SLoGin pub const BASENAME: &'static str = "fb"; 197*c566df45SLoGin fn new(fb: Weak<dyn FrameBuffer>, id: FbId) -> Arc<Self> { 198*c566df45SLoGin Arc::new(Self { 199*c566df45SLoGin inner: SpinLock::new(InnerFbDevice { 200*c566df45SLoGin fb, 201*c566df45SLoGin kern_inode: None, 202*c566df45SLoGin parent: None, 203*c566df45SLoGin kset: None, 204*c566df45SLoGin ktype: None, 205*c566df45SLoGin fb_id: id, 206*c566df45SLoGin }), 207*c566df45SLoGin kobj_state: LockedKObjectState::new(None), 208*c566df45SLoGin }) 209*c566df45SLoGin } 210*c566df45SLoGin 211*c566df45SLoGin pub fn framebuffer(&self) -> Option<Arc<dyn FrameBuffer>> { 212*c566df45SLoGin self.inner.lock().fb.upgrade() 213*c566df45SLoGin } 214*c566df45SLoGin } 215*c566df45SLoGin 216*c566df45SLoGin #[derive(Debug)] 217*c566df45SLoGin struct InnerFbDevice { 218*c566df45SLoGin fb: Weak<dyn FrameBuffer>, 219*c566df45SLoGin kern_inode: Option<Arc<KernFSInode>>, 220*c566df45SLoGin parent: Option<Weak<dyn KObject>>, 221*c566df45SLoGin kset: Option<Arc<KSet>>, 222*c566df45SLoGin ktype: Option<&'static dyn KObjType>, 223*c566df45SLoGin /// 帧缓冲区id 224*c566df45SLoGin fb_id: FbId, 225*c566df45SLoGin } 226*c566df45SLoGin 227*c566df45SLoGin impl KObject for FbDevice { 228*c566df45SLoGin fn as_any_ref(&self) -> &dyn core::any::Any { 229*c566df45SLoGin self 230*c566df45SLoGin } 231*c566df45SLoGin 232*c566df45SLoGin fn set_inode(&self, inode: Option<Arc<KernFSInode>>) { 233*c566df45SLoGin self.inner.lock().kern_inode = inode; 234*c566df45SLoGin } 235*c566df45SLoGin 236*c566df45SLoGin fn inode(&self) -> Option<Arc<KernFSInode>> { 237*c566df45SLoGin self.inner.lock().kern_inode.clone() 238*c566df45SLoGin } 239*c566df45SLoGin 240*c566df45SLoGin fn parent(&self) -> Option<Weak<dyn KObject>> { 241*c566df45SLoGin self.inner.lock().parent.clone() 242*c566df45SLoGin } 243*c566df45SLoGin 244*c566df45SLoGin fn set_parent(&self, parent: Option<Weak<dyn KObject>>) { 245*c566df45SLoGin self.inner.lock().parent = parent; 246*c566df45SLoGin } 247*c566df45SLoGin 248*c566df45SLoGin fn kset(&self) -> Option<Arc<KSet>> { 249*c566df45SLoGin self.inner.lock().kset.clone() 250*c566df45SLoGin } 251*c566df45SLoGin 252*c566df45SLoGin fn set_kset(&self, kset: Option<Arc<KSet>>) { 253*c566df45SLoGin self.inner.lock().kset = kset; 254*c566df45SLoGin } 255*c566df45SLoGin 256*c566df45SLoGin fn kobj_type(&self) -> Option<&'static dyn KObjType> { 257*c566df45SLoGin self.inner.lock().ktype 258*c566df45SLoGin } 259*c566df45SLoGin 260*c566df45SLoGin fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) { 261*c566df45SLoGin self.inner.lock().ktype = ktype; 262*c566df45SLoGin } 263*c566df45SLoGin 264*c566df45SLoGin fn name(&self) -> String { 265*c566df45SLoGin format!("{}{}", Self::BASENAME, self.inner.lock().fb_id.data()) 266*c566df45SLoGin } 267*c566df45SLoGin 268*c566df45SLoGin fn set_name(&self, _name: String) { 269*c566df45SLoGin // do nothing 270*c566df45SLoGin } 271*c566df45SLoGin 272*c566df45SLoGin fn kobj_state(&self) -> RwLockReadGuard<KObjectState> { 273*c566df45SLoGin self.kobj_state.read() 274*c566df45SLoGin } 275*c566df45SLoGin 276*c566df45SLoGin fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> { 277*c566df45SLoGin self.kobj_state.write() 278*c566df45SLoGin } 279*c566df45SLoGin 280*c566df45SLoGin fn set_kobj_state(&self, state: KObjectState) { 281*c566df45SLoGin *self.kobj_state.write() = state; 282*c566df45SLoGin } 283*c566df45SLoGin } 284*c566df45SLoGin 285*c566df45SLoGin impl Device for FbDevice { 286*c566df45SLoGin fn dev_type(&self) -> DeviceType { 287*c566df45SLoGin DeviceType::Char 288*c566df45SLoGin } 289*c566df45SLoGin 290*c566df45SLoGin fn id_table(&self) -> IdTable { 291*c566df45SLoGin IdTable::new( 292*c566df45SLoGin Self::BASENAME.to_string(), 293*c566df45SLoGin Some(DeviceNumber::new( 294*c566df45SLoGin Major::FB_MAJOR, 295*c566df45SLoGin self.inner.lock().fb_id.data(), 296*c566df45SLoGin )), 297*c566df45SLoGin ) 298*c566df45SLoGin } 299*c566df45SLoGin 300*c566df45SLoGin fn set_bus(&self, _bus: Option<Weak<dyn Bus>>) { 301*c566df45SLoGin todo!() 302*c566df45SLoGin } 303*c566df45SLoGin 304*c566df45SLoGin fn class(&self) -> Option<Arc<dyn Class>> { 305*c566df45SLoGin sys_class_graphics_instance().map(|ins| ins.clone() as Arc<dyn Class>) 306*c566df45SLoGin } 307*c566df45SLoGin fn set_class(&self, _class: Option<Arc<dyn Class>>) { 308*c566df45SLoGin // do nothing 309*c566df45SLoGin } 310*c566df45SLoGin 311*c566df45SLoGin fn driver(&self) -> Option<Arc<dyn Driver>> { 312*c566df45SLoGin None 313*c566df45SLoGin } 314*c566df45SLoGin 315*c566df45SLoGin fn set_driver(&self, _driver: Option<Weak<dyn Driver>>) { 316*c566df45SLoGin // do nothing 317*c566df45SLoGin } 318*c566df45SLoGin 319*c566df45SLoGin fn is_dead(&self) -> bool { 320*c566df45SLoGin false 321*c566df45SLoGin } 322*c566df45SLoGin 323*c566df45SLoGin fn can_match(&self) -> bool { 324*c566df45SLoGin false 325*c566df45SLoGin } 326*c566df45SLoGin 327*c566df45SLoGin fn set_can_match(&self, _can_match: bool) { 328*c566df45SLoGin // do nothing 329*c566df45SLoGin } 330*c566df45SLoGin 331*c566df45SLoGin fn state_synced(&self) -> bool { 332*c566df45SLoGin true 333*c566df45SLoGin } 334*c566df45SLoGin 335*c566df45SLoGin fn attribute_groups(&self) -> Option<&'static [&'static dyn AttributeGroup]> { 336*c566df45SLoGin Some(&[&FbDeviceAttrGroup]) 337*c566df45SLoGin } 338*c566df45SLoGin } 339