123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309 |
- use alloc::sync::Arc;
- use intertrait::cast::CastArc;
- use log::warn;
- use system_error::SystemError;
- use crate::{
- driver::base::kobject::KObject,
- filesystem::{
- sysfs::{
- file::sysfs_emit_str, Attribute, AttributeGroup, SysFSOpsSupport, SYSFS_ATTR_MODE_RO,
- },
- vfs::syscall::ModeType,
- },
- };
- use super::{device::PciDevice, pci_irq::IrqType};
- #[derive(Debug)]
- pub struct BasicPciReadOnlyAttrs;
- impl AttributeGroup for BasicPciReadOnlyAttrs {
- fn name(&self) -> Option<&str> {
- None
- }
- fn attrs(&self) -> &[&'static dyn Attribute] {
- &[
- &Vendor,
- &DeviceID,
- &SubsystemVendor,
- &SubsystemDevice,
- &Revision,
- &Class,
- &Irq,
- &Modalias,
- ]
- }
- fn is_visible(
- &self,
- _kobj: Arc<dyn KObject>,
- attr: &'static dyn Attribute,
- ) -> Option<ModeType> {
- return Some(attr.mode());
- }
- }
- #[derive(Debug)]
- struct Vendor;
- impl Attribute for Vendor {
- fn mode(&self) -> ModeType {
- SYSFS_ATTR_MODE_RO
- }
- fn name(&self) -> &str {
- "vendor"
- }
- fn show(&self, _kobj: Arc<dyn KObject>, _buf: &mut [u8]) -> Result<usize, SystemError> {
- let dev = _kobj
- .cast::<dyn PciDevice>()
- .map_err(|e: Arc<dyn KObject>| {
- warn!("device:{:?} is not a pci device!", e);
- SystemError::EINVAL
- })?;
- return sysfs_emit_str(_buf, &format!("0x{:04x}", dev.vendor()));
- }
- fn store(&self, _kobj: Arc<dyn KObject>, _buf: &[u8]) -> Result<usize, SystemError> {
- todo!()
- }
- fn support(&self) -> SysFSOpsSupport {
- SysFSOpsSupport::ATTR_SHOW
- }
- }
- #[derive(Debug)]
- struct DeviceID;
- impl Attribute for DeviceID {
- fn mode(&self) -> ModeType {
- SYSFS_ATTR_MODE_RO
- }
- fn name(&self) -> &str {
- "device"
- }
- fn show(&self, _kobj: Arc<dyn KObject>, _buf: &mut [u8]) -> Result<usize, SystemError> {
- let dev = _kobj
- .cast::<dyn PciDevice>()
- .map_err(|e: Arc<dyn KObject>| {
- warn!("device:{:?} is not a pci device!", e);
- SystemError::EINVAL
- })?;
- return sysfs_emit_str(_buf, &format!("0x{:04x}", dev.device_id()));
- }
- fn store(&self, _kobj: Arc<dyn KObject>, _buf: &[u8]) -> Result<usize, SystemError> {
- todo!()
- }
- fn support(&self) -> SysFSOpsSupport {
- SysFSOpsSupport::ATTR_SHOW
- }
- }
- #[derive(Debug)]
- struct SubsystemVendor;
- impl Attribute for SubsystemVendor {
- fn mode(&self) -> ModeType {
- SYSFS_ATTR_MODE_RO
- }
- fn name(&self) -> &str {
- "subsystem_vendor"
- }
- fn show(&self, _kobj: Arc<dyn KObject>, _buf: &mut [u8]) -> Result<usize, SystemError> {
- let dev = _kobj
- .cast::<dyn PciDevice>()
- .map_err(|e: Arc<dyn KObject>| {
- warn!("device:{:?} is not a pci device!", e);
- SystemError::EINVAL
- })?;
- return sysfs_emit_str(_buf, &format!("0x{:04x}", dev.subsystem_vendor()));
- }
- fn store(&self, _kobj: Arc<dyn KObject>, _buf: &[u8]) -> Result<usize, SystemError> {
- todo!()
- }
- fn support(&self) -> SysFSOpsSupport {
- SysFSOpsSupport::ATTR_SHOW
- }
- }
- #[derive(Debug)]
- struct SubsystemDevice;
- impl Attribute for SubsystemDevice {
- fn mode(&self) -> ModeType {
- SYSFS_ATTR_MODE_RO
- }
- fn name(&self) -> &str {
- "subsystem_device"
- }
- fn show(&self, _kobj: Arc<dyn KObject>, _buf: &mut [u8]) -> Result<usize, SystemError> {
- let dev = _kobj
- .cast::<dyn PciDevice>()
- .map_err(|e: Arc<dyn KObject>| {
- warn!("device:{:?} is not a pci device!", e);
- SystemError::EINVAL
- })?;
- return sysfs_emit_str(_buf, &format!("0x{:04x}", dev.subsystem_device()));
- }
- fn store(&self, _kobj: Arc<dyn KObject>, _buf: &[u8]) -> Result<usize, SystemError> {
- todo!()
- }
- fn support(&self) -> SysFSOpsSupport {
- SysFSOpsSupport::ATTR_SHOW
- }
- }
- #[derive(Debug)]
- struct Revision;
- impl Attribute for Revision {
- fn mode(&self) -> ModeType {
- SYSFS_ATTR_MODE_RO
- }
- fn name(&self) -> &str {
- "revision"
- }
- fn show(&self, _kobj: Arc<dyn KObject>, _buf: &mut [u8]) -> Result<usize, SystemError> {
- let dev = _kobj
- .cast::<dyn PciDevice>()
- .map_err(|e: Arc<dyn KObject>| {
- warn!("device:{:?} is not a pci device!", e);
- SystemError::EINVAL
- })?;
- return sysfs_emit_str(_buf, &format!("0x{:02x}", dev.revision()));
- }
- fn store(&self, _kobj: Arc<dyn KObject>, _buf: &[u8]) -> Result<usize, SystemError> {
- todo!()
- }
- fn support(&self) -> SysFSOpsSupport {
- SysFSOpsSupport::ATTR_SHOW
- }
- }
- #[derive(Debug)]
- struct Class;
- impl Attribute for Class {
- fn mode(&self) -> ModeType {
- SYSFS_ATTR_MODE_RO
- }
- fn name(&self) -> &str {
- "class"
- }
- fn show(&self, _kobj: Arc<dyn KObject>, _buf: &mut [u8]) -> Result<usize, SystemError> {
- let dev = _kobj
- .cast::<dyn PciDevice>()
- .map_err(|e: Arc<dyn KObject>| {
- warn!("device:{:?} is not a pci device!", e);
- SystemError::EINVAL
- })?;
- return sysfs_emit_str(_buf, &format!("0x{:06x}", dev.class_code()));
- }
- fn store(&self, _kobj: Arc<dyn KObject>, _buf: &[u8]) -> Result<usize, SystemError> {
- todo!()
- }
- fn support(&self) -> SysFSOpsSupport {
- SysFSOpsSupport::ATTR_SHOW
- }
- }
- #[derive(Debug)]
- struct Irq;
- impl Attribute for Irq {
- fn mode(&self) -> ModeType {
- SYSFS_ATTR_MODE_RO
- }
- fn name(&self) -> &str {
- "irq"
- }
- fn show(&self, _kobj: Arc<dyn KObject>, _buf: &mut [u8]) -> Result<usize, SystemError> {
- let dev = _kobj
- .cast::<dyn PciDevice>()
- .map_err(|e: Arc<dyn KObject>| {
- warn!("device:{:?} is not a pci device!", e);
- SystemError::EINVAL
- })?;
- if let IrqType::Msi { .. } = *dev.irq_type().read() {
- // 见https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/pci/pci-sysfs.c#55
- return sysfs_emit_str(_buf, "todo:sry,msi device is unimplemented now");
- }
- return sysfs_emit_str(_buf, &format!("{}", dev.irq_line()));
- }
- fn store(&self, _kobj: Arc<dyn KObject>, _buf: &[u8]) -> Result<usize, SystemError> {
- todo!()
- }
- fn support(&self) -> SysFSOpsSupport {
- SysFSOpsSupport::ATTR_SHOW
- }
- }
- #[derive(Debug)]
- struct Modalias;
- impl Attribute for Modalias {
- fn mode(&self) -> ModeType {
- SYSFS_ATTR_MODE_RO
- }
- fn name(&self) -> &str {
- "modalias"
- }
- fn show(&self, _kobj: Arc<dyn KObject>, _buf: &mut [u8]) -> Result<usize, SystemError> {
- let dev = _kobj
- .cast::<dyn PciDevice>()
- .map_err(|e: Arc<dyn KObject>| {
- warn!("device:{:?} is not a pci device!", e);
- SystemError::EINVAL
- })?;
- return sysfs_emit_str(
- _buf,
- &format!(
- "pci:v{:08X}d{:08X}sv{:08X}sd{:08X}bc{:02X}sc{:02X}i{:02X}",
- dev.vendor(),
- dev.device_id(),
- dev.subsystem_vendor(),
- dev.subsystem_device(),
- dev.class_code(),
- dev.subclass(),
- dev.interface_code(),
- ),
- );
- }
- fn store(&self, _kobj: Arc<dyn KObject>, _buf: &[u8]) -> Result<usize, SystemError> {
- todo!()
- }
- fn support(&self) -> SysFSOpsSupport {
- SysFSOpsSupport::ATTR_SHOW
- }
- }
|