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