Commit b31bdd13 authored by Rob Herring's avatar Rob Herring

drm/panfrost: Convert MMU IRQ handler to threaded handler

In preparation to handle mapping of page faults, we need the MMU handler
to be threaded as code paths take a mutex.

As the IRQ may be shared, we can't use the default handler and must
disable the MMU interrupts locally.

Cc: Tomeu Vizoso <tomeu.vizoso@collabora.com>
Cc: Boris Brezillon <boris.brezillon@collabora.com>
Cc: Robin Murphy <robin.murphy@arm.com>
Reviewed-by: default avatarSteven Price <steven.price@arm.com>
Acked-by: default avatarAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Signed-off-by: default avatarRob Herring <robh@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20190808222200.13176-8-robh@kernel.org
parent 73e467f6
...@@ -305,12 +305,20 @@ static const char *access_type_name(struct panfrost_device *pfdev, ...@@ -305,12 +305,20 @@ static const char *access_type_name(struct panfrost_device *pfdev,
static irqreturn_t panfrost_mmu_irq_handler(int irq, void *data) static irqreturn_t panfrost_mmu_irq_handler(int irq, void *data)
{ {
struct panfrost_device *pfdev = data; struct panfrost_device *pfdev = data;
u32 status = mmu_read(pfdev, MMU_INT_STAT);
int i;
if (!status) if (!mmu_read(pfdev, MMU_INT_STAT))
return IRQ_NONE; return IRQ_NONE;
mmu_write(pfdev, MMU_INT_MASK, 0);
return IRQ_WAKE_THREAD;
}
static irqreturn_t panfrost_mmu_irq_handler_thread(int irq, void *data)
{
struct panfrost_device *pfdev = data;
u32 status = mmu_read(pfdev, MMU_INT_RAWSTAT);
int i;
dev_err(pfdev->dev, "mmu irq status=%x\n", status); dev_err(pfdev->dev, "mmu irq status=%x\n", status);
for (i = 0; status; i++) { for (i = 0; status; i++) {
...@@ -355,6 +363,7 @@ static irqreturn_t panfrost_mmu_irq_handler(int irq, void *data) ...@@ -355,6 +363,7 @@ static irqreturn_t panfrost_mmu_irq_handler(int irq, void *data)
status &= ~mask; status &= ~mask;
} }
mmu_write(pfdev, MMU_INT_MASK, ~0);
return IRQ_HANDLED; return IRQ_HANDLED;
}; };
...@@ -373,7 +382,8 @@ int panfrost_mmu_init(struct panfrost_device *pfdev) ...@@ -373,7 +382,8 @@ int panfrost_mmu_init(struct panfrost_device *pfdev)
if (irq <= 0) if (irq <= 0)
return -ENODEV; return -ENODEV;
err = devm_request_irq(pfdev->dev, irq, panfrost_mmu_irq_handler, err = devm_request_threaded_irq(pfdev->dev, irq, panfrost_mmu_irq_handler,
panfrost_mmu_irq_handler_thread,
IRQF_SHARED, "mmu", pfdev); IRQF_SHARED, "mmu", pfdev);
if (err) { if (err) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment