/*
  * This is insane.
  *
- * If a GICv4 doesn't implement Direct LPIs (which is extremely
+ * If a GICv4.0 doesn't implement Direct LPIs (which is extremely
  * likely), the only way to perform an invalidate is to use a fake
  * device to issue an INV command, implying that the LPI has first
  * been mapped to some event on that device. Since this is not exactly
  * only issue an UNMAP if we're short on available slots.
  *
  * Broken by design(tm).
+ *
+ * GICv4.1, on the other hand, mandates that we're able to invalidate
+ * by writing to a MMIO register. It doesn't implement the whole of
+ * DirectLPI, but that's good enough. And most of the time, we don't
+ * even have to invalidate anything, as the redistributor can be told
+ * whether to generate a doorbell or not (we thus leave it enabled,
+ * always).
  */
 static void its_vpe_db_proxy_unmap_locked(struct its_vpe *vpe)
 {
+       /* GICv4.1 doesn't use a proxy, so nothing to do here */
+       if (gic_rdists->has_rvpeid)
+               return;
+
        /* Already unmapped? */
        if (vpe->vpe_proxy_event == -1)
                return;
 
 static void its_vpe_db_proxy_unmap(struct its_vpe *vpe)
 {
+       /* GICv4.1 doesn't use a proxy, so nothing to do here */
+       if (gic_rdists->has_rvpeid)
+               return;
+
        if (!gic_rdists->has_direct_lpi) {
                unsigned long flags;
 
 
 static void its_vpe_db_proxy_map_locked(struct its_vpe *vpe)
 {
+       /* GICv4.1 doesn't use a proxy, so nothing to do here */
+       if (gic_rdists->has_rvpeid)
+               return;
+
        /* Already mapped? */
        if (vpe->vpe_proxy_event != -1)
                return;
        unsigned long flags;
        struct its_collection *target_col;
 
+       /* GICv4.1 doesn't use a proxy, so nothing to do here */
+       if (gic_rdists->has_rvpeid)
+               return;
+
        if (gic_rdists->has_direct_lpi) {
                void __iomem *rdbase;