lkml.org 
[lkml]   [2020]   [Oct]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 11/13] x86/platform/uv: Update UV5 TSC Checking
    Date
    Update check of BIOS TSC sync status to include both possible "invalid"
    states provided by newer UV5 BIOS.

    Signed-off-by: Mike Travis <mike.travis@hpe.com>
    Reviewed-by: Steve Wahl <steve.wahl@hpe.com>
    ---
    arch/x86/include/asm/uv/uv_hub.h | 2 +-
    arch/x86/kernel/apic/x2apic_uv_x.c | 24 ++++++++++--------------
    2 files changed, 11 insertions(+), 15 deletions(-)

    diff --git a/arch/x86/include/asm/uv/uv_hub.h b/arch/x86/include/asm/uv/uv_hub.h
    index ecf5c93e7ae8..07079b59824d 100644
    --- a/arch/x86/include/asm/uv/uv_hub.h
    +++ b/arch/x86/include/asm/uv/uv_hub.h
    @@ -726,7 +726,7 @@ extern void uv_nmi_setup_hubless(void);
    #define UVH_TSC_SYNC_SHIFT_UV2K 16 /* UV2/3k have different bits */
    #define UVH_TSC_SYNC_MASK 3 /* 0011 */
    #define UVH_TSC_SYNC_VALID 3 /* 0011 */
    -#define UVH_TSC_SYNC_INVALID 2 /* 0010 */
    +#define UVH_TSC_SYNC_UNKNOWN 0 /* 0000 */

    /* BMC sets a bit this MMR non-zero before sending an NMI */
    #define UVH_NMI_MMR UVH_BIOS_KERNEL_MMR
    diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c
    index c7f5c1a55552..9ab4ac4d3ec0 100644
    --- a/arch/x86/kernel/apic/x2apic_uv_x.c
    +++ b/arch/x86/kernel/apic/x2apic_uv_x.c
    @@ -197,36 +197,32 @@ static void __init uv_tsc_check_sync(void)
    int sync_state;
    int mmr_shift;
    char *state;
    - bool valid;

    - /* Accommodate different UV arch BIOSes */
    + /* Different returns from different UV BIOS versions */
    mmr = uv_early_read_mmr(UVH_TSC_SYNC_MMR);
    mmr_shift =
    is_uv2_hub() ? UVH_TSC_SYNC_SHIFT_UV2K : UVH_TSC_SYNC_SHIFT;
    sync_state = (mmr >> mmr_shift) & UVH_TSC_SYNC_MASK;

    + /* Check if TSC is valid for all sockets */
    switch (sync_state) {
    case UVH_TSC_SYNC_VALID:
    state = "in sync";
    - valid = true;
    + mark_tsc_async_resets("UV BIOS");
    break;

    - case UVH_TSC_SYNC_INVALID:
    - state = "unstable";
    - valid = false;
    + /* If BIOS state unknown, don't do anything */
    + case UVH_TSC_SYNC_UNKNOWN:
    + state = "unknown";
    break;
    +
    + /* Otherwise, BIOS indicates problem with TSC */
    default:
    - state = "unknown: assuming valid";
    - valid = true;
    + state = "unstable";
    + mark_tsc_unstable("UV BIOS");
    break;
    }
    pr_info("UV: TSC sync state from BIOS:0%d(%s)\n", sync_state, state);
    -
    - /* Mark flag that says TSC != 0 is valid for socket 0 */
    - if (valid)
    - mark_tsc_async_resets("UV BIOS");
    - else
    - mark_tsc_unstable("UV BIOS");
    }

    /* Selector for (4|4A|5) structs */
    --
    2.21.0
    \
     
     \ /
      Last update: 2020-10-05 22:41    [W:4.309 / U:0.100 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site