@@ -47,6 +47,13 @@ bitflags::bitflags! {
47
47
}
48
48
}
49
49
50
+ #[ repr( u32 ) ]
51
+ pub enum DeliveryMode {
52
+ /// Deliver the signal to all the agents listed in the destination. The Trigger Mode for
53
+ /// fixed delivery mode can be edge or level.
54
+ Fixed = 0b000 ,
55
+ }
56
+
50
57
#[ repr( C ) ]
51
58
struct Message {
52
59
addr_lower : VolatileCell < u32 > ,
@@ -62,13 +69,18 @@ impl Message {
62
69
63
70
fn set_masked ( & self , masked : bool ) {
64
71
self . mask . set ( * self . mask . get ( ) . set_bit ( 0 , masked) ) ;
72
+ self . mask . set ( * self . mask . get ( ) . set_bit ( 30 , masked) ) ;
65
73
}
66
74
67
- fn set ( & mut self , vector : u8 ) {
75
+ fn set ( & mut self , vector : u8 , delivery_mode : DeliveryMode ) {
68
76
assert ! ( self . is_masked( ) , "msix: message is unmasked" ) ;
69
77
70
78
let mut data = 0 ;
71
79
data. set_bits ( 0 ..8 , vector as u32 ) ;
80
+ data. set_bits ( 8 ..11 , delivery_mode as u32 ) ;
81
+ data. set_bit ( 14 , false ) ;
82
+ data. set_bit ( 15 , false ) ;
83
+ data. set_bits ( 16 ..32 , 0 ) ;
72
84
73
85
let mut addr = 0 ;
74
86
addr. set_bits ( 12 ..20 , apic:: get_bsp_id ( ) as u32 ) ;
@@ -143,7 +155,7 @@ impl<'a> Msix<'a> {
143
155
self . table . set ( msix_vector, true ) ;
144
156
145
157
let message = & mut self . messages [ msix_vector] ;
146
- message. set ( vector) ;
158
+ message. set ( vector, DeliveryMode :: Fixed ) ;
147
159
message. set_masked ( false ) ;
148
160
149
161
msix_vector
0 commit comments