xref: /DragonOS/kernel/src/driver/base/map/mod.rs (revision ae5ede03bebe5c4b593ad7a350f0945f1367be7c)
1*ae5ede03SLoGin use core::ops::{Deref, DerefMut};
2b087521eSChiichen 
3*ae5ede03SLoGin use super::device::{mkdev, DeviceNumber, KObject};
4*ae5ede03SLoGin use crate::libs::spinlock::{SpinLock, SpinLockGuard};
50663027bSTingHuang use alloc::{collections::BTreeMap, sync::Arc, vec::Vec};
60663027bSTingHuang 
70663027bSTingHuang const KOBJMAP_HASH_SIZE: usize = 255;
8*ae5ede03SLoGin pub(crate) const DEV_MAJOR_HASH_SIZE: usize = 255;
9*ae5ede03SLoGin pub(crate) const DEV_MAJOR_MAX: usize = 512;
10*ae5ede03SLoGin pub(crate) const MINOR_BITS: usize = 20;
11*ae5ede03SLoGin pub(crate) const MINOR_MASK: usize = 1 << MINOR_BITS - 1;
12b087521eSChiichen /* Marks the bottom of the first segment of free char majors */
13*ae5ede03SLoGin pub(crate) const DEV_MAJOR_DYN_END: usize = 234;
14b087521eSChiichen /* Marks the top and bottom of the second segment of free char majors */
15*ae5ede03SLoGin pub(crate) const DEV_MAJOR_DYN_EXT_START: usize = 511;
16*ae5ede03SLoGin pub(crate) const DEV_MAJOR_DYN_EXT_END: usize = 384;
170663027bSTingHuang 
180663027bSTingHuang /// @brief: 字符设备与块设备管理结构体
190663027bSTingHuang #[derive(Debug, Clone)]
200663027bSTingHuang struct Probe(Arc<dyn KObject>);
210663027bSTingHuang 
220663027bSTingHuang impl Probe {
230663027bSTingHuang     /// @brief: 新建probe实例
240663027bSTingHuang     /// @parameter: data: probe实例
250663027bSTingHuang     /// @return: probe实例
260663027bSTingHuang     pub fn new(data: Arc<dyn KObject>) -> Self {
270663027bSTingHuang         Self(data)
280663027bSTingHuang     }
290663027bSTingHuang }
300663027bSTingHuang 
310663027bSTingHuang /// @brief: 字符设备和块设备管理实例(锁)
320663027bSTingHuang #[derive(Debug)]
330663027bSTingHuang pub struct LockedKObjMap(SpinLock<KObjMap>);
340663027bSTingHuang 
350663027bSTingHuang impl Default for LockedKObjMap {
360663027bSTingHuang     fn default() -> Self {
370663027bSTingHuang         Self(SpinLock::new(KObjMap::default()))
380663027bSTingHuang     }
390663027bSTingHuang }
400663027bSTingHuang 
410663027bSTingHuang /// @brief: 字符设备和块设备管理实例
420663027bSTingHuang #[derive(Debug, Clone)]
430663027bSTingHuang struct KObjMap(Vec<BTreeMap<DeviceNumber, Probe>>);
440663027bSTingHuang 
450663027bSTingHuang impl Default for KObjMap {
460663027bSTingHuang     fn default() -> Self {
470663027bSTingHuang         Self(vec![BTreeMap::new(); KOBJMAP_HASH_SIZE])
480663027bSTingHuang     }
490663027bSTingHuang }
500663027bSTingHuang 
510663027bSTingHuang /// @brief: obj设备注册
520663027bSTingHuang /// @parameter: domain: 管理实例
530663027bSTingHuang ///             dev_t: 设备号
540663027bSTingHuang ///             range: 次设备号范围
550663027bSTingHuang ///             data: 设备实例
560663027bSTingHuang /// @return: none
570663027bSTingHuang pub fn kobj_map(
580663027bSTingHuang     domain: Arc<LockedKObjMap>,
590663027bSTingHuang     dev_t: DeviceNumber,
600663027bSTingHuang     range: usize,
610663027bSTingHuang     data: Arc<dyn KObject>,
620663027bSTingHuang ) {
630663027bSTingHuang     if let Some(map) = domain.0.lock().0.get_mut(dev_t.major() % 255) {
640663027bSTingHuang         for i in 0..range {
650663027bSTingHuang             map.insert(
660663027bSTingHuang                 mkdev(dev_t.major(), dev_t.minor() + i),
670663027bSTingHuang                 Probe::new(data.clone()),
680663027bSTingHuang             );
690663027bSTingHuang         }
700663027bSTingHuang     }
710663027bSTingHuang }
720663027bSTingHuang 
730663027bSTingHuang /// @brief: obj设备注销
740663027bSTingHuang /// @parameter: domain: 管理实例
750663027bSTingHuang ///             dev_t: 设备号
760663027bSTingHuang ///             range: 次设备号范围
770663027bSTingHuang /// @return: none
780663027bSTingHuang pub fn kobj_unmap(domain: Arc<LockedKObjMap>, dev_t: DeviceNumber, range: usize) {
790663027bSTingHuang     if let Some(map) = domain.0.lock().0.get_mut(dev_t.major() % 255) {
800663027bSTingHuang         for i in 0..range {
810663027bSTingHuang             let rm_dev_t = &DeviceNumber::new(Into::<usize>::into(dev_t) + i);
820663027bSTingHuang             match map.get(rm_dev_t) {
830663027bSTingHuang                 Some(_) => {
840663027bSTingHuang                     map.remove(rm_dev_t);
850663027bSTingHuang                 }
860663027bSTingHuang                 None => {}
870663027bSTingHuang             }
880663027bSTingHuang         }
890663027bSTingHuang     }
900663027bSTingHuang }
910663027bSTingHuang 
920663027bSTingHuang /// @brief: 设备查找
930663027bSTingHuang /// @parameter: domain: 管理实例
940663027bSTingHuang ///             dev_t: 设备号
950663027bSTingHuang /// @return: 查找成功,返回设备实例,否则返回None
960663027bSTingHuang #[allow(dead_code)]
970663027bSTingHuang pub fn kobj_lookup(domain: Arc<LockedKObjMap>, dev_t: DeviceNumber) -> Option<Arc<dyn KObject>> {
980663027bSTingHuang     if let Some(map) = domain.0.lock().0.get(dev_t.major() % 255) {
990663027bSTingHuang         match map.get(&dev_t) {
1000663027bSTingHuang             Some(value) => {
1010663027bSTingHuang                 return Some(value.0.clone());
1020663027bSTingHuang             }
1030663027bSTingHuang             None => {
1040663027bSTingHuang                 return None;
1050663027bSTingHuang             }
1060663027bSTingHuang         }
1070663027bSTingHuang     }
1080663027bSTingHuang     return None;
1090663027bSTingHuang }
110b087521eSChiichen 
111b087521eSChiichen // 管理字符设备号的map(加锁)
112b087521eSChiichen pub struct LockedDevsMap(SpinLock<DevsMap>);
113b087521eSChiichen 
114b087521eSChiichen impl Default for LockedDevsMap {
115b087521eSChiichen     fn default() -> Self {
116b087521eSChiichen         LockedDevsMap(SpinLock::new(DevsMap::default()))
117b087521eSChiichen     }
118b087521eSChiichen }
119b087521eSChiichen 
120*ae5ede03SLoGin impl LockedDevsMap {
121*ae5ede03SLoGin     #[inline(always)]
122*ae5ede03SLoGin     pub fn lock(&self) -> SpinLockGuard<DevsMap> {
123*ae5ede03SLoGin         self.0.lock()
124*ae5ede03SLoGin     }
125*ae5ede03SLoGin }
126*ae5ede03SLoGin 
127b087521eSChiichen // 管理字符设备号的map
128b087521eSChiichen #[derive(Debug)]
129*ae5ede03SLoGin pub struct DevsMap(Vec<Vec<DeviceStruct>>);
130b087521eSChiichen 
131b087521eSChiichen impl Default for DevsMap {
132b087521eSChiichen     fn default() -> Self {
133b087521eSChiichen         DevsMap(vec![Vec::new(); DEV_MAJOR_HASH_SIZE])
134b087521eSChiichen     }
135b087521eSChiichen }
136b087521eSChiichen 
137*ae5ede03SLoGin impl Deref for DevsMap {
138*ae5ede03SLoGin     type Target = Vec<Vec<DeviceStruct>>;
139*ae5ede03SLoGin 
140*ae5ede03SLoGin     fn deref(&self) -> &Self::Target {
141*ae5ede03SLoGin         &self.0
142*ae5ede03SLoGin     }
143*ae5ede03SLoGin }
144*ae5ede03SLoGin 
145*ae5ede03SLoGin impl DerefMut for DevsMap {
146*ae5ede03SLoGin     fn deref_mut(&mut self) -> &mut Self::Target {
147*ae5ede03SLoGin         &mut self.0
148*ae5ede03SLoGin     }
149*ae5ede03SLoGin }
150*ae5ede03SLoGin 
151b087521eSChiichen // 字符设备在系统中的实例,devfs通过该结构与实际字符设备进行联系
152b087521eSChiichen #[allow(dead_code)]
153b087521eSChiichen #[derive(Debug, Clone)]
154b087521eSChiichen pub struct DeviceStruct {
155b087521eSChiichen     dev_t: DeviceNumber, //起始设备号
156b087521eSChiichen     minorct: usize,      // 次设备号数量
157b087521eSChiichen     name: &'static str,  //字符设备名
158b087521eSChiichen }
159b087521eSChiichen 
160b087521eSChiichen impl DeviceStruct {
161b087521eSChiichen     /// @brief: 创建实例
162b087521eSChiichen     /// @parameter: dev_t: 设备号
163b087521eSChiichen     ///             minorct: 次设备号数量
164b087521eSChiichen     ///             name: 字符设备名
165b087521eSChiichen     ///             char: 字符设备实例
166b087521eSChiichen     /// @return: 实例
167b087521eSChiichen     ///
168b087521eSChiichen     #[allow(dead_code)]
169b087521eSChiichen     pub fn new(dev_t: DeviceNumber, minorct: usize, name: &'static str) -> Self {
170b087521eSChiichen         Self {
171b087521eSChiichen             dev_t,
172b087521eSChiichen             minorct,
173b087521eSChiichen             name,
174b087521eSChiichen         }
175b087521eSChiichen     }
176b087521eSChiichen 
177b087521eSChiichen     /// @brief: 获取起始次设备号
178b087521eSChiichen     /// @parameter: None
179b087521eSChiichen     /// @return: 起始设备号
180b087521eSChiichen     ///
181b087521eSChiichen     #[allow(dead_code)]
182b087521eSChiichen     pub fn device_number(&self) -> DeviceNumber {
183b087521eSChiichen         self.dev_t
184b087521eSChiichen     }
185b087521eSChiichen 
186b087521eSChiichen     /// @brief: 获取起始次设备号
187b087521eSChiichen     /// @parameter: None
188b087521eSChiichen     /// @return: 起始设备号
189b087521eSChiichen     ///
190b087521eSChiichen     #[allow(dead_code)]
191b087521eSChiichen     pub fn base_minor(&self) -> usize {
192b087521eSChiichen         self.dev_t.minor()
193b087521eSChiichen     }
194b087521eSChiichen 
195b087521eSChiichen     /// @brief: 获取次设备号数量
196b087521eSChiichen     /// @parameter: None
197b087521eSChiichen     /// @return: 次设备号数量
198b087521eSChiichen     #[allow(dead_code)]
199b087521eSChiichen     pub fn minorct(&self) -> usize {
200b087521eSChiichen         self.minorct
201b087521eSChiichen     }
202b087521eSChiichen }
203