@@ -19,36 +19,6 @@ static void idxd_device_wqs_clear_state(struct idxd_device *idxd);
19
19
static void idxd_wq_disable_cleanup (struct idxd_wq * wq );
20
20
21
21
/* Interrupt control bits */
22
- void idxd_mask_msix_vector (struct idxd_device * idxd , int vec_id )
23
- {
24
- struct idxd_irq_entry * ie ;
25
- struct irq_data * data ;
26
-
27
- ie = idxd_get_ie (idxd , vec_id );
28
- data = irq_get_irq_data (ie -> vector );
29
- pci_msi_mask_irq (data );
30
- }
31
-
32
- void idxd_mask_msix_vectors (struct idxd_device * idxd )
33
- {
34
- struct pci_dev * pdev = idxd -> pdev ;
35
- int msixcnt = pci_msix_vec_count (pdev );
36
- int i ;
37
-
38
- for (i = 0 ; i < msixcnt ; i ++ )
39
- idxd_mask_msix_vector (idxd , i );
40
- }
41
-
42
- void idxd_unmask_msix_vector (struct idxd_device * idxd , int vec_id )
43
- {
44
- struct idxd_irq_entry * ie ;
45
- struct irq_data * data ;
46
-
47
- ie = idxd_get_ie (idxd , vec_id );
48
- data = irq_get_irq_data (ie -> vector );
49
- pci_msi_unmask_irq (data );
50
- }
51
-
52
22
void idxd_unmask_error_interrupts (struct idxd_device * idxd )
53
23
{
54
24
union genctrl_reg genctrl ;
@@ -593,7 +563,6 @@ void idxd_device_reset(struct idxd_device *idxd)
593
563
idxd_device_clear_state (idxd );
594
564
idxd -> state = IDXD_DEV_DISABLED ;
595
565
idxd_unmask_error_interrupts (idxd );
596
- idxd_msix_perm_setup (idxd );
597
566
spin_unlock (& idxd -> dev_lock );
598
567
}
599
568
@@ -732,36 +701,6 @@ void idxd_device_clear_state(struct idxd_device *idxd)
732
701
idxd_device_wqs_clear_state (idxd );
733
702
}
734
703
735
- void idxd_msix_perm_setup (struct idxd_device * idxd )
736
- {
737
- union msix_perm mperm ;
738
- int i , msixcnt ;
739
-
740
- msixcnt = pci_msix_vec_count (idxd -> pdev );
741
- if (msixcnt < 0 )
742
- return ;
743
-
744
- mperm .bits = 0 ;
745
- mperm .pasid = idxd -> pasid ;
746
- mperm .pasid_en = device_pasid_enabled (idxd );
747
- for (i = 1 ; i < msixcnt ; i ++ )
748
- iowrite32 (mperm .bits , idxd -> reg_base + idxd -> msix_perm_offset + i * 8 );
749
- }
750
-
751
- void idxd_msix_perm_clear (struct idxd_device * idxd )
752
- {
753
- union msix_perm mperm ;
754
- int i , msixcnt ;
755
-
756
- msixcnt = pci_msix_vec_count (idxd -> pdev );
757
- if (msixcnt < 0 )
758
- return ;
759
-
760
- mperm .bits = 0 ;
761
- for (i = 1 ; i < msixcnt ; i ++ )
762
- iowrite32 (mperm .bits , idxd -> reg_base + idxd -> msix_perm_offset + i * 8 );
763
- }
764
-
765
704
static void idxd_group_config_write (struct idxd_group * group )
766
705
{
767
706
struct idxd_device * idxd = group -> idxd ;
@@ -1158,6 +1097,106 @@ int idxd_device_load_config(struct idxd_device *idxd)
1158
1097
return 0 ;
1159
1098
}
1160
1099
1100
+ static void idxd_flush_pending_descs (struct idxd_irq_entry * ie )
1101
+ {
1102
+ struct idxd_desc * desc , * itr ;
1103
+ struct llist_node * head ;
1104
+ LIST_HEAD (flist );
1105
+ enum idxd_complete_type ctype ;
1106
+
1107
+ spin_lock (& ie -> list_lock );
1108
+ head = llist_del_all (& ie -> pending_llist );
1109
+ if (head ) {
1110
+ llist_for_each_entry_safe (desc , itr , head , llnode )
1111
+ list_add_tail (& desc -> list , & ie -> work_list );
1112
+ }
1113
+
1114
+ list_for_each_entry_safe (desc , itr , & ie -> work_list , list )
1115
+ list_move_tail (& desc -> list , & flist );
1116
+ spin_unlock (& ie -> list_lock );
1117
+
1118
+ list_for_each_entry_safe (desc , itr , & flist , list ) {
1119
+ list_del (& desc -> list );
1120
+ ctype = desc -> completion -> status ? IDXD_COMPLETE_NORMAL : IDXD_COMPLETE_ABORT ;
1121
+ idxd_dma_complete_txd (desc , ctype , true);
1122
+ }
1123
+ }
1124
+
1125
+ static void idxd_device_set_perm_entry (struct idxd_device * idxd ,
1126
+ struct idxd_irq_entry * ie )
1127
+ {
1128
+ union msix_perm mperm ;
1129
+
1130
+ if (ie -> pasid == INVALID_IOASID )
1131
+ return ;
1132
+
1133
+ mperm .bits = 0 ;
1134
+ mperm .pasid = ie -> pasid ;
1135
+ mperm .pasid_en = 1 ;
1136
+ iowrite32 (mperm .bits , idxd -> reg_base + idxd -> msix_perm_offset + ie -> id * 8 );
1137
+ }
1138
+
1139
+ static void idxd_device_clear_perm_entry (struct idxd_device * idxd ,
1140
+ struct idxd_irq_entry * ie )
1141
+ {
1142
+ iowrite32 (0 , idxd -> reg_base + idxd -> msix_perm_offset + ie -> id * 8 );
1143
+ }
1144
+
1145
+ void idxd_wq_free_irq (struct idxd_wq * wq )
1146
+ {
1147
+ struct idxd_device * idxd = wq -> idxd ;
1148
+ struct idxd_irq_entry * ie = & wq -> ie ;
1149
+
1150
+ synchronize_irq (ie -> vector );
1151
+ free_irq (ie -> vector , ie );
1152
+ idxd_flush_pending_descs (ie );
1153
+ if (idxd -> request_int_handles )
1154
+ idxd_device_release_int_handle (idxd , ie -> int_handle , IDXD_IRQ_MSIX );
1155
+ idxd_device_clear_perm_entry (idxd , ie );
1156
+ ie -> vector = -1 ;
1157
+ ie -> int_handle = INVALID_INT_HANDLE ;
1158
+ ie -> pasid = INVALID_IOASID ;
1159
+ }
1160
+
1161
+ int idxd_wq_request_irq (struct idxd_wq * wq )
1162
+ {
1163
+ struct idxd_device * idxd = wq -> idxd ;
1164
+ struct pci_dev * pdev = idxd -> pdev ;
1165
+ struct device * dev = & pdev -> dev ;
1166
+ struct idxd_irq_entry * ie ;
1167
+ int rc ;
1168
+
1169
+ ie = & wq -> ie ;
1170
+ ie -> vector = pci_irq_vector (pdev , ie -> id );
1171
+ ie -> pasid = device_pasid_enabled (idxd ) ? idxd -> pasid : INVALID_IOASID ;
1172
+ idxd_device_set_perm_entry (idxd , ie );
1173
+
1174
+ rc = request_threaded_irq (ie -> vector , NULL , idxd_wq_thread , 0 , "idxd-portal" , ie );
1175
+ if (rc < 0 ) {
1176
+ dev_err (dev , "Failed to request irq %d.\n" , ie -> vector );
1177
+ goto err_irq ;
1178
+ }
1179
+
1180
+ if (idxd -> request_int_handles ) {
1181
+ rc = idxd_device_request_int_handle (idxd , ie -> id , & ie -> int_handle ,
1182
+ IDXD_IRQ_MSIX );
1183
+ if (rc < 0 )
1184
+ goto err_int_handle ;
1185
+ } else {
1186
+ ie -> int_handle = ie -> id ;
1187
+ }
1188
+
1189
+ return 0 ;
1190
+
1191
+ err_int_handle :
1192
+ ie -> int_handle = INVALID_INT_HANDLE ;
1193
+ free_irq (ie -> vector , ie );
1194
+ err_irq :
1195
+ idxd_device_clear_perm_entry (idxd , ie );
1196
+ ie -> pasid = INVALID_IOASID ;
1197
+ return rc ;
1198
+ }
1199
+
1161
1200
int __drv_enable_wq (struct idxd_wq * wq )
1162
1201
{
1163
1202
struct idxd_device * idxd = wq -> idxd ;
0 commit comments