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