fbmem.rs 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. use core::intrinsics::unlikely;
  2. use alloc::{
  3. string::{String, ToString},
  4. sync::{Arc, Weak},
  5. };
  6. use system_error::SystemError;
  7. use unified_init::macros::unified_init;
  8. use crate::{
  9. driver::base::{
  10. class::{class_manager, Class},
  11. device::{
  12. bus::Bus,
  13. device_manager,
  14. device_number::{DeviceNumber, Major},
  15. driver::Driver,
  16. sys_dev_char_kset, Device, DeviceType, IdTable,
  17. },
  18. kobject::{KObjType, KObject, KObjectState, LockedKObjectState},
  19. kset::KSet,
  20. subsys::SubSysPrivate,
  21. },
  22. filesystem::{kernfs::KernFSInode, sysfs::AttributeGroup},
  23. init::initcall::INITCALL_SUBSYS,
  24. libs::{
  25. rwlock::{RwLock, RwLockReadGuard, RwLockWriteGuard},
  26. spinlock::SpinLock,
  27. },
  28. };
  29. use super::{fbcon::fb_console_init, fbsysfs::FbDeviceAttrGroup, FbId, FrameBuffer};
  30. /// `/sys/class/graphics` 的 class 实例
  31. static mut CLASS_GRAPHICS_INSTANCE: Option<Arc<GraphicsClass>> = None;
  32. lazy_static! {
  33. /// 帧缓冲区管理器
  34. static ref FRAME_BUFFER_MANAGER: FrameBufferManager = FrameBufferManager::new();
  35. }
  36. /// 获取 `/sys/class/graphics` 的 class 实例
  37. #[inline(always)]
  38. #[allow(dead_code)]
  39. pub fn sys_class_graphics_instance() -> Option<&'static Arc<GraphicsClass>> {
  40. unsafe { CLASS_GRAPHICS_INSTANCE.as_ref() }
  41. }
  42. #[inline(always)]
  43. pub fn frame_buffer_manager() -> &'static FrameBufferManager {
  44. &FRAME_BUFFER_MANAGER
  45. }
  46. /// 初始化帧缓冲区子系统
  47. #[unified_init(INITCALL_SUBSYS)]
  48. pub fn fbmem_init() -> Result<(), SystemError> {
  49. let graphics_class = GraphicsClass::new();
  50. class_manager().class_register(&(graphics_class.clone() as Arc<dyn Class>))?;
  51. unsafe {
  52. CLASS_GRAPHICS_INSTANCE = Some(graphics_class);
  53. }
  54. fb_console_init()?;
  55. return Ok(());
  56. }
  57. /// `/sys/class/graphics` 类
  58. #[derive(Debug)]
  59. pub struct GraphicsClass {
  60. subsystem: SubSysPrivate,
  61. }
  62. impl GraphicsClass {
  63. const NAME: &'static str = "graphics";
  64. pub fn new() -> Arc<Self> {
  65. let r = Self {
  66. subsystem: SubSysPrivate::new(Self::NAME.to_string(), None, None, &[]),
  67. };
  68. let r = Arc::new(r);
  69. r.subsystem()
  70. .set_class(Some(Arc::downgrade(&r) as Weak<dyn Class>));
  71. return r;
  72. }
  73. }
  74. impl Class for GraphicsClass {
  75. fn name(&self) -> &'static str {
  76. return Self::NAME;
  77. }
  78. fn dev_kobj(&self) -> Option<Arc<dyn KObject>> {
  79. Some(sys_dev_char_kset() as Arc<dyn KObject>)
  80. }
  81. fn set_dev_kobj(&self, _kobj: Arc<dyn KObject>) {
  82. unimplemented!("GraphicsClass::set_dev_kobj");
  83. }
  84. fn subsystem(&self) -> &SubSysPrivate {
  85. return &self.subsystem;
  86. }
  87. }
  88. /// 帧缓冲区管理器
  89. #[derive(Debug)]
  90. pub struct FrameBufferManager {
  91. inner: RwLock<InnerFrameBufferManager>,
  92. }
  93. #[derive(Debug)]
  94. struct InnerFrameBufferManager {
  95. /// 已经注册的帧缓冲区
  96. registered_fbs: [Option<Arc<dyn FrameBuffer>>; FrameBufferManager::FB_MAX],
  97. }
  98. impl FrameBufferManager {
  99. pub const FB_MAX: usize = 32;
  100. pub fn new() -> Self {
  101. Self {
  102. inner: RwLock::new(InnerFrameBufferManager {
  103. registered_fbs: Default::default(),
  104. }),
  105. }
  106. }
  107. /// 注册一个帧缓冲区
  108. ///
  109. /// # 参数
  110. ///
  111. /// - fb: 帧缓冲区
  112. pub fn register_fb(&self, fb: Arc<dyn FrameBuffer>) -> Result<FbId, SystemError> {
  113. let id = self.generate_fb_id().expect("no more fb id");
  114. fb.set_fb_id(id);
  115. let fb_device = FbDevice::new(Arc::downgrade(&fb) as Weak<dyn FrameBuffer>, id);
  116. device_manager().device_default_initialize(&(fb_device.clone() as Arc<dyn Device>));
  117. fb_device.set_parent(Some(Arc::downgrade(&(fb.clone() as Arc<dyn KObject>))));
  118. fb.set_fb_device(Some(fb_device.clone()));
  119. device_manager().add_device(fb_device.clone() as Arc<dyn Device>)?;
  120. // todo: 从Modedb中获取信息
  121. // 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/video/fbdev/core/fbmem.c#1584
  122. let mut inner = self.inner.write();
  123. inner.registered_fbs[id.data() as usize] = Some(fb.clone() as Arc<dyn FrameBuffer>);
  124. // todo: 把fb跟fbcon关联起来
  125. return Ok(id);
  126. }
  127. /// 注销一个帧缓冲区
  128. ///
  129. /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/video/fbdev/core/fbmem.c#1726
  130. #[allow(dead_code)]
  131. pub fn unregister_fb(&self, _fb: Arc<dyn FrameBuffer>) -> Result<(), SystemError> {
  132. todo!("unregister_fb")
  133. }
  134. /// 根据id查找帧缓冲区
  135. pub fn find_fb_by_id(&self, id: FbId) -> Result<Option<Arc<dyn FrameBuffer>>, SystemError> {
  136. if unlikely(!id.is_valid()) {
  137. return Err(SystemError::EINVAL);
  138. }
  139. let inner = self.inner.read();
  140. return Ok(inner.registered_fbs[id.data() as usize].clone());
  141. }
  142. fn generate_fb_id(&self) -> Option<FbId> {
  143. for i in 0..Self::FB_MAX {
  144. if self.inner.read().registered_fbs[i].is_none() {
  145. return Some(FbId::new(i as u32));
  146. }
  147. }
  148. return None;
  149. }
  150. }
  151. /// 抽象的帧缓冲区设备
  152. ///
  153. /// 对应于`/sys/class/graphics/fb(x)`目录下的设备, 其中`(x)`为帧缓冲区的id
  154. ///
  155. /// 该设备的父设备为真实的帧缓冲区设备
  156. #[derive(Debug)]
  157. #[cast_to([sync] Device)]
  158. pub struct FbDevice {
  159. inner: SpinLock<InnerFbDevice>,
  160. kobj_state: LockedKObjectState,
  161. }
  162. impl FbDevice {
  163. pub const BASENAME: &'static str = "fb";
  164. fn new(fb: Weak<dyn FrameBuffer>, id: FbId) -> Arc<Self> {
  165. Arc::new(Self {
  166. inner: SpinLock::new(InnerFbDevice {
  167. fb,
  168. kern_inode: None,
  169. parent: None,
  170. kset: None,
  171. ktype: None,
  172. fb_id: id,
  173. }),
  174. kobj_state: LockedKObjectState::new(None),
  175. })
  176. }
  177. pub fn framebuffer(&self) -> Option<Arc<dyn FrameBuffer>> {
  178. self.inner.lock().fb.upgrade()
  179. }
  180. }
  181. #[derive(Debug)]
  182. struct InnerFbDevice {
  183. fb: Weak<dyn FrameBuffer>,
  184. kern_inode: Option<Arc<KernFSInode>>,
  185. parent: Option<Weak<dyn KObject>>,
  186. kset: Option<Arc<KSet>>,
  187. ktype: Option<&'static dyn KObjType>,
  188. /// 帧缓冲区id
  189. fb_id: FbId,
  190. }
  191. impl KObject for FbDevice {
  192. fn as_any_ref(&self) -> &dyn core::any::Any {
  193. self
  194. }
  195. fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
  196. self.inner.lock().kern_inode = inode;
  197. }
  198. fn inode(&self) -> Option<Arc<KernFSInode>> {
  199. self.inner.lock().kern_inode.clone()
  200. }
  201. fn parent(&self) -> Option<Weak<dyn KObject>> {
  202. self.inner.lock().parent.clone()
  203. }
  204. fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
  205. self.inner.lock().parent = parent;
  206. }
  207. fn kset(&self) -> Option<Arc<KSet>> {
  208. self.inner.lock().kset.clone()
  209. }
  210. fn set_kset(&self, kset: Option<Arc<KSet>>) {
  211. self.inner.lock().kset = kset;
  212. }
  213. fn kobj_type(&self) -> Option<&'static dyn KObjType> {
  214. self.inner.lock().ktype
  215. }
  216. fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
  217. self.inner.lock().ktype = ktype;
  218. }
  219. fn name(&self) -> String {
  220. format!("{}{}", Self::BASENAME, self.inner.lock().fb_id.data())
  221. }
  222. fn set_name(&self, _name: String) {
  223. // do nothing
  224. }
  225. fn kobj_state(&self) -> RwLockReadGuard<KObjectState> {
  226. self.kobj_state.read()
  227. }
  228. fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> {
  229. self.kobj_state.write()
  230. }
  231. fn set_kobj_state(&self, state: KObjectState) {
  232. *self.kobj_state.write() = state;
  233. }
  234. }
  235. impl Device for FbDevice {
  236. fn dev_type(&self) -> DeviceType {
  237. DeviceType::Char
  238. }
  239. fn id_table(&self) -> IdTable {
  240. IdTable::new(
  241. Self::BASENAME.to_string(),
  242. Some(DeviceNumber::new(
  243. Major::FB_MAJOR,
  244. self.inner.lock().fb_id.data(),
  245. )),
  246. )
  247. }
  248. fn set_bus(&self, _bus: Option<Weak<dyn Bus>>) {
  249. todo!()
  250. }
  251. fn class(&self) -> Option<Arc<dyn Class>> {
  252. sys_class_graphics_instance().map(|ins| ins.clone() as Arc<dyn Class>)
  253. }
  254. fn set_class(&self, _class: Option<Arc<dyn Class>>) {
  255. // do nothing
  256. }
  257. fn driver(&self) -> Option<Arc<dyn Driver>> {
  258. None
  259. }
  260. fn set_driver(&self, _driver: Option<Weak<dyn Driver>>) {
  261. // do nothing
  262. }
  263. fn is_dead(&self) -> bool {
  264. false
  265. }
  266. fn can_match(&self) -> bool {
  267. false
  268. }
  269. fn set_can_match(&self, _can_match: bool) {
  270. // do nothing
  271. }
  272. fn state_synced(&self) -> bool {
  273. true
  274. }
  275. fn attribute_groups(&self) -> Option<&'static [&'static dyn AttributeGroup]> {
  276. Some(&[&FbDeviceAttrGroup])
  277. }
  278. }