attr.rs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. use alloc::sync::Arc;
  2. use intertrait::cast::CastArc;
  3. use log::warn;
  4. use system_error::SystemError;
  5. use crate::{
  6. driver::base::kobject::KObject,
  7. filesystem::{
  8. sysfs::{
  9. file::sysfs_emit_str, Attribute, AttributeGroup, SysFSOpsSupport, SYSFS_ATTR_MODE_RO,
  10. },
  11. vfs::syscall::ModeType,
  12. },
  13. };
  14. use super::{device::PciDevice, pci_irq::IrqType};
  15. #[derive(Debug)]
  16. pub struct BasicPciReadOnlyAttrs;
  17. impl AttributeGroup for BasicPciReadOnlyAttrs {
  18. fn name(&self) -> Option<&str> {
  19. None
  20. }
  21. fn attrs(&self) -> &[&'static dyn Attribute] {
  22. &[
  23. &Vendor,
  24. &DeviceID,
  25. &SubsystemVendor,
  26. &SubsystemDevice,
  27. &Revision,
  28. &Class,
  29. &Irq,
  30. &Modalias,
  31. ]
  32. }
  33. fn is_visible(
  34. &self,
  35. _kobj: Arc<dyn KObject>,
  36. attr: &'static dyn Attribute,
  37. ) -> Option<ModeType> {
  38. return Some(attr.mode());
  39. }
  40. }
  41. #[derive(Debug)]
  42. struct Vendor;
  43. impl Attribute for Vendor {
  44. fn mode(&self) -> ModeType {
  45. SYSFS_ATTR_MODE_RO
  46. }
  47. fn name(&self) -> &str {
  48. "vendor"
  49. }
  50. fn show(&self, _kobj: Arc<dyn KObject>, _buf: &mut [u8]) -> Result<usize, SystemError> {
  51. let dev = _kobj
  52. .cast::<dyn PciDevice>()
  53. .map_err(|e: Arc<dyn KObject>| {
  54. warn!("device:{:?} is not a pci device!", e);
  55. SystemError::EINVAL
  56. })?;
  57. return sysfs_emit_str(_buf, &format!("0x{:04x}", dev.vendor()));
  58. }
  59. fn store(&self, _kobj: Arc<dyn KObject>, _buf: &[u8]) -> Result<usize, SystemError> {
  60. todo!()
  61. }
  62. fn support(&self) -> SysFSOpsSupport {
  63. SysFSOpsSupport::ATTR_SHOW
  64. }
  65. }
  66. #[derive(Debug)]
  67. struct DeviceID;
  68. impl Attribute for DeviceID {
  69. fn mode(&self) -> ModeType {
  70. SYSFS_ATTR_MODE_RO
  71. }
  72. fn name(&self) -> &str {
  73. "device"
  74. }
  75. fn show(&self, _kobj: Arc<dyn KObject>, _buf: &mut [u8]) -> Result<usize, SystemError> {
  76. let dev = _kobj
  77. .cast::<dyn PciDevice>()
  78. .map_err(|e: Arc<dyn KObject>| {
  79. warn!("device:{:?} is not a pci device!", e);
  80. SystemError::EINVAL
  81. })?;
  82. return sysfs_emit_str(_buf, &format!("0x{:04x}", dev.device_id()));
  83. }
  84. fn store(&self, _kobj: Arc<dyn KObject>, _buf: &[u8]) -> Result<usize, SystemError> {
  85. todo!()
  86. }
  87. fn support(&self) -> SysFSOpsSupport {
  88. SysFSOpsSupport::ATTR_SHOW
  89. }
  90. }
  91. #[derive(Debug)]
  92. struct SubsystemVendor;
  93. impl Attribute for SubsystemVendor {
  94. fn mode(&self) -> ModeType {
  95. SYSFS_ATTR_MODE_RO
  96. }
  97. fn name(&self) -> &str {
  98. "subsystem_vendor"
  99. }
  100. fn show(&self, _kobj: Arc<dyn KObject>, _buf: &mut [u8]) -> Result<usize, SystemError> {
  101. let dev = _kobj
  102. .cast::<dyn PciDevice>()
  103. .map_err(|e: Arc<dyn KObject>| {
  104. warn!("device:{:?} is not a pci device!", e);
  105. SystemError::EINVAL
  106. })?;
  107. return sysfs_emit_str(_buf, &format!("0x{:04x}", dev.subsystem_vendor()));
  108. }
  109. fn store(&self, _kobj: Arc<dyn KObject>, _buf: &[u8]) -> Result<usize, SystemError> {
  110. todo!()
  111. }
  112. fn support(&self) -> SysFSOpsSupport {
  113. SysFSOpsSupport::ATTR_SHOW
  114. }
  115. }
  116. #[derive(Debug)]
  117. struct SubsystemDevice;
  118. impl Attribute for SubsystemDevice {
  119. fn mode(&self) -> ModeType {
  120. SYSFS_ATTR_MODE_RO
  121. }
  122. fn name(&self) -> &str {
  123. "subsystem_device"
  124. }
  125. fn show(&self, _kobj: Arc<dyn KObject>, _buf: &mut [u8]) -> Result<usize, SystemError> {
  126. let dev = _kobj
  127. .cast::<dyn PciDevice>()
  128. .map_err(|e: Arc<dyn KObject>| {
  129. warn!("device:{:?} is not a pci device!", e);
  130. SystemError::EINVAL
  131. })?;
  132. return sysfs_emit_str(_buf, &format!("0x{:04x}", dev.subsystem_device()));
  133. }
  134. fn store(&self, _kobj: Arc<dyn KObject>, _buf: &[u8]) -> Result<usize, SystemError> {
  135. todo!()
  136. }
  137. fn support(&self) -> SysFSOpsSupport {
  138. SysFSOpsSupport::ATTR_SHOW
  139. }
  140. }
  141. #[derive(Debug)]
  142. struct Revision;
  143. impl Attribute for Revision {
  144. fn mode(&self) -> ModeType {
  145. SYSFS_ATTR_MODE_RO
  146. }
  147. fn name(&self) -> &str {
  148. "revision"
  149. }
  150. fn show(&self, _kobj: Arc<dyn KObject>, _buf: &mut [u8]) -> Result<usize, SystemError> {
  151. let dev = _kobj
  152. .cast::<dyn PciDevice>()
  153. .map_err(|e: Arc<dyn KObject>| {
  154. warn!("device:{:?} is not a pci device!", e);
  155. SystemError::EINVAL
  156. })?;
  157. return sysfs_emit_str(_buf, &format!("0x{:02x}", dev.revision()));
  158. }
  159. fn store(&self, _kobj: Arc<dyn KObject>, _buf: &[u8]) -> Result<usize, SystemError> {
  160. todo!()
  161. }
  162. fn support(&self) -> SysFSOpsSupport {
  163. SysFSOpsSupport::ATTR_SHOW
  164. }
  165. }
  166. #[derive(Debug)]
  167. struct Class;
  168. impl Attribute for Class {
  169. fn mode(&self) -> ModeType {
  170. SYSFS_ATTR_MODE_RO
  171. }
  172. fn name(&self) -> &str {
  173. "class"
  174. }
  175. fn show(&self, _kobj: Arc<dyn KObject>, _buf: &mut [u8]) -> Result<usize, SystemError> {
  176. let dev = _kobj
  177. .cast::<dyn PciDevice>()
  178. .map_err(|e: Arc<dyn KObject>| {
  179. warn!("device:{:?} is not a pci device!", e);
  180. SystemError::EINVAL
  181. })?;
  182. return sysfs_emit_str(_buf, &format!("0x{:06x}", dev.class_code()));
  183. }
  184. fn store(&self, _kobj: Arc<dyn KObject>, _buf: &[u8]) -> Result<usize, SystemError> {
  185. todo!()
  186. }
  187. fn support(&self) -> SysFSOpsSupport {
  188. SysFSOpsSupport::ATTR_SHOW
  189. }
  190. }
  191. #[derive(Debug)]
  192. struct Irq;
  193. impl Attribute for Irq {
  194. fn mode(&self) -> ModeType {
  195. SYSFS_ATTR_MODE_RO
  196. }
  197. fn name(&self) -> &str {
  198. "irq"
  199. }
  200. fn show(&self, _kobj: Arc<dyn KObject>, _buf: &mut [u8]) -> Result<usize, SystemError> {
  201. let dev = _kobj
  202. .cast::<dyn PciDevice>()
  203. .map_err(|e: Arc<dyn KObject>| {
  204. warn!("device:{:?} is not a pci device!", e);
  205. SystemError::EINVAL
  206. })?;
  207. if let IrqType::Msi { .. } = *dev.irq_type().read() {
  208. // 见https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/pci/pci-sysfs.c#55
  209. return sysfs_emit_str(_buf, "todo:sry,msi device is unimplemented now");
  210. }
  211. return sysfs_emit_str(_buf, &format!("{}", dev.irq_line()));
  212. }
  213. fn store(&self, _kobj: Arc<dyn KObject>, _buf: &[u8]) -> Result<usize, SystemError> {
  214. todo!()
  215. }
  216. fn support(&self) -> SysFSOpsSupport {
  217. SysFSOpsSupport::ATTR_SHOW
  218. }
  219. }
  220. #[derive(Debug)]
  221. struct Modalias;
  222. impl Attribute for Modalias {
  223. fn mode(&self) -> ModeType {
  224. SYSFS_ATTR_MODE_RO
  225. }
  226. fn name(&self) -> &str {
  227. "modalias"
  228. }
  229. fn show(&self, _kobj: Arc<dyn KObject>, _buf: &mut [u8]) -> Result<usize, SystemError> {
  230. let dev = _kobj
  231. .cast::<dyn PciDevice>()
  232. .map_err(|e: Arc<dyn KObject>| {
  233. warn!("device:{:?} is not a pci device!", e);
  234. SystemError::EINVAL
  235. })?;
  236. return sysfs_emit_str(
  237. _buf,
  238. &format!(
  239. "pci:v{:08X}d{:08X}sv{:08X}sd{:08X}bc{:02X}sc{:02X}i{:02X}",
  240. dev.vendor(),
  241. dev.device_id(),
  242. dev.subsystem_vendor(),
  243. dev.subsystem_device(),
  244. dev.class_code(),
  245. dev.subclass(),
  246. dev.interface_code(),
  247. ),
  248. );
  249. }
  250. fn store(&self, _kobj: Arc<dyn KObject>, _buf: &[u8]) -> Result<usize, SystemError> {
  251. todo!()
  252. }
  253. fn support(&self) -> SysFSOpsSupport {
  254. SysFSOpsSupport::ATTR_SHOW
  255. }
  256. }