xref: /DragonOS/kernel/src/driver/video/fbdev/vesafb.rs (revision 2b7818e80e00fcfe4d03533f587cc125ea5e4bec)
1 use core::sync::atomic::AtomicBool;
2 
3 use alloc::{
4     string::{String, ToString},
5     sync::{Arc, Weak},
6     vec::Vec,
7 };
8 use log::{info, warn};
9 use system_error::SystemError;
10 use unified_init::macros::unified_init;
11 
12 use crate::{
13     driver::{
14         base::{
15             class::Class,
16             device::{
17                 bus::Bus, device_manager, driver::Driver, Device, DeviceState, DeviceType, IdTable,
18             },
19             kobject::{KObjType, KObject, KObjectState, LockedKObjectState},
20             kset::KSet,
21             platform::{
22                 platform_device::{platform_device_manager, PlatformDevice},
23                 platform_driver::{platform_driver_manager, PlatformDriver},
24             },
25         },
26         serial::serial8250::send_to_default_serial8250_port,
27         video::fbdev::base::{fbmem::frame_buffer_manager, FbVisual, FRAME_BUFFER_SET},
28     },
29     filesystem::{
30         kernfs::KernFSInode,
31         sysfs::{file::sysfs_emit_str, Attribute, AttributeGroup, SysFSOpsSupport},
32         vfs::syscall::ModeType,
33     },
34     init::{boot::boot_callbacks, boot_params, initcall::INITCALL_DEVICE},
35     libs::{
36         once::Once,
37         rwlock::{RwLock, RwLockReadGuard, RwLockWriteGuard},
38         spinlock::SpinLock,
39     },
40     mm::{early_ioremap::EarlyIoRemap, PhysAddr, VirtAddr},
41 };
42 
43 use super::base::{
44     fbmem::FbDevice, BlankMode, BootTimeVideoType, FbAccel, FbActivateFlags, FbId, FbState, FbType,
45     FbVModeFlags, FbVarScreenInfo, FbVideoMode, FixedScreenInfo, FrameBuffer, FrameBufferInfo,
46     FrameBufferInfoData, FrameBufferOps,
47 };
48 
49 /// 当前机器上面是否有vesa帧缓冲区
50 static HAS_VESA_FB: AtomicBool = AtomicBool::new(false);
51 
52 lazy_static! {
53     static ref VESAFB_FIX_INFO: RwLock<FixedScreenInfo> = RwLock::new(FixedScreenInfo {
54         id: FixedScreenInfo::name2id("VESA VGA"),
55         fb_type: FbType::PackedPixels,
56         accel: FbAccel::None,
57         ..Default::default()
58     });
59     static ref VESAFB_DEFINED: RwLock<FbVarScreenInfo> = RwLock::new(FbVarScreenInfo {
60         activate: FbActivateFlags::FB_ACTIVATE_NOW,
61         height: None,
62         width: None,
63         right_margin: 32,
64         upper_margin: 16,
65         lower_margin: 4,
66         vsync_len: 4,
67         vmode: FbVModeFlags::FB_VMODE_NONINTERLACED,
68 
69         ..Default::default()
70     });
71 }
72 
73 #[derive(Debug)]
74 #[cast_to([sync] Device)]
75 #[cast_to([sync] PlatformDevice)]
76 pub struct VesaFb {
77     inner: SpinLock<InnerVesaFb>,
78     kobj_state: LockedKObjectState,
79     fb_data: RwLock<FrameBufferInfoData>,
80 }
81 
82 impl VesaFb {
83     pub const NAME: &'static str = "vesa_vga";
84     pub fn new() -> Self {
85         let mut fb_info_data = FrameBufferInfoData::new();
86         fb_info_data.pesudo_palette.resize(256, 0);
87         return Self {
88             inner: SpinLock::new(InnerVesaFb {
89                 bus: None,
90                 class: None,
91                 driver: None,
92                 kern_inode: None,
93                 parent: None,
94                 kset: None,
95                 kobj_type: None,
96                 device_state: DeviceState::NotInitialized,
97                 pdev_id: 0,
98                 pdev_id_auto: false,
99                 fb_id: FbId::INIT,
100                 fb_device: None,
101                 fb_state: FbState::Suspended,
102             }),
103             kobj_state: LockedKObjectState::new(None),
104             fb_data: RwLock::new(fb_info_data),
105         };
106     }
107 }
108 
109 #[derive(Debug)]
110 struct InnerVesaFb {
111     bus: Option<Weak<dyn Bus>>,
112     class: Option<Weak<dyn Class>>,
113     driver: Option<Weak<dyn Driver>>,
114     kern_inode: Option<Arc<KernFSInode>>,
115     parent: Option<Weak<dyn KObject>>,
116     kset: Option<Arc<KSet>>,
117     kobj_type: Option<&'static dyn KObjType>,
118     device_state: DeviceState,
119     pdev_id: i32,
120     pdev_id_auto: bool,
121     fb_id: FbId,
122     fb_device: Option<Arc<FbDevice>>,
123     fb_state: FbState,
124 }
125 
126 impl FrameBuffer for VesaFb {
127     fn fb_id(&self) -> FbId {
128         self.inner.lock().fb_id
129     }
130 
131     fn set_fb_id(&self, id: FbId) {
132         self.inner.lock().fb_id = id;
133     }
134 }
135 
136 impl PlatformDevice for VesaFb {
137     fn pdev_name(&self) -> &str {
138         Self::NAME
139     }
140 
141     fn set_pdev_id(&self, id: i32) {
142         self.inner.lock().pdev_id = id;
143     }
144 
145     fn set_pdev_id_auto(&self, id_auto: bool) {
146         self.inner.lock().pdev_id_auto = id_auto;
147     }
148 
149     fn is_initialized(&self) -> bool {
150         self.inner.lock().device_state == DeviceState::Initialized
151     }
152 
153     fn set_state(&self, set_state: DeviceState) {
154         self.inner.lock().device_state = set_state;
155     }
156 }
157 
158 impl Device for VesaFb {
159     fn dev_type(&self) -> DeviceType {
160         DeviceType::Char
161     }
162 
163     fn id_table(&self) -> IdTable {
164         IdTable::new(self.name(), None)
165     }
166 
167     fn bus(&self) -> Option<Weak<dyn Bus>> {
168         self.inner.lock().bus.clone()
169     }
170 
171     fn set_bus(&self, bus: Option<Weak<dyn Bus>>) {
172         self.inner.lock().bus = bus;
173     }
174 
175     fn set_class(&self, class: Option<Weak<dyn Class>>) {
176         self.inner.lock().class = class;
177     }
178 
179     fn class(&self) -> Option<Arc<dyn Class>> {
180         let mut guard = self.inner.lock();
181 
182         let r = guard.class.clone()?.upgrade();
183         if r.is_none() {
184             // 为了让弱引用失效
185             guard.class = None;
186         }
187 
188         return r;
189     }
190 
191     fn driver(&self) -> Option<Arc<dyn Driver>> {
192         self.inner.lock().driver.clone()?.upgrade()
193     }
194 
195     fn set_driver(&self, driver: Option<Weak<dyn Driver>>) {
196         self.inner.lock().driver = driver;
197     }
198 
199     fn is_dead(&self) -> bool {
200         false
201     }
202 
203     fn can_match(&self) -> bool {
204         true
205     }
206 
207     fn set_can_match(&self, _can_match: bool) {}
208 
209     fn state_synced(&self) -> bool {
210         true
211     }
212 }
213 
214 impl KObject for VesaFb {
215     fn as_any_ref(&self) -> &dyn core::any::Any {
216         self
217     }
218 
219     fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
220         self.inner.lock().kern_inode = inode;
221     }
222 
223     fn inode(&self) -> Option<Arc<KernFSInode>> {
224         self.inner.lock().kern_inode.clone()
225     }
226 
227     fn parent(&self) -> Option<Weak<dyn KObject>> {
228         self.inner.lock().parent.clone()
229     }
230 
231     fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
232         self.inner.lock().parent = parent;
233     }
234 
235     fn kset(&self) -> Option<Arc<KSet>> {
236         self.inner.lock().kset.clone()
237     }
238 
239     fn set_kset(&self, kset: Option<Arc<KSet>>) {
240         self.inner.lock().kset = kset;
241     }
242 
243     fn kobj_type(&self) -> Option<&'static dyn KObjType> {
244         self.inner.lock().kobj_type
245     }
246 
247     fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
248         self.inner.lock().kobj_type = ktype;
249     }
250 
251     fn name(&self) -> String {
252         Self::NAME.to_string()
253     }
254 
255     fn set_name(&self, _name: String) {
256         // do nothing
257     }
258 
259     fn kobj_state(&self) -> RwLockReadGuard<KObjectState> {
260         self.kobj_state.read()
261     }
262 
263     fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> {
264         self.kobj_state.write()
265     }
266 
267     fn set_kobj_state(&self, state: KObjectState) {
268         *self.kobj_state.write() = state;
269     }
270 }
271 
272 impl FrameBufferOps for VesaFb {
273     fn fb_open(&self, _user: bool) {
274         todo!()
275     }
276 
277     fn fb_release(&self, _user: bool) {
278         todo!()
279     }
280 
281     fn fb_set_color_register(
282         &self,
283         regno: u16,
284         mut red: u16,
285         mut green: u16,
286         mut blue: u16,
287     ) -> Result<(), SystemError> {
288         let mut fb_data = self.framebuffer_info_data().write();
289         let var = self.current_fb_var();
290         if regno as usize >= fb_data.pesudo_palette.len() {
291             return Err(SystemError::E2BIG);
292         }
293 
294         if var.bits_per_pixel == 8 {
295             todo!("vesa_setpalette todo");
296         } else if regno < 16 {
297             match var.bits_per_pixel {
298                 16 => {
299                     if var.red.offset == 10 {
300                         // RGB 1:5:5:5
301                         fb_data.pesudo_palette[regno as usize] = ((red as u32 & 0xf800) >> 1)
302                             | ((green as u32 & 0xf800) >> 6)
303                             | ((blue as u32 & 0xf800) >> 11);
304                     } else {
305                         fb_data.pesudo_palette[regno as usize] = (red as u32 & 0xf800)
306                             | ((green as u32 & 0xfc00) >> 5)
307                             | ((blue as u32 & 0xf800) >> 11);
308                     }
309                 }
310                 24 | 32 => {
311                     red >>= 8;
312                     green >>= 8;
313                     blue >>= 8;
314                     fb_data.pesudo_palette[regno as usize] = ((red as u32) << var.red.offset)
315                         | ((green as u32) << var.green.offset)
316                         | ((blue as u32) << var.blue.offset);
317                 }
318                 _ => {}
319             }
320         }
321 
322         Ok(())
323     }
324 
325     fn fb_blank(&self, _blank_mode: BlankMode) -> Result<(), SystemError> {
326         todo!()
327     }
328 
329     fn fb_destroy(&self) {
330         todo!()
331     }
332 
333     fn fb_read(&self, buf: &mut [u8], pos: usize) -> Result<usize, SystemError> {
334         let bp = boot_params().read();
335 
336         let vaddr = bp.screen_info.lfb_virt_base.ok_or(SystemError::ENODEV)?;
337         let size = self.current_fb_fix().smem_len;
338         drop(bp);
339         if pos >= size {
340             return Ok(0);
341         }
342 
343         let pos = pos as i64;
344         let size = size as i64;
345 
346         let len = core::cmp::min(size - pos, buf.len() as i64) as usize;
347 
348         let slice = unsafe { core::slice::from_raw_parts(vaddr.as_ptr::<u8>(), size as usize) };
349         buf[..len].copy_from_slice(&slice[pos as usize..(pos as usize + len)]);
350 
351         return Ok(len);
352     }
353 
354     fn fb_write(&self, buf: &[u8], pos: usize) -> Result<usize, SystemError> {
355         let bp = boot_params().read();
356 
357         let vaddr = bp.screen_info.lfb_virt_base.ok_or(SystemError::ENODEV)?;
358         let size = self.current_fb_fix().smem_len;
359 
360         if pos >= size {
361             return Ok(0);
362         }
363 
364         let pos = pos as i64;
365         let size = size as i64;
366 
367         let len = core::cmp::min(size - pos, buf.len() as i64) as usize;
368 
369         let slice = unsafe { core::slice::from_raw_parts_mut(vaddr.as_ptr::<u8>(), size as usize) };
370         slice[pos as usize..(pos as usize + len)].copy_from_slice(&buf[..len]);
371 
372         return Ok(len);
373     }
374 
375     fn fb_image_blit(&self, image: &super::base::FbImage) {
376         self.generic_imageblit(image);
377     }
378 
379     /// ## 填充矩形
380     fn fb_fillrect(&self, rect: super::base::FillRectData) -> Result<(), SystemError> {
381         // warn!("rect {rect:?}");
382 
383         let boot_param = boot_params().read();
384         let screen_base = boot_param
385             .screen_info
386             .lfb_virt_base
387             .ok_or(SystemError::ENODEV)?;
388 
389         let fg = if self.current_fb_fix().visual == FbVisual::TrueColor
390             || self.current_fb_fix().visual == FbVisual::DirectColor
391         {
392             self.fb_data.read().pesudo_palette[rect.color as usize]
393         } else {
394             rect.color
395         };
396 
397         let bpp = self.current_fb_var().bits_per_pixel;
398         // 每行像素数
399         let line_offset = self.current_fb_var().xres;
400         match bpp {
401             32 => {
402                 let base = screen_base.as_ptr::<u32>();
403 
404                 for y in rect.dy..(rect.dy + rect.height) {
405                     for x in rect.dx..(rect.dx + rect.width) {
406                         unsafe { *base.add((y * line_offset + x) as usize) = fg };
407                     }
408                 }
409             }
410             16 => {
411                 let base = screen_base.as_ptr::<u16>();
412 
413                 for y in rect.dy..(rect.dy + rect.height) {
414                     for x in rect.dx..(rect.dx + rect.width) {
415                         unsafe { *base.add((y * line_offset + x) as usize) = 0x0000 };
416                     }
417                 }
418             }
419             24 => {
420                 let base = screen_base.as_ptr::<[u8; 3]>();
421 
422                 for y in rect.dy..(rect.dy + rect.height) {
423                     for x in rect.dx..(rect.dx + rect.width) {
424                         unsafe { *base.add((y * line_offset + x) as usize) = [0, 0, 0] };
425                     }
426                 }
427             }
428             _ => {
429                 send_to_default_serial8250_port(
430                     format!("unsupported bit depth:{}!\n\0", bpp).as_bytes(),
431                 );
432                 todo!()
433             }
434         }
435 
436         Ok(())
437     }
438 
439     #[inline(never)]
440     fn fb_copyarea(&self, data: super::base::CopyAreaData) {
441         let bp = boot_params().read();
442         let base = bp.screen_info.lfb_virt_base.unwrap();
443         let var = self.current_fb_var();
444 
445         // 原区域或者目标区域全在屏幕外,则直接返回
446         if data.sx > var.xres as i32
447             || data.sy > var.yres as i32
448             || data.dx > var.xres as i32
449             || data.dy > var.yres as i32
450             || (data.sx + data.width as i32) < 0
451             || (data.sy + data.height as i32) < 0
452             || (data.dx + data.width as i32) < 0
453             || (data.dy + data.height as i32) < 0
454         {
455             return;
456         }
457 
458         // 求两个矩形可视范围交集
459         let (s_visiable_x, s_w) = if data.sx < 0 {
460             (0, (data.width - ((-data.sx) as u32)).min(var.xres))
461         } else {
462             let w = if data.sx as u32 + data.width > var.xres {
463                 var.xres - data.sx as u32
464             } else {
465                 data.width
466             };
467 
468             (data.sx, w)
469         };
470         let (s_visiable_y, s_h) = if data.sy < 0 {
471             (0, (data.height - ((-data.sy) as u32).min(var.yres)))
472         } else {
473             let h = if data.sy as u32 + data.height > var.yres {
474                 var.yres - data.sy as u32
475             } else {
476                 data.height
477             };
478 
479             (data.sy, h)
480         };
481 
482         let (d_visiable_x, d_w) = if data.dx < 0 {
483             (0, (data.width - ((-data.dx) as u32)).min(var.xres))
484         } else {
485             let w = if data.dx as u32 + data.width > var.xres {
486                 var.xres - data.dx as u32
487             } else {
488                 data.width
489             };
490 
491             (data.dx, w)
492         };
493         let (d_visiable_y, d_h) = if data.dy < 0 {
494             (0, (data.height - ((-data.dy) as u32).min(var.yres)))
495         } else {
496             let h = if data.dy as u32 + data.height > var.yres {
497                 var.yres - data.dy as u32
498             } else {
499                 data.height
500             };
501 
502             (data.dy, h)
503         };
504 
505         // 可视范围无交集
506         if !(d_h + s_h > data.height && s_w + d_w > data.width) {
507             return;
508         }
509 
510         // 可视区域左上角相对于矩形的坐标
511         let s_relative_x = s_visiable_x - data.sx;
512         let s_relative_y = s_visiable_y - data.sy;
513         let d_relative_x = d_visiable_x - data.dx;
514         let d_relative_y = d_visiable_y - data.dy;
515 
516         let visiable_x = s_relative_x.max(d_relative_x);
517         let visiable_y = s_relative_y.max(d_relative_y);
518         let visiable_h = d_h + s_h - data.height;
519         let visiable_w = d_w + s_w - data.width;
520 
521         let s_real_x = (visiable_x + data.sx) as u32;
522         let s_real_y = (visiable_y + data.sy) as u32;
523         let d_real_x = (visiable_x + data.dx) as u32;
524         let d_real_y = (visiable_y + data.dy) as u32;
525 
526         let bytes_per_pixel = var.bits_per_pixel >> 3;
527         let bytes_per_line = var.xres * bytes_per_pixel;
528 
529         let src =
530             base + VirtAddr::new((s_real_y * bytes_per_line + s_real_x * bytes_per_pixel) as usize);
531 
532         let dst =
533             base + VirtAddr::new((d_real_y * bytes_per_line + d_real_x * bytes_per_pixel) as usize);
534 
535         let size = (visiable_h * visiable_w) as usize;
536 
537         match bytes_per_pixel {
538             4 => {
539                 // 32bpp
540                 let mut dst = dst.as_ptr::<u32>();
541                 let mut src = src.as_ptr::<u32>();
542                 let line_offset = var.xres as usize;
543 
544                 if s_real_x > d_real_x {
545                     // 如果src在dst下方,则可以直接拷贝不会出现指针覆盖
546                     unsafe {
547                         for _ in 0..visiable_h {
548                             core::ptr::copy(src, dst, visiable_w as usize);
549                             src = src.add(line_offset);
550                             dst = dst.add(visiable_w as usize);
551                         }
552                     }
553                 } else {
554                     let mut tmp: Vec<u32> = vec![0; size];
555                     let mut tmp_ptr = tmp.as_mut_ptr();
556 
557                     // 这里是一个可以优化的点,现在为了避免指针拷贝时覆盖,统一先拷贝进入buf再拷贝到dst
558                     unsafe {
559                         for _ in 0..visiable_h {
560                             core::ptr::copy(src, tmp_ptr, visiable_w as usize);
561                             src = src.add(line_offset);
562                             tmp_ptr = tmp_ptr.add(visiable_w as usize);
563                         }
564 
565                         tmp_ptr = tmp_ptr.sub(size);
566                         for _ in 0..visiable_h {
567                             core::ptr::copy(tmp_ptr, dst, visiable_w as usize);
568                             dst = dst.add(line_offset);
569                             tmp_ptr = tmp_ptr.add(visiable_w as usize);
570                         }
571                     }
572                 }
573             }
574             2 => {
575                 let mut dst = dst.as_ptr::<u16>();
576                 let mut src = src.as_ptr::<u16>();
577                 let line_offset = var.xres as usize;
578 
579                 if s_real_x > d_real_x {
580                     // 如果src在dst下方,则可以直接拷贝不会出现指针覆盖
581                     unsafe {
582                         for _ in 0..visiable_h {
583                             core::ptr::copy(src, dst, visiable_w as usize);
584                             src = src.add(line_offset);
585                             dst = dst.add(visiable_w as usize);
586                         }
587                     }
588                 } else {
589                     let mut tmp: Vec<u16> = vec![0; size];
590                     let mut tmp_ptr = tmp.as_mut_ptr();
591 
592                     // 这里是一个可以优化的点,现在为了避免指针拷贝时覆盖,统一先拷贝进入buf再拷贝到dst
593                     unsafe {
594                         for _ in 0..visiable_h {
595                             core::ptr::copy(src, tmp_ptr, visiable_w as usize);
596                             src = src.add(line_offset);
597                             tmp_ptr = tmp_ptr.add(visiable_w as usize);
598                         }
599 
600                         tmp_ptr = tmp_ptr.sub(size);
601                         for _ in 0..visiable_h {
602                             core::ptr::copy(tmp_ptr, dst, visiable_w as usize);
603                             dst = dst.add(line_offset);
604                             tmp_ptr = tmp_ptr.add(visiable_w as usize);
605                         }
606                     }
607                 }
608             }
609             3 => {
610                 let mut dst = dst.as_ptr::<[u8; 3]>();
611                 let mut src = src.as_ptr::<[u8; 3]>();
612                 let line_offset = var.xres as usize;
613 
614                 if s_real_x > d_real_x {
615                     // 如果src在dst下方,则可以直接拷贝不会出现指针覆盖
616                     unsafe {
617                         for _ in 0..visiable_h {
618                             core::ptr::copy(src, dst, visiable_w as usize);
619                             src = src.add(line_offset);
620                             dst = dst.add(visiable_w as usize);
621                         }
622                     }
623                 } else {
624                     let mut tmp: Vec<u32> = vec![0; size];
625                     let mut tmp_ptr = tmp.as_mut_ptr() as *mut [u8; 3];
626 
627                     // 这里是一个可以优化的点,现在为了避免指针拷贝时覆盖,统一先拷贝进入buf再拷贝到dst
628                     unsafe {
629                         for _ in 0..visiable_h {
630                             core::ptr::copy(src, tmp_ptr, visiable_w as usize);
631                             src = src.add(line_offset);
632                             tmp_ptr = tmp_ptr.add(visiable_w as usize);
633                         }
634 
635                         tmp_ptr = tmp_ptr.sub(size);
636                         for _ in 0..visiable_h {
637                             core::ptr::copy(tmp_ptr, dst, visiable_w as usize);
638                             dst = dst.add(line_offset);
639                             tmp_ptr = tmp_ptr.add(visiable_w as usize);
640                         }
641                     }
642                 }
643             }
644 
645             _ => {
646                 send_to_default_serial8250_port(
647                     format!("bytes_per_pixel:{}\n\0", bytes_per_pixel).as_bytes(),
648                 );
649                 todo!()
650             }
651         }
652     }
653 }
654 
655 impl FrameBufferInfo for VesaFb {
656     fn fb_device(&self) -> Option<Arc<FbDevice>> {
657         self.inner.lock().fb_device.clone()
658     }
659 
660     fn set_fb_device(&self, device: Option<Arc<FbDevice>>) {
661         self.inner.lock().fb_device = device;
662     }
663 
664     fn screen_size(&self) -> usize {
665         todo!()
666     }
667 
668     fn current_fb_var(&self) -> FbVarScreenInfo {
669         *VESAFB_DEFINED.read()
670     }
671 
672     fn current_fb_fix(&self) -> FixedScreenInfo {
673         *VESAFB_FIX_INFO.read()
674     }
675 
676     fn video_mode(&self) -> Option<&FbVideoMode> {
677         todo!()
678     }
679 
680     fn state(&self) -> FbState {
681         self.inner.lock().fb_state
682     }
683 
684     fn framebuffer_info_data(&self) -> &RwLock<FrameBufferInfoData> {
685         &self.fb_data
686     }
687 }
688 
689 #[derive(Debug)]
690 #[cast_to([sync] PlatformDriver)]
691 struct VesaFbDriver {
692     inner: SpinLock<InnerVesaFbDriver>,
693     kobj_state: LockedKObjectState,
694 }
695 
696 impl VesaFbDriver {
697     pub fn new() -> Arc<Self> {
698         let r = Arc::new(Self {
699             inner: SpinLock::new(InnerVesaFbDriver {
700                 ktype: None,
701                 kset: None,
702                 parent: None,
703                 kernfs_inode: None,
704                 devices: Vec::new(),
705                 bus: None,
706                 self_ref: Weak::new(),
707             }),
708             kobj_state: LockedKObjectState::new(None),
709         });
710 
711         r.inner.lock().self_ref = Arc::downgrade(&r);
712 
713         return r;
714     }
715 }
716 
717 #[derive(Debug)]
718 struct InnerVesaFbDriver {
719     ktype: Option<&'static dyn KObjType>,
720     kset: Option<Arc<KSet>>,
721     parent: Option<Weak<dyn KObject>>,
722     kernfs_inode: Option<Arc<KernFSInode>>,
723     devices: Vec<Arc<dyn Device>>,
724     bus: Option<Weak<dyn Bus>>,
725 
726     self_ref: Weak<VesaFbDriver>,
727 }
728 
729 impl VesaFbDriver {
730     const NAME: &'static str = "vesa-framebuffer";
731 }
732 
733 impl PlatformDriver for VesaFbDriver {
734     fn probe(&self, device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError> {
735         let device = device
736             .clone()
737             .arc_any()
738             .downcast::<VesaFb>()
739             .map_err(|_| SystemError::EINVAL)?;
740 
741         device.set_driver(Some(self.inner.lock_irqsave().self_ref.clone()));
742 
743         return Ok(());
744     }
745 
746     fn remove(&self, _device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError> {
747         todo!()
748     }
749 
750     fn shutdown(&self, _device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError> {
751         // do nothing
752         return Ok(());
753     }
754 
755     fn suspend(&self, _device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError> {
756         // do nothing
757         return Ok(());
758     }
759 
760     fn resume(&self, _device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError> {
761         todo!()
762     }
763 }
764 
765 impl Driver for VesaFbDriver {
766     fn id_table(&self) -> Option<IdTable> {
767         Some(IdTable::new(VesaFb::NAME.to_string(), None))
768     }
769 
770     fn devices(&self) -> Vec<Arc<dyn Device>> {
771         self.inner.lock().devices.clone()
772     }
773 
774     fn add_device(&self, device: Arc<dyn Device>) {
775         let mut guard = self.inner.lock();
776         // check if the device is already in the list
777         if guard.devices.iter().any(|dev| Arc::ptr_eq(dev, &device)) {
778             return;
779         }
780 
781         guard.devices.push(device);
782     }
783 
784     fn delete_device(&self, device: &Arc<dyn Device>) {
785         let mut guard = self.inner.lock();
786         guard.devices.retain(|dev| !Arc::ptr_eq(dev, device));
787     }
788 
789     fn set_bus(&self, bus: Option<Weak<dyn Bus>>) {
790         self.inner.lock().bus = bus;
791     }
792 
793     fn bus(&self) -> Option<Weak<dyn Bus>> {
794         self.inner.lock().bus.clone()
795     }
796 
797     fn dev_groups(&self) -> &'static [&'static dyn AttributeGroup] {
798         return &[&VesaFbAnonAttributeGroup];
799     }
800 }
801 
802 impl KObject for VesaFbDriver {
803     fn as_any_ref(&self) -> &dyn core::any::Any {
804         self
805     }
806 
807     fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
808         self.inner.lock().kernfs_inode = inode;
809     }
810 
811     fn inode(&self) -> Option<Arc<KernFSInode>> {
812         self.inner.lock().kernfs_inode.clone()
813     }
814 
815     fn parent(&self) -> Option<Weak<dyn KObject>> {
816         self.inner.lock().parent.clone()
817     }
818 
819     fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
820         self.inner.lock().parent = parent;
821     }
822 
823     fn kset(&self) -> Option<Arc<KSet>> {
824         self.inner.lock().kset.clone()
825     }
826 
827     fn set_kset(&self, kset: Option<Arc<KSet>>) {
828         self.inner.lock().kset = kset;
829     }
830 
831     fn kobj_type(&self) -> Option<&'static dyn KObjType> {
832         self.inner.lock().ktype
833     }
834 
835     fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
836         self.inner.lock().ktype = ktype;
837     }
838 
839     fn name(&self) -> String {
840         Self::NAME.to_string()
841     }
842 
843     fn set_name(&self, _name: String) {
844         // do nothing
845     }
846 
847     fn kobj_state(&self) -> RwLockReadGuard<KObjectState> {
848         self.kobj_state.read()
849     }
850 
851     fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> {
852         self.kobj_state.write()
853     }
854 
855     fn set_kobj_state(&self, state: KObjectState) {
856         *self.kobj_state.write() = state;
857     }
858 }
859 
860 #[derive(Debug)]
861 struct VesaFbAnonAttributeGroup;
862 
863 impl AttributeGroup for VesaFbAnonAttributeGroup {
864     fn name(&self) -> Option<&str> {
865         None
866     }
867 
868     fn attrs(&self) -> &[&'static dyn Attribute] {
869         &[&AnonAttrPhysAddr as &'static dyn Attribute]
870     }
871 
872     fn is_visible(
873         &self,
874         _kobj: Arc<dyn KObject>,
875         attr: &'static dyn Attribute,
876     ) -> Option<ModeType> {
877         Some(attr.mode())
878     }
879 }
880 
881 #[derive(Debug)]
882 struct AnonAttrPhysAddr;
883 
884 impl Attribute for AnonAttrPhysAddr {
885     fn name(&self) -> &str {
886         "smem_start"
887     }
888 
889     fn mode(&self) -> ModeType {
890         ModeType::S_IRUGO
891     }
892 
893     fn support(&self) -> SysFSOpsSupport {
894         SysFSOpsSupport::ATTR_SHOW
895     }
896 
897     fn show(&self, _kobj: Arc<dyn KObject>, buf: &mut [u8]) -> Result<usize, SystemError> {
898         sysfs_emit_str(
899             buf,
900             format!(
901                 "0x{:x}\n",
902                 VESAFB_FIX_INFO
903                     .read()
904                     .smem_start
905                     .unwrap_or(PhysAddr::new(0))
906                     .data()
907             )
908             .as_str(),
909         )
910     }
911 }
912 
913 #[unified_init(INITCALL_DEVICE)]
914 pub fn vesa_fb_driver_init() -> Result<(), SystemError> {
915     let driver = VesaFbDriver::new();
916 
917     platform_driver_manager().register(driver)?;
918 
919     return Ok(());
920 }
921 
922 /// 在内存管理初始化之前,初始化vesafb
923 pub fn vesafb_early_init() -> Result<(), SystemError> {
924     let mut boot_params_guard = boot_params().write();
925     boot_callbacks().early_init_framebuffer_info(&mut boot_params_guard.screen_info)?;
926 
927     HAS_VESA_FB.store(true, core::sync::atomic::Ordering::SeqCst);
928 
929     return Ok(());
930 }
931 
932 pub fn vesafb_early_map(paddr: PhysAddr, size: usize) -> Result<VirtAddr, SystemError> {
933     let (buf_vaddr, _) = EarlyIoRemap::map(paddr, size, false)?;
934 
935     return Ok(buf_vaddr);
936 }
937 
938 #[unified_init(INITCALL_DEVICE)]
939 fn vesa_fb_device_init() -> Result<(), SystemError> {
940     // 如果没有vesa帧缓冲区,直接返回
941     if !HAS_VESA_FB.load(core::sync::atomic::Ordering::SeqCst) {
942         return Ok(());
943     }
944 
945     static INIT: Once = Once::new();
946     INIT.call_once(|| {
947         info!("vesa fb device init");
948         let device = Arc::new(VesaFb::new());
949 
950         let mut fb_fix = VESAFB_FIX_INFO.write_irqsave();
951         let mut fb_var = VESAFB_DEFINED.write_irqsave();
952 
953         let boot_params_guard = boot_params().read();
954         let boottime_screen_info = &boot_params_guard.screen_info;
955 
956         fb_fix.smem_start = Some(boottime_screen_info.lfb_base);
957         fb_fix.smem_len = boottime_screen_info.lfb_size;
958 
959         if boottime_screen_info.video_type == BootTimeVideoType::Mda {
960             fb_fix.visual = FbVisual::Mono10;
961             fb_var.bits_per_pixel = 8;
962             fb_fix.line_length =
963                 (boottime_screen_info.origin_video_cols as u32) * (fb_var.bits_per_pixel / 8);
964             fb_var.xres_virtual = boottime_screen_info.origin_video_cols as u32;
965             fb_var.yres_virtual = boottime_screen_info.origin_video_lines as u32;
966         } else {
967             fb_fix.visual = FbVisual::TrueColor;
968             fb_var.bits_per_pixel = boottime_screen_info.lfb_depth as u32;
969             fb_fix.line_length =
970                 (boottime_screen_info.lfb_width as u32) * (fb_var.bits_per_pixel / 8);
971             fb_var.xres_virtual = boottime_screen_info.lfb_width as u32;
972             fb_var.yres_virtual = boottime_screen_info.lfb_height as u32;
973             fb_var.xres = boottime_screen_info.lfb_width as u32;
974             fb_var.yres = boottime_screen_info.lfb_height as u32;
975         }
976 
977         fb_var.red.length = boottime_screen_info.red_size as u32;
978         fb_var.green.length = boottime_screen_info.green_size as u32;
979         fb_var.blue.length = boottime_screen_info.blue_size as u32;
980 
981         fb_var.red.offset = boottime_screen_info.red_pos as u32;
982         fb_var.green.offset = boottime_screen_info.green_pos as u32;
983         fb_var.blue.offset = boottime_screen_info.blue_pos as u32;
984 
985         // TODO: 这里是暂时这样写的,初始化为RGB888格式,后续vesa初始化完善后删掉下面
986         fb_var.red.offset = 16;
987         fb_var.green.offset = 8;
988         fb_var.blue.offset = 0;
989 
990         if fb_var.bits_per_pixel >= 1 && fb_var.bits_per_pixel <= 8 {
991             fb_var.red.length = fb_var.bits_per_pixel;
992             fb_var.green.length = fb_var.bits_per_pixel;
993             fb_var.blue.length = fb_var.bits_per_pixel;
994         }
995 
996         device_manager().device_default_initialize(&(device.clone() as Arc<dyn Device>));
997 
998         platform_device_manager()
999             .device_add(device.clone() as Arc<dyn PlatformDevice>)
1000             .expect("vesa_fb_device_init: platform_device_manager().device_add failed");
1001 
1002         frame_buffer_manager()
1003             .register_fb(device.clone() as Arc<dyn FrameBuffer>)
1004             .expect("vesa_fb_device_init: frame_buffer_manager().register_fb failed");
1005 
1006         // 加入全局fb表
1007         let mut guard = FRAME_BUFFER_SET.write();
1008         if guard.get(device.fb_id().data() as usize).unwrap().is_some() {
1009             warn!(
1010                 "vesa_fb_device_init: There is already an element {:?} in the FRAME_BUFFER_SET",
1011                 device.fb_id()
1012             );
1013         }
1014         guard[device.fb_id().data() as usize] = Some(device.clone());
1015 
1016         // 设置vesa fb的状态为运行中
1017         device.inner.lock().fb_state = FbState::Running;
1018     });
1019 
1020     return Ok(());
1021 }
1022