Le 26/04/2017 à 08:40, Alastair D'Silva a écrit :
From: Alastair D'Silva <alast...@d-silva.org>

In some situations, a faulty AFU slice may create an interrupt storm,
rendering the machine unusable. Since these interrupts are informational
only, present the interrupt once, then mask it off to prevent it from
being retriggered until the card is reset.

Signed-off-by: Alastair D'Silva <alast...@d-silva.org>
---

Patch looks good, thanks!
It doesn't apply cleanly on the 'next' tree due to the capi2 patchset though, so you should probably rebase on that tree. The bits have changed a bit on PSL9, but the approach still works (error type reported in the first byte, and the corresponding masking bits are still right-shifted by 32).

  Fred

 drivers/misc/cxl/native.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/misc/cxl/native.c b/drivers/misc/cxl/native.c
index 7ae7105..4e8010f 100644
--- a/drivers/misc/cxl/native.c
+++ b/drivers/misc/cxl/native.c
@@ -996,7 +996,7 @@ static void native_irq_wait(struct cxl_context *ctx)
 static irqreturn_t native_slice_irq_err(int irq, void *data)
 {
        struct cxl_afu *afu = data;
-       u64 fir_slice, errstat, serr, afu_debug, afu_error, dsisr;
+       u64 fir_slice, errstat, serr, afu_debug, afu_error, dsisr, irq_mask;

        /*
         * slice err interrupt is only used with full PSL (no XSL)
@@ -1014,6 +1014,10 @@ static irqreturn_t native_slice_irq_err(int irq, void 
*data)
        dev_crit(&afu->dev, "AFU_ERR_An: 0x%.16llx\n", afu_error);
        dev_crit(&afu->dev, "PSL_DSISR_An: 0x%.16llx\n", dsisr);

+       /* mask off the IRQ so it won't retrigger until the card is reset */
+       irq_mask = (serr & 0xff80000000000000ULL) >> 32;
+       serr |= irq_mask;
+
        cxl_p1n_write(afu, CXL_PSL_SERR_An, serr);

        return IRQ_HANDLED;


Reply via email to