mirror of
https://github.com/torvalds/linux.git
synced 2024-11-11 06:31:49 +00:00
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:
parent
d3e669f31e
commit
1e89da5ef9
@ -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;
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user