irqchip/gic-v4: Use Inner-Shareable attributes for virtual pending tables
authorHeyi Guo <guoheyi@huawei.com>
Sat, 30 Nov 2019 07:38:49 +0000 (15:38 +0800)
committerMarc Zyngier <maz@kernel.org>
Sat, 21 Mar 2020 09:40:47 +0000 (09:40 +0000)
There is no special reason to set virtual LPI pending table as
non-shareable. If we choose to hard code the shareability without
probing, Inner-Shareable is likely to be a better choice, as the
VPEs can move around and benefit from having the redistributors
snooping each other's cache, if that's something they can do.

Furthermore, Hisilicon hip08 ends up with unspecified errors when
mixing shareability attributes. So let's move to IS attributes for
the VPT. This has also been tested on D05 and didn't show any
regression.

Signed-off-by: Heyi Guo <guoheyi@huawei.com>
[maz: rewrote commit message]
Signed-off-by: Marc Zyngier <maz@kernel.org>
Tested-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20191130073849.38378-1-guoheyi@huawei.com
drivers/irqchip/irq-gic-v3-its.c
include/linux/irqchip/arm-gic-v3.h

index bb80285998b5a70903ee06de7d4ea3d651896e7d..bc5b3f6e6f2bc18e2b9ee0140f27c57fb5cdec40 100644 (file)
@@ -3560,7 +3560,7 @@ static void its_vpe_schedule(struct its_vpe *vpe)
        val  = virt_to_phys(page_address(vpe->vpt_page)) &
                GENMASK_ULL(51, 16);
        val |= GICR_VPENDBASER_RaWaWb;
-       val |= GICR_VPENDBASER_NonShareable;
+       val |= GICR_VPENDBASER_InnerShareable;
        /*
         * There is no good way of finding out if the pending table is
         * empty as we can race against the doorbell interrupt very
index 83439bfb6c5b0eb258a3d1cec2cf6beb98e11abf..85b105f6dc3679e06a5200e35652b9fb8f8d56df 100644 (file)
 #define GICR_VPENDBASER_NonShareable                                   \
        GIC_BASER_SHAREABILITY(GICR_VPENDBASER, NonShareable)
 
+#define GICR_VPENDBASER_InnerShareable                                 \
+       GIC_BASER_SHAREABILITY(GICR_VPENDBASER, InnerShareable)
+
 #define GICR_VPENDBASER_nCnB   GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, nCnB)
 #define GICR_VPENDBASER_nC     GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, nC)
 #define GICR_VPENDBASER_RaWt   GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, RaWt)