Hi Rob,

On 25/07/2019 02:10, Rob Herring wrote:
[...]
@@ -328,6 +427,18 @@ static irqreturn_t panfrost_mmu_irq_handler(int irq, void 
*data)
                access_type = (fault_status >> 8) & 0x3;
                source_id = (fault_status >> 16);

+               /* Page fault only */
+               if ((status & mask) == BIT(i)) {
+                       WARN_ON(exception_type < 0xC1 || exception_type > 0xC4);
+
+                       ret = panfrost_mmu_map_fault_addr(pfdev, i, addr);
+                       if (!ret) {
+                               mmu_write(pfdev, MMU_INT_CLEAR, BIT(i));
+                               status &= ~mask;
+                               continue;
+                       }
+               }
+
                /* terminal fault, print info about the fault */
                dev_err(pfdev->dev,
                        "Unhandled Page fault in AS%d at VA 0x%016llX\n"
@@ -368,8 +479,9 @@ int panfrost_mmu_init(struct panfrost_device *pfdev)
        if (irq <= 0)
                return -ENODEV;

-       err = devm_request_irq(pfdev->dev, irq, panfrost_mmu_irq_handler,
-                              IRQF_SHARED, "mmu", pfdev);
+       err = devm_request_threaded_irq(pfdev->dev, irq, NULL,
+                                       panfrost_mmu_irq_handler,
+                                       IRQF_ONESHOT, "mmu", pfdev);

The change of flags here breaks platforms using a single shared interrupt line.

Otherwise, though, I've hacked around that and taken the branch for a spin with mesa/master (and using a 64K page kernel config for giggles) and nothing seems amiss to the extent of my "glmark2 runs all the way through" testing, but I guess there still need to be additional changes on the userspace end to actually exercise these new flags.

Robin.


        if (err) {
                dev_err(pfdev->dev, "failed to request mmu irq");
diff --git a/include/uapi/drm/panfrost_drm.h b/include/uapi/drm/panfrost_drm.h
index 17fb5d200f7a..9150dd75aad8 100644
--- a/include/uapi/drm/panfrost_drm.h
+++ b/include/uapi/drm/panfrost_drm.h
@@ -83,6 +83,7 @@ struct drm_panfrost_wait_bo {
  };

  #define PANFROST_BO_NOEXEC    1
+#define PANFROST_BO_HEAP       2

  /**
   * struct drm_panfrost_create_bo - ioctl argument for creating Panfrost BOs.
--
2.20.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to