scsi: cxlflash: Access interrupt trigger page from xive directly

xive is already mapping the trigger page in kernel space and it can be
accessed through standard APIs, so let's reuse it and simplify the code.

Signed-off-by: Frederic Barrat <fbarrat@linux.ibm.com>
Reviewed-by: Cédric Le Goater <clg@kaod.org>
Acked-by: Matthew R. Ochs <mrochs@linux.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20200403153838.29224-2-fbarrat@linux.ibm.com
This commit is contained in:
Frederic Barrat 2020-04-03 17:38:35 +02:00 committed by Michael Ellerman
parent d3e669f31e
commit 1e89da5ef9
2 changed files with 8 additions and 11 deletions

View File

@ -15,7 +15,8 @@
#include <linux/pseudo_fs.h> #include <linux/pseudo_fs.h>
#include <linux/poll.h> #include <linux/poll.h>
#include <linux/sched/signal.h> #include <linux/sched/signal.h>
#include <linux/interrupt.h>
#include <asm/xive.h>
#include <misc/ocxl.h> #include <misc/ocxl.h>
#include <uapi/misc/cxl.h> #include <uapi/misc/cxl.h>
@ -180,7 +181,7 @@ static int afu_map_irq(u64 flags, struct ocxlflash_context *ctx, int num,
struct ocxl_hw_afu *afu = ctx->hw_afu; struct ocxl_hw_afu *afu = ctx->hw_afu;
struct device *dev = afu->dev; struct device *dev = afu->dev;
struct ocxlflash_irqs *irq; struct ocxlflash_irqs *irq;
void __iomem *vtrig; struct xive_irq_data *xd;
u32 virq; u32 virq;
int rc = 0; int rc = 0;
@ -204,15 +205,15 @@ static int afu_map_irq(u64 flags, struct ocxlflash_context *ctx, int num,
goto err1; goto err1;
} }
vtrig = ioremap(irq->ptrig, PAGE_SIZE); xd = irq_get_handler_data(virq);
if (unlikely(!vtrig)) { if (unlikely(!xd)) {
dev_err(dev, "%s: Trigger page mapping failed\n", __func__); dev_err(dev, "%s: Can't get interrupt data\n", __func__);
rc = -ENOMEM; rc = -ENXIO;
goto err2; goto err2;
} }
irq->virq = virq; irq->virq = virq;
irq->vtrig = vtrig; irq->vtrig = xd->trig_mmio;
out: out:
return rc; return rc;
err2: err2:
@ -259,8 +260,6 @@ static void afu_unmap_irq(u64 flags, struct ocxlflash_context *ctx, int num,
} }
irq = &ctx->irqs[num]; irq = &ctx->irqs[num];
if (irq->vtrig)
iounmap(irq->vtrig);
if (irq_find_mapping(NULL, irq->hwirq)) { if (irq_find_mapping(NULL, irq->hwirq)) {
free_irq(irq->virq, cookie); free_irq(irq->virq, cookie);
@ -648,7 +647,6 @@ static int alloc_afu_irqs(struct ocxlflash_context *ctx, int num)
} }
irqs[i].hwirq = hwirq; irqs[i].hwirq = hwirq;
irqs[i].ptrig = addr;
} }
ctx->irqs = irqs; ctx->irqs = irqs;

View File

@ -13,7 +13,6 @@
struct ocxlflash_irqs { struct ocxlflash_irqs {
int hwirq; int hwirq;
u32 virq; u32 virq;
u64 ptrig;
void __iomem *vtrig; void __iomem *vtrig;
}; };