lkml.org 
[lkml]   [2019]   [Oct]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.2 183/313] platform/x86: intel_pmc_core: Do not ioremap RAM
    Date
    From: M. Vefa Bicakci <m.v.b@runbox.com>

    [ Upstream commit 7d505758b1e556cdf65a5e451744fe0ae8063d17 ]

    On a Xen-based PVH virtual machine with more than 4 GiB of RAM,
    intel_pmc_core fails initialization with the following warning message
    from the kernel, indicating that the driver is attempting to ioremap
    RAM:

    ioremap on RAM at 0x00000000fe000000 - 0x00000000fe001fff
    WARNING: CPU: 1 PID: 434 at arch/x86/mm/ioremap.c:186 __ioremap_caller.constprop.0+0x2aa/0x2c0
    ...
    Call Trace:
    ? pmc_core_probe+0x87/0x2d0 [intel_pmc_core]
    pmc_core_probe+0x87/0x2d0 [intel_pmc_core]

    This issue appears to manifest itself because of the following fallback
    mechanism in the driver:

    if (lpit_read_residency_count_address(&slp_s0_addr))
    pmcdev->base_addr = PMC_BASE_ADDR_DEFAULT;

    The validity of address PMC_BASE_ADDR_DEFAULT (i.e., 0xFE000000) is not
    verified by the driver, which is what this patch introduces. With this
    patch, if address PMC_BASE_ADDR_DEFAULT is in RAM, then the driver will
    not attempt to ioremap the aforementioned address.

    Signed-off-by: M. Vefa Bicakci <m.v.b@runbox.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 | 8 ++++++--
    1 file changed, 6 insertions(+), 2 deletions(-)

    diff --git a/drivers/platform/x86/intel_pmc_core.c b/drivers/platform/x86/intel_pmc_core.c
    index be6cda89dcf5b..01a530e2f8017 100644
    --- a/drivers/platform/x86/intel_pmc_core.c
    +++ b/drivers/platform/x86/intel_pmc_core.c
    @@ -882,10 +882,14 @@ static int pmc_core_probe(struct platform_device *pdev)
    if (pmcdev->map == &spt_reg_map && !pci_dev_present(pmc_pci_ids))
    pmcdev->map = &cnp_reg_map;

    - if (lpit_read_residency_count_address(&slp_s0_addr))
    + if (lpit_read_residency_count_address(&slp_s0_addr)) {
    pmcdev->base_addr = PMC_BASE_ADDR_DEFAULT;
    - else
    +
    + if (page_is_ram(PHYS_PFN(pmcdev->base_addr)))
    + return -ENODEV;
    + } else {
    pmcdev->base_addr = slp_s0_addr - pmcdev->map->slp_s0_offset;
    + }

    pmcdev->regbase = ioremap(pmcdev->base_addr,
    pmcdev->map->regmap_length);
    --
    2.20.1


    \
     
     \ /
      Last update: 2019-10-03 19:11    [W:4.052 / U:0.348 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site