lkml.org 
[lkml]   [2019]   [Mar]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.0 179/262] platform/x86: intel_pmc_core: Fix PCH IP sts reading
    Date
    From: Rajneesh Bhardwaj <rajneesh.bhardwaj@linux.intel.com>

    [ Upstream commit 0e68eeea9894feeba2edf7ec63e4551b87f39621 ]

    A previous commit "platform/x86: intel_pmc_core: Make the driver PCH
    family agnostic <c977b98bbef5898ed3d30b08ea67622e9e82082a>" provided
    better abstraction to this driver but has some fundamental issues.

    e.g. the following condition

    for (index = 0; index < pmcdev->map->ppfear_buckets &&
    index < PPFEAR_MAX_NUM_ENTRIES; index++, iter++)

    is wrong because for CNL, PPFEAR_MAX_NUM_ENTRIES is hardcoded as 5 which
    is _wrong_ and even though ppfear_buckets is 8, the loop fails to read
    all eight registers needed for CNL PCH i.e. PPFEAR0 and PPFEAR1. This
    patch refactors the pfear show logic to correctly read PCH IP power
    gating status for Cannonlake and beyond.

    Cc: "David E. Box" <david.e.box@intel.com>
    Cc: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
    Fixes: c977b98bbef5 ("platform/x86: intel_pmc_core: Make the driver PCH family agnostic")
    Signed-off-by: Rajneesh Bhardwaj <rajneesh.bhardwaj@linux.intel.com>
    Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/platform/x86/intel_pmc_core.c | 3 ++-
    drivers/platform/x86/intel_pmc_core.h | 2 +-
    2 files changed, 3 insertions(+), 2 deletions(-)

    diff --git a/drivers/platform/x86/intel_pmc_core.c b/drivers/platform/x86/intel_pmc_core.c
    index 22dbf115782e..c37e74ee609d 100644
    --- a/drivers/platform/x86/intel_pmc_core.c
    +++ b/drivers/platform/x86/intel_pmc_core.c
    @@ -380,7 +380,8 @@ static int pmc_core_ppfear_show(struct seq_file *s, void *unused)
    index < PPFEAR_MAX_NUM_ENTRIES; index++, iter++)
    pf_regs[index] = pmc_core_reg_read_byte(pmcdev, iter);

    - for (index = 0; map[index].name; index++)
    + for (index = 0; map[index].name &&
    + index < pmcdev->map->ppfear_buckets * 8; index++)
    pmc_core_display_map(s, index, pf_regs[index / 8], map);

    return 0;
    diff --git a/drivers/platform/x86/intel_pmc_core.h b/drivers/platform/x86/intel_pmc_core.h
    index 89554cba5758..1a0104d2cbf0 100644
    --- a/drivers/platform/x86/intel_pmc_core.h
    +++ b/drivers/platform/x86/intel_pmc_core.h
    @@ -32,7 +32,7 @@
    #define SPT_PMC_SLP_S0_RES_COUNTER_STEP 0x64
    #define PMC_BASE_ADDR_MASK ~(SPT_PMC_MMIO_REG_LEN - 1)
    #define MTPMC_MASK 0xffff0000
    -#define PPFEAR_MAX_NUM_ENTRIES 5
    +#define PPFEAR_MAX_NUM_ENTRIES 12
    #define SPT_PPFEAR_NUM_ENTRIES 5
    #define SPT_PMC_READ_DISABLE_BIT 0x16
    #define SPT_PMC_MSG_FULL_STS_BIT 0x18
    --
    2.19.1
    \
     
     \ /
      Last update: 2019-03-27 19:08    [W:2.687 / U:0.192 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site