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