]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/misc/cxl/guest.c
Merge tag 'sh-for-4.8' of git://git.libc.org/linux-sh
[karo-tx-linux.git] / drivers / misc / cxl / guest.c
index bc8d0b9870eb42b5bf18ec8577c32769fbee8c2d..9aa58a77a24d13f102546a9c45aa48d780326364 100644 (file)
@@ -196,15 +196,18 @@ static irqreturn_t guest_slice_irq_err(int irq, void *data)
 {
        struct cxl_afu *afu = data;
        int rc;
-       u64 serr;
+       u64 serr, afu_error, dsisr;
 
-       WARN(irq, "CXL SLICE ERROR interrupt %i\n", irq);
        rc = cxl_h_get_fn_error_interrupt(afu->guest->handle, &serr);
        if (rc) {
                dev_crit(&afu->dev, "Couldn't read PSL_SERR_An: %d\n", rc);
                return IRQ_HANDLED;
        }
-       dev_crit(&afu->dev, "PSL_SERR_An: 0x%.16llx\n", serr);
+       afu_error = cxl_p2n_read(afu, CXL_AFU_ERR_An);
+       dsisr = cxl_p2n_read(afu, CXL_PSL_DSISR_An);
+       cxl_afu_decode_psl_serr(afu, serr);
+       dev_crit(&afu->dev, "AFU_ERR_An: 0x%.16llx\n", afu_error);
+       dev_crit(&afu->dev, "PSL_DSISR_An: 0x%.16llx\n", dsisr);
 
        rc = cxl_h_ack_fn_error_interrupt(afu->guest->handle, serr);
        if (rc)
@@ -1052,16 +1055,18 @@ static void free_adapter(struct cxl *adapter)
        struct irq_avail *cur;
        int i;
 
-       if (adapter->guest->irq_avail) {
-               for (i = 0; i < adapter->guest->irq_nranges; i++) {
-                       cur = &adapter->guest->irq_avail[i];
-                       kfree(cur->bitmap);
+       if (adapter->guest) {
+               if (adapter->guest->irq_avail) {
+                       for (i = 0; i < adapter->guest->irq_nranges; i++) {
+                               cur = &adapter->guest->irq_avail[i];
+                               kfree(cur->bitmap);
+                       }
+                       kfree(adapter->guest->irq_avail);
                }
-               kfree(adapter->guest->irq_avail);
+               kfree(adapter->guest->status);
+               kfree(adapter->guest);
        }
-       kfree(adapter->guest->status);
        cxl_remove_adapter_nr(adapter);
-       kfree(adapter->guest);
        kfree(adapter);
 }
 
@@ -1182,6 +1187,7 @@ const struct cxl_backend_ops cxl_guest_ops = {
        .ack_irq = guest_ack_irq,
        .attach_process = guest_attach_process,
        .detach_process = guest_detach_process,
+       .update_ivtes = NULL,
        .support_attributes = guest_support_attributes,
        .link_ok = guest_link_ok,
        .release_afu = guest_release_afu,