xref: /DragonOS/kernel/src/driver/video/fbdev/base/fbmem.rs (revision c566df451ce6dbf2af684333e68b39fdfff86498)
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