• Michael Ellerman's avatar
    powerpc/64s: Fix Power9 DD2.0 workarounds by adding DD2.1 feature · 3ffa9d9e
    Michael Ellerman authored
    Recently we added a CPU feature for Power9 DD2.0, to capture the fact
    that some workarounds are required only on Power9 DD1 and DD2.0 but
    not DD2.1 or later.
    
    Then in commit 9d2f510a ("powerpc/64s/idle: avoid POWER9 DD1 and
    DD2.0 ERAT workaround on DD2.1") and commit e3646330
    "powerpc/64s/idle: avoid POWER9 DD1 and DD2.0 PMU workaround on
    DD2.1") we changed CPU_FTR_SECTIONs to check for DD1 or DD20, eg:
    
      BEGIN_FTR_SECTION
              PPC_INVALIDATE_ERAT
      END_FTR_SECTION_IFSET(CPU_FTR_POWER9_DD1 | CPU_FTR_POWER9_DD20)
    
    Unfortunately although this reads as "if set DD1 or DD2.0", the or is
    a bitwise or and actually generates a mask of both bits. The code that
    does the feature patching then checks that the value of the CPU
    features masked with that mask are equal to the mask.
    
    So the end result is we're checking for DD1 and DD20 being set, which
    never happens. Yes the API is terrible.
    
    Removing the ERAT workaround on DD2.0 results in random SEGVs, the
    system tends to boot, but things randomly die including sometimes
    dhclient, udev etc.
    
    To fix the problem and hopefully avoid it in future, we remove the
    DD2.0 CPU feature and instead add a DD2.1 (or later) feature. This
    allows us to easily express that the workarounds are required if DD2.1
    is not set.
    
    At some point we will drop the DD1 workarounds entirely and some of
    this can be cleaned up.
    
    Fixes: 9d2f510a ("powerpc/64s/idle: avoid POWER9 DD1 and DD2.0 ERAT workaround on DD2.1")
    Fixes: e3646330 ("powerpc/64s/idle: avoid POWER9 DD1 and DD2.0 PMU workaround on DD2.1")
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    3ffa9d9e
idle_book3s.S 24.9 KB