diff options
Diffstat (limited to 'drivers/misc/cxl/guest.c')
-rw-r--r-- | drivers/misc/cxl/guest.c | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/drivers/misc/cxl/guest.c b/drivers/misc/cxl/guest.c index bc8d0b9870eb..9aa58a77a24d 100644 --- a/drivers/misc/cxl/guest.c +++ b/drivers/misc/cxl/guest.c | |||
@@ -196,15 +196,18 @@ static irqreturn_t guest_slice_irq_err(int irq, void *data) | |||
196 | { | 196 | { |
197 | struct cxl_afu *afu = data; | 197 | struct cxl_afu *afu = data; |
198 | int rc; | 198 | int rc; |
199 | u64 serr; | 199 | u64 serr, afu_error, dsisr; |
200 | 200 | ||
201 | WARN(irq, "CXL SLICE ERROR interrupt %i\n", irq); | ||
202 | rc = cxl_h_get_fn_error_interrupt(afu->guest->handle, &serr); | 201 | rc = cxl_h_get_fn_error_interrupt(afu->guest->handle, &serr); |
203 | if (rc) { | 202 | if (rc) { |
204 | dev_crit(&afu->dev, "Couldn't read PSL_SERR_An: %d\n", rc); | 203 | dev_crit(&afu->dev, "Couldn't read PSL_SERR_An: %d\n", rc); |
205 | return IRQ_HANDLED; | 204 | return IRQ_HANDLED; |
206 | } | 205 | } |
207 | dev_crit(&afu->dev, "PSL_SERR_An: 0x%.16llx\n", serr); | 206 | afu_error = cxl_p2n_read(afu, CXL_AFU_ERR_An); |
207 | dsisr = cxl_p2n_read(afu, CXL_PSL_DSISR_An); | ||
208 | cxl_afu_decode_psl_serr(afu, serr); | ||
209 | dev_crit(&afu->dev, "AFU_ERR_An: 0x%.16llx\n", afu_error); | ||
210 | dev_crit(&afu->dev, "PSL_DSISR_An: 0x%.16llx\n", dsisr); | ||
208 | 211 | ||
209 | rc = cxl_h_ack_fn_error_interrupt(afu->guest->handle, serr); | 212 | rc = cxl_h_ack_fn_error_interrupt(afu->guest->handle, serr); |
210 | if (rc) | 213 | if (rc) |
@@ -1052,16 +1055,18 @@ static void free_adapter(struct cxl *adapter) | |||
1052 | struct irq_avail *cur; | 1055 | struct irq_avail *cur; |
1053 | int i; | 1056 | int i; |
1054 | 1057 | ||
1055 | if (adapter->guest->irq_avail) { | 1058 | if (adapter->guest) { |
1056 | for (i = 0; i < adapter->guest->irq_nranges; i++) { | 1059 | if (adapter->guest->irq_avail) { |
1057 | cur = &adapter->guest->irq_avail[i]; | 1060 | for (i = 0; i < adapter->guest->irq_nranges; i++) { |
1058 | kfree(cur->bitmap); | 1061 | cur = &adapter->guest->irq_avail[i]; |
1062 | kfree(cur->bitmap); | ||
1063 | } | ||
1064 | kfree(adapter->guest->irq_avail); | ||
1059 | } | 1065 | } |
1060 | kfree(adapter->guest->irq_avail); | 1066 | kfree(adapter->guest->status); |
1067 | kfree(adapter->guest); | ||
1061 | } | 1068 | } |
1062 | kfree(adapter->guest->status); | ||
1063 | cxl_remove_adapter_nr(adapter); | 1069 | cxl_remove_adapter_nr(adapter); |
1064 | kfree(adapter->guest); | ||
1065 | kfree(adapter); | 1070 | kfree(adapter); |
1066 | } | 1071 | } |
1067 | 1072 | ||
@@ -1182,6 +1187,7 @@ const struct cxl_backend_ops cxl_guest_ops = { | |||
1182 | .ack_irq = guest_ack_irq, | 1187 | .ack_irq = guest_ack_irq, |
1183 | .attach_process = guest_attach_process, | 1188 | .attach_process = guest_attach_process, |
1184 | .detach_process = guest_detach_process, | 1189 | .detach_process = guest_detach_process, |
1190 | .update_ivtes = NULL, | ||
1185 | .support_attributes = guest_support_attributes, | 1191 | .support_attributes = guest_support_attributes, |
1186 | .link_ok = guest_link_ok, | 1192 | .link_ok = guest_link_ok, |
1187 | .release_afu = guest_release_afu, | 1193 | .release_afu = guest_release_afu, |