xref: /DragonOS/kernel/src/driver/pci/pci_irq.rs (revision e28411791f090c421fe4b6fa5956fb1bd362a8d9)
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