xref: /DragonOS/kernel/src/driver/base/platform/mod.rs (revision 06d5e247267cb65b84a80f219853ccd0f384b16e)
1*06d5e247SLoGin use self::{platform_device::PlatformBusDevice, subsys::PlatformBus};
2*06d5e247SLoGin 
3*06d5e247SLoGin use super::{
4*06d5e247SLoGin     device::{
5*06d5e247SLoGin         bus::{bus_register, Bus, BusState},
6*06d5e247SLoGin         device_unregister, sys_devices_kset, DeviceNumber, DevicePrivateData, IdTable,
7*06d5e247SLoGin     },
8*06d5e247SLoGin     kobject::KObject,
92a7d773dSTingHuang };
10*06d5e247SLoGin use crate::{driver::base::device::device_register, syscall::SystemError};
11*06d5e247SLoGin use alloc::{collections::BTreeSet, string::ToString, sync::Arc, vec::Vec};
1278bf93f0SYJwu2023 use core::fmt::Debug;
132a7d773dSTingHuang 
142a7d773dSTingHuang pub mod platform_device;
152a7d773dSTingHuang pub mod platform_driver;
16*06d5e247SLoGin pub mod subsys;
17*06d5e247SLoGin 
18*06d5e247SLoGin static mut PLATFORM_BUS_DEVICE: Option<Arc<PlatformBusDevice>> = None;
19*06d5e247SLoGin static mut PLATFORM_BUS: Option<Arc<PlatformBus>> = None;
20*06d5e247SLoGin 
21*06d5e247SLoGin #[allow(dead_code)]
22*06d5e247SLoGin #[inline(always)]
23*06d5e247SLoGin pub fn platform_bus_device() -> Arc<PlatformBusDevice> {
24*06d5e247SLoGin     unsafe { PLATFORM_BUS_DEVICE.clone().unwrap() }
25*06d5e247SLoGin }
26*06d5e247SLoGin 
27*06d5e247SLoGin #[allow(dead_code)]
28*06d5e247SLoGin #[inline(always)]
29*06d5e247SLoGin pub fn platform_bus() -> Arc<PlatformBus> {
30*06d5e247SLoGin     unsafe { PLATFORM_BUS.clone().unwrap() }
31*06d5e247SLoGin }
322a7d773dSTingHuang 
332a7d773dSTingHuang /// @brief: platform总线匹配表
342a7d773dSTingHuang ///         总线上的设备和驱动都存在一份匹配表
352a7d773dSTingHuang ///         根据匹配表条目是否匹配来辨识设备和驱动能否进行匹配
36b087521eSChiichen #[derive(Debug, Clone)]
372a7d773dSTingHuang pub struct CompatibleTable(BTreeSet<&'static str>);
382a7d773dSTingHuang 
392a7d773dSTingHuang /// @brief: 匹配表操作方法集
402a7d773dSTingHuang impl CompatibleTable {
412a7d773dSTingHuang     /// @brief: 创建一个新的匹配表
422a7d773dSTingHuang     /// @parameter id_vec: 匹配条目数组
432a7d773dSTingHuang     /// @return: 匹配表
442a7d773dSTingHuang     #[inline]
452a7d773dSTingHuang     #[allow(dead_code)]
462a7d773dSTingHuang     pub fn new(id_vec: Vec<&'static str>) -> CompatibleTable {
472a7d773dSTingHuang         CompatibleTable(BTreeSet::from_iter(id_vec.iter().cloned()))
482a7d773dSTingHuang     }
492a7d773dSTingHuang 
502a7d773dSTingHuang     /// @brief: 判断两个匹配表是否能够匹配
512a7d773dSTingHuang     /// @parameter other: 其他匹配表
522a7d773dSTingHuang     /// @return: 如果匹配成功,返回true,否则,返回false
532a7d773dSTingHuang     #[allow(dead_code)]
542a7d773dSTingHuang     pub fn matches(&self, other: &CompatibleTable) -> bool {
55b087521eSChiichen         self.0.intersection(&other.0).next().is_some()
562a7d773dSTingHuang     }
57b087521eSChiichen 
58b087521eSChiichen     /// @brief: 添加一组匹配条目
59b087521eSChiichen     /// @param:
60b087521eSChiichen     #[allow(dead_code)]
61b087521eSChiichen     pub fn add_device(&mut self, devices: Vec<&'static str>) {
62b087521eSChiichen         for str in devices {
63b087521eSChiichen             self.0.insert(str);
642a7d773dSTingHuang         }
652a7d773dSTingHuang     }
662a7d773dSTingHuang }
672a7d773dSTingHuang 
682a7d773dSTingHuang /// @brief: 初始化platform总线
692a7d773dSTingHuang /// @parameter: None
702a7d773dSTingHuang /// @return: None
71*06d5e247SLoGin ///
72*06d5e247SLoGin /// 参考: https://opengrok.ringotek.cn/xref/linux-6.1.9/drivers/base/platform.c?fi=platform_bus_init#1511
73e0de0fd6STingHuang pub fn platform_bus_init() -> Result<(), SystemError> {
74*06d5e247SLoGin     let platform_device: Arc<PlatformBusDevice> = PlatformBusDevice::new(
75*06d5e247SLoGin         DevicePrivateData::new(
76b087521eSChiichen             IdTable::new("platform".to_string(), DeviceNumber::new(0)),
77b087521eSChiichen             None,
78b087521eSChiichen             CompatibleTable::new(vec!["platform"]),
79b087521eSChiichen             BusState::NotInitialized.into(),
80*06d5e247SLoGin         ),
81*06d5e247SLoGin         Some(Arc::downgrade(&(sys_devices_kset() as Arc<dyn KObject>))),
82*06d5e247SLoGin     );
83*06d5e247SLoGin     unsafe { PLATFORM_BUS_DEVICE = Some(platform_device.clone()) };
84*06d5e247SLoGin     // 注册到/sys/devices
85*06d5e247SLoGin     device_register(platform_device.clone())?;
862a7d773dSTingHuang 
87*06d5e247SLoGin     let paltform_bus = PlatformBus::new();
88*06d5e247SLoGin     // 注册到/sys/bus
89*06d5e247SLoGin     let r = bus_register(paltform_bus.clone() as Arc<dyn Bus>);
90*06d5e247SLoGin     if r.is_err() {
91*06d5e247SLoGin         device_unregister(platform_device.clone());
92*06d5e247SLoGin         unsafe { PLATFORM_BUS_DEVICE = None };
93*06d5e247SLoGin         return r;
94*06d5e247SLoGin     }
95*06d5e247SLoGin     unsafe { PLATFORM_BUS = Some(paltform_bus) };
96*06d5e247SLoGin 
97*06d5e247SLoGin     return r;
982a7d773dSTingHuang }
99