lkml.org 
[lkml]   [2022]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.16 0765/1039] irqchip/gic-v4: Disable redistributors view of the VPE table at boot time
    Date
    From: Marc Zyngier <maz@kernel.org>

    [ Upstream commit 79a7f77b9b154d572bd9d2f1eecf58c4d018d8e2 ]

    Jay Chen reported that using a kdump kernel on a GICv4.1 system
    results in a RAS error being delivered when the secondary kernel
    configures the ITS's view of the new VPE table.

    As it turns out, that's because each RD still has a pointer to
    the previous instance of the VPE table, and that particular
    implementation is very upset by seeing two bits of the HW that
    should point to the same table with different values.

    To solve this, let's invalidate any reference that any RD has to
    the VPE table when discovering the RDs. The ITS can then be
    programmed as expected.

    Reported-by: Jay Chen <jkchen@linux.alibaba.com>
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Link: https://lore.kernel.org/r/20211214064716.21407-1-jkchen@linux.alibaba.com
    Link: https://lore.kernel.org/r/20211216144804.1578566-1-maz@kernel.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/irqchip/irq-gic-v3.c | 16 ++++++++++++++++
    1 file changed, 16 insertions(+)

    diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c
    index daec3309b014d..86397522e7864 100644
    --- a/drivers/irqchip/irq-gic-v3.c
    +++ b/drivers/irqchip/irq-gic-v3.c
    @@ -920,6 +920,22 @@ static int __gic_update_rdist_properties(struct redist_region *region,
    {
    u64 typer = gic_read_typer(ptr + GICR_TYPER);

    + /* Boot-time cleanip */
    + if ((typer & GICR_TYPER_VLPIS) && (typer & GICR_TYPER_RVPEID)) {
    + u64 val;
    +
    + /* Deactivate any present vPE */
    + val = gicr_read_vpendbaser(ptr + SZ_128K + GICR_VPENDBASER);
    + if (val & GICR_VPENDBASER_Valid)
    + gicr_write_vpendbaser(GICR_VPENDBASER_PendingLast,
    + ptr + SZ_128K + GICR_VPENDBASER);
    +
    + /* Mark the VPE table as invalid */
    + val = gicr_read_vpropbaser(ptr + SZ_128K + GICR_VPROPBASER);
    + val &= ~GICR_VPROPBASER_4_1_VALID;
    + gicr_write_vpropbaser(val, ptr + SZ_128K + GICR_VPROPBASER);
    + }
    +
    gic_data.rdists.has_vlpis &= !!(typer & GICR_TYPER_VLPIS);

    /* RVPEID implies some form of DirectLPI, no matter what the doc says... :-/ */
    --
    2.34.1


    \
     
     \ /
      Last update: 2022-09-17 16:14    [W:4.018 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site