powerpc/xive: Activate StoreEOI on P10
authorCédric Le Goater <clg@kaod.org>
Fri, 5 Nov 2021 10:26:28 +0000 (11:26 +0100)
committerMichael Ellerman <mpe@ellerman.id.au>
Thu, 25 Nov 2021 00:25:30 +0000 (11:25 +1100)
StoreEOI (the capability to EOI with a store) requires load-after-store
ordering in some cases to be reliable. P10 introduced a new offset for
load operations to enforce correct ordering and the XIVE driver has
the required support since kernel 5.8, commit b1f9be9392f0
("powerpc/xive: Enforce load-after-store ordering when StoreEOI is active")

Since skiboot v7, StoreEOI support is advertised on P10 with a new flag
on the PowerNV platform. See skiboot commit 4bd7d84afe46 ("xive/p10:
Introduce a new OPAL_XIVE_IRQ_STORE_EOI2 flag"). When detected,
activate the feature.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20211105102636.1016378-4-clg@kaod.org
arch/powerpc/include/asm/opal-api.h
arch/powerpc/sysdev/xive/native.c

index 0b63ba7d59175f3d00d6d5a03853c0851279abb4..a2bc4b95e703cff0179f23d826dceb8167ab9dbd 100644 (file)
@@ -1094,6 +1094,7 @@ enum {
        OPAL_XIVE_IRQ_SHIFT_BUG         = 0x00000008, /* P9 DD1.0 workaround */
        OPAL_XIVE_IRQ_MASK_VIA_FW       = 0x00000010, /* P9 DD1.0 workaround */
        OPAL_XIVE_IRQ_EOI_VIA_FW        = 0x00000020, /* P9 DD1.0 workaround */
+       OPAL_XIVE_IRQ_STORE_EOI2        = 0x00000040,
 };
 
 /* Flags for OPAL_XIVE_GET/SET_QUEUE_INFO */
index 1aec282cd650d0b798fb5d1791dd7840c3500d80..7ec8911dad57cf55754d16550d1fb5b0e04285bb 100644 (file)
@@ -63,6 +63,8 @@ int xive_native_populate_irq_data(u32 hw_irq, struct xive_irq_data *data)
        opal_flags = be64_to_cpu(flags);
        if (opal_flags & OPAL_XIVE_IRQ_STORE_EOI)
                data->flags |= XIVE_IRQ_FLAG_STORE_EOI;
+       if (opal_flags & OPAL_XIVE_IRQ_STORE_EOI2)
+               data->flags |= XIVE_IRQ_FLAG_STORE_EOI;
        if (opal_flags & OPAL_XIVE_IRQ_LSI)
                data->flags |= XIVE_IRQ_FLAG_LSI;
        data->eoi_page = be64_to_cpu(eoi_page);