1cc36cf4aSYJwu2023 #![allow(dead_code)] 2cc36cf4aSYJwu2023 3cc36cf4aSYJwu2023 use core::mem::size_of; 4cc36cf4aSYJwu2023 use core::ptr::NonNull; 5cc36cf4aSYJwu2023 6cc36cf4aSYJwu2023 use alloc::ffi::CString; 7cc36cf4aSYJwu2023 use alloc::vec::Vec; 8cc36cf4aSYJwu2023 940fe15e0SLoGin use super::pci::{PciDeviceStructure, PciDeviceStructureGeneralDevice, PciError}; 104fda81ceSLoGin use crate::arch::msi::{arch_msi_message_address, arch_msi_message_data}; 11cc36cf4aSYJwu2023 use crate::arch::{PciArch, TraitPciArch}; 12cc36cf4aSYJwu2023 use crate::include::bindings::bindings::{ 13cc36cf4aSYJwu2023 c_irq_install, c_irq_uninstall, pt_regs, ul, EAGAIN, EINVAL, 14cc36cf4aSYJwu2023 }; 15876cb89eSGnoCiYeH 16fbe6becdSLoGin use crate::libs::volatile::{volread, volwrite, Volatile}; 1740fe15e0SLoGin 18cc36cf4aSYJwu2023 /// MSIX表的一项 19cc36cf4aSYJwu2023 #[repr(C)] 20cc36cf4aSYJwu2023 struct MsixEntry { 21cc36cf4aSYJwu2023 msg_addr: Volatile<u32>, 220dd8ff43SYJwu2023 msg_upper_addr: Volatile<u32>, 230dd8ff43SYJwu2023 msg_data: Volatile<u32>, 240dd8ff43SYJwu2023 vector_control: Volatile<u32>, 25cc36cf4aSYJwu2023 } 26afc95d5cSYJwu2023 27cc36cf4aSYJwu2023 /// Pending表的一项 28cc36cf4aSYJwu2023 #[repr(C)] 29cc36cf4aSYJwu2023 struct PendingEntry { 30cc36cf4aSYJwu2023 entry: Volatile<u64>, 31cc36cf4aSYJwu2023 } 32afc95d5cSYJwu2023 33cc36cf4aSYJwu2023 /// PCI设备中断错误 34cc36cf4aSYJwu2023 #[derive(Copy, Clone, Debug, Eq, PartialEq)] 35cc36cf4aSYJwu2023 pub enum PciIrqError { 36cc36cf4aSYJwu2023 IrqTypeNotSupported, 37cc36cf4aSYJwu2023 PciDeviceNotSupportIrq, 38cc36cf4aSYJwu2023 IrqTypeUnmatch, 39cc36cf4aSYJwu2023 InvalidIrqIndex(u16), 40cc36cf4aSYJwu2023 InvalidIrqNum(u16), 41cc36cf4aSYJwu2023 IrqNumOccupied(u16), 42cc36cf4aSYJwu2023 DeviceIrqOverflow, 43cc36cf4aSYJwu2023 MxiIrqNumWrong, 44cc36cf4aSYJwu2023 PciBarNotInited, 45cc36cf4aSYJwu2023 BarGetVaddrFailed, 46cc36cf4aSYJwu2023 MaskNotSupported, 47cc36cf4aSYJwu2023 IrqNotInited, 48cc36cf4aSYJwu2023 } 49afc95d5cSYJwu2023 50cc36cf4aSYJwu2023 /// PCI设备的中断类型 51cc36cf4aSYJwu2023 #[derive(Copy, Clone, Debug)] 52cc36cf4aSYJwu2023 pub enum IrqType { 53cc36cf4aSYJwu2023 Msi { 54cc36cf4aSYJwu2023 address_64: bool, 55cc36cf4aSYJwu2023 maskable: bool, 56cc36cf4aSYJwu2023 irq_max_num: u16, 57cc36cf4aSYJwu2023 cap_offset: u8, 58cc36cf4aSYJwu2023 }, 59cc36cf4aSYJwu2023 Msix { 60cc36cf4aSYJwu2023 msix_table_bar: u8, 61cc36cf4aSYJwu2023 msix_table_offset: u32, 62cc36cf4aSYJwu2023 pending_table_bar: u8, 63cc36cf4aSYJwu2023 pending_table_offset: u32, 64cc36cf4aSYJwu2023 irq_max_num: u16, 65cc36cf4aSYJwu2023 cap_offset: u8, 66cc36cf4aSYJwu2023 }, 67cc36cf4aSYJwu2023 Legacy, 68cc36cf4aSYJwu2023 Unused, 69cc36cf4aSYJwu2023 } 70afc95d5cSYJwu2023 71cc36cf4aSYJwu2023 // PCI设备install中断时需要传递的参数 72cc36cf4aSYJwu2023 #[derive(Clone, Debug)] 73*ce5850adSLoGin pub struct PciIrqMsg { 740dd8ff43SYJwu2023 pub irq_common_message: IrqCommonMsg, 750dd8ff43SYJwu2023 pub irq_specific_message: IrqSpecificMsg, 76cc36cf4aSYJwu2023 } 77afc95d5cSYJwu2023 78cc36cf4aSYJwu2023 // PCI设备install中断时需要传递的共同参数 79cc36cf4aSYJwu2023 #[derive(Clone, Debug)] 80cc36cf4aSYJwu2023 pub struct IrqCommonMsg { 81afc95d5cSYJwu2023 irq_index: u16, //要install的中断号在PCI设备中的irq_vector的index 82afc95d5cSYJwu2023 irq_name: CString, //中断名字 83afc95d5cSYJwu2023 irq_parameter: u16, //中断额外参数,可传入中断处理函数 84afc95d5cSYJwu2023 irq_hander: unsafe extern "C" fn(irq_num: ul, parameter: ul, regs: *mut pt_regs), // 中断处理函数 85afc95d5cSYJwu2023 irq_ack: Option<unsafe extern "C" fn(irq_num: ul)>, // 中断的ack,可为None,若为None则中断处理中会正常通知中断结束,不为None则调用传入的函数进行回复 86cc36cf4aSYJwu2023 } 87afc95d5cSYJwu2023 88afc95d5cSYJwu2023 impl IrqCommonMsg { 89afc95d5cSYJwu2023 pub fn init_from( 90afc95d5cSYJwu2023 irq_index: u16, 91afc95d5cSYJwu2023 irq_name: &str, 92afc95d5cSYJwu2023 irq_parameter: u16, 93afc95d5cSYJwu2023 irq_hander: unsafe extern "C" fn(irq_num: ul, parameter: ul, regs: *mut pt_regs), 94afc95d5cSYJwu2023 irq_ack: Option<unsafe extern "C" fn(irq_num: ul)>, 95afc95d5cSYJwu2023 ) -> Self { 96afc95d5cSYJwu2023 IrqCommonMsg { 97afc95d5cSYJwu2023 irq_index, 98afc95d5cSYJwu2023 irq_name: CString::new(irq_name).expect("CString::new failed"), 99afc95d5cSYJwu2023 irq_parameter, 100afc95d5cSYJwu2023 irq_hander, 101afc95d5cSYJwu2023 irq_ack, 102afc95d5cSYJwu2023 } 103afc95d5cSYJwu2023 } 104afc95d5cSYJwu2023 } 105afc95d5cSYJwu2023 106cc36cf4aSYJwu2023 // PCI设备install中断时需要传递的特有参数,Msi代表MSI与MSIX 107cc36cf4aSYJwu2023 #[derive(Clone, Debug)] 108cc36cf4aSYJwu2023 pub enum IrqSpecificMsg { 109cc36cf4aSYJwu2023 Legacy, 110cc36cf4aSYJwu2023 Msi { 111cc36cf4aSYJwu2023 processor: u16, 112cc36cf4aSYJwu2023 trigger_mode: TriggerMode, 113cc36cf4aSYJwu2023 }, 114cc36cf4aSYJwu2023 } 115cc36cf4aSYJwu2023 impl IrqSpecificMsg { 1160dd8ff43SYJwu2023 pub fn msi_default() -> Self { 117cc36cf4aSYJwu2023 IrqSpecificMsg::Msi { 118cc36cf4aSYJwu2023 processor: 0, 119cc36cf4aSYJwu2023 trigger_mode: TriggerMode::EdgeTrigger, 120cc36cf4aSYJwu2023 } 121cc36cf4aSYJwu2023 } 122cc36cf4aSYJwu2023 } 123afc95d5cSYJwu2023 124cc36cf4aSYJwu2023 // 申请中断的触发模式,MSI默认为边沿触发 125cc36cf4aSYJwu2023 #[derive(Copy, Clone, Debug)] 126cc36cf4aSYJwu2023 pub enum TriggerMode { 127cc36cf4aSYJwu2023 EdgeTrigger, 128cc36cf4aSYJwu2023 AssertHigh, 129cc36cf4aSYJwu2023 AssertLow, 130cc36cf4aSYJwu2023 } 131afc95d5cSYJwu2023 132cc36cf4aSYJwu2023 bitflags! { 133cc36cf4aSYJwu2023 /// 设备中断类型,使用bitflag使得中断类型的选择更多元化 134cc36cf4aSYJwu2023 pub struct IRQ: u8{ 135cc36cf4aSYJwu2023 const PCI_IRQ_LEGACY = 1 << 0; 136cc36cf4aSYJwu2023 const PCI_IRQ_MSI = 1 << 1; 137cc36cf4aSYJwu2023 const PCI_IRQ_MSIX = 1 << 2; 138cc36cf4aSYJwu2023 const PCI_IRQ_ALL_TYPES=IRQ::PCI_IRQ_LEGACY.bits|IRQ::PCI_IRQ_MSI.bits|IRQ::PCI_IRQ_MSIX.bits; 139cc36cf4aSYJwu2023 } 140cc36cf4aSYJwu2023 } 141afc95d5cSYJwu2023 142cc36cf4aSYJwu2023 /// PciDeviceStructure的子trait,使用继承以直接使用PciDeviceStructure里的接口 143cc36cf4aSYJwu2023 pub trait PciInterrupt: PciDeviceStructure { 144cc36cf4aSYJwu2023 /// @brief PCI设备调用该函数选择中断类型 145cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 146cc36cf4aSYJwu2023 /// @param flag 选择的中断类型(支持多个选择),如PCI_IRQ_ALL_TYPES表示所有中断类型均可,让系统按顺序进行选择 147cc36cf4aSYJwu2023 /// @return Option<IrqType> 失败返回None,成功则返回对应中断类型 148cc36cf4aSYJwu2023 fn irq_init(&mut self, flag: IRQ) -> Option<IrqType> { 149cc36cf4aSYJwu2023 // MSIX中断优先 150cc36cf4aSYJwu2023 if flag.contains(IRQ::PCI_IRQ_MSIX) { 151cc36cf4aSYJwu2023 if let Some(cap_offset) = self.msix_capability_offset() { 152cc36cf4aSYJwu2023 let data = 1530dd8ff43SYJwu2023 PciArch::read_config(&self.common_header().bus_device_function, cap_offset); 1540dd8ff43SYJwu2023 let irq_max_num = ((data >> 16) & 0x7ff) as u16 + 1; 155cc36cf4aSYJwu2023 let data = 156cc36cf4aSYJwu2023 PciArch::read_config(&self.common_header().bus_device_function, cap_offset + 4); 1570dd8ff43SYJwu2023 let msix_table_bar = (data & 0x07) as u8; 1580dd8ff43SYJwu2023 let msix_table_offset = data & (!0x07); 159cc36cf4aSYJwu2023 let data = 160cc36cf4aSYJwu2023 PciArch::read_config(&self.common_header().bus_device_function, cap_offset + 8); 1610dd8ff43SYJwu2023 let pending_table_bar = (data & 0x07) as u8; 1620dd8ff43SYJwu2023 let pending_table_offset = data & (!0x07); 163cc36cf4aSYJwu2023 *self.irq_type_mut()? = IrqType::Msix { 164cc36cf4aSYJwu2023 msix_table_bar, 165cc36cf4aSYJwu2023 msix_table_offset, 166cc36cf4aSYJwu2023 pending_table_bar, 167cc36cf4aSYJwu2023 pending_table_offset, 168cc36cf4aSYJwu2023 irq_max_num, 169cc36cf4aSYJwu2023 cap_offset, 170cc36cf4aSYJwu2023 }; 171cc36cf4aSYJwu2023 return Some(IrqType::Msix { 172cc36cf4aSYJwu2023 msix_table_bar, 173cc36cf4aSYJwu2023 msix_table_offset, 174cc36cf4aSYJwu2023 pending_table_bar, 175cc36cf4aSYJwu2023 pending_table_offset, 176cc36cf4aSYJwu2023 irq_max_num, 177cc36cf4aSYJwu2023 cap_offset, 178cc36cf4aSYJwu2023 }); 179cc36cf4aSYJwu2023 } 180cc36cf4aSYJwu2023 } 181cc36cf4aSYJwu2023 // 其次MSI 182cc36cf4aSYJwu2023 if flag.contains(IRQ::PCI_IRQ_MSI) { 183cc36cf4aSYJwu2023 if let Some(cap_offset) = self.msi_capability_offset() { 184cc36cf4aSYJwu2023 let data = 185cc36cf4aSYJwu2023 PciArch::read_config(&self.common_header().bus_device_function, cap_offset); 186cc36cf4aSYJwu2023 let message_control = (data >> 16) as u16; 187cc36cf4aSYJwu2023 let maskable = (message_control & 0x0100) != 0; 188cc36cf4aSYJwu2023 let address_64 = (message_control & 0x0080) != 0; 189cc36cf4aSYJwu2023 let irq_max_num = (1 << (((message_control & 0x000e) >> 1) + 1)) as u16; 190cc36cf4aSYJwu2023 *self.irq_type_mut()? = IrqType::Msi { 191cc36cf4aSYJwu2023 address_64, 192cc36cf4aSYJwu2023 maskable, 193cc36cf4aSYJwu2023 irq_max_num, 194cc36cf4aSYJwu2023 cap_offset, 195cc36cf4aSYJwu2023 }; 196cc36cf4aSYJwu2023 return Some(IrqType::Msi { 197cc36cf4aSYJwu2023 address_64, 198cc36cf4aSYJwu2023 maskable, 199cc36cf4aSYJwu2023 irq_max_num, 200cc36cf4aSYJwu2023 cap_offset, 201cc36cf4aSYJwu2023 }); 202cc36cf4aSYJwu2023 } 203cc36cf4aSYJwu2023 } 204cc36cf4aSYJwu2023 // 最后选择legacy# 205cc36cf4aSYJwu2023 if flag.contains(IRQ::PCI_IRQ_LEGACY) { 206cc36cf4aSYJwu2023 *self.irq_type_mut()? = IrqType::Legacy; 207cc36cf4aSYJwu2023 return Some(IrqType::Legacy); 208cc36cf4aSYJwu2023 } 209cc36cf4aSYJwu2023 None 210cc36cf4aSYJwu2023 } 211cc36cf4aSYJwu2023 212cc36cf4aSYJwu2023 /// @brief 启动/关闭设备中断 213cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 214cc36cf4aSYJwu2023 /// @param enable 开启/关闭 215cc36cf4aSYJwu2023 fn irq_enable(&mut self, enable: bool) -> Result<u8, PciError> { 216cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 217cc36cf4aSYJwu2023 match *irq_type { 218cc36cf4aSYJwu2023 IrqType::Msix { .. } => { 219cc36cf4aSYJwu2023 return self.msix_enable(enable); 220cc36cf4aSYJwu2023 } 221cc36cf4aSYJwu2023 IrqType::Msi { .. } => { 222cc36cf4aSYJwu2023 return self.msi_enable(enable); 223cc36cf4aSYJwu2023 } 224cc36cf4aSYJwu2023 IrqType::Legacy => { 225cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeNotSupported)); 226cc36cf4aSYJwu2023 } 227cc36cf4aSYJwu2023 IrqType::Unused => { 228cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 229cc36cf4aSYJwu2023 } 230cc36cf4aSYJwu2023 } 231cc36cf4aSYJwu2023 } 232cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 233cc36cf4aSYJwu2023 } 234cc36cf4aSYJwu2023 /// @brief 启动/关闭设备MSIX中断 235cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 236cc36cf4aSYJwu2023 /// @param enable 开启/关闭 237cc36cf4aSYJwu2023 fn msix_enable(&mut self, enable: bool) -> Result<u8, PciError> { 238cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 239cc36cf4aSYJwu2023 match *irq_type { 240cc36cf4aSYJwu2023 IrqType::Msix { cap_offset, .. } => { 241cc36cf4aSYJwu2023 let mut message = 242cc36cf4aSYJwu2023 PciArch::read_config(&self.common_header().bus_device_function, cap_offset); 243cc36cf4aSYJwu2023 if enable { 244cc36cf4aSYJwu2023 message |= 1 << 31; 245cc36cf4aSYJwu2023 } else { 246cc36cf4aSYJwu2023 message &= !(1 << 31); 247cc36cf4aSYJwu2023 } 248cc36cf4aSYJwu2023 PciArch::write_config( 249cc36cf4aSYJwu2023 &self.common_header().bus_device_function, 250cc36cf4aSYJwu2023 cap_offset, 251cc36cf4aSYJwu2023 message, 252cc36cf4aSYJwu2023 ); 253cc36cf4aSYJwu2023 return Ok(0); 254cc36cf4aSYJwu2023 } 255cc36cf4aSYJwu2023 IrqType::Unused => { 256cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 257cc36cf4aSYJwu2023 } 258cc36cf4aSYJwu2023 _ => { 259cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 260cc36cf4aSYJwu2023 } 261cc36cf4aSYJwu2023 } 262cc36cf4aSYJwu2023 } 263cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 264cc36cf4aSYJwu2023 } 265cc36cf4aSYJwu2023 /// @brief 启动/关闭设备MSI中断 266cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 267cc36cf4aSYJwu2023 /// @param enable 开启/关闭 268cc36cf4aSYJwu2023 fn msi_enable(&mut self, enable: bool) -> Result<u8, PciError> { 269cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 270cc36cf4aSYJwu2023 match *irq_type { 271cc36cf4aSYJwu2023 IrqType::Msi { cap_offset, .. } => { 272cc36cf4aSYJwu2023 let mut message = 273cc36cf4aSYJwu2023 PciArch::read_config(&self.common_header().bus_device_function, cap_offset); 274cc36cf4aSYJwu2023 if enable { 275cc36cf4aSYJwu2023 message |= 1 << 16; 276cc36cf4aSYJwu2023 } else { 277cc36cf4aSYJwu2023 message &= !(1 << 16); 278cc36cf4aSYJwu2023 } 279cc36cf4aSYJwu2023 PciArch::write_config( 280cc36cf4aSYJwu2023 &self.common_header().bus_device_function, 281cc36cf4aSYJwu2023 cap_offset, 282cc36cf4aSYJwu2023 message, 283cc36cf4aSYJwu2023 ); 284cc36cf4aSYJwu2023 return Ok(0); 285cc36cf4aSYJwu2023 } 286cc36cf4aSYJwu2023 IrqType::Unused => { 287cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 288cc36cf4aSYJwu2023 } 289cc36cf4aSYJwu2023 _ => { 290cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 291cc36cf4aSYJwu2023 } 292cc36cf4aSYJwu2023 } 293cc36cf4aSYJwu2023 } 294cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 295cc36cf4aSYJwu2023 } 296cc36cf4aSYJwu2023 /// @brief 获取指定数量的中断号 todo 需要中断重构支持 29740fe15e0SLoGin fn irq_alloc(_num: u16) -> Option<Vec<u16>> { 298cc36cf4aSYJwu2023 None 299cc36cf4aSYJwu2023 } 300cc36cf4aSYJwu2023 /// @brief 进行PCI设备中断的安装 301cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 302cc36cf4aSYJwu2023 /// @param msg PCI设备install中断时需要传递的共同参数 303cc36cf4aSYJwu2023 /// @return 一切正常返回Ok(0),有错误返回对应错误原因 304*ce5850adSLoGin fn irq_install(&mut self, msg: PciIrqMsg) -> Result<u8, PciError> { 305cc36cf4aSYJwu2023 if let Some(irq_vector) = self.irq_vector_mut() { 306cc36cf4aSYJwu2023 if msg.irq_common_message.irq_index as usize > irq_vector.len() { 307cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::InvalidIrqIndex( 308cc36cf4aSYJwu2023 msg.irq_common_message.irq_index, 309cc36cf4aSYJwu2023 ))); 310cc36cf4aSYJwu2023 } 311cc36cf4aSYJwu2023 } 312cc36cf4aSYJwu2023 self.irq_enable(false)?; //中断设置更改前先关闭对应PCI设备的中断 313cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 314cc36cf4aSYJwu2023 match *irq_type { 315cc36cf4aSYJwu2023 IrqType::Msix { .. } => { 316cc36cf4aSYJwu2023 return self.msix_install(msg); 317cc36cf4aSYJwu2023 } 318cc36cf4aSYJwu2023 IrqType::Msi { .. } => { 319cc36cf4aSYJwu2023 return self.msi_install(msg); 320cc36cf4aSYJwu2023 } 321cc36cf4aSYJwu2023 IrqType::Unused => { 322cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 323cc36cf4aSYJwu2023 } 324cc36cf4aSYJwu2023 _ => { 325cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeNotSupported)); 326cc36cf4aSYJwu2023 } 327cc36cf4aSYJwu2023 } 328cc36cf4aSYJwu2023 } 329cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 330cc36cf4aSYJwu2023 } 331cc36cf4aSYJwu2023 /// @brief 进行PCI设备中断的安装(MSI) 332cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 333cc36cf4aSYJwu2023 /// @param msg PCI设备install中断时需要传递的共同参数 334cc36cf4aSYJwu2023 /// @return 一切正常返回Ok(0),有错误返回对应错误原因 335*ce5850adSLoGin fn msi_install(&mut self, msg: PciIrqMsg) -> Result<u8, PciError> { 336cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 337cc36cf4aSYJwu2023 match *irq_type { 338cc36cf4aSYJwu2023 IrqType::Msi { 339cc36cf4aSYJwu2023 address_64, 340cc36cf4aSYJwu2023 irq_max_num, 341cc36cf4aSYJwu2023 cap_offset, 342cc36cf4aSYJwu2023 .. 343cc36cf4aSYJwu2023 } => { 344cc36cf4aSYJwu2023 // 注意:MSI中断分配的中断号必须连续且大小为2的倍数 345cc36cf4aSYJwu2023 if self.irq_vector_mut().unwrap().len() > irq_max_num as usize { 346cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::DeviceIrqOverflow)); 347cc36cf4aSYJwu2023 } 348cc36cf4aSYJwu2023 let irq_num = 349cc36cf4aSYJwu2023 self.irq_vector_mut().unwrap()[msg.irq_common_message.irq_index as usize]; 350cc36cf4aSYJwu2023 let common_msg = &msg.irq_common_message; 351cc36cf4aSYJwu2023 let result = unsafe { 352cc36cf4aSYJwu2023 c_irq_install( 353cc36cf4aSYJwu2023 irq_num as u64, 354cc36cf4aSYJwu2023 Some(common_msg.irq_hander), 355cc36cf4aSYJwu2023 common_msg.irq_parameter as u64, 356cc36cf4aSYJwu2023 common_msg.irq_name.as_ptr(), 357cc36cf4aSYJwu2023 common_msg.irq_ack, 358cc36cf4aSYJwu2023 ) 359cc36cf4aSYJwu2023 }; 360cc36cf4aSYJwu2023 match result as u32 { 361cc36cf4aSYJwu2023 EINVAL => { 362cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::InvalidIrqNum(irq_num))); 363cc36cf4aSYJwu2023 } 364cc36cf4aSYJwu2023 EAGAIN => { 365cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNumOccupied( 366cc36cf4aSYJwu2023 irq_num, 367cc36cf4aSYJwu2023 ))); 368cc36cf4aSYJwu2023 } 369cc36cf4aSYJwu2023 _ => {} 370cc36cf4aSYJwu2023 } 371cc36cf4aSYJwu2023 //MSI中断只需配置一次PCI寄存器 372cc36cf4aSYJwu2023 if common_msg.irq_index == 0 { 3734fda81ceSLoGin let msg_address = arch_msi_message_address(0); 374cc36cf4aSYJwu2023 let trigger = match msg.irq_specific_message { 375cc36cf4aSYJwu2023 IrqSpecificMsg::Legacy => { 376cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 377cc36cf4aSYJwu2023 } 378cc36cf4aSYJwu2023 IrqSpecificMsg::Msi { trigger_mode, .. } => trigger_mode, 379cc36cf4aSYJwu2023 }; 3804fda81ceSLoGin let msg_data = arch_msi_message_data(irq_num, 0, trigger); 381cc36cf4aSYJwu2023 //写入Message Data和Message Address 382cc36cf4aSYJwu2023 if address_64 { 383cc36cf4aSYJwu2023 PciArch::write_config( 384cc36cf4aSYJwu2023 &self.common_header().bus_device_function, 385cc36cf4aSYJwu2023 cap_offset + 4, 386cc36cf4aSYJwu2023 msg_address, 387cc36cf4aSYJwu2023 ); 388cc36cf4aSYJwu2023 PciArch::write_config( 389cc36cf4aSYJwu2023 &self.common_header().bus_device_function, 390cc36cf4aSYJwu2023 cap_offset + 8, 391cc36cf4aSYJwu2023 0, 392cc36cf4aSYJwu2023 ); 393cc36cf4aSYJwu2023 PciArch::write_config( 394cc36cf4aSYJwu2023 &self.common_header().bus_device_function, 395cc36cf4aSYJwu2023 cap_offset + 12, 396cc36cf4aSYJwu2023 msg_data, 397cc36cf4aSYJwu2023 ); 398cc36cf4aSYJwu2023 } else { 399cc36cf4aSYJwu2023 PciArch::write_config( 400cc36cf4aSYJwu2023 &self.common_header().bus_device_function, 401cc36cf4aSYJwu2023 cap_offset + 4, 402cc36cf4aSYJwu2023 msg_address, 403cc36cf4aSYJwu2023 ); 404cc36cf4aSYJwu2023 PciArch::write_config( 405cc36cf4aSYJwu2023 &self.common_header().bus_device_function, 406cc36cf4aSYJwu2023 cap_offset + 8, 407cc36cf4aSYJwu2023 msg_data, 408cc36cf4aSYJwu2023 ); 409cc36cf4aSYJwu2023 } 410cc36cf4aSYJwu2023 let data = PciArch::read_config( 411cc36cf4aSYJwu2023 &self.common_header().bus_device_function, 412cc36cf4aSYJwu2023 cap_offset, 413cc36cf4aSYJwu2023 ); 414cc36cf4aSYJwu2023 let message_control = (data >> 16) as u16; 415cc36cf4aSYJwu2023 match self.irq_vector_mut().unwrap().len() { 416cc36cf4aSYJwu2023 1 => { 417cc36cf4aSYJwu2023 let temp = message_control & (!0x0070); 418cc36cf4aSYJwu2023 PciArch::write_config( 419cc36cf4aSYJwu2023 &self.common_header().bus_device_function, 420cc36cf4aSYJwu2023 cap_offset, 421cc36cf4aSYJwu2023 (temp as u32) << 16, 422cc36cf4aSYJwu2023 ); 423cc36cf4aSYJwu2023 } 424cc36cf4aSYJwu2023 2 => { 425cc36cf4aSYJwu2023 let temp = message_control & (!0x0070); 426cc36cf4aSYJwu2023 PciArch::write_config( 427cc36cf4aSYJwu2023 &self.common_header().bus_device_function, 428cc36cf4aSYJwu2023 cap_offset, 429cc36cf4aSYJwu2023 ((temp | (0x0001 << 4)) as u32) << 16, 430cc36cf4aSYJwu2023 ); 431cc36cf4aSYJwu2023 } 432cc36cf4aSYJwu2023 4 => { 433cc36cf4aSYJwu2023 let temp = message_control & (!0x0070); 434cc36cf4aSYJwu2023 PciArch::write_config( 435cc36cf4aSYJwu2023 &self.common_header().bus_device_function, 436cc36cf4aSYJwu2023 cap_offset, 437cc36cf4aSYJwu2023 ((temp | (0x0002 << 4)) as u32) << 16, 438cc36cf4aSYJwu2023 ); 439cc36cf4aSYJwu2023 } 440cc36cf4aSYJwu2023 8 => { 441cc36cf4aSYJwu2023 let temp = message_control & (!0x0070); 442cc36cf4aSYJwu2023 PciArch::write_config( 443cc36cf4aSYJwu2023 &self.common_header().bus_device_function, 444cc36cf4aSYJwu2023 cap_offset, 445cc36cf4aSYJwu2023 ((temp | (0x0003 << 4)) as u32) << 16, 446cc36cf4aSYJwu2023 ); 447cc36cf4aSYJwu2023 } 448cc36cf4aSYJwu2023 16 => { 449cc36cf4aSYJwu2023 let temp = message_control & (!0x0070); 450cc36cf4aSYJwu2023 PciArch::write_config( 451cc36cf4aSYJwu2023 &self.common_header().bus_device_function, 452cc36cf4aSYJwu2023 cap_offset, 453cc36cf4aSYJwu2023 ((temp | (0x0004 << 4)) as u32) << 16, 454cc36cf4aSYJwu2023 ); 455cc36cf4aSYJwu2023 } 456cc36cf4aSYJwu2023 32 => { 457cc36cf4aSYJwu2023 let temp = message_control & (!0x0070); 458cc36cf4aSYJwu2023 PciArch::write_config( 459cc36cf4aSYJwu2023 &self.common_header().bus_device_function, 460cc36cf4aSYJwu2023 cap_offset, 461cc36cf4aSYJwu2023 ((temp | (0x0005 << 4)) as u32) << 16, 462cc36cf4aSYJwu2023 ); 463cc36cf4aSYJwu2023 } 464cc36cf4aSYJwu2023 _ => { 465cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::MxiIrqNumWrong)); 466cc36cf4aSYJwu2023 } 467cc36cf4aSYJwu2023 } 468cc36cf4aSYJwu2023 } 469cc36cf4aSYJwu2023 return Ok(0); 470cc36cf4aSYJwu2023 } 471cc36cf4aSYJwu2023 IrqType::Unused => { 472cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 473cc36cf4aSYJwu2023 } 474cc36cf4aSYJwu2023 _ => { 475cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 476cc36cf4aSYJwu2023 } 477cc36cf4aSYJwu2023 } 478cc36cf4aSYJwu2023 } 479cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 480cc36cf4aSYJwu2023 } 481cc36cf4aSYJwu2023 /// @brief 进行PCI设备中断的安装(MSIX) 482cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 483cc36cf4aSYJwu2023 /// @param msg PCI设备install中断时需要传递的共同参数 484cc36cf4aSYJwu2023 /// @return 一切正常返回Ok(0),有错误返回对应错误原因 485*ce5850adSLoGin fn msix_install(&mut self, msg: PciIrqMsg) -> Result<u8, PciError> { 486cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 487cc36cf4aSYJwu2023 match *irq_type { 488cc36cf4aSYJwu2023 IrqType::Msix { 489cc36cf4aSYJwu2023 irq_max_num, 490cc36cf4aSYJwu2023 msix_table_bar, 491cc36cf4aSYJwu2023 msix_table_offset, 492cc36cf4aSYJwu2023 .. 493cc36cf4aSYJwu2023 } => { 494cc36cf4aSYJwu2023 if self.irq_vector_mut().unwrap().len() > irq_max_num as usize { 495cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::DeviceIrqOverflow)); 496cc36cf4aSYJwu2023 } 497cc36cf4aSYJwu2023 let irq_num = 498cc36cf4aSYJwu2023 self.irq_vector_mut().unwrap()[msg.irq_common_message.irq_index as usize]; 499cc36cf4aSYJwu2023 let common_msg = &msg.irq_common_message; 500cc36cf4aSYJwu2023 let result = unsafe { 501cc36cf4aSYJwu2023 c_irq_install( 502cc36cf4aSYJwu2023 irq_num as u64, 503cc36cf4aSYJwu2023 Some(common_msg.irq_hander), 504cc36cf4aSYJwu2023 common_msg.irq_parameter as u64, 505cc36cf4aSYJwu2023 common_msg.irq_name.as_ptr(), 506cc36cf4aSYJwu2023 common_msg.irq_ack, 507cc36cf4aSYJwu2023 ) 508cc36cf4aSYJwu2023 }; 509cc36cf4aSYJwu2023 match result as u32 { 510cc36cf4aSYJwu2023 EINVAL => { 511cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::InvalidIrqNum(irq_num))); 512cc36cf4aSYJwu2023 } 513cc36cf4aSYJwu2023 EAGAIN => { 514cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNumOccupied( 515cc36cf4aSYJwu2023 irq_num, 516cc36cf4aSYJwu2023 ))); 517cc36cf4aSYJwu2023 } 518cc36cf4aSYJwu2023 _ => {} 519cc36cf4aSYJwu2023 } 520cc36cf4aSYJwu2023 5214fda81ceSLoGin let msg_address = arch_msi_message_address(0); 522cc36cf4aSYJwu2023 let trigger = match msg.irq_specific_message { 523cc36cf4aSYJwu2023 IrqSpecificMsg::Legacy => { 524cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 525cc36cf4aSYJwu2023 } 526cc36cf4aSYJwu2023 IrqSpecificMsg::Msi { trigger_mode, .. } => trigger_mode, 527cc36cf4aSYJwu2023 }; 5284fda81ceSLoGin let msg_data = arch_msi_message_data(irq_num, 0, trigger); 529cc36cf4aSYJwu2023 //写入Message Data和Message Address 530cc36cf4aSYJwu2023 let pcistandardbar = self 531cc36cf4aSYJwu2023 .bar() 532cc36cf4aSYJwu2023 .ok_or(PciError::PciIrqError(PciIrqError::PciBarNotInited))?; 533cc36cf4aSYJwu2023 let msix_bar = pcistandardbar.get_bar(msix_table_bar)?; 5340dd8ff43SYJwu2023 let vaddr: crate::mm::VirtAddr = msix_bar 535cc36cf4aSYJwu2023 .virtual_address() 536cc36cf4aSYJwu2023 .ok_or(PciError::PciIrqError(PciIrqError::BarGetVaddrFailed))? 537cc36cf4aSYJwu2023 + msix_table_offset as usize 538cc36cf4aSYJwu2023 + msg.irq_common_message.irq_index as usize * size_of::<MsixEntry>(); 5392dd9f0c7SLoGin let msix_entry = NonNull::new(vaddr.data() as *mut MsixEntry).unwrap(); 540afc95d5cSYJwu2023 // 这里的操作并不适用于所有架构,需要再优化,msg_upper_data并不一定为0 541cc36cf4aSYJwu2023 unsafe { 542cc36cf4aSYJwu2023 volwrite!(msix_entry, vector_control, 0); 543cc36cf4aSYJwu2023 volwrite!(msix_entry, msg_data, msg_data); 544cc36cf4aSYJwu2023 volwrite!(msix_entry, msg_upper_addr, 0); 545cc36cf4aSYJwu2023 volwrite!(msix_entry, msg_addr, msg_address); 546cc36cf4aSYJwu2023 } 547cc36cf4aSYJwu2023 return Ok(0); 548cc36cf4aSYJwu2023 } 549cc36cf4aSYJwu2023 IrqType::Unused => { 550cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 551cc36cf4aSYJwu2023 } 552cc36cf4aSYJwu2023 _ => { 553cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 554cc36cf4aSYJwu2023 } 555cc36cf4aSYJwu2023 } 556cc36cf4aSYJwu2023 } 557cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 558cc36cf4aSYJwu2023 } 559cc36cf4aSYJwu2023 /// @brief 进行PCI设备中断的卸载 560cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 561cc36cf4aSYJwu2023 fn irq_uninstall(&mut self) -> Result<u8, PciError> { 562cc36cf4aSYJwu2023 self.irq_enable(false)?; //中断设置更改前先关闭对应PCI设备的中断 563cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 564cc36cf4aSYJwu2023 match *irq_type { 565cc36cf4aSYJwu2023 IrqType::Msix { .. } => { 566cc36cf4aSYJwu2023 return self.msix_uninstall(); 567cc36cf4aSYJwu2023 } 568cc36cf4aSYJwu2023 IrqType::Msi { .. } => { 569cc36cf4aSYJwu2023 return self.msi_uninstall(); 570cc36cf4aSYJwu2023 } 571cc36cf4aSYJwu2023 IrqType::Unused => { 572cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 573cc36cf4aSYJwu2023 } 574cc36cf4aSYJwu2023 _ => { 575cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeNotSupported)); 576cc36cf4aSYJwu2023 } 577cc36cf4aSYJwu2023 } 578cc36cf4aSYJwu2023 } 579cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 580cc36cf4aSYJwu2023 } 581cc36cf4aSYJwu2023 /// @brief 进行PCI设备中断的卸载(MSI) 582cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 583cc36cf4aSYJwu2023 fn msi_uninstall(&mut self) -> Result<u8, PciError> { 584cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 585cc36cf4aSYJwu2023 match *irq_type { 586cc36cf4aSYJwu2023 IrqType::Msi { 587cc36cf4aSYJwu2023 address_64, 588cc36cf4aSYJwu2023 cap_offset, 589cc36cf4aSYJwu2023 .. 590cc36cf4aSYJwu2023 } => { 591cc36cf4aSYJwu2023 for vector in self.irq_vector_mut().unwrap() { 592cc36cf4aSYJwu2023 unsafe { 593cc36cf4aSYJwu2023 c_irq_uninstall(vector.clone() as u64); 594cc36cf4aSYJwu2023 } 595cc36cf4aSYJwu2023 } 596cc36cf4aSYJwu2023 PciArch::write_config(&self.common_header().bus_device_function, cap_offset, 0); 597cc36cf4aSYJwu2023 PciArch::write_config( 598cc36cf4aSYJwu2023 &self.common_header().bus_device_function, 599cc36cf4aSYJwu2023 cap_offset + 4, 600cc36cf4aSYJwu2023 0, 601cc36cf4aSYJwu2023 ); 602cc36cf4aSYJwu2023 PciArch::write_config( 603cc36cf4aSYJwu2023 &self.common_header().bus_device_function, 604cc36cf4aSYJwu2023 cap_offset + 8, 605cc36cf4aSYJwu2023 0, 606cc36cf4aSYJwu2023 ); 607cc36cf4aSYJwu2023 if address_64 { 608cc36cf4aSYJwu2023 PciArch::write_config( 609cc36cf4aSYJwu2023 &self.common_header().bus_device_function, 610cc36cf4aSYJwu2023 cap_offset + 12, 611cc36cf4aSYJwu2023 0, 612cc36cf4aSYJwu2023 ); 613cc36cf4aSYJwu2023 } 614cc36cf4aSYJwu2023 return Ok(0); 615cc36cf4aSYJwu2023 } 616cc36cf4aSYJwu2023 IrqType::Unused => { 617cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 618cc36cf4aSYJwu2023 } 619cc36cf4aSYJwu2023 _ => { 620cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 621cc36cf4aSYJwu2023 } 622cc36cf4aSYJwu2023 } 623cc36cf4aSYJwu2023 } 624cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 625cc36cf4aSYJwu2023 } 626cc36cf4aSYJwu2023 /// @brief 进行PCI设备中断的卸载(MSIX) 627cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 628cc36cf4aSYJwu2023 fn msix_uninstall(&mut self) -> Result<u8, PciError> { 629cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 630cc36cf4aSYJwu2023 match *irq_type { 631cc36cf4aSYJwu2023 IrqType::Msix { 632cc36cf4aSYJwu2023 irq_max_num, 633cc36cf4aSYJwu2023 cap_offset, 634cc36cf4aSYJwu2023 msix_table_bar, 635cc36cf4aSYJwu2023 msix_table_offset, 636cc36cf4aSYJwu2023 .. 637cc36cf4aSYJwu2023 } => { 638cc36cf4aSYJwu2023 for vector in self.irq_vector_mut().unwrap() { 639cc36cf4aSYJwu2023 unsafe { 640cc36cf4aSYJwu2023 c_irq_uninstall(vector.clone() as u64); 641cc36cf4aSYJwu2023 } 642cc36cf4aSYJwu2023 } 643cc36cf4aSYJwu2023 PciArch::write_config(&self.common_header().bus_device_function, cap_offset, 0); 644cc36cf4aSYJwu2023 let pcistandardbar = self 645cc36cf4aSYJwu2023 .bar() 646cc36cf4aSYJwu2023 .ok_or(PciError::PciIrqError(PciIrqError::PciBarNotInited)) 647cc36cf4aSYJwu2023 .unwrap(); 648cc36cf4aSYJwu2023 let msix_bar = pcistandardbar.get_bar(msix_table_bar).unwrap(); 649cc36cf4aSYJwu2023 for index in 0..irq_max_num { 650cc36cf4aSYJwu2023 let vaddr = msix_bar 651cc36cf4aSYJwu2023 .virtual_address() 652cc36cf4aSYJwu2023 .ok_or(PciError::PciIrqError(PciIrqError::BarGetVaddrFailed)) 6532dd9f0c7SLoGin .unwrap() 654cc36cf4aSYJwu2023 + msix_table_offset as usize 655cc36cf4aSYJwu2023 + index as usize * size_of::<MsixEntry>(); 6562dd9f0c7SLoGin let msix_entry = NonNull::new(vaddr.data() as *mut MsixEntry).unwrap(); 657cc36cf4aSYJwu2023 unsafe { 658cc36cf4aSYJwu2023 volwrite!(msix_entry, vector_control, 0); 659cc36cf4aSYJwu2023 volwrite!(msix_entry, msg_data, 0); 660cc36cf4aSYJwu2023 volwrite!(msix_entry, msg_upper_addr, 0); 661cc36cf4aSYJwu2023 volwrite!(msix_entry, msg_addr, 0); 662cc36cf4aSYJwu2023 } 663cc36cf4aSYJwu2023 } 664cc36cf4aSYJwu2023 return Ok(0); 665cc36cf4aSYJwu2023 } 666cc36cf4aSYJwu2023 IrqType::Unused => { 667cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 668cc36cf4aSYJwu2023 } 669cc36cf4aSYJwu2023 _ => { 670cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 671cc36cf4aSYJwu2023 } 672cc36cf4aSYJwu2023 } 673cc36cf4aSYJwu2023 } 674cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 675cc36cf4aSYJwu2023 } 676cc36cf4aSYJwu2023 /// @brief 屏蔽相应位置的中断 677cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 678cc36cf4aSYJwu2023 /// @param irq_index 中断的位置(在vec中的index和安装的index相同) 679cc36cf4aSYJwu2023 fn irq_mask(&mut self, irq_index: u16) -> Result<u8, PciError> { 680cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 681cc36cf4aSYJwu2023 match *irq_type { 682cc36cf4aSYJwu2023 IrqType::Msix { .. } => { 683cc36cf4aSYJwu2023 return self.msix_mask(irq_index); 684cc36cf4aSYJwu2023 } 685cc36cf4aSYJwu2023 IrqType::Msi { .. } => { 686cc36cf4aSYJwu2023 return self.msi_mask(irq_index); 687cc36cf4aSYJwu2023 } 688cc36cf4aSYJwu2023 IrqType::Unused => { 689cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 690cc36cf4aSYJwu2023 } 691cc36cf4aSYJwu2023 _ => { 692cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeNotSupported)); 693cc36cf4aSYJwu2023 } 694cc36cf4aSYJwu2023 } 695cc36cf4aSYJwu2023 } 696cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 697cc36cf4aSYJwu2023 } 698cc36cf4aSYJwu2023 /// @brief 屏蔽相应位置的中断(MSI) 699cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 700cc36cf4aSYJwu2023 /// @param irq_index 中断的位置(在vec中的index和安装的index相同) 701cc36cf4aSYJwu2023 fn msi_mask(&mut self, irq_index: u16) -> Result<u8, PciError> { 702cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 703cc36cf4aSYJwu2023 match *irq_type { 704cc36cf4aSYJwu2023 IrqType::Msi { 705cc36cf4aSYJwu2023 maskable, 706cc36cf4aSYJwu2023 address_64, 707cc36cf4aSYJwu2023 cap_offset, 708cc36cf4aSYJwu2023 irq_max_num, 709cc36cf4aSYJwu2023 } => { 710cc36cf4aSYJwu2023 if irq_index >= irq_max_num { 711cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::InvalidIrqIndex( 712cc36cf4aSYJwu2023 irq_index, 713cc36cf4aSYJwu2023 ))); 714cc36cf4aSYJwu2023 } 715cc36cf4aSYJwu2023 if maskable { 716cc36cf4aSYJwu2023 match address_64 { 717cc36cf4aSYJwu2023 true => { 718cc36cf4aSYJwu2023 let mut mask = PciArch::read_config( 719cc36cf4aSYJwu2023 &self.common_header().bus_device_function, 720cc36cf4aSYJwu2023 cap_offset + 16, 721cc36cf4aSYJwu2023 ); 722cc36cf4aSYJwu2023 mask |= 1 << irq_index; 723cc36cf4aSYJwu2023 PciArch::write_config( 724cc36cf4aSYJwu2023 &self.common_header().bus_device_function, 725cc36cf4aSYJwu2023 cap_offset, 726cc36cf4aSYJwu2023 mask, 727cc36cf4aSYJwu2023 ); 728cc36cf4aSYJwu2023 } 729cc36cf4aSYJwu2023 false => { 730cc36cf4aSYJwu2023 let mut mask = PciArch::read_config( 731cc36cf4aSYJwu2023 &self.common_header().bus_device_function, 732cc36cf4aSYJwu2023 cap_offset + 12, 733cc36cf4aSYJwu2023 ); 734cc36cf4aSYJwu2023 mask |= 1 << irq_index; 735cc36cf4aSYJwu2023 PciArch::write_config( 736cc36cf4aSYJwu2023 &self.common_header().bus_device_function, 737cc36cf4aSYJwu2023 cap_offset, 738cc36cf4aSYJwu2023 mask, 739cc36cf4aSYJwu2023 ); 740cc36cf4aSYJwu2023 } 741cc36cf4aSYJwu2023 } 742cc36cf4aSYJwu2023 return Ok(0); 743cc36cf4aSYJwu2023 } 744cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::MaskNotSupported)); 745cc36cf4aSYJwu2023 } 746cc36cf4aSYJwu2023 IrqType::Unused => { 747cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 748cc36cf4aSYJwu2023 } 749cc36cf4aSYJwu2023 _ => { 750cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 751cc36cf4aSYJwu2023 } 752cc36cf4aSYJwu2023 } 753cc36cf4aSYJwu2023 } 754cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 755cc36cf4aSYJwu2023 } 756cc36cf4aSYJwu2023 /// @brief 屏蔽相应位置的中断(MSIX) 757cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 758cc36cf4aSYJwu2023 /// @param irq_index 中断的位置(在vec中的index和安装的index相同) 759cc36cf4aSYJwu2023 fn msix_mask(&mut self, irq_index: u16) -> Result<u8, PciError> { 760cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 761cc36cf4aSYJwu2023 match *irq_type { 762cc36cf4aSYJwu2023 IrqType::Msix { 763cc36cf4aSYJwu2023 irq_max_num, 764cc36cf4aSYJwu2023 msix_table_bar, 765cc36cf4aSYJwu2023 msix_table_offset, 766cc36cf4aSYJwu2023 .. 767cc36cf4aSYJwu2023 } => { 768cc36cf4aSYJwu2023 if irq_index >= irq_max_num { 769cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::InvalidIrqIndex( 770cc36cf4aSYJwu2023 irq_index, 771cc36cf4aSYJwu2023 ))); 772cc36cf4aSYJwu2023 } 773cc36cf4aSYJwu2023 let pcistandardbar = self 774cc36cf4aSYJwu2023 .bar() 775cc36cf4aSYJwu2023 .ok_or(PciError::PciIrqError(PciIrqError::PciBarNotInited)) 776cc36cf4aSYJwu2023 .unwrap(); 777cc36cf4aSYJwu2023 let msix_bar = pcistandardbar.get_bar(msix_table_bar).unwrap(); 7782dd9f0c7SLoGin let vaddr = msix_bar.virtual_address().unwrap() 779cc36cf4aSYJwu2023 + msix_table_offset as usize 780cc36cf4aSYJwu2023 + irq_index as usize * size_of::<MsixEntry>(); 7812dd9f0c7SLoGin let msix_entry = NonNull::new(vaddr.data() as *mut MsixEntry).unwrap(); 782cc36cf4aSYJwu2023 unsafe { 783cc36cf4aSYJwu2023 volwrite!(msix_entry, vector_control, 1); 784cc36cf4aSYJwu2023 } 785cc36cf4aSYJwu2023 return Ok(0); 786cc36cf4aSYJwu2023 } 787cc36cf4aSYJwu2023 IrqType::Unused => { 788cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 789cc36cf4aSYJwu2023 } 790cc36cf4aSYJwu2023 _ => { 791cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 792cc36cf4aSYJwu2023 } 793cc36cf4aSYJwu2023 } 794cc36cf4aSYJwu2023 } 795cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 796cc36cf4aSYJwu2023 } 797cc36cf4aSYJwu2023 /// @brief 解除屏蔽相应位置的中断 798cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 799cc36cf4aSYJwu2023 /// @param irq_index 中断的位置(在vec中的index和安装的index相同) 800cc36cf4aSYJwu2023 fn irq_unmask(&mut self, irq_index: u16) -> Result<u8, PciError> { 801cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 802cc36cf4aSYJwu2023 match *irq_type { 803cc36cf4aSYJwu2023 IrqType::Msix { .. } => { 804cc36cf4aSYJwu2023 return self.msix_unmask(irq_index); 805cc36cf4aSYJwu2023 } 806cc36cf4aSYJwu2023 IrqType::Msi { .. } => { 807cc36cf4aSYJwu2023 return self.msi_unmask(irq_index); 808cc36cf4aSYJwu2023 } 809cc36cf4aSYJwu2023 IrqType::Unused => { 810cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 811cc36cf4aSYJwu2023 } 812cc36cf4aSYJwu2023 _ => { 813cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeNotSupported)); 814cc36cf4aSYJwu2023 } 815cc36cf4aSYJwu2023 } 816cc36cf4aSYJwu2023 } 817cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 818cc36cf4aSYJwu2023 } 819cc36cf4aSYJwu2023 /// @brief 解除屏蔽相应位置的中断(MSI) 820cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 821cc36cf4aSYJwu2023 /// @param irq_index 中断的位置(在vec中的index和安装的index相同) 822cc36cf4aSYJwu2023 fn msi_unmask(&mut self, irq_index: u16) -> Result<u8, PciError> { 823cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 824cc36cf4aSYJwu2023 match *irq_type { 825cc36cf4aSYJwu2023 IrqType::Msi { 826cc36cf4aSYJwu2023 maskable, 827cc36cf4aSYJwu2023 address_64, 828cc36cf4aSYJwu2023 cap_offset, 829cc36cf4aSYJwu2023 irq_max_num, 830cc36cf4aSYJwu2023 } => { 831cc36cf4aSYJwu2023 if irq_index >= irq_max_num { 832cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::InvalidIrqIndex( 833cc36cf4aSYJwu2023 irq_index, 834cc36cf4aSYJwu2023 ))); 835cc36cf4aSYJwu2023 } 836cc36cf4aSYJwu2023 if maskable { 837cc36cf4aSYJwu2023 match address_64 { 838cc36cf4aSYJwu2023 true => { 839cc36cf4aSYJwu2023 let mut mask = PciArch::read_config( 840cc36cf4aSYJwu2023 &self.common_header().bus_device_function, 841cc36cf4aSYJwu2023 cap_offset + 16, 842cc36cf4aSYJwu2023 ); 843cc36cf4aSYJwu2023 mask &= !(1 << irq_index); 844cc36cf4aSYJwu2023 PciArch::write_config( 845cc36cf4aSYJwu2023 &self.common_header().bus_device_function, 846cc36cf4aSYJwu2023 cap_offset, 847cc36cf4aSYJwu2023 mask, 848cc36cf4aSYJwu2023 ); 849cc36cf4aSYJwu2023 } 850cc36cf4aSYJwu2023 false => { 851cc36cf4aSYJwu2023 let mut mask = PciArch::read_config( 852cc36cf4aSYJwu2023 &self.common_header().bus_device_function, 853cc36cf4aSYJwu2023 cap_offset + 12, 854cc36cf4aSYJwu2023 ); 855cc36cf4aSYJwu2023 mask &= !(1 << irq_index); 856cc36cf4aSYJwu2023 PciArch::write_config( 857cc36cf4aSYJwu2023 &self.common_header().bus_device_function, 858cc36cf4aSYJwu2023 cap_offset, 859cc36cf4aSYJwu2023 mask, 860cc36cf4aSYJwu2023 ); 861cc36cf4aSYJwu2023 } 862cc36cf4aSYJwu2023 } 863cc36cf4aSYJwu2023 } 864cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::MaskNotSupported)); 865cc36cf4aSYJwu2023 } 866cc36cf4aSYJwu2023 IrqType::Unused => { 867cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 868cc36cf4aSYJwu2023 } 869cc36cf4aSYJwu2023 _ => { 870cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 871cc36cf4aSYJwu2023 } 872cc36cf4aSYJwu2023 } 873cc36cf4aSYJwu2023 } 874cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 875cc36cf4aSYJwu2023 } 876cc36cf4aSYJwu2023 /// @brief 解除屏蔽相应位置的中断(MSIX) 877cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 878cc36cf4aSYJwu2023 /// @param irq_index 中断的位置(在vec中的index和安装的index相同) 879cc36cf4aSYJwu2023 fn msix_unmask(&mut self, irq_index: u16) -> Result<u8, PciError> { 880cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 881cc36cf4aSYJwu2023 match *irq_type { 882cc36cf4aSYJwu2023 IrqType::Msix { 883cc36cf4aSYJwu2023 irq_max_num, 884cc36cf4aSYJwu2023 msix_table_bar, 885cc36cf4aSYJwu2023 msix_table_offset, 886cc36cf4aSYJwu2023 .. 887cc36cf4aSYJwu2023 } => { 888cc36cf4aSYJwu2023 if irq_index >= irq_max_num { 889cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::InvalidIrqIndex( 890cc36cf4aSYJwu2023 irq_index, 891cc36cf4aSYJwu2023 ))); 892cc36cf4aSYJwu2023 } 893cc36cf4aSYJwu2023 let pcistandardbar = self 894cc36cf4aSYJwu2023 .bar() 895cc36cf4aSYJwu2023 .ok_or(PciError::PciIrqError(PciIrqError::PciBarNotInited)) 896cc36cf4aSYJwu2023 .unwrap(); 897cc36cf4aSYJwu2023 let msix_bar = pcistandardbar.get_bar(msix_table_bar).unwrap(); 8982dd9f0c7SLoGin let vaddr = msix_bar.virtual_address().unwrap() 899cc36cf4aSYJwu2023 + msix_table_offset as usize 900cc36cf4aSYJwu2023 + irq_index as usize * size_of::<MsixEntry>(); 9012dd9f0c7SLoGin let msix_entry = NonNull::new(vaddr.data() as *mut MsixEntry).unwrap(); 902cc36cf4aSYJwu2023 unsafe { 903cc36cf4aSYJwu2023 volwrite!(msix_entry, vector_control, 0); 904cc36cf4aSYJwu2023 } 905cc36cf4aSYJwu2023 return Ok(0); 906cc36cf4aSYJwu2023 } 907cc36cf4aSYJwu2023 IrqType::Unused => { 908cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 909cc36cf4aSYJwu2023 } 910cc36cf4aSYJwu2023 _ => { 911cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 912cc36cf4aSYJwu2023 } 913cc36cf4aSYJwu2023 } 914cc36cf4aSYJwu2023 } 915cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 916cc36cf4aSYJwu2023 } 917cc36cf4aSYJwu2023 /// @brief 检查被挂起的中断是否在挂起的时候产生了 918cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 919cc36cf4aSYJwu2023 /// @param irq_index 中断的位置(在vec中的index和安装的index相同) 920cc36cf4aSYJwu2023 /// @return 是否在挂起过程中产生中断(异常情况也返回false) 921cc36cf4aSYJwu2023 fn irq_check_pending(&mut self, irq_index: u16) -> Result<bool, PciError> { 922cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 923cc36cf4aSYJwu2023 match *irq_type { 924cc36cf4aSYJwu2023 IrqType::Msix { .. } => { 925cc36cf4aSYJwu2023 return self.msix_check_pending(irq_index); 926cc36cf4aSYJwu2023 } 927cc36cf4aSYJwu2023 IrqType::Msi { .. } => { 928cc36cf4aSYJwu2023 return self.msi_check_pending(irq_index); 929cc36cf4aSYJwu2023 } 930cc36cf4aSYJwu2023 IrqType::Unused => { 931cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 932cc36cf4aSYJwu2023 } 933cc36cf4aSYJwu2023 _ => { 934cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeNotSupported)); 935cc36cf4aSYJwu2023 } 936cc36cf4aSYJwu2023 } 937cc36cf4aSYJwu2023 } 938cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 939cc36cf4aSYJwu2023 } 940cc36cf4aSYJwu2023 /// @brief 检查被挂起的中断是否在挂起的时候产生了(MSI) 941cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 942cc36cf4aSYJwu2023 /// @param irq_index 中断的位置(在vec中的index和安装的index相同) 943cc36cf4aSYJwu2023 /// @return 是否在挂起过程中产生中断(异常情况也返回false) 944cc36cf4aSYJwu2023 fn msi_check_pending(&mut self, irq_index: u16) -> Result<bool, PciError> { 945cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 946cc36cf4aSYJwu2023 match *irq_type { 947cc36cf4aSYJwu2023 IrqType::Msi { 948cc36cf4aSYJwu2023 maskable, 949cc36cf4aSYJwu2023 address_64, 950cc36cf4aSYJwu2023 cap_offset, 951cc36cf4aSYJwu2023 irq_max_num, 952cc36cf4aSYJwu2023 } => { 953cc36cf4aSYJwu2023 if irq_index >= irq_max_num { 954cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::InvalidIrqIndex( 955cc36cf4aSYJwu2023 irq_index, 956cc36cf4aSYJwu2023 ))); 957cc36cf4aSYJwu2023 } 958cc36cf4aSYJwu2023 if maskable { 959cc36cf4aSYJwu2023 match address_64 { 960cc36cf4aSYJwu2023 true => { 961cc36cf4aSYJwu2023 let mut pend = PciArch::read_config( 962cc36cf4aSYJwu2023 &self.common_header().bus_device_function, 963cc36cf4aSYJwu2023 cap_offset + 20, 964cc36cf4aSYJwu2023 ); 965cc36cf4aSYJwu2023 pend &= 1 << irq_index; 966cc36cf4aSYJwu2023 return Ok(pend != 0); 967cc36cf4aSYJwu2023 } 968cc36cf4aSYJwu2023 false => { 969cc36cf4aSYJwu2023 let mut pend = PciArch::read_config( 970cc36cf4aSYJwu2023 &self.common_header().bus_device_function, 971cc36cf4aSYJwu2023 cap_offset + 16, 972cc36cf4aSYJwu2023 ); 973cc36cf4aSYJwu2023 pend &= 1 << irq_index; 974cc36cf4aSYJwu2023 return Ok(pend != 0); 975cc36cf4aSYJwu2023 } 976cc36cf4aSYJwu2023 } 977cc36cf4aSYJwu2023 } 978cc36cf4aSYJwu2023 } 979cc36cf4aSYJwu2023 IrqType::Unused => { 980cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 981cc36cf4aSYJwu2023 } 982cc36cf4aSYJwu2023 _ => { 983cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 984cc36cf4aSYJwu2023 } 985cc36cf4aSYJwu2023 } 986cc36cf4aSYJwu2023 } 987cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 988cc36cf4aSYJwu2023 } 989cc36cf4aSYJwu2023 /// @brief 检查被挂起的中断是否在挂起的时候产生了(MSIX) 990cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 991cc36cf4aSYJwu2023 /// @param irq_index 中断的位置(在vec中的index和安装的index相同) 992cc36cf4aSYJwu2023 /// @return 是否在挂起过程中产生中断(异常情况也返回false) 993cc36cf4aSYJwu2023 fn msix_check_pending(&mut self, irq_index: u16) -> Result<bool, PciError> { 994cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 995cc36cf4aSYJwu2023 match *irq_type { 996cc36cf4aSYJwu2023 IrqType::Msix { 997cc36cf4aSYJwu2023 irq_max_num, 998cc36cf4aSYJwu2023 pending_table_bar, 999cc36cf4aSYJwu2023 pending_table_offset, 1000cc36cf4aSYJwu2023 .. 1001cc36cf4aSYJwu2023 } => { 1002cc36cf4aSYJwu2023 if irq_index >= irq_max_num { 1003cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::InvalidIrqIndex( 1004cc36cf4aSYJwu2023 irq_index, 1005cc36cf4aSYJwu2023 ))); 1006cc36cf4aSYJwu2023 } 1007cc36cf4aSYJwu2023 let pcistandardbar = self 1008cc36cf4aSYJwu2023 .bar() 1009cc36cf4aSYJwu2023 .ok_or(PciError::PciIrqError(PciIrqError::PciBarNotInited)) 1010cc36cf4aSYJwu2023 .unwrap(); 1011cc36cf4aSYJwu2023 let pending_bar = pcistandardbar.get_bar(pending_table_bar).unwrap(); 10122dd9f0c7SLoGin let vaddr = pending_bar.virtual_address().unwrap() 1013cc36cf4aSYJwu2023 + pending_table_offset as usize 1014cc36cf4aSYJwu2023 + (irq_index as usize / 64) * size_of::<PendingEntry>(); 10152dd9f0c7SLoGin let pending_entry = NonNull::new(vaddr.data() as *mut PendingEntry).unwrap(); 1016cc36cf4aSYJwu2023 let pending_entry = unsafe { volread!(pending_entry, entry) }; 1017cc36cf4aSYJwu2023 return Ok(pending_entry & (1 << (irq_index as u64 % 64)) != 0); 1018cc36cf4aSYJwu2023 } 1019cc36cf4aSYJwu2023 IrqType::Unused => { 1020cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 1021cc36cf4aSYJwu2023 } 1022cc36cf4aSYJwu2023 _ => { 1023cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 1024cc36cf4aSYJwu2023 } 1025cc36cf4aSYJwu2023 } 1026cc36cf4aSYJwu2023 } 1027cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 1028cc36cf4aSYJwu2023 } 1029cc36cf4aSYJwu2023 } 1030cc36cf4aSYJwu2023 /// PCI标准设备的msi/msix中断相关函数块 1031cc36cf4aSYJwu2023 impl PciInterrupt for PciDeviceStructureGeneralDevice {} 1032