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