1cc36cf4aSYJwu2023 #![allow(dead_code)] 2cc36cf4aSYJwu2023 3cc36cf4aSYJwu2023 use core::mem::size_of; 4cc36cf4aSYJwu2023 use core::ptr::NonNull; 5cc36cf4aSYJwu2023 6e2841179SLoGin use alloc::string::String; 7e2841179SLoGin use alloc::sync::Arc; 8cc36cf4aSYJwu2023 use alloc::vec::Vec; 92eab6dd7S曾俊 use log::error; 10e2841179SLoGin use system_error::SystemError; 11cc36cf4aSYJwu2023 12370472f7SLoGin use super::pci::{PciDeviceStructure, PciDeviceStructureGeneralDevice, PciError}; 13370472f7SLoGin use super::root::pci_root_0; 144fda81ceSLoGin use crate::arch::msi::{arch_msi_message_address, arch_msi_message_data}; 15876cb89eSGnoCiYeH 16e2841179SLoGin use crate::driver::base::device::DeviceId; 17e2841179SLoGin use crate::exception::irqdesc::{IrqHandleFlags, IrqHandler}; 18e2841179SLoGin use crate::exception::manage::irq_manager; 19e2841179SLoGin use crate::exception::IrqNumber; 20fbe6becdSLoGin use crate::libs::volatile::{volread, volwrite, Volatile}; 2140fe15e0SLoGin 22cc36cf4aSYJwu2023 /// MSIX表的一项 23cc36cf4aSYJwu2023 #[repr(C)] 24cc36cf4aSYJwu2023 struct MsixEntry { 25cc36cf4aSYJwu2023 msg_addr: Volatile<u32>, 260dd8ff43SYJwu2023 msg_upper_addr: Volatile<u32>, 270dd8ff43SYJwu2023 msg_data: Volatile<u32>, 280dd8ff43SYJwu2023 vector_control: Volatile<u32>, 29cc36cf4aSYJwu2023 } 30afc95d5cSYJwu2023 31cc36cf4aSYJwu2023 /// Pending表的一项 32cc36cf4aSYJwu2023 #[repr(C)] 33cc36cf4aSYJwu2023 struct PendingEntry { 34cc36cf4aSYJwu2023 entry: Volatile<u64>, 35cc36cf4aSYJwu2023 } 36afc95d5cSYJwu2023 37cc36cf4aSYJwu2023 /// PCI设备中断错误 38cc36cf4aSYJwu2023 #[derive(Copy, Clone, Debug, Eq, PartialEq)] 39cc36cf4aSYJwu2023 pub enum PciIrqError { 40cc36cf4aSYJwu2023 IrqTypeNotSupported, 41cc36cf4aSYJwu2023 PciDeviceNotSupportIrq, 42cc36cf4aSYJwu2023 IrqTypeUnmatch, 43cc36cf4aSYJwu2023 InvalidIrqIndex(u16), 44e2841179SLoGin InvalidIrqNum(IrqNumber), 45e2841179SLoGin IrqNumOccupied(IrqNumber), 46cc36cf4aSYJwu2023 DeviceIrqOverflow, 47cc36cf4aSYJwu2023 MxiIrqNumWrong, 48cc36cf4aSYJwu2023 PciBarNotInited, 49cc36cf4aSYJwu2023 BarGetVaddrFailed, 50cc36cf4aSYJwu2023 MaskNotSupported, 51cc36cf4aSYJwu2023 IrqNotInited, 52cc36cf4aSYJwu2023 } 53afc95d5cSYJwu2023 54cc36cf4aSYJwu2023 /// PCI设备的中断类型 55cc36cf4aSYJwu2023 #[derive(Copy, Clone, Debug)] 56cc36cf4aSYJwu2023 pub enum IrqType { 57cc36cf4aSYJwu2023 Msi { 58cc36cf4aSYJwu2023 address_64: bool, 59cc36cf4aSYJwu2023 maskable: bool, 60cc36cf4aSYJwu2023 irq_max_num: u16, 61cc36cf4aSYJwu2023 cap_offset: u8, 62cc36cf4aSYJwu2023 }, 63cc36cf4aSYJwu2023 Msix { 64cc36cf4aSYJwu2023 msix_table_bar: u8, 65cc36cf4aSYJwu2023 msix_table_offset: u32, 66cc36cf4aSYJwu2023 pending_table_bar: u8, 67cc36cf4aSYJwu2023 pending_table_offset: u32, 68cc36cf4aSYJwu2023 irq_max_num: u16, 69cc36cf4aSYJwu2023 cap_offset: u8, 70cc36cf4aSYJwu2023 }, 71cc36cf4aSYJwu2023 Legacy, 72cc36cf4aSYJwu2023 Unused, 73cc36cf4aSYJwu2023 } 74afc95d5cSYJwu2023 75cc36cf4aSYJwu2023 // PCI设备install中断时需要传递的参数 76cc36cf4aSYJwu2023 #[derive(Clone, Debug)] 77ce5850adSLoGin pub struct PciIrqMsg { 780dd8ff43SYJwu2023 pub irq_common_message: IrqCommonMsg, 790dd8ff43SYJwu2023 pub irq_specific_message: IrqSpecificMsg, 80cc36cf4aSYJwu2023 } 81afc95d5cSYJwu2023 82cc36cf4aSYJwu2023 // PCI设备install中断时需要传递的共同参数 83cc36cf4aSYJwu2023 #[derive(Clone, Debug)] 84cc36cf4aSYJwu2023 pub struct IrqCommonMsg { 85afc95d5cSYJwu2023 irq_index: u16, //要install的中断号在PCI设备中的irq_vector的index 86e2841179SLoGin irq_name: String, //中断名字 87e2841179SLoGin irq_hander: &'static dyn IrqHandler, // 中断处理函数 88e2841179SLoGin /// 全局设备标志符 89e2841179SLoGin dev_id: Arc<DeviceId>, 90cc36cf4aSYJwu2023 } 91afc95d5cSYJwu2023 92afc95d5cSYJwu2023 impl IrqCommonMsg { init_from( irq_index: u16, irq_name: String, irq_hander: &'static dyn IrqHandler, dev_id: Arc<DeviceId>, ) -> Self93afc95d5cSYJwu2023 pub fn init_from( 94afc95d5cSYJwu2023 irq_index: u16, 95e2841179SLoGin irq_name: String, 96e2841179SLoGin irq_hander: &'static dyn IrqHandler, 97e2841179SLoGin dev_id: Arc<DeviceId>, 98afc95d5cSYJwu2023 ) -> Self { 99afc95d5cSYJwu2023 IrqCommonMsg { 100afc95d5cSYJwu2023 irq_index, 101e2841179SLoGin irq_name, 102afc95d5cSYJwu2023 irq_hander, 103e2841179SLoGin dev_id, 104afc95d5cSYJwu2023 } 105afc95d5cSYJwu2023 } 106e2841179SLoGin set_handler(&mut self, irq_hander: &'static dyn IrqHandler)107e2841179SLoGin pub fn set_handler(&mut self, irq_hander: &'static dyn IrqHandler) { 108e2841179SLoGin self.irq_hander = irq_hander; 109e2841179SLoGin } 110e2841179SLoGin dev_id(&self) -> &Arc<DeviceId>111e2841179SLoGin pub fn dev_id(&self) -> &Arc<DeviceId> { 112e2841179SLoGin &self.dev_id 113e2841179SLoGin } 114afc95d5cSYJwu2023 } 115afc95d5cSYJwu2023 116cc36cf4aSYJwu2023 // PCI设备install中断时需要传递的特有参数,Msi代表MSI与MSIX 117cc36cf4aSYJwu2023 #[derive(Clone, Debug)] 118cc36cf4aSYJwu2023 pub enum IrqSpecificMsg { 119cc36cf4aSYJwu2023 Legacy, 120cc36cf4aSYJwu2023 Msi { 121cc36cf4aSYJwu2023 processor: u16, 122cc36cf4aSYJwu2023 trigger_mode: TriggerMode, 123cc36cf4aSYJwu2023 }, 124cc36cf4aSYJwu2023 } 125cc36cf4aSYJwu2023 impl IrqSpecificMsg { msi_default() -> Self1260dd8ff43SYJwu2023 pub fn msi_default() -> Self { 127cc36cf4aSYJwu2023 IrqSpecificMsg::Msi { 128cc36cf4aSYJwu2023 processor: 0, 129cc36cf4aSYJwu2023 trigger_mode: TriggerMode::EdgeTrigger, 130cc36cf4aSYJwu2023 } 131cc36cf4aSYJwu2023 } 132cc36cf4aSYJwu2023 } 133afc95d5cSYJwu2023 134cc36cf4aSYJwu2023 // 申请中断的触发模式,MSI默认为边沿触发 135cc36cf4aSYJwu2023 #[derive(Copy, Clone, Debug)] 136cc36cf4aSYJwu2023 pub enum TriggerMode { 137cc36cf4aSYJwu2023 EdgeTrigger, 138cc36cf4aSYJwu2023 AssertHigh, 139cc36cf4aSYJwu2023 AssertLow, 140cc36cf4aSYJwu2023 } 141afc95d5cSYJwu2023 142cc36cf4aSYJwu2023 bitflags! { 143cc36cf4aSYJwu2023 /// 设备中断类型,使用bitflag使得中断类型的选择更多元化 144cc36cf4aSYJwu2023 pub struct IRQ: u8{ 145cc36cf4aSYJwu2023 const PCI_IRQ_LEGACY = 1 << 0; 146cc36cf4aSYJwu2023 const PCI_IRQ_MSI = 1 << 1; 147cc36cf4aSYJwu2023 const PCI_IRQ_MSIX = 1 << 2; 148cc36cf4aSYJwu2023 const PCI_IRQ_ALL_TYPES=IRQ::PCI_IRQ_LEGACY.bits|IRQ::PCI_IRQ_MSI.bits|IRQ::PCI_IRQ_MSIX.bits; 149cc36cf4aSYJwu2023 } 150cc36cf4aSYJwu2023 } 151afc95d5cSYJwu2023 152cc36cf4aSYJwu2023 /// PciDeviceStructure的子trait,使用继承以直接使用PciDeviceStructure里的接口 153cc36cf4aSYJwu2023 pub trait PciInterrupt: PciDeviceStructure { 154cc36cf4aSYJwu2023 /// @brief PCI设备调用该函数选择中断类型 155cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 156cc36cf4aSYJwu2023 /// @param flag 选择的中断类型(支持多个选择),如PCI_IRQ_ALL_TYPES表示所有中断类型均可,让系统按顺序进行选择 157cc36cf4aSYJwu2023 /// @return Option<IrqType> 失败返回None,成功则返回对应中断类型 irq_init(&mut self, flag: IRQ) -> Option<IrqType>158cc36cf4aSYJwu2023 fn irq_init(&mut self, flag: IRQ) -> Option<IrqType> { 159cc36cf4aSYJwu2023 // MSIX中断优先 160cc36cf4aSYJwu2023 if flag.contains(IRQ::PCI_IRQ_MSIX) { 161cc36cf4aSYJwu2023 if let Some(cap_offset) = self.msix_capability_offset() { 1622709e017SLoGin let data = pci_root_0() 1632709e017SLoGin .read_config(self.common_header().bus_device_function, cap_offset.into()); 1640dd8ff43SYJwu2023 let irq_max_num = ((data >> 16) & 0x7ff) as u16 + 1; 1652709e017SLoGin let data = pci_root_0().read_config( 1662709e017SLoGin self.common_header().bus_device_function, 1672709e017SLoGin (cap_offset + 4).into(), 1682709e017SLoGin ); 1690dd8ff43SYJwu2023 let msix_table_bar = (data & 0x07) as u8; 1700dd8ff43SYJwu2023 let msix_table_offset = data & (!0x07); 1712709e017SLoGin let data = pci_root_0().read_config( 1722709e017SLoGin self.common_header().bus_device_function, 1732709e017SLoGin (cap_offset + 8).into(), 1742709e017SLoGin ); 1750dd8ff43SYJwu2023 let pending_table_bar = (data & 0x07) as u8; 1760dd8ff43SYJwu2023 let pending_table_offset = data & (!0x07); 177cc36cf4aSYJwu2023 *self.irq_type_mut()? = IrqType::Msix { 178cc36cf4aSYJwu2023 msix_table_bar, 179cc36cf4aSYJwu2023 msix_table_offset, 180cc36cf4aSYJwu2023 pending_table_bar, 181cc36cf4aSYJwu2023 pending_table_offset, 182cc36cf4aSYJwu2023 irq_max_num, 183cc36cf4aSYJwu2023 cap_offset, 184cc36cf4aSYJwu2023 }; 185cc36cf4aSYJwu2023 return Some(IrqType::Msix { 186cc36cf4aSYJwu2023 msix_table_bar, 187cc36cf4aSYJwu2023 msix_table_offset, 188cc36cf4aSYJwu2023 pending_table_bar, 189cc36cf4aSYJwu2023 pending_table_offset, 190cc36cf4aSYJwu2023 irq_max_num, 191cc36cf4aSYJwu2023 cap_offset, 192cc36cf4aSYJwu2023 }); 193cc36cf4aSYJwu2023 } 194cc36cf4aSYJwu2023 } 195cc36cf4aSYJwu2023 // 其次MSI 196cc36cf4aSYJwu2023 if flag.contains(IRQ::PCI_IRQ_MSI) { 197cc36cf4aSYJwu2023 if let Some(cap_offset) = self.msi_capability_offset() { 1982709e017SLoGin let data = pci_root_0() 1992709e017SLoGin .read_config(self.common_header().bus_device_function, cap_offset.into()); 200cc36cf4aSYJwu2023 let message_control = (data >> 16) as u16; 201cc36cf4aSYJwu2023 let maskable = (message_control & 0x0100) != 0; 202cc36cf4aSYJwu2023 let address_64 = (message_control & 0x0080) != 0; 203cc36cf4aSYJwu2023 let irq_max_num = (1 << (((message_control & 0x000e) >> 1) + 1)) as u16; 204cc36cf4aSYJwu2023 *self.irq_type_mut()? = IrqType::Msi { 205cc36cf4aSYJwu2023 address_64, 206cc36cf4aSYJwu2023 maskable, 207cc36cf4aSYJwu2023 irq_max_num, 208cc36cf4aSYJwu2023 cap_offset, 209cc36cf4aSYJwu2023 }; 210cc36cf4aSYJwu2023 return Some(IrqType::Msi { 211cc36cf4aSYJwu2023 address_64, 212cc36cf4aSYJwu2023 maskable, 213cc36cf4aSYJwu2023 irq_max_num, 214cc36cf4aSYJwu2023 cap_offset, 215cc36cf4aSYJwu2023 }); 216cc36cf4aSYJwu2023 } 217cc36cf4aSYJwu2023 } 218cc36cf4aSYJwu2023 // 最后选择legacy# 219cc36cf4aSYJwu2023 if flag.contains(IRQ::PCI_IRQ_LEGACY) { 220cc36cf4aSYJwu2023 *self.irq_type_mut()? = IrqType::Legacy; 221cc36cf4aSYJwu2023 return Some(IrqType::Legacy); 222cc36cf4aSYJwu2023 } 223cc36cf4aSYJwu2023 None 224cc36cf4aSYJwu2023 } 225cc36cf4aSYJwu2023 226cc36cf4aSYJwu2023 /// @brief 启动/关闭设备中断 227cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 228cc36cf4aSYJwu2023 /// @param enable 开启/关闭 irq_enable(&mut self, enable: bool) -> Result<u8, PciError>229cc36cf4aSYJwu2023 fn irq_enable(&mut self, enable: bool) -> Result<u8, PciError> { 230cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 231cc36cf4aSYJwu2023 match *irq_type { 232cc36cf4aSYJwu2023 IrqType::Msix { .. } => { 233cc36cf4aSYJwu2023 return self.msix_enable(enable); 234cc36cf4aSYJwu2023 } 235cc36cf4aSYJwu2023 IrqType::Msi { .. } => { 236cc36cf4aSYJwu2023 return self.msi_enable(enable); 237cc36cf4aSYJwu2023 } 238cc36cf4aSYJwu2023 IrqType::Legacy => { 239cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeNotSupported)); 240cc36cf4aSYJwu2023 } 241cc36cf4aSYJwu2023 IrqType::Unused => { 242cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 243cc36cf4aSYJwu2023 } 244cc36cf4aSYJwu2023 } 245cc36cf4aSYJwu2023 } 246cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 247cc36cf4aSYJwu2023 } 248cc36cf4aSYJwu2023 /// @brief 启动/关闭设备MSIX中断 249cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 250cc36cf4aSYJwu2023 /// @param enable 开启/关闭 msix_enable(&mut self, enable: bool) -> Result<u8, PciError>251cc36cf4aSYJwu2023 fn msix_enable(&mut self, enable: bool) -> Result<u8, PciError> { 252cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 253cc36cf4aSYJwu2023 match *irq_type { 254cc36cf4aSYJwu2023 IrqType::Msix { cap_offset, .. } => { 2552709e017SLoGin let mut message = pci_root_0() 2562709e017SLoGin .read_config(self.common_header().bus_device_function, cap_offset.into()); 257cc36cf4aSYJwu2023 if enable { 258cc36cf4aSYJwu2023 message |= 1 << 31; 259cc36cf4aSYJwu2023 } else { 260cc36cf4aSYJwu2023 message &= !(1 << 31); 261cc36cf4aSYJwu2023 } 2622709e017SLoGin pci_root_0().write_config( 2632709e017SLoGin self.common_header().bus_device_function, 2642709e017SLoGin cap_offset.into(), 265cc36cf4aSYJwu2023 message, 266cc36cf4aSYJwu2023 ); 267cc36cf4aSYJwu2023 return Ok(0); 268cc36cf4aSYJwu2023 } 269cc36cf4aSYJwu2023 IrqType::Unused => { 270cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 271cc36cf4aSYJwu2023 } 272cc36cf4aSYJwu2023 _ => { 273cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 274cc36cf4aSYJwu2023 } 275cc36cf4aSYJwu2023 } 276cc36cf4aSYJwu2023 } 277cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 278cc36cf4aSYJwu2023 } 279cc36cf4aSYJwu2023 /// @brief 启动/关闭设备MSI中断 280cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 281cc36cf4aSYJwu2023 /// @param enable 开启/关闭 msi_enable(&mut self, enable: bool) -> Result<u8, PciError>282cc36cf4aSYJwu2023 fn msi_enable(&mut self, enable: bool) -> Result<u8, PciError> { 283cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 284cc36cf4aSYJwu2023 match *irq_type { 285cc36cf4aSYJwu2023 IrqType::Msi { cap_offset, .. } => { 2862709e017SLoGin let mut message = pci_root_0() 2872709e017SLoGin .read_config(self.common_header().bus_device_function, cap_offset.into()); 288cc36cf4aSYJwu2023 if enable { 289cc36cf4aSYJwu2023 message |= 1 << 16; 290cc36cf4aSYJwu2023 } else { 291cc36cf4aSYJwu2023 message &= !(1 << 16); 292cc36cf4aSYJwu2023 } 2932709e017SLoGin pci_root_0().write_config( 2942709e017SLoGin self.common_header().bus_device_function, 2952709e017SLoGin cap_offset.into(), 296cc36cf4aSYJwu2023 message, 297cc36cf4aSYJwu2023 ); 298cc36cf4aSYJwu2023 return Ok(0); 299cc36cf4aSYJwu2023 } 300cc36cf4aSYJwu2023 IrqType::Unused => { 301cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 302cc36cf4aSYJwu2023 } 303cc36cf4aSYJwu2023 _ => { 304cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 305cc36cf4aSYJwu2023 } 306cc36cf4aSYJwu2023 } 307cc36cf4aSYJwu2023 } 308cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 309cc36cf4aSYJwu2023 } 310cc36cf4aSYJwu2023 /// @brief 获取指定数量的中断号 todo 需要中断重构支持 irq_alloc(_num: u16) -> Option<Vec<u16>>31140fe15e0SLoGin fn irq_alloc(_num: u16) -> Option<Vec<u16>> { 312cc36cf4aSYJwu2023 None 313cc36cf4aSYJwu2023 } 314cc36cf4aSYJwu2023 /// @brief 进行PCI设备中断的安装 315cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 316cc36cf4aSYJwu2023 /// @param msg PCI设备install中断时需要传递的共同参数 317cc36cf4aSYJwu2023 /// @return 一切正常返回Ok(0),有错误返回对应错误原因 irq_install(&mut self, msg: PciIrqMsg) -> Result<u8, PciError>318ce5850adSLoGin fn irq_install(&mut self, msg: PciIrqMsg) -> Result<u8, PciError> { 319cc36cf4aSYJwu2023 if let Some(irq_vector) = self.irq_vector_mut() { 320cc36cf4aSYJwu2023 if msg.irq_common_message.irq_index as usize > irq_vector.len() { 321cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::InvalidIrqIndex( 322cc36cf4aSYJwu2023 msg.irq_common_message.irq_index, 323cc36cf4aSYJwu2023 ))); 324cc36cf4aSYJwu2023 } 325cc36cf4aSYJwu2023 } 326cc36cf4aSYJwu2023 self.irq_enable(false)?; //中断设置更改前先关闭对应PCI设备的中断 327cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 328cc36cf4aSYJwu2023 match *irq_type { 329cc36cf4aSYJwu2023 IrqType::Msix { .. } => { 330cc36cf4aSYJwu2023 return self.msix_install(msg); 331cc36cf4aSYJwu2023 } 332cc36cf4aSYJwu2023 IrqType::Msi { .. } => { 333cc36cf4aSYJwu2023 return self.msi_install(msg); 334cc36cf4aSYJwu2023 } 335cc36cf4aSYJwu2023 IrqType::Unused => { 336cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 337cc36cf4aSYJwu2023 } 338cc36cf4aSYJwu2023 _ => { 339cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeNotSupported)); 340cc36cf4aSYJwu2023 } 341cc36cf4aSYJwu2023 } 342cc36cf4aSYJwu2023 } 343cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 344cc36cf4aSYJwu2023 } 345cc36cf4aSYJwu2023 /// @brief 进行PCI设备中断的安装(MSI) 346cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 347cc36cf4aSYJwu2023 /// @param msg PCI设备install中断时需要传递的共同参数 348cc36cf4aSYJwu2023 /// @return 一切正常返回Ok(0),有错误返回对应错误原因 msi_install(&mut self, msg: PciIrqMsg) -> Result<u8, PciError>349ce5850adSLoGin fn msi_install(&mut self, msg: PciIrqMsg) -> Result<u8, PciError> { 350cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 351cc36cf4aSYJwu2023 match *irq_type { 352cc36cf4aSYJwu2023 IrqType::Msi { 353cc36cf4aSYJwu2023 address_64, 354cc36cf4aSYJwu2023 irq_max_num, 355cc36cf4aSYJwu2023 cap_offset, 356cc36cf4aSYJwu2023 .. 357cc36cf4aSYJwu2023 } => { 358cc36cf4aSYJwu2023 // 注意:MSI中断分配的中断号必须连续且大小为2的倍数 359cc36cf4aSYJwu2023 if self.irq_vector_mut().unwrap().len() > irq_max_num as usize { 360cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::DeviceIrqOverflow)); 361cc36cf4aSYJwu2023 } 362cc36cf4aSYJwu2023 let irq_num = 363cc36cf4aSYJwu2023 self.irq_vector_mut().unwrap()[msg.irq_common_message.irq_index as usize]; 364e2841179SLoGin 365e2841179SLoGin let irq_num = IrqNumber::new(irq_num.into()); 366cc36cf4aSYJwu2023 let common_msg = &msg.irq_common_message; 367e2841179SLoGin 368e2841179SLoGin let result = irq_manager().request_irq( 369e2841179SLoGin irq_num, 370e2841179SLoGin common_msg.irq_name.clone(), 371e2841179SLoGin common_msg.irq_hander, 372*232570aeSLoGin IrqHandleFlags::IRQF_SHARED, 373e2841179SLoGin Some(common_msg.dev_id.clone()), 374e2841179SLoGin ); 375e2841179SLoGin 376e2841179SLoGin match result { 377e2841179SLoGin Ok(_) => {} 378e2841179SLoGin Err(SystemError::EINVAL) => { 379cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::InvalidIrqNum(irq_num))); 380cc36cf4aSYJwu2023 } 381e2841179SLoGin 382e2841179SLoGin Err(SystemError::EAGAIN_OR_EWOULDBLOCK) => { 383cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNumOccupied( 384cc36cf4aSYJwu2023 irq_num, 385cc36cf4aSYJwu2023 ))); 386cc36cf4aSYJwu2023 } 387e2841179SLoGin 388e2841179SLoGin Err(_) => { 3892eab6dd7S曾俊 error!( 390e2841179SLoGin "Failed to request pci irq {} for device {}", 391e2841179SLoGin irq_num.data(), 392e2841179SLoGin &common_msg.irq_name 393e2841179SLoGin ); 394e2841179SLoGin return Err(PciError::PciIrqError(PciIrqError::IrqNumOccupied( 395e2841179SLoGin irq_num, 396e2841179SLoGin ))); 397cc36cf4aSYJwu2023 } 398e2841179SLoGin } 399e2841179SLoGin 400cc36cf4aSYJwu2023 // MSI中断只需配置一次PCI寄存器 401cc36cf4aSYJwu2023 if common_msg.irq_index == 0 { 4024fda81ceSLoGin let msg_address = arch_msi_message_address(0); 403cc36cf4aSYJwu2023 let trigger = match msg.irq_specific_message { 404cc36cf4aSYJwu2023 IrqSpecificMsg::Legacy => { 405cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 406cc36cf4aSYJwu2023 } 407cc36cf4aSYJwu2023 IrqSpecificMsg::Msi { trigger_mode, .. } => trigger_mode, 408cc36cf4aSYJwu2023 }; 409e2841179SLoGin let msg_data = arch_msi_message_data(irq_num.data() as u16, 0, trigger); 410cc36cf4aSYJwu2023 // 写入Message Data和Message Address 411cc36cf4aSYJwu2023 if address_64 { 4122709e017SLoGin pci_root_0().write_config( 4132709e017SLoGin self.common_header().bus_device_function, 4142709e017SLoGin (cap_offset + 4).into(), 415cc36cf4aSYJwu2023 msg_address, 416cc36cf4aSYJwu2023 ); 4172709e017SLoGin pci_root_0().write_config( 4182709e017SLoGin self.common_header().bus_device_function, 4192709e017SLoGin (cap_offset + 8).into(), 420cc36cf4aSYJwu2023 0, 421cc36cf4aSYJwu2023 ); 4222709e017SLoGin pci_root_0().write_config( 4232709e017SLoGin self.common_header().bus_device_function, 4242709e017SLoGin (cap_offset + 12).into(), 425cc36cf4aSYJwu2023 msg_data, 426cc36cf4aSYJwu2023 ); 427cc36cf4aSYJwu2023 } else { 4282709e017SLoGin pci_root_0().write_config( 4292709e017SLoGin self.common_header().bus_device_function, 4302709e017SLoGin (cap_offset + 4).into(), 431cc36cf4aSYJwu2023 msg_address, 432cc36cf4aSYJwu2023 ); 4332709e017SLoGin pci_root_0().write_config( 4342709e017SLoGin self.common_header().bus_device_function, 4352709e017SLoGin (cap_offset + 8).into(), 436cc36cf4aSYJwu2023 msg_data, 437cc36cf4aSYJwu2023 ); 438cc36cf4aSYJwu2023 } 4392709e017SLoGin let data = pci_root_0().read_config( 4402709e017SLoGin self.common_header().bus_device_function, 4412709e017SLoGin cap_offset.into(), 442cc36cf4aSYJwu2023 ); 443cc36cf4aSYJwu2023 let message_control = (data >> 16) as u16; 444cc36cf4aSYJwu2023 match self.irq_vector_mut().unwrap().len() { 445cc36cf4aSYJwu2023 1 => { 446cc36cf4aSYJwu2023 let temp = message_control & (!0x0070); 4472709e017SLoGin pci_root_0().write_config( 4482709e017SLoGin self.common_header().bus_device_function, 4492709e017SLoGin cap_offset.into(), 450cc36cf4aSYJwu2023 (temp as u32) << 16, 451cc36cf4aSYJwu2023 ); 452cc36cf4aSYJwu2023 } 453cc36cf4aSYJwu2023 2 => { 454cc36cf4aSYJwu2023 let temp = message_control & (!0x0070); 4552709e017SLoGin pci_root_0().write_config( 4562709e017SLoGin self.common_header().bus_device_function, 4572709e017SLoGin cap_offset.into(), 458cc36cf4aSYJwu2023 ((temp | (0x0001 << 4)) as u32) << 16, 459cc36cf4aSYJwu2023 ); 460cc36cf4aSYJwu2023 } 461cc36cf4aSYJwu2023 4 => { 462cc36cf4aSYJwu2023 let temp = message_control & (!0x0070); 4632709e017SLoGin pci_root_0().write_config( 4642709e017SLoGin self.common_header().bus_device_function, 4652709e017SLoGin cap_offset.into(), 466cc36cf4aSYJwu2023 ((temp | (0x0002 << 4)) as u32) << 16, 467cc36cf4aSYJwu2023 ); 468cc36cf4aSYJwu2023 } 469cc36cf4aSYJwu2023 8 => { 470cc36cf4aSYJwu2023 let temp = message_control & (!0x0070); 4712709e017SLoGin pci_root_0().write_config( 4722709e017SLoGin self.common_header().bus_device_function, 4732709e017SLoGin cap_offset.into(), 474cc36cf4aSYJwu2023 ((temp | (0x0003 << 4)) as u32) << 16, 475cc36cf4aSYJwu2023 ); 476cc36cf4aSYJwu2023 } 477cc36cf4aSYJwu2023 16 => { 478cc36cf4aSYJwu2023 let temp = message_control & (!0x0070); 4792709e017SLoGin pci_root_0().write_config( 4802709e017SLoGin self.common_header().bus_device_function, 4812709e017SLoGin cap_offset.into(), 482cc36cf4aSYJwu2023 ((temp | (0x0004 << 4)) as u32) << 16, 483cc36cf4aSYJwu2023 ); 484cc36cf4aSYJwu2023 } 485cc36cf4aSYJwu2023 32 => { 486cc36cf4aSYJwu2023 let temp = message_control & (!0x0070); 4872709e017SLoGin pci_root_0().write_config( 4882709e017SLoGin self.common_header().bus_device_function, 4892709e017SLoGin cap_offset.into(), 490cc36cf4aSYJwu2023 ((temp | (0x0005 << 4)) as u32) << 16, 491cc36cf4aSYJwu2023 ); 492cc36cf4aSYJwu2023 } 493cc36cf4aSYJwu2023 _ => { 494cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::MxiIrqNumWrong)); 495cc36cf4aSYJwu2023 } 496cc36cf4aSYJwu2023 } 497cc36cf4aSYJwu2023 } 498cc36cf4aSYJwu2023 return Ok(0); 499cc36cf4aSYJwu2023 } 500cc36cf4aSYJwu2023 IrqType::Unused => { 501cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 502cc36cf4aSYJwu2023 } 503cc36cf4aSYJwu2023 _ => { 504cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 505cc36cf4aSYJwu2023 } 506cc36cf4aSYJwu2023 } 507cc36cf4aSYJwu2023 } 508cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 509cc36cf4aSYJwu2023 } 510cc36cf4aSYJwu2023 /// @brief 进行PCI设备中断的安装(MSIX) 511cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 512cc36cf4aSYJwu2023 /// @param msg PCI设备install中断时需要传递的共同参数 513cc36cf4aSYJwu2023 /// @return 一切正常返回Ok(0),有错误返回对应错误原因 msix_install(&mut self, msg: PciIrqMsg) -> Result<u8, PciError>514ce5850adSLoGin fn msix_install(&mut self, msg: PciIrqMsg) -> Result<u8, PciError> { 515cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 516cc36cf4aSYJwu2023 match *irq_type { 517cc36cf4aSYJwu2023 IrqType::Msix { 518cc36cf4aSYJwu2023 irq_max_num, 519cc36cf4aSYJwu2023 msix_table_bar, 520cc36cf4aSYJwu2023 msix_table_offset, 521cc36cf4aSYJwu2023 .. 522cc36cf4aSYJwu2023 } => { 523cc36cf4aSYJwu2023 if self.irq_vector_mut().unwrap().len() > irq_max_num as usize { 524cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::DeviceIrqOverflow)); 525cc36cf4aSYJwu2023 } 526cc36cf4aSYJwu2023 let irq_num = 527cc36cf4aSYJwu2023 self.irq_vector_mut().unwrap()[msg.irq_common_message.irq_index as usize]; 528e2841179SLoGin 529cc36cf4aSYJwu2023 let common_msg = &msg.irq_common_message; 530e2841179SLoGin 531e2841179SLoGin let result = irq_manager().request_irq( 532e2841179SLoGin irq_num, 533e2841179SLoGin common_msg.irq_name.clone(), 534e2841179SLoGin common_msg.irq_hander, 535*232570aeSLoGin IrqHandleFlags::IRQF_SHARED, 536e2841179SLoGin Some(common_msg.dev_id.clone()), 537e2841179SLoGin ); 538e2841179SLoGin 539e2841179SLoGin match result { 540e2841179SLoGin Ok(_) => {} 541e2841179SLoGin Err(SystemError::EINVAL) => { 542cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::InvalidIrqNum(irq_num))); 543cc36cf4aSYJwu2023 } 544e2841179SLoGin 545e2841179SLoGin Err(SystemError::EAGAIN_OR_EWOULDBLOCK) => { 546cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNumOccupied( 547cc36cf4aSYJwu2023 irq_num, 548cc36cf4aSYJwu2023 ))); 549cc36cf4aSYJwu2023 } 550e2841179SLoGin 551e2841179SLoGin Err(_) => { 5522eab6dd7S曾俊 error!( 553e2841179SLoGin "Failed to request pci irq {} for device {}", 554e2841179SLoGin irq_num.data(), 555e2841179SLoGin &common_msg.irq_name 556e2841179SLoGin ); 557e2841179SLoGin return Err(PciError::PciIrqError(PciIrqError::IrqNumOccupied( 558e2841179SLoGin irq_num, 559e2841179SLoGin ))); 560e2841179SLoGin } 561cc36cf4aSYJwu2023 } 562cc36cf4aSYJwu2023 5634fda81ceSLoGin let msg_address = arch_msi_message_address(0); 564cc36cf4aSYJwu2023 let trigger = match msg.irq_specific_message { 565cc36cf4aSYJwu2023 IrqSpecificMsg::Legacy => { 566cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 567cc36cf4aSYJwu2023 } 568cc36cf4aSYJwu2023 IrqSpecificMsg::Msi { trigger_mode, .. } => trigger_mode, 569cc36cf4aSYJwu2023 }; 570e2841179SLoGin let msg_data = arch_msi_message_data(irq_num.data() as u16, 0, trigger); 571cc36cf4aSYJwu2023 //写入Message Data和Message Address 572cc36cf4aSYJwu2023 let pcistandardbar = self 573cc36cf4aSYJwu2023 .bar() 574cc36cf4aSYJwu2023 .ok_or(PciError::PciIrqError(PciIrqError::PciBarNotInited))?; 575cc36cf4aSYJwu2023 let msix_bar = pcistandardbar.get_bar(msix_table_bar)?; 5760dd8ff43SYJwu2023 let vaddr: crate::mm::VirtAddr = msix_bar 577cc36cf4aSYJwu2023 .virtual_address() 578cc36cf4aSYJwu2023 .ok_or(PciError::PciIrqError(PciIrqError::BarGetVaddrFailed))? 579cc36cf4aSYJwu2023 + msix_table_offset as usize 580cc36cf4aSYJwu2023 + msg.irq_common_message.irq_index as usize * size_of::<MsixEntry>(); 5812dd9f0c7SLoGin let msix_entry = NonNull::new(vaddr.data() as *mut MsixEntry).unwrap(); 582afc95d5cSYJwu2023 // 这里的操作并不适用于所有架构,需要再优化,msg_upper_data并不一定为0 583cc36cf4aSYJwu2023 unsafe { 584cc36cf4aSYJwu2023 volwrite!(msix_entry, vector_control, 0); 585cc36cf4aSYJwu2023 volwrite!(msix_entry, msg_data, msg_data); 586cc36cf4aSYJwu2023 volwrite!(msix_entry, msg_upper_addr, 0); 587cc36cf4aSYJwu2023 volwrite!(msix_entry, msg_addr, msg_address); 588cc36cf4aSYJwu2023 } 589cc36cf4aSYJwu2023 return Ok(0); 590cc36cf4aSYJwu2023 } 591cc36cf4aSYJwu2023 IrqType::Unused => { 592cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 593cc36cf4aSYJwu2023 } 594cc36cf4aSYJwu2023 _ => { 595cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 596cc36cf4aSYJwu2023 } 597cc36cf4aSYJwu2023 } 598cc36cf4aSYJwu2023 } 599cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 600cc36cf4aSYJwu2023 } 601cc36cf4aSYJwu2023 /// @brief 进行PCI设备中断的卸载 602cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 irq_uninstall(&mut self) -> Result<u8, PciError>603cc36cf4aSYJwu2023 fn irq_uninstall(&mut self) -> Result<u8, PciError> { 604cc36cf4aSYJwu2023 self.irq_enable(false)?; //中断设置更改前先关闭对应PCI设备的中断 605cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 606cc36cf4aSYJwu2023 match *irq_type { 607cc36cf4aSYJwu2023 IrqType::Msix { .. } => { 608cc36cf4aSYJwu2023 return self.msix_uninstall(); 609cc36cf4aSYJwu2023 } 610cc36cf4aSYJwu2023 IrqType::Msi { .. } => { 611cc36cf4aSYJwu2023 return self.msi_uninstall(); 612cc36cf4aSYJwu2023 } 613cc36cf4aSYJwu2023 IrqType::Unused => { 614cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 615cc36cf4aSYJwu2023 } 616cc36cf4aSYJwu2023 _ => { 617cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeNotSupported)); 618cc36cf4aSYJwu2023 } 619cc36cf4aSYJwu2023 } 620cc36cf4aSYJwu2023 } 621cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 622cc36cf4aSYJwu2023 } 623cc36cf4aSYJwu2023 /// @brief 进行PCI设备中断的卸载(MSI) 624cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 msi_uninstall(&mut self) -> Result<u8, PciError>625cc36cf4aSYJwu2023 fn msi_uninstall(&mut self) -> Result<u8, PciError> { 626cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 627cc36cf4aSYJwu2023 match *irq_type { 628cc36cf4aSYJwu2023 IrqType::Msi { 629cc36cf4aSYJwu2023 address_64, 630cc36cf4aSYJwu2023 cap_offset, 631cc36cf4aSYJwu2023 .. 632cc36cf4aSYJwu2023 } => { 633cc36cf4aSYJwu2023 for vector in self.irq_vector_mut().unwrap() { 634e2841179SLoGin let irq = IrqNumber::new((*vector).into()); 635e2841179SLoGin irq_manager().free_irq(irq, None); 636cc36cf4aSYJwu2023 } 6372709e017SLoGin pci_root_0().write_config( 6382709e017SLoGin self.common_header().bus_device_function, 6392709e017SLoGin cap_offset.into(), 640cc36cf4aSYJwu2023 0, 641cc36cf4aSYJwu2023 ); 6422709e017SLoGin pci_root_0().write_config( 6432709e017SLoGin self.common_header().bus_device_function, 6442709e017SLoGin (cap_offset + 4).into(), 6452709e017SLoGin 0, 6462709e017SLoGin ); 6472709e017SLoGin pci_root_0().write_config( 6482709e017SLoGin self.common_header().bus_device_function, 6492709e017SLoGin (cap_offset + 8).into(), 650cc36cf4aSYJwu2023 0, 651cc36cf4aSYJwu2023 ); 652cc36cf4aSYJwu2023 if address_64 { 6532709e017SLoGin pci_root_0().write_config( 6542709e017SLoGin self.common_header().bus_device_function, 6552709e017SLoGin (cap_offset + 12).into(), 656cc36cf4aSYJwu2023 0, 657cc36cf4aSYJwu2023 ); 658cc36cf4aSYJwu2023 } 659cc36cf4aSYJwu2023 return Ok(0); 660cc36cf4aSYJwu2023 } 661cc36cf4aSYJwu2023 IrqType::Unused => { 662cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 663cc36cf4aSYJwu2023 } 664cc36cf4aSYJwu2023 _ => { 665cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 666cc36cf4aSYJwu2023 } 667cc36cf4aSYJwu2023 } 668cc36cf4aSYJwu2023 } 669cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 670cc36cf4aSYJwu2023 } 671cc36cf4aSYJwu2023 /// @brief 进行PCI设备中断的卸载(MSIX) 672cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 msix_uninstall(&mut self) -> Result<u8, PciError>673cc36cf4aSYJwu2023 fn msix_uninstall(&mut self) -> Result<u8, PciError> { 674cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 675cc36cf4aSYJwu2023 match *irq_type { 676cc36cf4aSYJwu2023 IrqType::Msix { 677cc36cf4aSYJwu2023 irq_max_num, 678cc36cf4aSYJwu2023 cap_offset, 679cc36cf4aSYJwu2023 msix_table_bar, 680cc36cf4aSYJwu2023 msix_table_offset, 681cc36cf4aSYJwu2023 .. 682cc36cf4aSYJwu2023 } => { 683cc36cf4aSYJwu2023 for vector in self.irq_vector_mut().unwrap() { 684e2841179SLoGin let irq = IrqNumber::new((*vector).into()); 685e2841179SLoGin irq_manager().free_irq(irq, None); 686cc36cf4aSYJwu2023 } 6872709e017SLoGin pci_root_0().write_config( 6882709e017SLoGin self.common_header().bus_device_function, 6892709e017SLoGin cap_offset.into(), 6902709e017SLoGin 0, 6912709e017SLoGin ); 692cc36cf4aSYJwu2023 let pcistandardbar = self 693cc36cf4aSYJwu2023 .bar() 694cc36cf4aSYJwu2023 .ok_or(PciError::PciIrqError(PciIrqError::PciBarNotInited)) 695cc36cf4aSYJwu2023 .unwrap(); 696cc36cf4aSYJwu2023 let msix_bar = pcistandardbar.get_bar(msix_table_bar).unwrap(); 697cc36cf4aSYJwu2023 for index in 0..irq_max_num { 698cc36cf4aSYJwu2023 let vaddr = msix_bar 699cc36cf4aSYJwu2023 .virtual_address() 700cc36cf4aSYJwu2023 .ok_or(PciError::PciIrqError(PciIrqError::BarGetVaddrFailed)) 7012dd9f0c7SLoGin .unwrap() 702cc36cf4aSYJwu2023 + msix_table_offset as usize 703cc36cf4aSYJwu2023 + index as usize * size_of::<MsixEntry>(); 7042dd9f0c7SLoGin let msix_entry = NonNull::new(vaddr.data() as *mut MsixEntry).unwrap(); 705cc36cf4aSYJwu2023 unsafe { 706cc36cf4aSYJwu2023 volwrite!(msix_entry, vector_control, 0); 707cc36cf4aSYJwu2023 volwrite!(msix_entry, msg_data, 0); 708cc36cf4aSYJwu2023 volwrite!(msix_entry, msg_upper_addr, 0); 709cc36cf4aSYJwu2023 volwrite!(msix_entry, msg_addr, 0); 710cc36cf4aSYJwu2023 } 711cc36cf4aSYJwu2023 } 712cc36cf4aSYJwu2023 return Ok(0); 713cc36cf4aSYJwu2023 } 714cc36cf4aSYJwu2023 IrqType::Unused => { 715cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 716cc36cf4aSYJwu2023 } 717cc36cf4aSYJwu2023 _ => { 718cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 719cc36cf4aSYJwu2023 } 720cc36cf4aSYJwu2023 } 721cc36cf4aSYJwu2023 } 722cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 723cc36cf4aSYJwu2023 } 724cc36cf4aSYJwu2023 /// @brief 屏蔽相应位置的中断 725cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 726cc36cf4aSYJwu2023 /// @param irq_index 中断的位置(在vec中的index和安装的index相同) irq_mask(&mut self, irq_index: u16) -> Result<u8, PciError>727cc36cf4aSYJwu2023 fn irq_mask(&mut self, irq_index: u16) -> Result<u8, PciError> { 728cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 729cc36cf4aSYJwu2023 match *irq_type { 730cc36cf4aSYJwu2023 IrqType::Msix { .. } => { 731cc36cf4aSYJwu2023 return self.msix_mask(irq_index); 732cc36cf4aSYJwu2023 } 733cc36cf4aSYJwu2023 IrqType::Msi { .. } => { 734cc36cf4aSYJwu2023 return self.msi_mask(irq_index); 735cc36cf4aSYJwu2023 } 736cc36cf4aSYJwu2023 IrqType::Unused => { 737cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 738cc36cf4aSYJwu2023 } 739cc36cf4aSYJwu2023 _ => { 740cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeNotSupported)); 741cc36cf4aSYJwu2023 } 742cc36cf4aSYJwu2023 } 743cc36cf4aSYJwu2023 } 744cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 745cc36cf4aSYJwu2023 } 746cc36cf4aSYJwu2023 /// @brief 屏蔽相应位置的中断(MSI) 747cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 748cc36cf4aSYJwu2023 /// @param irq_index 中断的位置(在vec中的index和安装的index相同) msi_mask(&mut self, irq_index: u16) -> Result<u8, PciError>749cc36cf4aSYJwu2023 fn msi_mask(&mut self, irq_index: u16) -> Result<u8, PciError> { 750cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 751cc36cf4aSYJwu2023 match *irq_type { 752cc36cf4aSYJwu2023 IrqType::Msi { 753cc36cf4aSYJwu2023 maskable, 754cc36cf4aSYJwu2023 address_64, 755cc36cf4aSYJwu2023 cap_offset, 756cc36cf4aSYJwu2023 irq_max_num, 757cc36cf4aSYJwu2023 } => { 758cc36cf4aSYJwu2023 if irq_index >= irq_max_num { 759cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::InvalidIrqIndex( 760cc36cf4aSYJwu2023 irq_index, 761cc36cf4aSYJwu2023 ))); 762cc36cf4aSYJwu2023 } 763cc36cf4aSYJwu2023 if maskable { 764cc36cf4aSYJwu2023 match address_64 { 765cc36cf4aSYJwu2023 true => { 7662709e017SLoGin let mut mask = pci_root_0().read_config( 7672709e017SLoGin self.common_header().bus_device_function, 7682709e017SLoGin (cap_offset + 16).into(), 769cc36cf4aSYJwu2023 ); 770cc36cf4aSYJwu2023 mask |= 1 << irq_index; 7712709e017SLoGin pci_root_0().write_config( 7722709e017SLoGin self.common_header().bus_device_function, 7732709e017SLoGin cap_offset.into(), 774cc36cf4aSYJwu2023 mask, 775cc36cf4aSYJwu2023 ); 776cc36cf4aSYJwu2023 } 777cc36cf4aSYJwu2023 false => { 7782709e017SLoGin let mut mask = pci_root_0().read_config( 7792709e017SLoGin self.common_header().bus_device_function, 7802709e017SLoGin (cap_offset + 12).into(), 781cc36cf4aSYJwu2023 ); 782cc36cf4aSYJwu2023 mask |= 1 << irq_index; 7832709e017SLoGin pci_root_0().write_config( 7842709e017SLoGin self.common_header().bus_device_function, 7852709e017SLoGin cap_offset.into(), 786cc36cf4aSYJwu2023 mask, 787cc36cf4aSYJwu2023 ); 788cc36cf4aSYJwu2023 } 789cc36cf4aSYJwu2023 } 790cc36cf4aSYJwu2023 return Ok(0); 791cc36cf4aSYJwu2023 } 792cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::MaskNotSupported)); 793cc36cf4aSYJwu2023 } 794cc36cf4aSYJwu2023 IrqType::Unused => { 795cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 796cc36cf4aSYJwu2023 } 797cc36cf4aSYJwu2023 _ => { 798cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 799cc36cf4aSYJwu2023 } 800cc36cf4aSYJwu2023 } 801cc36cf4aSYJwu2023 } 802cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 803cc36cf4aSYJwu2023 } 804cc36cf4aSYJwu2023 /// @brief 屏蔽相应位置的中断(MSIX) 805cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 806cc36cf4aSYJwu2023 /// @param irq_index 中断的位置(在vec中的index和安装的index相同) msix_mask(&mut self, irq_index: u16) -> Result<u8, PciError>807cc36cf4aSYJwu2023 fn msix_mask(&mut self, irq_index: u16) -> Result<u8, PciError> { 808cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 809cc36cf4aSYJwu2023 match *irq_type { 810cc36cf4aSYJwu2023 IrqType::Msix { 811cc36cf4aSYJwu2023 irq_max_num, 812cc36cf4aSYJwu2023 msix_table_bar, 813cc36cf4aSYJwu2023 msix_table_offset, 814cc36cf4aSYJwu2023 .. 815cc36cf4aSYJwu2023 } => { 816cc36cf4aSYJwu2023 if irq_index >= irq_max_num { 817cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::InvalidIrqIndex( 818cc36cf4aSYJwu2023 irq_index, 819cc36cf4aSYJwu2023 ))); 820cc36cf4aSYJwu2023 } 821cc36cf4aSYJwu2023 let pcistandardbar = self 822cc36cf4aSYJwu2023 .bar() 823cc36cf4aSYJwu2023 .ok_or(PciError::PciIrqError(PciIrqError::PciBarNotInited)) 824cc36cf4aSYJwu2023 .unwrap(); 825cc36cf4aSYJwu2023 let msix_bar = pcistandardbar.get_bar(msix_table_bar).unwrap(); 8262dd9f0c7SLoGin let vaddr = msix_bar.virtual_address().unwrap() 827cc36cf4aSYJwu2023 + msix_table_offset as usize 828cc36cf4aSYJwu2023 + irq_index as usize * size_of::<MsixEntry>(); 8292dd9f0c7SLoGin let msix_entry = NonNull::new(vaddr.data() as *mut MsixEntry).unwrap(); 830cc36cf4aSYJwu2023 unsafe { 831cc36cf4aSYJwu2023 volwrite!(msix_entry, vector_control, 1); 832cc36cf4aSYJwu2023 } 833cc36cf4aSYJwu2023 return Ok(0); 834cc36cf4aSYJwu2023 } 835cc36cf4aSYJwu2023 IrqType::Unused => { 836cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 837cc36cf4aSYJwu2023 } 838cc36cf4aSYJwu2023 _ => { 839cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 840cc36cf4aSYJwu2023 } 841cc36cf4aSYJwu2023 } 842cc36cf4aSYJwu2023 } 843cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 844cc36cf4aSYJwu2023 } 845cc36cf4aSYJwu2023 /// @brief 解除屏蔽相应位置的中断 846cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 847cc36cf4aSYJwu2023 /// @param irq_index 中断的位置(在vec中的index和安装的index相同) irq_unmask(&mut self, irq_index: u16) -> Result<u8, PciError>848cc36cf4aSYJwu2023 fn irq_unmask(&mut self, irq_index: u16) -> Result<u8, PciError> { 849cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 850cc36cf4aSYJwu2023 match *irq_type { 851cc36cf4aSYJwu2023 IrqType::Msix { .. } => { 852cc36cf4aSYJwu2023 return self.msix_unmask(irq_index); 853cc36cf4aSYJwu2023 } 854cc36cf4aSYJwu2023 IrqType::Msi { .. } => { 855cc36cf4aSYJwu2023 return self.msi_unmask(irq_index); 856cc36cf4aSYJwu2023 } 857cc36cf4aSYJwu2023 IrqType::Unused => { 858cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 859cc36cf4aSYJwu2023 } 860cc36cf4aSYJwu2023 _ => { 861cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeNotSupported)); 862cc36cf4aSYJwu2023 } 863cc36cf4aSYJwu2023 } 864cc36cf4aSYJwu2023 } 865cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 866cc36cf4aSYJwu2023 } 867cc36cf4aSYJwu2023 /// @brief 解除屏蔽相应位置的中断(MSI) 868cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 869cc36cf4aSYJwu2023 /// @param irq_index 中断的位置(在vec中的index和安装的index相同) msi_unmask(&mut self, irq_index: u16) -> Result<u8, PciError>870cc36cf4aSYJwu2023 fn msi_unmask(&mut self, irq_index: u16) -> Result<u8, PciError> { 871cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 872cc36cf4aSYJwu2023 match *irq_type { 873cc36cf4aSYJwu2023 IrqType::Msi { 874cc36cf4aSYJwu2023 maskable, 875cc36cf4aSYJwu2023 address_64, 876cc36cf4aSYJwu2023 cap_offset, 877cc36cf4aSYJwu2023 irq_max_num, 878cc36cf4aSYJwu2023 } => { 879cc36cf4aSYJwu2023 if irq_index >= irq_max_num { 880cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::InvalidIrqIndex( 881cc36cf4aSYJwu2023 irq_index, 882cc36cf4aSYJwu2023 ))); 883cc36cf4aSYJwu2023 } 884cc36cf4aSYJwu2023 if maskable { 885cc36cf4aSYJwu2023 match address_64 { 886cc36cf4aSYJwu2023 true => { 8872709e017SLoGin let mut mask = pci_root_0().read_config( 8882709e017SLoGin self.common_header().bus_device_function, 8892709e017SLoGin (cap_offset + 16).into(), 890cc36cf4aSYJwu2023 ); 891cc36cf4aSYJwu2023 mask &= !(1 << irq_index); 8922709e017SLoGin pci_root_0().write_config( 8932709e017SLoGin self.common_header().bus_device_function, 8942709e017SLoGin cap_offset.into(), 895cc36cf4aSYJwu2023 mask, 896cc36cf4aSYJwu2023 ); 897cc36cf4aSYJwu2023 } 898cc36cf4aSYJwu2023 false => { 8992709e017SLoGin let mut mask = pci_root_0().read_config( 9002709e017SLoGin self.common_header().bus_device_function, 9012709e017SLoGin (cap_offset + 12).into(), 902cc36cf4aSYJwu2023 ); 903cc36cf4aSYJwu2023 mask &= !(1 << irq_index); 9042709e017SLoGin pci_root_0().write_config( 9052709e017SLoGin self.common_header().bus_device_function, 9062709e017SLoGin cap_offset.into(), 907cc36cf4aSYJwu2023 mask, 908cc36cf4aSYJwu2023 ); 909cc36cf4aSYJwu2023 } 910cc36cf4aSYJwu2023 } 911cc36cf4aSYJwu2023 } 912cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::MaskNotSupported)); 913cc36cf4aSYJwu2023 } 914cc36cf4aSYJwu2023 IrqType::Unused => { 915cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 916cc36cf4aSYJwu2023 } 917cc36cf4aSYJwu2023 _ => { 918cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 919cc36cf4aSYJwu2023 } 920cc36cf4aSYJwu2023 } 921cc36cf4aSYJwu2023 } 922cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 923cc36cf4aSYJwu2023 } 924cc36cf4aSYJwu2023 /// @brief 解除屏蔽相应位置的中断(MSIX) 925cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 926cc36cf4aSYJwu2023 /// @param irq_index 中断的位置(在vec中的index和安装的index相同) msix_unmask(&mut self, irq_index: u16) -> Result<u8, PciError>927cc36cf4aSYJwu2023 fn msix_unmask(&mut self, irq_index: u16) -> Result<u8, PciError> { 928cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 929cc36cf4aSYJwu2023 match *irq_type { 930cc36cf4aSYJwu2023 IrqType::Msix { 931cc36cf4aSYJwu2023 irq_max_num, 932cc36cf4aSYJwu2023 msix_table_bar, 933cc36cf4aSYJwu2023 msix_table_offset, 934cc36cf4aSYJwu2023 .. 935cc36cf4aSYJwu2023 } => { 936cc36cf4aSYJwu2023 if irq_index >= irq_max_num { 937cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::InvalidIrqIndex( 938cc36cf4aSYJwu2023 irq_index, 939cc36cf4aSYJwu2023 ))); 940cc36cf4aSYJwu2023 } 941cc36cf4aSYJwu2023 let pcistandardbar = self 942cc36cf4aSYJwu2023 .bar() 943cc36cf4aSYJwu2023 .ok_or(PciError::PciIrqError(PciIrqError::PciBarNotInited)) 944cc36cf4aSYJwu2023 .unwrap(); 945cc36cf4aSYJwu2023 let msix_bar = pcistandardbar.get_bar(msix_table_bar).unwrap(); 9462dd9f0c7SLoGin let vaddr = msix_bar.virtual_address().unwrap() 947cc36cf4aSYJwu2023 + msix_table_offset as usize 948cc36cf4aSYJwu2023 + irq_index as usize * size_of::<MsixEntry>(); 9492dd9f0c7SLoGin let msix_entry = NonNull::new(vaddr.data() as *mut MsixEntry).unwrap(); 950cc36cf4aSYJwu2023 unsafe { 951cc36cf4aSYJwu2023 volwrite!(msix_entry, vector_control, 0); 952cc36cf4aSYJwu2023 } 953cc36cf4aSYJwu2023 return Ok(0); 954cc36cf4aSYJwu2023 } 955cc36cf4aSYJwu2023 IrqType::Unused => { 956cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 957cc36cf4aSYJwu2023 } 958cc36cf4aSYJwu2023 _ => { 959cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 960cc36cf4aSYJwu2023 } 961cc36cf4aSYJwu2023 } 962cc36cf4aSYJwu2023 } 963cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 964cc36cf4aSYJwu2023 } 965cc36cf4aSYJwu2023 /// @brief 检查被挂起的中断是否在挂起的时候产生了 966cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 967cc36cf4aSYJwu2023 /// @param irq_index 中断的位置(在vec中的index和安装的index相同) 968cc36cf4aSYJwu2023 /// @return 是否在挂起过程中产生中断(异常情况也返回false) irq_check_pending(&mut self, irq_index: u16) -> Result<bool, PciError>969cc36cf4aSYJwu2023 fn irq_check_pending(&mut self, irq_index: u16) -> Result<bool, PciError> { 970cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 971cc36cf4aSYJwu2023 match *irq_type { 972cc36cf4aSYJwu2023 IrqType::Msix { .. } => { 973cc36cf4aSYJwu2023 return self.msix_check_pending(irq_index); 974cc36cf4aSYJwu2023 } 975cc36cf4aSYJwu2023 IrqType::Msi { .. } => { 976cc36cf4aSYJwu2023 return self.msi_check_pending(irq_index); 977cc36cf4aSYJwu2023 } 978cc36cf4aSYJwu2023 IrqType::Unused => { 979cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 980cc36cf4aSYJwu2023 } 981cc36cf4aSYJwu2023 _ => { 982cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeNotSupported)); 983cc36cf4aSYJwu2023 } 984cc36cf4aSYJwu2023 } 985cc36cf4aSYJwu2023 } 986cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 987cc36cf4aSYJwu2023 } 988cc36cf4aSYJwu2023 /// @brief 检查被挂起的中断是否在挂起的时候产生了(MSI) 989cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 990cc36cf4aSYJwu2023 /// @param irq_index 中断的位置(在vec中的index和安装的index相同) 991cc36cf4aSYJwu2023 /// @return 是否在挂起过程中产生中断(异常情况也返回false) msi_check_pending(&mut self, irq_index: u16) -> Result<bool, PciError>992cc36cf4aSYJwu2023 fn msi_check_pending(&mut self, irq_index: u16) -> Result<bool, PciError> { 993cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 994cc36cf4aSYJwu2023 match *irq_type { 995cc36cf4aSYJwu2023 IrqType::Msi { 996cc36cf4aSYJwu2023 maskable, 997cc36cf4aSYJwu2023 address_64, 998cc36cf4aSYJwu2023 cap_offset, 999cc36cf4aSYJwu2023 irq_max_num, 1000cc36cf4aSYJwu2023 } => { 1001cc36cf4aSYJwu2023 if irq_index >= irq_max_num { 1002cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::InvalidIrqIndex( 1003cc36cf4aSYJwu2023 irq_index, 1004cc36cf4aSYJwu2023 ))); 1005cc36cf4aSYJwu2023 } 1006cc36cf4aSYJwu2023 if maskable { 1007cc36cf4aSYJwu2023 match address_64 { 1008cc36cf4aSYJwu2023 true => { 10092709e017SLoGin let mut pend = pci_root_0().read_config( 10102709e017SLoGin self.common_header().bus_device_function, 10112709e017SLoGin (cap_offset + 20).into(), 1012cc36cf4aSYJwu2023 ); 1013cc36cf4aSYJwu2023 pend &= 1 << irq_index; 1014cc36cf4aSYJwu2023 return Ok(pend != 0); 1015cc36cf4aSYJwu2023 } 1016cc36cf4aSYJwu2023 false => { 10172709e017SLoGin let mut pend = pci_root_0().read_config( 10182709e017SLoGin self.common_header().bus_device_function, 10192709e017SLoGin (cap_offset + 16).into(), 1020cc36cf4aSYJwu2023 ); 1021cc36cf4aSYJwu2023 pend &= 1 << irq_index; 1022cc36cf4aSYJwu2023 return Ok(pend != 0); 1023cc36cf4aSYJwu2023 } 1024cc36cf4aSYJwu2023 } 1025cc36cf4aSYJwu2023 } 1026cc36cf4aSYJwu2023 } 1027cc36cf4aSYJwu2023 IrqType::Unused => { 1028cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 1029cc36cf4aSYJwu2023 } 1030cc36cf4aSYJwu2023 _ => { 1031cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 1032cc36cf4aSYJwu2023 } 1033cc36cf4aSYJwu2023 } 1034cc36cf4aSYJwu2023 } 1035cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 1036cc36cf4aSYJwu2023 } 1037cc36cf4aSYJwu2023 /// @brief 检查被挂起的中断是否在挂起的时候产生了(MSIX) 1038cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 1039cc36cf4aSYJwu2023 /// @param irq_index 中断的位置(在vec中的index和安装的index相同) 1040cc36cf4aSYJwu2023 /// @return 是否在挂起过程中产生中断(异常情况也返回false) msix_check_pending(&mut self, irq_index: u16) -> Result<bool, PciError>1041cc36cf4aSYJwu2023 fn msix_check_pending(&mut self, irq_index: u16) -> Result<bool, PciError> { 1042cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 1043cc36cf4aSYJwu2023 match *irq_type { 1044cc36cf4aSYJwu2023 IrqType::Msix { 1045cc36cf4aSYJwu2023 irq_max_num, 1046cc36cf4aSYJwu2023 pending_table_bar, 1047cc36cf4aSYJwu2023 pending_table_offset, 1048cc36cf4aSYJwu2023 .. 1049cc36cf4aSYJwu2023 } => { 1050cc36cf4aSYJwu2023 if irq_index >= irq_max_num { 1051cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::InvalidIrqIndex( 1052cc36cf4aSYJwu2023 irq_index, 1053cc36cf4aSYJwu2023 ))); 1054cc36cf4aSYJwu2023 } 1055cc36cf4aSYJwu2023 let pcistandardbar = self 1056cc36cf4aSYJwu2023 .bar() 1057cc36cf4aSYJwu2023 .ok_or(PciError::PciIrqError(PciIrqError::PciBarNotInited)) 1058cc36cf4aSYJwu2023 .unwrap(); 1059cc36cf4aSYJwu2023 let pending_bar = pcistandardbar.get_bar(pending_table_bar).unwrap(); 10602dd9f0c7SLoGin let vaddr = pending_bar.virtual_address().unwrap() 1061cc36cf4aSYJwu2023 + pending_table_offset as usize 1062cc36cf4aSYJwu2023 + (irq_index as usize / 64) * size_of::<PendingEntry>(); 10632dd9f0c7SLoGin let pending_entry = NonNull::new(vaddr.data() as *mut PendingEntry).unwrap(); 1064cc36cf4aSYJwu2023 let pending_entry = unsafe { volread!(pending_entry, entry) }; 1065cc36cf4aSYJwu2023 return Ok(pending_entry & (1 << (irq_index as u64 % 64)) != 0); 1066cc36cf4aSYJwu2023 } 1067cc36cf4aSYJwu2023 IrqType::Unused => { 1068cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 1069cc36cf4aSYJwu2023 } 1070cc36cf4aSYJwu2023 _ => { 1071cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 1072cc36cf4aSYJwu2023 } 1073cc36cf4aSYJwu2023 } 1074cc36cf4aSYJwu2023 } 1075cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 1076cc36cf4aSYJwu2023 } 1077cc36cf4aSYJwu2023 } 1078cc36cf4aSYJwu2023 /// PCI标准设备的msi/msix中断相关函数块 1079cc36cf4aSYJwu2023 impl PciInterrupt for PciDeviceStructureGeneralDevice {} 1080