fbmem.rs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453
  1. use core::intrinsics::unlikely;
  2. use alloc::{
  3. string::{String, ToString},
  4. sync::{Arc, Weak},
  5. vec::Vec,
  6. };
  7. use log::error;
  8. use system_error::SystemError;
  9. use unified_init::macros::unified_init;
  10. use crate::{
  11. driver::base::{
  12. class::{class_manager, Class},
  13. device::{
  14. bus::Bus,
  15. device_manager,
  16. device_number::{DeviceNumber, Major},
  17. driver::Driver,
  18. sys_dev_char_kset, Device, DeviceCommonData, DeviceType, IdTable,
  19. },
  20. kobject::{KObjType, KObject, KObjectCommonData, KObjectState, LockedKObjectState},
  21. kset::KSet,
  22. subsys::SubSysPrivate,
  23. },
  24. filesystem::{
  25. devfs::{devfs_register, DevFS, DeviceINode},
  26. kernfs::KernFSInode,
  27. sysfs::AttributeGroup,
  28. vfs::{
  29. file::FileMode, syscall::ModeType, FilePrivateData, FileSystem, FileType, IndexNode,
  30. Metadata,
  31. },
  32. },
  33. init::initcall::INITCALL_SUBSYS,
  34. libs::{
  35. rwlock::{RwLock, RwLockReadGuard, RwLockWriteGuard},
  36. spinlock::{SpinLock, SpinLockGuard},
  37. },
  38. };
  39. use super::{fbcon::fb_console_init, fbsysfs::FbDeviceAttrGroup, FbId, FrameBuffer};
  40. /// `/sys/class/graphics` 的 class 实例
  41. static mut CLASS_GRAPHICS_INSTANCE: Option<Arc<GraphicsClass>> = None;
  42. lazy_static! {
  43. /// 帧缓冲区管理器
  44. static ref FRAME_BUFFER_MANAGER: FrameBufferManager = FrameBufferManager::new();
  45. }
  46. /// 获取 `/sys/class/graphics` 的 class 实例
  47. #[inline(always)]
  48. #[allow(dead_code)]
  49. pub fn sys_class_graphics_instance() -> Option<&'static Arc<GraphicsClass>> {
  50. unsafe { CLASS_GRAPHICS_INSTANCE.as_ref() }
  51. }
  52. #[inline(always)]
  53. pub fn frame_buffer_manager() -> &'static FrameBufferManager {
  54. &FRAME_BUFFER_MANAGER
  55. }
  56. /// 初始化帧缓冲区子系统
  57. #[unified_init(INITCALL_SUBSYS)]
  58. pub fn fbmem_init() -> Result<(), SystemError> {
  59. let graphics_class = GraphicsClass::new();
  60. class_manager().class_register(&(graphics_class.clone() as Arc<dyn Class>))?;
  61. unsafe {
  62. CLASS_GRAPHICS_INSTANCE = Some(graphics_class);
  63. }
  64. fb_console_init()?;
  65. return Ok(());
  66. }
  67. /// `/sys/class/graphics` 类
  68. #[derive(Debug)]
  69. pub struct GraphicsClass {
  70. subsystem: SubSysPrivate,
  71. }
  72. impl GraphicsClass {
  73. const NAME: &'static str = "graphics";
  74. pub fn new() -> Arc<Self> {
  75. let r = Self {
  76. subsystem: SubSysPrivate::new(Self::NAME.to_string(), None, None, &[]),
  77. };
  78. let r = Arc::new(r);
  79. r.subsystem()
  80. .set_class(Some(Arc::downgrade(&r) as Weak<dyn Class>));
  81. return r;
  82. }
  83. }
  84. impl Class for GraphicsClass {
  85. fn name(&self) -> &'static str {
  86. return Self::NAME;
  87. }
  88. fn dev_kobj(&self) -> Option<Arc<dyn KObject>> {
  89. Some(sys_dev_char_kset() as Arc<dyn KObject>)
  90. }
  91. fn set_dev_kobj(&self, _kobj: Arc<dyn KObject>) {
  92. unimplemented!("GraphicsClass::set_dev_kobj");
  93. }
  94. fn subsystem(&self) -> &SubSysPrivate {
  95. return &self.subsystem;
  96. }
  97. }
  98. /// 帧缓冲区管理器
  99. #[derive(Debug)]
  100. pub struct FrameBufferManager {
  101. inner: RwLock<InnerFrameBufferManager>,
  102. }
  103. #[derive(Debug)]
  104. struct InnerFrameBufferManager {
  105. /// 已经注册的帧缓冲区
  106. registered_fbs: [Option<Arc<dyn FrameBuffer>>; FrameBufferManager::FB_MAX],
  107. }
  108. impl FrameBufferManager {
  109. pub const FB_MAX: usize = 32;
  110. pub fn new() -> Self {
  111. Self {
  112. inner: RwLock::new(InnerFrameBufferManager {
  113. registered_fbs: Default::default(),
  114. }),
  115. }
  116. }
  117. /// 注册一个帧缓冲区
  118. ///
  119. /// # 参数
  120. ///
  121. /// - fb: 帧缓冲区
  122. pub fn register_fb(&self, fb: Arc<dyn FrameBuffer>) -> Result<FbId, SystemError> {
  123. let id = self.generate_fb_id().expect("no more fb id");
  124. fb.set_fb_id(id);
  125. let fb_device = FbDevice::new(Arc::downgrade(&fb) as Weak<dyn FrameBuffer>, id);
  126. device_manager().device_default_initialize(&(fb_device.clone() as Arc<dyn Device>));
  127. fb_device.set_dev_parent(Some(Arc::downgrade(&(fb.clone() as Arc<dyn Device>))));
  128. fb.set_fb_device(Some(fb_device.clone()));
  129. device_manager().add_device(fb_device.clone() as Arc<dyn Device>)?;
  130. // 添加到devfs
  131. devfs_register(&fb_device.name(), fb_device.clone()).map_err(|e| {
  132. error!(
  133. "register fb device '{}' to devfs failed: {:?}",
  134. fb_device.name(),
  135. e
  136. );
  137. device_manager().remove(&(fb_device.clone() as Arc<dyn Device>));
  138. e
  139. })?;
  140. // todo: 从Modedb中获取信息
  141. // 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/video/fbdev/core/fbmem.c#1584
  142. let mut inner = self.inner.write();
  143. inner.registered_fbs[id.data() as usize] = Some(fb.clone() as Arc<dyn FrameBuffer>);
  144. // todo: 把fb跟fbcon关联起来
  145. return Ok(id);
  146. }
  147. /// 注销一个帧缓冲区
  148. ///
  149. /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/video/fbdev/core/fbmem.c#1726
  150. #[allow(dead_code)]
  151. pub fn unregister_fb(&self, _fb: Arc<dyn FrameBuffer>) -> Result<(), SystemError> {
  152. todo!("unregister_fb")
  153. }
  154. /// 根据id查找帧缓冲区
  155. pub fn find_fb_by_id(&self, id: FbId) -> Result<Option<Arc<dyn FrameBuffer>>, SystemError> {
  156. if unlikely(!id.is_valid()) {
  157. return Err(SystemError::EINVAL);
  158. }
  159. let inner = self.inner.read();
  160. return Ok(inner.registered_fbs[id.data() as usize].clone());
  161. }
  162. fn generate_fb_id(&self) -> Option<FbId> {
  163. for i in 0..Self::FB_MAX {
  164. if self.inner.read().registered_fbs[i].is_none() {
  165. return Some(FbId::new(i as u32));
  166. }
  167. }
  168. return None;
  169. }
  170. }
  171. /// 抽象的帧缓冲区设备
  172. ///
  173. /// 对应于`/sys/class/graphics/fb(x)`目录下的设备, 其中`(x)`为帧缓冲区的id
  174. ///
  175. /// 该设备的父设备为真实的帧缓冲区设备
  176. #[derive(Debug)]
  177. #[cast_to([sync] Device)]
  178. pub struct FbDevice {
  179. inner: SpinLock<InnerFbDevice>,
  180. kobj_state: LockedKObjectState,
  181. }
  182. impl FbDevice {
  183. pub const BASENAME: &'static str = "fb";
  184. fn new(fb: Weak<dyn FrameBuffer>, id: FbId) -> Arc<Self> {
  185. let r = Arc::new(Self {
  186. inner: SpinLock::new(InnerFbDevice {
  187. fb,
  188. kobject_common: KObjectCommonData::default(),
  189. device_common: DeviceCommonData::default(),
  190. fb_id: id,
  191. device_inode_fs: None,
  192. devfs_metadata: Metadata::new(
  193. FileType::FramebufferDevice,
  194. ModeType::from_bits_truncate(0o666),
  195. ),
  196. }),
  197. kobj_state: LockedKObjectState::new(None),
  198. });
  199. let mut inner_guard = r.inner.lock();
  200. inner_guard.devfs_metadata.raw_dev = r.do_device_number(&inner_guard);
  201. drop(inner_guard);
  202. return r;
  203. }
  204. pub fn framebuffer(&self) -> Option<Arc<dyn FrameBuffer>> {
  205. self.inner.lock().fb.upgrade()
  206. }
  207. /// 获取设备号
  208. pub fn device_number(&self) -> DeviceNumber {
  209. let inner_guard = self.inner.lock();
  210. self.do_device_number(&inner_guard)
  211. }
  212. fn do_device_number(&self, inner_guard: &SpinLockGuard<'_, InnerFbDevice>) -> DeviceNumber {
  213. DeviceNumber::new(Major::FB_MAJOR, inner_guard.fb_id.data())
  214. }
  215. fn inner(&self) -> SpinLockGuard<InnerFbDevice> {
  216. self.inner.lock()
  217. }
  218. }
  219. #[derive(Debug)]
  220. struct InnerFbDevice {
  221. fb: Weak<dyn FrameBuffer>,
  222. kobject_common: KObjectCommonData,
  223. device_common: DeviceCommonData,
  224. /// 帧缓冲区id
  225. fb_id: FbId,
  226. /// device inode要求的字段
  227. device_inode_fs: Option<Weak<DevFS>>,
  228. devfs_metadata: Metadata,
  229. }
  230. impl KObject for FbDevice {
  231. fn as_any_ref(&self) -> &dyn core::any::Any {
  232. self
  233. }
  234. fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
  235. self.inner().kobject_common.kern_inode = inode;
  236. }
  237. fn inode(&self) -> Option<Arc<KernFSInode>> {
  238. self.inner().kobject_common.kern_inode.clone()
  239. }
  240. fn parent(&self) -> Option<Weak<dyn KObject>> {
  241. self.inner().kobject_common.parent.clone()
  242. }
  243. fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
  244. self.inner().kobject_common.parent = parent;
  245. }
  246. fn kset(&self) -> Option<Arc<KSet>> {
  247. self.inner().kobject_common.kset.clone()
  248. }
  249. fn set_kset(&self, kset: Option<Arc<KSet>>) {
  250. self.inner().kobject_common.kset = kset;
  251. }
  252. fn kobj_type(&self) -> Option<&'static dyn KObjType> {
  253. self.inner().kobject_common.kobj_type
  254. }
  255. fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
  256. self.inner().kobject_common.kobj_type = ktype;
  257. }
  258. fn name(&self) -> String {
  259. format!("{}{}", Self::BASENAME, self.inner.lock().fb_id.data())
  260. }
  261. fn set_name(&self, _name: String) {
  262. // do nothing
  263. }
  264. fn kobj_state(&self) -> RwLockReadGuard<KObjectState> {
  265. self.kobj_state.read()
  266. }
  267. fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> {
  268. self.kobj_state.write()
  269. }
  270. fn set_kobj_state(&self, state: KObjectState) {
  271. *self.kobj_state.write() = state;
  272. }
  273. }
  274. impl Device for FbDevice {
  275. fn dev_type(&self) -> DeviceType {
  276. DeviceType::Char
  277. }
  278. fn id_table(&self) -> IdTable {
  279. IdTable::new(Self::BASENAME.to_string(), Some(self.device_number()))
  280. }
  281. fn set_bus(&self, _bus: Option<Weak<dyn Bus>>) {
  282. todo!()
  283. }
  284. fn class(&self) -> Option<Arc<dyn Class>> {
  285. sys_class_graphics_instance().map(|ins| ins.clone() as Arc<dyn Class>)
  286. }
  287. fn set_class(&self, _class: Option<Weak<dyn Class>>) {
  288. // do nothing
  289. }
  290. fn driver(&self) -> Option<Arc<dyn Driver>> {
  291. None
  292. }
  293. fn set_driver(&self, _driver: Option<Weak<dyn Driver>>) {
  294. // do nothing
  295. }
  296. fn is_dead(&self) -> bool {
  297. false
  298. }
  299. fn can_match(&self) -> bool {
  300. false
  301. }
  302. fn set_can_match(&self, _can_match: bool) {
  303. // do nothing
  304. }
  305. fn state_synced(&self) -> bool {
  306. true
  307. }
  308. fn attribute_groups(&self) -> Option<&'static [&'static dyn AttributeGroup]> {
  309. Some(&[&FbDeviceAttrGroup])
  310. }
  311. fn dev_parent(&self) -> Option<Weak<dyn Device>> {
  312. self.inner().device_common.get_parent_weak_or_clear()
  313. }
  314. fn set_dev_parent(&self, dev_parent: Option<Weak<dyn Device>>) {
  315. self.inner().device_common.parent = dev_parent;
  316. }
  317. }
  318. impl DeviceINode for FbDevice {
  319. fn set_fs(&self, fs: Weak<DevFS>) {
  320. self.inner.lock().device_inode_fs = Some(fs);
  321. }
  322. }
  323. impl IndexNode for FbDevice {
  324. fn open(
  325. &self,
  326. _data: SpinLockGuard<FilePrivateData>,
  327. _mode: &FileMode,
  328. ) -> Result<(), SystemError> {
  329. Ok(())
  330. }
  331. fn close(&self, _data: SpinLockGuard<FilePrivateData>) -> Result<(), SystemError> {
  332. Ok(())
  333. }
  334. fn read_at(
  335. &self,
  336. offset: usize,
  337. len: usize,
  338. buf: &mut [u8],
  339. _data: SpinLockGuard<FilePrivateData>,
  340. ) -> Result<usize, SystemError> {
  341. let fb = self.inner.lock().fb.upgrade().unwrap();
  342. return fb.fb_read(&mut buf[0..len], offset);
  343. }
  344. fn write_at(
  345. &self,
  346. offset: usize,
  347. len: usize,
  348. buf: &[u8],
  349. _data: SpinLockGuard<FilePrivateData>,
  350. ) -> Result<usize, SystemError> {
  351. let fb = self.inner.lock().fb.upgrade().unwrap();
  352. return fb.fb_write(&buf[0..len], offset);
  353. }
  354. fn fs(&self) -> Arc<dyn FileSystem> {
  355. self.inner
  356. .lock()
  357. .device_inode_fs
  358. .as_ref()
  359. .unwrap()
  360. .upgrade()
  361. .unwrap()
  362. }
  363. fn as_any_ref(&self) -> &dyn core::any::Any {
  364. self
  365. }
  366. fn list(&self) -> Result<Vec<String>, SystemError> {
  367. todo!()
  368. }
  369. fn metadata(&self) -> Result<Metadata, SystemError> {
  370. Ok(self.inner.lock().devfs_metadata.clone())
  371. }
  372. fn resize(&self, _len: usize) -> Result<(), SystemError> {
  373. return Ok(());
  374. }
  375. }