aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/misc/cxl/guest.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/misc/cxl/guest.c')
-rw-r--r--drivers/misc/cxl/guest.c26
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,