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