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; 9e2841179SLoGin use system_error::SystemError; 10cc36cf4aSYJwu2023 11*370472f7SLoGin use super::pci::{PciDeviceStructure, PciDeviceStructureGeneralDevice, PciError}; 12*370472f7SLoGin use super::root::pci_root_0; 134fda81ceSLoGin use crate::arch::msi::{arch_msi_message_address, arch_msi_message_data}; 14876cb89eSGnoCiYeH 15e2841179SLoGin use crate::driver::base::device::DeviceId; 16e2841179SLoGin use crate::exception::irqdesc::{IrqHandleFlags, IrqHandler}; 17e2841179SLoGin use crate::exception::manage::irq_manager; 18e2841179SLoGin 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), 43e2841179SLoGin InvalidIrqNum(IrqNumber), 44e2841179SLoGin 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 85e2841179SLoGin irq_name: String, //中断名字 86e2841179SLoGin irq_hander: &'static dyn IrqHandler, // 中断处理函数 87e2841179SLoGin /// 全局设备标志符 88e2841179SLoGin dev_id: Arc<DeviceId>, 89cc36cf4aSYJwu2023 } 90afc95d5cSYJwu2023 91afc95d5cSYJwu2023 impl IrqCommonMsg { 92afc95d5cSYJwu2023 pub fn init_from( 93afc95d5cSYJwu2023 irq_index: u16, 94e2841179SLoGin irq_name: String, 95e2841179SLoGin irq_hander: &'static dyn IrqHandler, 96e2841179SLoGin dev_id: Arc<DeviceId>, 97afc95d5cSYJwu2023 ) -> Self { 98afc95d5cSYJwu2023 IrqCommonMsg { 99afc95d5cSYJwu2023 irq_index, 100e2841179SLoGin irq_name, 101afc95d5cSYJwu2023 irq_hander, 102e2841179SLoGin dev_id, 103afc95d5cSYJwu2023 } 104afc95d5cSYJwu2023 } 105e2841179SLoGin 106e2841179SLoGin pub fn set_handler(&mut self, irq_hander: &'static dyn IrqHandler) { 107e2841179SLoGin self.irq_hander = irq_hander; 108e2841179SLoGin } 109e2841179SLoGin 110e2841179SLoGin pub fn dev_id(&self) -> &Arc<DeviceId> { 111e2841179SLoGin &self.dev_id 112e2841179SLoGin } 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() { 1612709e017SLoGin let data = pci_root_0() 1622709e017SLoGin .read_config(self.common_header().bus_device_function, cap_offset.into()); 1630dd8ff43SYJwu2023 let irq_max_num = ((data >> 16) & 0x7ff) as u16 + 1; 1642709e017SLoGin let data = pci_root_0().read_config( 1652709e017SLoGin self.common_header().bus_device_function, 1662709e017SLoGin (cap_offset + 4).into(), 1672709e017SLoGin ); 1680dd8ff43SYJwu2023 let msix_table_bar = (data & 0x07) as u8; 1690dd8ff43SYJwu2023 let msix_table_offset = data & (!0x07); 1702709e017SLoGin let data = pci_root_0().read_config( 1712709e017SLoGin self.common_header().bus_device_function, 1722709e017SLoGin (cap_offset + 8).into(), 1732709e017SLoGin ); 1740dd8ff43SYJwu2023 let pending_table_bar = (data & 0x07) as u8; 1750dd8ff43SYJwu2023 let pending_table_offset = data & (!0x07); 176cc36cf4aSYJwu2023 *self.irq_type_mut()? = IrqType::Msix { 177cc36cf4aSYJwu2023 msix_table_bar, 178cc36cf4aSYJwu2023 msix_table_offset, 179cc36cf4aSYJwu2023 pending_table_bar, 180cc36cf4aSYJwu2023 pending_table_offset, 181cc36cf4aSYJwu2023 irq_max_num, 182cc36cf4aSYJwu2023 cap_offset, 183cc36cf4aSYJwu2023 }; 184cc36cf4aSYJwu2023 return Some(IrqType::Msix { 185cc36cf4aSYJwu2023 msix_table_bar, 186cc36cf4aSYJwu2023 msix_table_offset, 187cc36cf4aSYJwu2023 pending_table_bar, 188cc36cf4aSYJwu2023 pending_table_offset, 189cc36cf4aSYJwu2023 irq_max_num, 190cc36cf4aSYJwu2023 cap_offset, 191cc36cf4aSYJwu2023 }); 192cc36cf4aSYJwu2023 } 193cc36cf4aSYJwu2023 } 194cc36cf4aSYJwu2023 // 其次MSI 195cc36cf4aSYJwu2023 if flag.contains(IRQ::PCI_IRQ_MSI) { 196cc36cf4aSYJwu2023 if let Some(cap_offset) = self.msi_capability_offset() { 1972709e017SLoGin let data = pci_root_0() 1982709e017SLoGin .read_config(self.common_header().bus_device_function, cap_offset.into()); 199cc36cf4aSYJwu2023 let message_control = (data >> 16) as u16; 200cc36cf4aSYJwu2023 let maskable = (message_control & 0x0100) != 0; 201cc36cf4aSYJwu2023 let address_64 = (message_control & 0x0080) != 0; 202cc36cf4aSYJwu2023 let irq_max_num = (1 << (((message_control & 0x000e) >> 1) + 1)) as u16; 203cc36cf4aSYJwu2023 *self.irq_type_mut()? = IrqType::Msi { 204cc36cf4aSYJwu2023 address_64, 205cc36cf4aSYJwu2023 maskable, 206cc36cf4aSYJwu2023 irq_max_num, 207cc36cf4aSYJwu2023 cap_offset, 208cc36cf4aSYJwu2023 }; 209cc36cf4aSYJwu2023 return Some(IrqType::Msi { 210cc36cf4aSYJwu2023 address_64, 211cc36cf4aSYJwu2023 maskable, 212cc36cf4aSYJwu2023 irq_max_num, 213cc36cf4aSYJwu2023 cap_offset, 214cc36cf4aSYJwu2023 }); 215cc36cf4aSYJwu2023 } 216cc36cf4aSYJwu2023 } 217cc36cf4aSYJwu2023 // 最后选择legacy# 218cc36cf4aSYJwu2023 if flag.contains(IRQ::PCI_IRQ_LEGACY) { 219cc36cf4aSYJwu2023 *self.irq_type_mut()? = IrqType::Legacy; 220cc36cf4aSYJwu2023 return Some(IrqType::Legacy); 221cc36cf4aSYJwu2023 } 222cc36cf4aSYJwu2023 None 223cc36cf4aSYJwu2023 } 224cc36cf4aSYJwu2023 225cc36cf4aSYJwu2023 /// @brief 启动/关闭设备中断 226cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 227cc36cf4aSYJwu2023 /// @param enable 开启/关闭 228cc36cf4aSYJwu2023 fn irq_enable(&mut self, enable: bool) -> Result<u8, PciError> { 229cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 230cc36cf4aSYJwu2023 match *irq_type { 231cc36cf4aSYJwu2023 IrqType::Msix { .. } => { 232cc36cf4aSYJwu2023 return self.msix_enable(enable); 233cc36cf4aSYJwu2023 } 234cc36cf4aSYJwu2023 IrqType::Msi { .. } => { 235cc36cf4aSYJwu2023 return self.msi_enable(enable); 236cc36cf4aSYJwu2023 } 237cc36cf4aSYJwu2023 IrqType::Legacy => { 238cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeNotSupported)); 239cc36cf4aSYJwu2023 } 240cc36cf4aSYJwu2023 IrqType::Unused => { 241cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 242cc36cf4aSYJwu2023 } 243cc36cf4aSYJwu2023 } 244cc36cf4aSYJwu2023 } 245cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 246cc36cf4aSYJwu2023 } 247cc36cf4aSYJwu2023 /// @brief 启动/关闭设备MSIX中断 248cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 249cc36cf4aSYJwu2023 /// @param enable 开启/关闭 250cc36cf4aSYJwu2023 fn msix_enable(&mut self, enable: bool) -> Result<u8, PciError> { 251cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 252cc36cf4aSYJwu2023 match *irq_type { 253cc36cf4aSYJwu2023 IrqType::Msix { cap_offset, .. } => { 2542709e017SLoGin let mut message = pci_root_0() 2552709e017SLoGin .read_config(self.common_header().bus_device_function, cap_offset.into()); 256cc36cf4aSYJwu2023 if enable { 257cc36cf4aSYJwu2023 message |= 1 << 31; 258cc36cf4aSYJwu2023 } else { 259cc36cf4aSYJwu2023 message &= !(1 << 31); 260cc36cf4aSYJwu2023 } 2612709e017SLoGin pci_root_0().write_config( 2622709e017SLoGin self.common_header().bus_device_function, 2632709e017SLoGin cap_offset.into(), 264cc36cf4aSYJwu2023 message, 265cc36cf4aSYJwu2023 ); 266cc36cf4aSYJwu2023 return Ok(0); 267cc36cf4aSYJwu2023 } 268cc36cf4aSYJwu2023 IrqType::Unused => { 269cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 270cc36cf4aSYJwu2023 } 271cc36cf4aSYJwu2023 _ => { 272cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 273cc36cf4aSYJwu2023 } 274cc36cf4aSYJwu2023 } 275cc36cf4aSYJwu2023 } 276cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 277cc36cf4aSYJwu2023 } 278cc36cf4aSYJwu2023 /// @brief 启动/关闭设备MSI中断 279cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 280cc36cf4aSYJwu2023 /// @param enable 开启/关闭 281cc36cf4aSYJwu2023 fn msi_enable(&mut self, enable: bool) -> Result<u8, PciError> { 282cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 283cc36cf4aSYJwu2023 match *irq_type { 284cc36cf4aSYJwu2023 IrqType::Msi { cap_offset, .. } => { 2852709e017SLoGin let mut message = pci_root_0() 2862709e017SLoGin .read_config(self.common_header().bus_device_function, cap_offset.into()); 287cc36cf4aSYJwu2023 if enable { 288cc36cf4aSYJwu2023 message |= 1 << 16; 289cc36cf4aSYJwu2023 } else { 290cc36cf4aSYJwu2023 message &= !(1 << 16); 291cc36cf4aSYJwu2023 } 2922709e017SLoGin pci_root_0().write_config( 2932709e017SLoGin self.common_header().bus_device_function, 2942709e017SLoGin cap_offset.into(), 295cc36cf4aSYJwu2023 message, 296cc36cf4aSYJwu2023 ); 297cc36cf4aSYJwu2023 return Ok(0); 298cc36cf4aSYJwu2023 } 299cc36cf4aSYJwu2023 IrqType::Unused => { 300cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 301cc36cf4aSYJwu2023 } 302cc36cf4aSYJwu2023 _ => { 303cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 304cc36cf4aSYJwu2023 } 305cc36cf4aSYJwu2023 } 306cc36cf4aSYJwu2023 } 307cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 308cc36cf4aSYJwu2023 } 309cc36cf4aSYJwu2023 /// @brief 获取指定数量的中断号 todo 需要中断重构支持 31040fe15e0SLoGin fn irq_alloc(_num: u16) -> Option<Vec<u16>> { 311cc36cf4aSYJwu2023 None 312cc36cf4aSYJwu2023 } 313cc36cf4aSYJwu2023 /// @brief 进行PCI设备中断的安装 314cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 315cc36cf4aSYJwu2023 /// @param msg PCI设备install中断时需要传递的共同参数 316cc36cf4aSYJwu2023 /// @return 一切正常返回Ok(0),有错误返回对应错误原因 317ce5850adSLoGin fn irq_install(&mut self, msg: PciIrqMsg) -> Result<u8, PciError> { 318cc36cf4aSYJwu2023 if let Some(irq_vector) = self.irq_vector_mut() { 319cc36cf4aSYJwu2023 if msg.irq_common_message.irq_index as usize > irq_vector.len() { 320cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::InvalidIrqIndex( 321cc36cf4aSYJwu2023 msg.irq_common_message.irq_index, 322cc36cf4aSYJwu2023 ))); 323cc36cf4aSYJwu2023 } 324cc36cf4aSYJwu2023 } 325cc36cf4aSYJwu2023 self.irq_enable(false)?; //中断设置更改前先关闭对应PCI设备的中断 326cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 327cc36cf4aSYJwu2023 match *irq_type { 328cc36cf4aSYJwu2023 IrqType::Msix { .. } => { 329cc36cf4aSYJwu2023 return self.msix_install(msg); 330cc36cf4aSYJwu2023 } 331cc36cf4aSYJwu2023 IrqType::Msi { .. } => { 332cc36cf4aSYJwu2023 return self.msi_install(msg); 333cc36cf4aSYJwu2023 } 334cc36cf4aSYJwu2023 IrqType::Unused => { 335cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 336cc36cf4aSYJwu2023 } 337cc36cf4aSYJwu2023 _ => { 338cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeNotSupported)); 339cc36cf4aSYJwu2023 } 340cc36cf4aSYJwu2023 } 341cc36cf4aSYJwu2023 } 342cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 343cc36cf4aSYJwu2023 } 344cc36cf4aSYJwu2023 /// @brief 进行PCI设备中断的安装(MSI) 345cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 346cc36cf4aSYJwu2023 /// @param msg PCI设备install中断时需要传递的共同参数 347cc36cf4aSYJwu2023 /// @return 一切正常返回Ok(0),有错误返回对应错误原因 348ce5850adSLoGin fn msi_install(&mut self, msg: PciIrqMsg) -> Result<u8, PciError> { 349cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 350cc36cf4aSYJwu2023 match *irq_type { 351cc36cf4aSYJwu2023 IrqType::Msi { 352cc36cf4aSYJwu2023 address_64, 353cc36cf4aSYJwu2023 irq_max_num, 354cc36cf4aSYJwu2023 cap_offset, 355cc36cf4aSYJwu2023 .. 356cc36cf4aSYJwu2023 } => { 357cc36cf4aSYJwu2023 // 注意:MSI中断分配的中断号必须连续且大小为2的倍数 358cc36cf4aSYJwu2023 if self.irq_vector_mut().unwrap().len() > irq_max_num as usize { 359cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::DeviceIrqOverflow)); 360cc36cf4aSYJwu2023 } 361cc36cf4aSYJwu2023 let irq_num = 362cc36cf4aSYJwu2023 self.irq_vector_mut().unwrap()[msg.irq_common_message.irq_index as usize]; 363e2841179SLoGin 364e2841179SLoGin let irq_num = IrqNumber::new(irq_num.into()); 365cc36cf4aSYJwu2023 let common_msg = &msg.irq_common_message; 366e2841179SLoGin 367e2841179SLoGin let result = irq_manager().request_irq( 368e2841179SLoGin irq_num, 369e2841179SLoGin common_msg.irq_name.clone(), 370e2841179SLoGin common_msg.irq_hander, 371e2841179SLoGin IrqHandleFlags::empty(), 372e2841179SLoGin Some(common_msg.dev_id.clone()), 373e2841179SLoGin ); 374e2841179SLoGin 375e2841179SLoGin match result { 376e2841179SLoGin Ok(_) => {} 377e2841179SLoGin Err(SystemError::EINVAL) => { 378cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::InvalidIrqNum(irq_num))); 379cc36cf4aSYJwu2023 } 380e2841179SLoGin 381e2841179SLoGin Err(SystemError::EAGAIN_OR_EWOULDBLOCK) => { 382cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNumOccupied( 383cc36cf4aSYJwu2023 irq_num, 384cc36cf4aSYJwu2023 ))); 385cc36cf4aSYJwu2023 } 386e2841179SLoGin 387e2841179SLoGin Err(_) => { 388e2841179SLoGin kerror!( 389e2841179SLoGin "Failed to request pci irq {} for device {}", 390e2841179SLoGin irq_num.data(), 391e2841179SLoGin &common_msg.irq_name 392e2841179SLoGin ); 393e2841179SLoGin return Err(PciError::PciIrqError(PciIrqError::IrqNumOccupied( 394e2841179SLoGin irq_num, 395e2841179SLoGin ))); 396cc36cf4aSYJwu2023 } 397e2841179SLoGin } 398e2841179SLoGin 399cc36cf4aSYJwu2023 // MSI中断只需配置一次PCI寄存器 400cc36cf4aSYJwu2023 if common_msg.irq_index == 0 { 4014fda81ceSLoGin let msg_address = arch_msi_message_address(0); 402cc36cf4aSYJwu2023 let trigger = match msg.irq_specific_message { 403cc36cf4aSYJwu2023 IrqSpecificMsg::Legacy => { 404cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 405cc36cf4aSYJwu2023 } 406cc36cf4aSYJwu2023 IrqSpecificMsg::Msi { trigger_mode, .. } => trigger_mode, 407cc36cf4aSYJwu2023 }; 408e2841179SLoGin let msg_data = arch_msi_message_data(irq_num.data() as u16, 0, trigger); 409cc36cf4aSYJwu2023 // 写入Message Data和Message Address 410cc36cf4aSYJwu2023 if address_64 { 4112709e017SLoGin pci_root_0().write_config( 4122709e017SLoGin self.common_header().bus_device_function, 4132709e017SLoGin (cap_offset + 4).into(), 414cc36cf4aSYJwu2023 msg_address, 415cc36cf4aSYJwu2023 ); 4162709e017SLoGin pci_root_0().write_config( 4172709e017SLoGin self.common_header().bus_device_function, 4182709e017SLoGin (cap_offset + 8).into(), 419cc36cf4aSYJwu2023 0, 420cc36cf4aSYJwu2023 ); 4212709e017SLoGin pci_root_0().write_config( 4222709e017SLoGin self.common_header().bus_device_function, 4232709e017SLoGin (cap_offset + 12).into(), 424cc36cf4aSYJwu2023 msg_data, 425cc36cf4aSYJwu2023 ); 426cc36cf4aSYJwu2023 } else { 4272709e017SLoGin pci_root_0().write_config( 4282709e017SLoGin self.common_header().bus_device_function, 4292709e017SLoGin (cap_offset + 4).into(), 430cc36cf4aSYJwu2023 msg_address, 431cc36cf4aSYJwu2023 ); 4322709e017SLoGin pci_root_0().write_config( 4332709e017SLoGin self.common_header().bus_device_function, 4342709e017SLoGin (cap_offset + 8).into(), 435cc36cf4aSYJwu2023 msg_data, 436cc36cf4aSYJwu2023 ); 437cc36cf4aSYJwu2023 } 4382709e017SLoGin let data = pci_root_0().read_config( 4392709e017SLoGin self.common_header().bus_device_function, 4402709e017SLoGin cap_offset.into(), 441cc36cf4aSYJwu2023 ); 442cc36cf4aSYJwu2023 let message_control = (data >> 16) as u16; 443cc36cf4aSYJwu2023 match self.irq_vector_mut().unwrap().len() { 444cc36cf4aSYJwu2023 1 => { 445cc36cf4aSYJwu2023 let temp = message_control & (!0x0070); 4462709e017SLoGin pci_root_0().write_config( 4472709e017SLoGin self.common_header().bus_device_function, 4482709e017SLoGin cap_offset.into(), 449cc36cf4aSYJwu2023 (temp as u32) << 16, 450cc36cf4aSYJwu2023 ); 451cc36cf4aSYJwu2023 } 452cc36cf4aSYJwu2023 2 => { 453cc36cf4aSYJwu2023 let temp = message_control & (!0x0070); 4542709e017SLoGin pci_root_0().write_config( 4552709e017SLoGin self.common_header().bus_device_function, 4562709e017SLoGin cap_offset.into(), 457cc36cf4aSYJwu2023 ((temp | (0x0001 << 4)) as u32) << 16, 458cc36cf4aSYJwu2023 ); 459cc36cf4aSYJwu2023 } 460cc36cf4aSYJwu2023 4 => { 461cc36cf4aSYJwu2023 let temp = message_control & (!0x0070); 4622709e017SLoGin pci_root_0().write_config( 4632709e017SLoGin self.common_header().bus_device_function, 4642709e017SLoGin cap_offset.into(), 465cc36cf4aSYJwu2023 ((temp | (0x0002 << 4)) as u32) << 16, 466cc36cf4aSYJwu2023 ); 467cc36cf4aSYJwu2023 } 468cc36cf4aSYJwu2023 8 => { 469cc36cf4aSYJwu2023 let temp = message_control & (!0x0070); 4702709e017SLoGin pci_root_0().write_config( 4712709e017SLoGin self.common_header().bus_device_function, 4722709e017SLoGin cap_offset.into(), 473cc36cf4aSYJwu2023 ((temp | (0x0003 << 4)) as u32) << 16, 474cc36cf4aSYJwu2023 ); 475cc36cf4aSYJwu2023 } 476cc36cf4aSYJwu2023 16 => { 477cc36cf4aSYJwu2023 let temp = message_control & (!0x0070); 4782709e017SLoGin pci_root_0().write_config( 4792709e017SLoGin self.common_header().bus_device_function, 4802709e017SLoGin cap_offset.into(), 481cc36cf4aSYJwu2023 ((temp | (0x0004 << 4)) as u32) << 16, 482cc36cf4aSYJwu2023 ); 483cc36cf4aSYJwu2023 } 484cc36cf4aSYJwu2023 32 => { 485cc36cf4aSYJwu2023 let temp = message_control & (!0x0070); 4862709e017SLoGin pci_root_0().write_config( 4872709e017SLoGin self.common_header().bus_device_function, 4882709e017SLoGin cap_offset.into(), 489cc36cf4aSYJwu2023 ((temp | (0x0005 << 4)) as u32) << 16, 490cc36cf4aSYJwu2023 ); 491cc36cf4aSYJwu2023 } 492cc36cf4aSYJwu2023 _ => { 493cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::MxiIrqNumWrong)); 494cc36cf4aSYJwu2023 } 495cc36cf4aSYJwu2023 } 496cc36cf4aSYJwu2023 } 497cc36cf4aSYJwu2023 return Ok(0); 498cc36cf4aSYJwu2023 } 499cc36cf4aSYJwu2023 IrqType::Unused => { 500cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 501cc36cf4aSYJwu2023 } 502cc36cf4aSYJwu2023 _ => { 503cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 504cc36cf4aSYJwu2023 } 505cc36cf4aSYJwu2023 } 506cc36cf4aSYJwu2023 } 507cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 508cc36cf4aSYJwu2023 } 509cc36cf4aSYJwu2023 /// @brief 进行PCI设备中断的安装(MSIX) 510cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 511cc36cf4aSYJwu2023 /// @param msg PCI设备install中断时需要传递的共同参数 512cc36cf4aSYJwu2023 /// @return 一切正常返回Ok(0),有错误返回对应错误原因 513ce5850adSLoGin fn msix_install(&mut self, msg: PciIrqMsg) -> Result<u8, PciError> { 514cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 515cc36cf4aSYJwu2023 match *irq_type { 516cc36cf4aSYJwu2023 IrqType::Msix { 517cc36cf4aSYJwu2023 irq_max_num, 518cc36cf4aSYJwu2023 msix_table_bar, 519cc36cf4aSYJwu2023 msix_table_offset, 520cc36cf4aSYJwu2023 .. 521cc36cf4aSYJwu2023 } => { 522cc36cf4aSYJwu2023 if self.irq_vector_mut().unwrap().len() > irq_max_num as usize { 523cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::DeviceIrqOverflow)); 524cc36cf4aSYJwu2023 } 525cc36cf4aSYJwu2023 let irq_num = 526cc36cf4aSYJwu2023 self.irq_vector_mut().unwrap()[msg.irq_common_message.irq_index as usize]; 527e2841179SLoGin 528cc36cf4aSYJwu2023 let common_msg = &msg.irq_common_message; 529e2841179SLoGin 530e2841179SLoGin let result = irq_manager().request_irq( 531e2841179SLoGin irq_num, 532e2841179SLoGin common_msg.irq_name.clone(), 533e2841179SLoGin common_msg.irq_hander, 534e2841179SLoGin IrqHandleFlags::empty(), 535e2841179SLoGin Some(common_msg.dev_id.clone()), 536e2841179SLoGin ); 537e2841179SLoGin 538e2841179SLoGin match result { 539e2841179SLoGin Ok(_) => {} 540e2841179SLoGin Err(SystemError::EINVAL) => { 541cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::InvalidIrqNum(irq_num))); 542cc36cf4aSYJwu2023 } 543e2841179SLoGin 544e2841179SLoGin Err(SystemError::EAGAIN_OR_EWOULDBLOCK) => { 545cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNumOccupied( 546cc36cf4aSYJwu2023 irq_num, 547cc36cf4aSYJwu2023 ))); 548cc36cf4aSYJwu2023 } 549e2841179SLoGin 550e2841179SLoGin Err(_) => { 551e2841179SLoGin kerror!( 552e2841179SLoGin "Failed to request pci irq {} for device {}", 553e2841179SLoGin irq_num.data(), 554e2841179SLoGin &common_msg.irq_name 555e2841179SLoGin ); 556e2841179SLoGin return Err(PciError::PciIrqError(PciIrqError::IrqNumOccupied( 557e2841179SLoGin irq_num, 558e2841179SLoGin ))); 559e2841179SLoGin } 560cc36cf4aSYJwu2023 } 561cc36cf4aSYJwu2023 5624fda81ceSLoGin let msg_address = arch_msi_message_address(0); 563cc36cf4aSYJwu2023 let trigger = match msg.irq_specific_message { 564cc36cf4aSYJwu2023 IrqSpecificMsg::Legacy => { 565cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 566cc36cf4aSYJwu2023 } 567cc36cf4aSYJwu2023 IrqSpecificMsg::Msi { trigger_mode, .. } => trigger_mode, 568cc36cf4aSYJwu2023 }; 569e2841179SLoGin let msg_data = arch_msi_message_data(irq_num.data() as u16, 0, trigger); 570cc36cf4aSYJwu2023 //写入Message Data和Message Address 571cc36cf4aSYJwu2023 let pcistandardbar = self 572cc36cf4aSYJwu2023 .bar() 573cc36cf4aSYJwu2023 .ok_or(PciError::PciIrqError(PciIrqError::PciBarNotInited))?; 574cc36cf4aSYJwu2023 let msix_bar = pcistandardbar.get_bar(msix_table_bar)?; 5750dd8ff43SYJwu2023 let vaddr: crate::mm::VirtAddr = msix_bar 576cc36cf4aSYJwu2023 .virtual_address() 577cc36cf4aSYJwu2023 .ok_or(PciError::PciIrqError(PciIrqError::BarGetVaddrFailed))? 578cc36cf4aSYJwu2023 + msix_table_offset as usize 579cc36cf4aSYJwu2023 + msg.irq_common_message.irq_index as usize * size_of::<MsixEntry>(); 5802dd9f0c7SLoGin let msix_entry = NonNull::new(vaddr.data() as *mut MsixEntry).unwrap(); 581afc95d5cSYJwu2023 // 这里的操作并不适用于所有架构,需要再优化,msg_upper_data并不一定为0 582cc36cf4aSYJwu2023 unsafe { 583cc36cf4aSYJwu2023 volwrite!(msix_entry, vector_control, 0); 584cc36cf4aSYJwu2023 volwrite!(msix_entry, msg_data, msg_data); 585cc36cf4aSYJwu2023 volwrite!(msix_entry, msg_upper_addr, 0); 586cc36cf4aSYJwu2023 volwrite!(msix_entry, msg_addr, msg_address); 587cc36cf4aSYJwu2023 } 588cc36cf4aSYJwu2023 return Ok(0); 589cc36cf4aSYJwu2023 } 590cc36cf4aSYJwu2023 IrqType::Unused => { 591cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 592cc36cf4aSYJwu2023 } 593cc36cf4aSYJwu2023 _ => { 594cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 595cc36cf4aSYJwu2023 } 596cc36cf4aSYJwu2023 } 597cc36cf4aSYJwu2023 } 598cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 599cc36cf4aSYJwu2023 } 600cc36cf4aSYJwu2023 /// @brief 进行PCI设备中断的卸载 601cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 602cc36cf4aSYJwu2023 fn irq_uninstall(&mut self) -> Result<u8, PciError> { 603cc36cf4aSYJwu2023 self.irq_enable(false)?; //中断设置更改前先关闭对应PCI设备的中断 604cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 605cc36cf4aSYJwu2023 match *irq_type { 606cc36cf4aSYJwu2023 IrqType::Msix { .. } => { 607cc36cf4aSYJwu2023 return self.msix_uninstall(); 608cc36cf4aSYJwu2023 } 609cc36cf4aSYJwu2023 IrqType::Msi { .. } => { 610cc36cf4aSYJwu2023 return self.msi_uninstall(); 611cc36cf4aSYJwu2023 } 612cc36cf4aSYJwu2023 IrqType::Unused => { 613cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 614cc36cf4aSYJwu2023 } 615cc36cf4aSYJwu2023 _ => { 616cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeNotSupported)); 617cc36cf4aSYJwu2023 } 618cc36cf4aSYJwu2023 } 619cc36cf4aSYJwu2023 } 620cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 621cc36cf4aSYJwu2023 } 622cc36cf4aSYJwu2023 /// @brief 进行PCI设备中断的卸载(MSI) 623cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 624cc36cf4aSYJwu2023 fn msi_uninstall(&mut self) -> Result<u8, PciError> { 625cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 626cc36cf4aSYJwu2023 match *irq_type { 627cc36cf4aSYJwu2023 IrqType::Msi { 628cc36cf4aSYJwu2023 address_64, 629cc36cf4aSYJwu2023 cap_offset, 630cc36cf4aSYJwu2023 .. 631cc36cf4aSYJwu2023 } => { 632cc36cf4aSYJwu2023 for vector in self.irq_vector_mut().unwrap() { 633e2841179SLoGin let irq = IrqNumber::new((*vector).into()); 634e2841179SLoGin irq_manager().free_irq(irq, None); 635cc36cf4aSYJwu2023 } 6362709e017SLoGin pci_root_0().write_config( 6372709e017SLoGin self.common_header().bus_device_function, 6382709e017SLoGin cap_offset.into(), 639cc36cf4aSYJwu2023 0, 640cc36cf4aSYJwu2023 ); 6412709e017SLoGin pci_root_0().write_config( 6422709e017SLoGin self.common_header().bus_device_function, 6432709e017SLoGin (cap_offset + 4).into(), 6442709e017SLoGin 0, 6452709e017SLoGin ); 6462709e017SLoGin pci_root_0().write_config( 6472709e017SLoGin self.common_header().bus_device_function, 6482709e017SLoGin (cap_offset + 8).into(), 649cc36cf4aSYJwu2023 0, 650cc36cf4aSYJwu2023 ); 651cc36cf4aSYJwu2023 if address_64 { 6522709e017SLoGin pci_root_0().write_config( 6532709e017SLoGin self.common_header().bus_device_function, 6542709e017SLoGin (cap_offset + 12).into(), 655cc36cf4aSYJwu2023 0, 656cc36cf4aSYJwu2023 ); 657cc36cf4aSYJwu2023 } 658cc36cf4aSYJwu2023 return Ok(0); 659cc36cf4aSYJwu2023 } 660cc36cf4aSYJwu2023 IrqType::Unused => { 661cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 662cc36cf4aSYJwu2023 } 663cc36cf4aSYJwu2023 _ => { 664cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 665cc36cf4aSYJwu2023 } 666cc36cf4aSYJwu2023 } 667cc36cf4aSYJwu2023 } 668cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 669cc36cf4aSYJwu2023 } 670cc36cf4aSYJwu2023 /// @brief 进行PCI设备中断的卸载(MSIX) 671cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 672cc36cf4aSYJwu2023 fn msix_uninstall(&mut self) -> Result<u8, PciError> { 673cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 674cc36cf4aSYJwu2023 match *irq_type { 675cc36cf4aSYJwu2023 IrqType::Msix { 676cc36cf4aSYJwu2023 irq_max_num, 677cc36cf4aSYJwu2023 cap_offset, 678cc36cf4aSYJwu2023 msix_table_bar, 679cc36cf4aSYJwu2023 msix_table_offset, 680cc36cf4aSYJwu2023 .. 681cc36cf4aSYJwu2023 } => { 682cc36cf4aSYJwu2023 for vector in self.irq_vector_mut().unwrap() { 683e2841179SLoGin let irq = IrqNumber::new((*vector).into()); 684e2841179SLoGin irq_manager().free_irq(irq, None); 685cc36cf4aSYJwu2023 } 6862709e017SLoGin pci_root_0().write_config( 6872709e017SLoGin self.common_header().bus_device_function, 6882709e017SLoGin cap_offset.into(), 6892709e017SLoGin 0, 6902709e017SLoGin ); 691cc36cf4aSYJwu2023 let pcistandardbar = self 692cc36cf4aSYJwu2023 .bar() 693cc36cf4aSYJwu2023 .ok_or(PciError::PciIrqError(PciIrqError::PciBarNotInited)) 694cc36cf4aSYJwu2023 .unwrap(); 695cc36cf4aSYJwu2023 let msix_bar = pcistandardbar.get_bar(msix_table_bar).unwrap(); 696cc36cf4aSYJwu2023 for index in 0..irq_max_num { 697cc36cf4aSYJwu2023 let vaddr = msix_bar 698cc36cf4aSYJwu2023 .virtual_address() 699cc36cf4aSYJwu2023 .ok_or(PciError::PciIrqError(PciIrqError::BarGetVaddrFailed)) 7002dd9f0c7SLoGin .unwrap() 701cc36cf4aSYJwu2023 + msix_table_offset as usize 702cc36cf4aSYJwu2023 + index as usize * size_of::<MsixEntry>(); 7032dd9f0c7SLoGin let msix_entry = NonNull::new(vaddr.data() as *mut MsixEntry).unwrap(); 704cc36cf4aSYJwu2023 unsafe { 705cc36cf4aSYJwu2023 volwrite!(msix_entry, vector_control, 0); 706cc36cf4aSYJwu2023 volwrite!(msix_entry, msg_data, 0); 707cc36cf4aSYJwu2023 volwrite!(msix_entry, msg_upper_addr, 0); 708cc36cf4aSYJwu2023 volwrite!(msix_entry, msg_addr, 0); 709cc36cf4aSYJwu2023 } 710cc36cf4aSYJwu2023 } 711cc36cf4aSYJwu2023 return Ok(0); 712cc36cf4aSYJwu2023 } 713cc36cf4aSYJwu2023 IrqType::Unused => { 714cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 715cc36cf4aSYJwu2023 } 716cc36cf4aSYJwu2023 _ => { 717cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 718cc36cf4aSYJwu2023 } 719cc36cf4aSYJwu2023 } 720cc36cf4aSYJwu2023 } 721cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 722cc36cf4aSYJwu2023 } 723cc36cf4aSYJwu2023 /// @brief 屏蔽相应位置的中断 724cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 725cc36cf4aSYJwu2023 /// @param irq_index 中断的位置(在vec中的index和安装的index相同) 726cc36cf4aSYJwu2023 fn irq_mask(&mut self, irq_index: u16) -> Result<u8, PciError> { 727cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 728cc36cf4aSYJwu2023 match *irq_type { 729cc36cf4aSYJwu2023 IrqType::Msix { .. } => { 730cc36cf4aSYJwu2023 return self.msix_mask(irq_index); 731cc36cf4aSYJwu2023 } 732cc36cf4aSYJwu2023 IrqType::Msi { .. } => { 733cc36cf4aSYJwu2023 return self.msi_mask(irq_index); 734cc36cf4aSYJwu2023 } 735cc36cf4aSYJwu2023 IrqType::Unused => { 736cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 737cc36cf4aSYJwu2023 } 738cc36cf4aSYJwu2023 _ => { 739cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeNotSupported)); 740cc36cf4aSYJwu2023 } 741cc36cf4aSYJwu2023 } 742cc36cf4aSYJwu2023 } 743cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 744cc36cf4aSYJwu2023 } 745cc36cf4aSYJwu2023 /// @brief 屏蔽相应位置的中断(MSI) 746cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 747cc36cf4aSYJwu2023 /// @param irq_index 中断的位置(在vec中的index和安装的index相同) 748cc36cf4aSYJwu2023 fn msi_mask(&mut self, irq_index: u16) -> Result<u8, PciError> { 749cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 750cc36cf4aSYJwu2023 match *irq_type { 751cc36cf4aSYJwu2023 IrqType::Msi { 752cc36cf4aSYJwu2023 maskable, 753cc36cf4aSYJwu2023 address_64, 754cc36cf4aSYJwu2023 cap_offset, 755cc36cf4aSYJwu2023 irq_max_num, 756cc36cf4aSYJwu2023 } => { 757cc36cf4aSYJwu2023 if irq_index >= irq_max_num { 758cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::InvalidIrqIndex( 759cc36cf4aSYJwu2023 irq_index, 760cc36cf4aSYJwu2023 ))); 761cc36cf4aSYJwu2023 } 762cc36cf4aSYJwu2023 if maskable { 763cc36cf4aSYJwu2023 match address_64 { 764cc36cf4aSYJwu2023 true => { 7652709e017SLoGin let mut mask = pci_root_0().read_config( 7662709e017SLoGin self.common_header().bus_device_function, 7672709e017SLoGin (cap_offset + 16).into(), 768cc36cf4aSYJwu2023 ); 769cc36cf4aSYJwu2023 mask |= 1 << irq_index; 7702709e017SLoGin pci_root_0().write_config( 7712709e017SLoGin self.common_header().bus_device_function, 7722709e017SLoGin cap_offset.into(), 773cc36cf4aSYJwu2023 mask, 774cc36cf4aSYJwu2023 ); 775cc36cf4aSYJwu2023 } 776cc36cf4aSYJwu2023 false => { 7772709e017SLoGin let mut mask = pci_root_0().read_config( 7782709e017SLoGin self.common_header().bus_device_function, 7792709e017SLoGin (cap_offset + 12).into(), 780cc36cf4aSYJwu2023 ); 781cc36cf4aSYJwu2023 mask |= 1 << irq_index; 7822709e017SLoGin pci_root_0().write_config( 7832709e017SLoGin self.common_header().bus_device_function, 7842709e017SLoGin cap_offset.into(), 785cc36cf4aSYJwu2023 mask, 786cc36cf4aSYJwu2023 ); 787cc36cf4aSYJwu2023 } 788cc36cf4aSYJwu2023 } 789cc36cf4aSYJwu2023 return Ok(0); 790cc36cf4aSYJwu2023 } 791cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::MaskNotSupported)); 792cc36cf4aSYJwu2023 } 793cc36cf4aSYJwu2023 IrqType::Unused => { 794cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 795cc36cf4aSYJwu2023 } 796cc36cf4aSYJwu2023 _ => { 797cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 798cc36cf4aSYJwu2023 } 799cc36cf4aSYJwu2023 } 800cc36cf4aSYJwu2023 } 801cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 802cc36cf4aSYJwu2023 } 803cc36cf4aSYJwu2023 /// @brief 屏蔽相应位置的中断(MSIX) 804cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 805cc36cf4aSYJwu2023 /// @param irq_index 中断的位置(在vec中的index和安装的index相同) 806cc36cf4aSYJwu2023 fn msix_mask(&mut self, irq_index: u16) -> Result<u8, PciError> { 807cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 808cc36cf4aSYJwu2023 match *irq_type { 809cc36cf4aSYJwu2023 IrqType::Msix { 810cc36cf4aSYJwu2023 irq_max_num, 811cc36cf4aSYJwu2023 msix_table_bar, 812cc36cf4aSYJwu2023 msix_table_offset, 813cc36cf4aSYJwu2023 .. 814cc36cf4aSYJwu2023 } => { 815cc36cf4aSYJwu2023 if irq_index >= irq_max_num { 816cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::InvalidIrqIndex( 817cc36cf4aSYJwu2023 irq_index, 818cc36cf4aSYJwu2023 ))); 819cc36cf4aSYJwu2023 } 820cc36cf4aSYJwu2023 let pcistandardbar = self 821cc36cf4aSYJwu2023 .bar() 822cc36cf4aSYJwu2023 .ok_or(PciError::PciIrqError(PciIrqError::PciBarNotInited)) 823cc36cf4aSYJwu2023 .unwrap(); 824cc36cf4aSYJwu2023 let msix_bar = pcistandardbar.get_bar(msix_table_bar).unwrap(); 8252dd9f0c7SLoGin let vaddr = msix_bar.virtual_address().unwrap() 826cc36cf4aSYJwu2023 + msix_table_offset as usize 827cc36cf4aSYJwu2023 + irq_index as usize * size_of::<MsixEntry>(); 8282dd9f0c7SLoGin let msix_entry = NonNull::new(vaddr.data() as *mut MsixEntry).unwrap(); 829cc36cf4aSYJwu2023 unsafe { 830cc36cf4aSYJwu2023 volwrite!(msix_entry, vector_control, 1); 831cc36cf4aSYJwu2023 } 832cc36cf4aSYJwu2023 return Ok(0); 833cc36cf4aSYJwu2023 } 834cc36cf4aSYJwu2023 IrqType::Unused => { 835cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 836cc36cf4aSYJwu2023 } 837cc36cf4aSYJwu2023 _ => { 838cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 839cc36cf4aSYJwu2023 } 840cc36cf4aSYJwu2023 } 841cc36cf4aSYJwu2023 } 842cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 843cc36cf4aSYJwu2023 } 844cc36cf4aSYJwu2023 /// @brief 解除屏蔽相应位置的中断 845cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 846cc36cf4aSYJwu2023 /// @param irq_index 中断的位置(在vec中的index和安装的index相同) 847cc36cf4aSYJwu2023 fn irq_unmask(&mut self, irq_index: u16) -> Result<u8, PciError> { 848cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 849cc36cf4aSYJwu2023 match *irq_type { 850cc36cf4aSYJwu2023 IrqType::Msix { .. } => { 851cc36cf4aSYJwu2023 return self.msix_unmask(irq_index); 852cc36cf4aSYJwu2023 } 853cc36cf4aSYJwu2023 IrqType::Msi { .. } => { 854cc36cf4aSYJwu2023 return self.msi_unmask(irq_index); 855cc36cf4aSYJwu2023 } 856cc36cf4aSYJwu2023 IrqType::Unused => { 857cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 858cc36cf4aSYJwu2023 } 859cc36cf4aSYJwu2023 _ => { 860cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeNotSupported)); 861cc36cf4aSYJwu2023 } 862cc36cf4aSYJwu2023 } 863cc36cf4aSYJwu2023 } 864cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 865cc36cf4aSYJwu2023 } 866cc36cf4aSYJwu2023 /// @brief 解除屏蔽相应位置的中断(MSI) 867cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 868cc36cf4aSYJwu2023 /// @param irq_index 中断的位置(在vec中的index和安装的index相同) 869cc36cf4aSYJwu2023 fn msi_unmask(&mut self, irq_index: u16) -> Result<u8, PciError> { 870cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 871cc36cf4aSYJwu2023 match *irq_type { 872cc36cf4aSYJwu2023 IrqType::Msi { 873cc36cf4aSYJwu2023 maskable, 874cc36cf4aSYJwu2023 address_64, 875cc36cf4aSYJwu2023 cap_offset, 876cc36cf4aSYJwu2023 irq_max_num, 877cc36cf4aSYJwu2023 } => { 878cc36cf4aSYJwu2023 if irq_index >= irq_max_num { 879cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::InvalidIrqIndex( 880cc36cf4aSYJwu2023 irq_index, 881cc36cf4aSYJwu2023 ))); 882cc36cf4aSYJwu2023 } 883cc36cf4aSYJwu2023 if maskable { 884cc36cf4aSYJwu2023 match address_64 { 885cc36cf4aSYJwu2023 true => { 8862709e017SLoGin let mut mask = pci_root_0().read_config( 8872709e017SLoGin self.common_header().bus_device_function, 8882709e017SLoGin (cap_offset + 16).into(), 889cc36cf4aSYJwu2023 ); 890cc36cf4aSYJwu2023 mask &= !(1 << irq_index); 8912709e017SLoGin pci_root_0().write_config( 8922709e017SLoGin self.common_header().bus_device_function, 8932709e017SLoGin cap_offset.into(), 894cc36cf4aSYJwu2023 mask, 895cc36cf4aSYJwu2023 ); 896cc36cf4aSYJwu2023 } 897cc36cf4aSYJwu2023 false => { 8982709e017SLoGin let mut mask = pci_root_0().read_config( 8992709e017SLoGin self.common_header().bus_device_function, 9002709e017SLoGin (cap_offset + 12).into(), 901cc36cf4aSYJwu2023 ); 902cc36cf4aSYJwu2023 mask &= !(1 << irq_index); 9032709e017SLoGin pci_root_0().write_config( 9042709e017SLoGin self.common_header().bus_device_function, 9052709e017SLoGin cap_offset.into(), 906cc36cf4aSYJwu2023 mask, 907cc36cf4aSYJwu2023 ); 908cc36cf4aSYJwu2023 } 909cc36cf4aSYJwu2023 } 910cc36cf4aSYJwu2023 } 911cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::MaskNotSupported)); 912cc36cf4aSYJwu2023 } 913cc36cf4aSYJwu2023 IrqType::Unused => { 914cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 915cc36cf4aSYJwu2023 } 916cc36cf4aSYJwu2023 _ => { 917cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 918cc36cf4aSYJwu2023 } 919cc36cf4aSYJwu2023 } 920cc36cf4aSYJwu2023 } 921cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 922cc36cf4aSYJwu2023 } 923cc36cf4aSYJwu2023 /// @brief 解除屏蔽相应位置的中断(MSIX) 924cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 925cc36cf4aSYJwu2023 /// @param irq_index 中断的位置(在vec中的index和安装的index相同) 926cc36cf4aSYJwu2023 fn msix_unmask(&mut self, irq_index: u16) -> Result<u8, PciError> { 927cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 928cc36cf4aSYJwu2023 match *irq_type { 929cc36cf4aSYJwu2023 IrqType::Msix { 930cc36cf4aSYJwu2023 irq_max_num, 931cc36cf4aSYJwu2023 msix_table_bar, 932cc36cf4aSYJwu2023 msix_table_offset, 933cc36cf4aSYJwu2023 .. 934cc36cf4aSYJwu2023 } => { 935cc36cf4aSYJwu2023 if irq_index >= irq_max_num { 936cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::InvalidIrqIndex( 937cc36cf4aSYJwu2023 irq_index, 938cc36cf4aSYJwu2023 ))); 939cc36cf4aSYJwu2023 } 940cc36cf4aSYJwu2023 let pcistandardbar = self 941cc36cf4aSYJwu2023 .bar() 942cc36cf4aSYJwu2023 .ok_or(PciError::PciIrqError(PciIrqError::PciBarNotInited)) 943cc36cf4aSYJwu2023 .unwrap(); 944cc36cf4aSYJwu2023 let msix_bar = pcistandardbar.get_bar(msix_table_bar).unwrap(); 9452dd9f0c7SLoGin let vaddr = msix_bar.virtual_address().unwrap() 946cc36cf4aSYJwu2023 + msix_table_offset as usize 947cc36cf4aSYJwu2023 + irq_index as usize * size_of::<MsixEntry>(); 9482dd9f0c7SLoGin let msix_entry = NonNull::new(vaddr.data() as *mut MsixEntry).unwrap(); 949cc36cf4aSYJwu2023 unsafe { 950cc36cf4aSYJwu2023 volwrite!(msix_entry, vector_control, 0); 951cc36cf4aSYJwu2023 } 952cc36cf4aSYJwu2023 return Ok(0); 953cc36cf4aSYJwu2023 } 954cc36cf4aSYJwu2023 IrqType::Unused => { 955cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 956cc36cf4aSYJwu2023 } 957cc36cf4aSYJwu2023 _ => { 958cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 959cc36cf4aSYJwu2023 } 960cc36cf4aSYJwu2023 } 961cc36cf4aSYJwu2023 } 962cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 963cc36cf4aSYJwu2023 } 964cc36cf4aSYJwu2023 /// @brief 检查被挂起的中断是否在挂起的时候产生了 965cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 966cc36cf4aSYJwu2023 /// @param irq_index 中断的位置(在vec中的index和安装的index相同) 967cc36cf4aSYJwu2023 /// @return 是否在挂起过程中产生中断(异常情况也返回false) 968cc36cf4aSYJwu2023 fn irq_check_pending(&mut self, irq_index: u16) -> Result<bool, PciError> { 969cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 970cc36cf4aSYJwu2023 match *irq_type { 971cc36cf4aSYJwu2023 IrqType::Msix { .. } => { 972cc36cf4aSYJwu2023 return self.msix_check_pending(irq_index); 973cc36cf4aSYJwu2023 } 974cc36cf4aSYJwu2023 IrqType::Msi { .. } => { 975cc36cf4aSYJwu2023 return self.msi_check_pending(irq_index); 976cc36cf4aSYJwu2023 } 977cc36cf4aSYJwu2023 IrqType::Unused => { 978cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 979cc36cf4aSYJwu2023 } 980cc36cf4aSYJwu2023 _ => { 981cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeNotSupported)); 982cc36cf4aSYJwu2023 } 983cc36cf4aSYJwu2023 } 984cc36cf4aSYJwu2023 } 985cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 986cc36cf4aSYJwu2023 } 987cc36cf4aSYJwu2023 /// @brief 检查被挂起的中断是否在挂起的时候产生了(MSI) 988cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 989cc36cf4aSYJwu2023 /// @param irq_index 中断的位置(在vec中的index和安装的index相同) 990cc36cf4aSYJwu2023 /// @return 是否在挂起过程中产生中断(异常情况也返回false) 991cc36cf4aSYJwu2023 fn msi_check_pending(&mut self, irq_index: u16) -> Result<bool, PciError> { 992cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 993cc36cf4aSYJwu2023 match *irq_type { 994cc36cf4aSYJwu2023 IrqType::Msi { 995cc36cf4aSYJwu2023 maskable, 996cc36cf4aSYJwu2023 address_64, 997cc36cf4aSYJwu2023 cap_offset, 998cc36cf4aSYJwu2023 irq_max_num, 999cc36cf4aSYJwu2023 } => { 1000cc36cf4aSYJwu2023 if irq_index >= irq_max_num { 1001cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::InvalidIrqIndex( 1002cc36cf4aSYJwu2023 irq_index, 1003cc36cf4aSYJwu2023 ))); 1004cc36cf4aSYJwu2023 } 1005cc36cf4aSYJwu2023 if maskable { 1006cc36cf4aSYJwu2023 match address_64 { 1007cc36cf4aSYJwu2023 true => { 10082709e017SLoGin let mut pend = pci_root_0().read_config( 10092709e017SLoGin self.common_header().bus_device_function, 10102709e017SLoGin (cap_offset + 20).into(), 1011cc36cf4aSYJwu2023 ); 1012cc36cf4aSYJwu2023 pend &= 1 << irq_index; 1013cc36cf4aSYJwu2023 return Ok(pend != 0); 1014cc36cf4aSYJwu2023 } 1015cc36cf4aSYJwu2023 false => { 10162709e017SLoGin let mut pend = pci_root_0().read_config( 10172709e017SLoGin self.common_header().bus_device_function, 10182709e017SLoGin (cap_offset + 16).into(), 1019cc36cf4aSYJwu2023 ); 1020cc36cf4aSYJwu2023 pend &= 1 << irq_index; 1021cc36cf4aSYJwu2023 return Ok(pend != 0); 1022cc36cf4aSYJwu2023 } 1023cc36cf4aSYJwu2023 } 1024cc36cf4aSYJwu2023 } 1025cc36cf4aSYJwu2023 } 1026cc36cf4aSYJwu2023 IrqType::Unused => { 1027cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 1028cc36cf4aSYJwu2023 } 1029cc36cf4aSYJwu2023 _ => { 1030cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 1031cc36cf4aSYJwu2023 } 1032cc36cf4aSYJwu2023 } 1033cc36cf4aSYJwu2023 } 1034cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 1035cc36cf4aSYJwu2023 } 1036cc36cf4aSYJwu2023 /// @brief 检查被挂起的中断是否在挂起的时候产生了(MSIX) 1037cc36cf4aSYJwu2023 /// @param self PCI设备的可变引用 1038cc36cf4aSYJwu2023 /// @param irq_index 中断的位置(在vec中的index和安装的index相同) 1039cc36cf4aSYJwu2023 /// @return 是否在挂起过程中产生中断(异常情况也返回false) 1040cc36cf4aSYJwu2023 fn msix_check_pending(&mut self, irq_index: u16) -> Result<bool, PciError> { 1041cc36cf4aSYJwu2023 if let Some(irq_type) = self.irq_type_mut() { 1042cc36cf4aSYJwu2023 match *irq_type { 1043cc36cf4aSYJwu2023 IrqType::Msix { 1044cc36cf4aSYJwu2023 irq_max_num, 1045cc36cf4aSYJwu2023 pending_table_bar, 1046cc36cf4aSYJwu2023 pending_table_offset, 1047cc36cf4aSYJwu2023 .. 1048cc36cf4aSYJwu2023 } => { 1049cc36cf4aSYJwu2023 if irq_index >= irq_max_num { 1050cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::InvalidIrqIndex( 1051cc36cf4aSYJwu2023 irq_index, 1052cc36cf4aSYJwu2023 ))); 1053cc36cf4aSYJwu2023 } 1054cc36cf4aSYJwu2023 let pcistandardbar = self 1055cc36cf4aSYJwu2023 .bar() 1056cc36cf4aSYJwu2023 .ok_or(PciError::PciIrqError(PciIrqError::PciBarNotInited)) 1057cc36cf4aSYJwu2023 .unwrap(); 1058cc36cf4aSYJwu2023 let pending_bar = pcistandardbar.get_bar(pending_table_bar).unwrap(); 10592dd9f0c7SLoGin let vaddr = pending_bar.virtual_address().unwrap() 1060cc36cf4aSYJwu2023 + pending_table_offset as usize 1061cc36cf4aSYJwu2023 + (irq_index as usize / 64) * size_of::<PendingEntry>(); 10622dd9f0c7SLoGin let pending_entry = NonNull::new(vaddr.data() as *mut PendingEntry).unwrap(); 1063cc36cf4aSYJwu2023 let pending_entry = unsafe { volread!(pending_entry, entry) }; 1064cc36cf4aSYJwu2023 return Ok(pending_entry & (1 << (irq_index as u64 % 64)) != 0); 1065cc36cf4aSYJwu2023 } 1066cc36cf4aSYJwu2023 IrqType::Unused => { 1067cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqNotInited)); 1068cc36cf4aSYJwu2023 } 1069cc36cf4aSYJwu2023 _ => { 1070cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::IrqTypeUnmatch)); 1071cc36cf4aSYJwu2023 } 1072cc36cf4aSYJwu2023 } 1073cc36cf4aSYJwu2023 } 1074cc36cf4aSYJwu2023 return Err(PciError::PciIrqError(PciIrqError::PciDeviceNotSupportIrq)); 1075cc36cf4aSYJwu2023 } 1076cc36cf4aSYJwu2023 } 1077cc36cf4aSYJwu2023 /// PCI标准设备的msi/msix中断相关函数块 1078cc36cf4aSYJwu2023 impl PciInterrupt for PciDeviceStructureGeneralDevice {} 1079