]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
platform/x86:intel/pmc: Revert "Enable the ACPI PM Timer to be turned off when suspended"
authorMarek Maslanka <mmaslanka@google.com>
Sat, 12 Oct 2024 18:26:55 +0000 (18:26 +0000)
committerHans de Goede <hdegoede@redhat.com>
Mon, 21 Oct 2024 14:04:00 +0000 (16:04 +0200)
Commit e86c8186d03a ("platform/x86:intel/pmc: Enable the ACPI PM Timer to
be turned off when suspended") can cause the suspend process to hang as
the pmcdev->lock in the pmc_core_acpi_pm_timer_suspend_resume might already
be held by the pmc_core_mphy_pg_show or pmc_core_pll_show if the userspace
gets frozen when these functions are being executed.

Also, pmc_core_acpi_pm_timer_suspend_resume must not sleep, as this
function is called indirectly by the tick_freeze function in
kernel/time/tick-common.c, which holds the spinlock.

Revert the changes for now to fix these issues.

Fixes: e86c8186d03a ("platform/x86:intel/pmc: Enable the ACPI PM Timer to be turned off when suspended")
Reported-by: Luca Coelho <luca@coelho.fi>
Closes: https://lore.kernel.org/lkml/40555604c3f4be43bf72e72d5409eaece4be9320.camel@coelho.fi/
Signed-off-by: Marek Maslanka <mmaslanka@google.com>
Link: https://lore.kernel.org/r/20241012182656.2107178-1-mmaslanka@google.com
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
drivers/platform/x86/intel/pmc/adl.c
drivers/platform/x86/intel/pmc/cnp.c
drivers/platform/x86/intel/pmc/core.c
drivers/platform/x86/intel/pmc/core.h
drivers/platform/x86/intel/pmc/icl.c
drivers/platform/x86/intel/pmc/mtl.c
drivers/platform/x86/intel/pmc/tgl.c

index 9d9c07f44ff61c001eafdc5c6def48b1402cbdfa..e7878558fd9090140e6de7c6ce192e8419eb5306 100644 (file)
@@ -295,8 +295,6 @@ const struct pmc_reg_map adl_reg_map = {
        .ppfear_buckets = CNP_PPFEAR_NUM_ENTRIES,
        .pm_cfg_offset = CNP_PMC_PM_CFG_OFFSET,
        .pm_read_disable_bit = CNP_PMC_READ_DISABLE_BIT,
-       .acpi_pm_tmr_ctl_offset = SPT_PMC_ACPI_PM_TMR_CTL_OFFSET,
-       .acpi_pm_tmr_disable_bit = SPT_PMC_BIT_ACPI_PM_TMR_DISABLE,
        .ltr_ignore_max = ADL_NUM_IP_IGN_ALLOWED,
        .lpm_num_modes = ADL_LPM_NUM_MODES,
        .lpm_num_maps = ADL_LPM_NUM_MAPS,
index 513c02670c5aa97fde095f59eb123e51eccab9f2..dd72974bf71e2abe248a1f1b671a45756ad61288 100644 (file)
@@ -200,8 +200,6 @@ const struct pmc_reg_map cnp_reg_map = {
        .ppfear_buckets = CNP_PPFEAR_NUM_ENTRIES,
        .pm_cfg_offset = CNP_PMC_PM_CFG_OFFSET,
        .pm_read_disable_bit = CNP_PMC_READ_DISABLE_BIT,
-       .acpi_pm_tmr_ctl_offset = SPT_PMC_ACPI_PM_TMR_CTL_OFFSET,
-       .acpi_pm_tmr_disable_bit = SPT_PMC_BIT_ACPI_PM_TMR_DISABLE,
        .ltr_ignore_max = CNP_NUM_IP_IGN_ALLOWED,
        .etr3_offset = ETR3_OFFSET,
 };
index ecb47f8b4f834dd9df622ec37b596a85dc0ff26f..4e9c8c96c8cceedc195093035d045a9f55aed3f1 100644 (file)
@@ -11,7 +11,6 @@
 
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
-#include <linux/acpi_pmtmr.h>
 #include <linux/bitfield.h>
 #include <linux/debugfs.h>
 #include <linux/delay.h>
@@ -1258,39 +1257,6 @@ static bool pmc_core_is_pson_residency_enabled(struct pmc_dev *pmcdev)
        return val == 1;
 }
 
-/*
- * Enable or disable ACPI PM Timer
- *
- * This function is intended to be a callback for ACPI PM suspend/resume event.
- * The ACPI PM Timer is enabled on resume only if it was enabled during suspend.
- */
-static void pmc_core_acpi_pm_timer_suspend_resume(void *data, bool suspend)
-{
-       struct pmc_dev *pmcdev = data;
-       struct pmc *pmc = pmcdev->pmcs[PMC_IDX_MAIN];
-       const struct pmc_reg_map *map = pmc->map;
-       bool enabled;
-       u32 reg;
-
-       if (!map->acpi_pm_tmr_ctl_offset)
-               return;
-
-       guard(mutex)(&pmcdev->lock);
-
-       if (!suspend && !pmcdev->enable_acpi_pm_timer_on_resume)
-               return;
-
-       reg = pmc_core_reg_read(pmc, map->acpi_pm_tmr_ctl_offset);
-       enabled = !(reg & map->acpi_pm_tmr_disable_bit);
-       if (suspend)
-               reg |= map->acpi_pm_tmr_disable_bit;
-       else
-               reg &= ~map->acpi_pm_tmr_disable_bit;
-       pmc_core_reg_write(pmc, map->acpi_pm_tmr_ctl_offset, reg);
-
-       pmcdev->enable_acpi_pm_timer_on_resume = suspend && enabled;
-}
-
 static void pmc_core_dbgfs_unregister(struct pmc_dev *pmcdev)
 {
        debugfs_remove_recursive(pmcdev->dbgfs_dir);
@@ -1486,7 +1452,6 @@ static int pmc_core_probe(struct platform_device *pdev)
        struct pmc_dev *pmcdev;
        const struct x86_cpu_id *cpu_id;
        int (*core_init)(struct pmc_dev *pmcdev);
-       const struct pmc_reg_map *map;
        struct pmc *primary_pmc;
        int ret;
 
@@ -1545,11 +1510,6 @@ static int pmc_core_probe(struct platform_device *pdev)
        pm_report_max_hw_sleep(FIELD_MAX(SLP_S0_RES_COUNTER_MASK) *
                               pmc_core_adjust_slp_s0_step(primary_pmc, 1));
 
-       map = primary_pmc->map;
-       if (map->acpi_pm_tmr_ctl_offset)
-               acpi_pmtmr_register_suspend_resume_callback(pmc_core_acpi_pm_timer_suspend_resume,
-                                                        pmcdev);
-
        device_initialized = true;
        dev_info(&pdev->dev, " initialized\n");
 
@@ -1559,12 +1519,6 @@ static int pmc_core_probe(struct platform_device *pdev)
 static void pmc_core_remove(struct platform_device *pdev)
 {
        struct pmc_dev *pmcdev = platform_get_drvdata(pdev);
-       const struct pmc *pmc = pmcdev->pmcs[PMC_IDX_MAIN];
-       const struct pmc_reg_map *map = pmc->map;
-
-       if (map->acpi_pm_tmr_ctl_offset)
-               acpi_pmtmr_unregister_suspend_resume_callback();
-
        pmc_core_dbgfs_unregister(pmcdev);
        pmc_core_clean_structure(pdev);
 }
index 75fd593a7b0ffd9094aafbe44399f8137e05ca53..b9d3291d0bf2c82ab2e2bcf6f7cca49b844e49cd 100644 (file)
@@ -68,8 +68,6 @@ struct telem_endpoint;
 #define SPT_PMC_LTR_SCC                                0x3A0
 #define SPT_PMC_LTR_ISH                                0x3A4
 
-#define SPT_PMC_ACPI_PM_TMR_CTL_OFFSET         0x18FC
-
 /* Sunrise Point: PGD PFET Enable Ack Status Registers */
 enum ppfear_regs {
        SPT_PMC_XRAM_PPFEAR0A = 0x590,
@@ -150,8 +148,6 @@ enum ppfear_regs {
 #define SPT_PMC_VRIC1_SLPS0LVEN                        BIT(13)
 #define SPT_PMC_VRIC1_XTALSDQDIS               BIT(22)
 
-#define SPT_PMC_BIT_ACPI_PM_TMR_DISABLE                BIT(1)
-
 /* Cannonlake Power Management Controller register offsets */
 #define CNP_PMC_SLPS0_DBG_OFFSET               0x10B4
 #define CNP_PMC_PM_CFG_OFFSET                  0x1818
@@ -355,8 +351,6 @@ struct pmc_reg_map {
        const u8  *lpm_reg_index;
        const u32 pson_residency_offset;
        const u32 pson_residency_counter_step;
-       const u32 acpi_pm_tmr_ctl_offset;
-       const u32 acpi_pm_tmr_disable_bit;
 };
 
 /**
@@ -432,8 +426,6 @@ struct pmc_dev {
        u32 die_c6_offset;
        struct telem_endpoint *punit_ep;
        struct pmc_info *regmap_list;
-
-       bool enable_acpi_pm_timer_on_resume;
 };
 
 enum pmc_index {
index cbbd4405446888cd57e3f212e6ae4b47e183b0e0..71b0fd6cb7d840e1b2e9c71f3f8d40dd9d93126e 100644 (file)
@@ -46,8 +46,6 @@ const struct pmc_reg_map icl_reg_map = {
        .ppfear_buckets = ICL_PPFEAR_NUM_ENTRIES,
        .pm_cfg_offset = CNP_PMC_PM_CFG_OFFSET,
        .pm_read_disable_bit = CNP_PMC_READ_DISABLE_BIT,
-       .acpi_pm_tmr_ctl_offset = SPT_PMC_ACPI_PM_TMR_CTL_OFFSET,
-       .acpi_pm_tmr_disable_bit = SPT_PMC_BIT_ACPI_PM_TMR_DISABLE,
        .ltr_ignore_max = ICL_NUM_IP_IGN_ALLOWED,
        .etr3_offset = ETR3_OFFSET,
 };
index 91f2fa728f5c88b5b0e56a77f386d5339e39ad61..c7d15d864039d0265199861316c5911539e10358 100644 (file)
@@ -462,8 +462,6 @@ const struct pmc_reg_map mtl_socm_reg_map = {
        .ppfear_buckets = MTL_SOCM_PPFEAR_NUM_ENTRIES,
        .pm_cfg_offset = CNP_PMC_PM_CFG_OFFSET,
        .pm_read_disable_bit = CNP_PMC_READ_DISABLE_BIT,
-       .acpi_pm_tmr_ctl_offset = SPT_PMC_ACPI_PM_TMR_CTL_OFFSET,
-       .acpi_pm_tmr_disable_bit = SPT_PMC_BIT_ACPI_PM_TMR_DISABLE,
        .lpm_num_maps = ADL_LPM_NUM_MAPS,
        .ltr_ignore_max = MTL_SOCM_NUM_IP_IGN_ALLOWED,
        .lpm_res_counter_step_x2 = TGL_PMC_LPM_RES_COUNTER_STEP_X2,
index 371b4e30f142636d5019ab8d742cb513b03e8049..e0580de180773c57e6b1c2208d341402e97c64ad 100644 (file)
@@ -197,8 +197,6 @@ const struct pmc_reg_map tgl_reg_map = {
        .ppfear_buckets = ICL_PPFEAR_NUM_ENTRIES,
        .pm_cfg_offset = CNP_PMC_PM_CFG_OFFSET,
        .pm_read_disable_bit = CNP_PMC_READ_DISABLE_BIT,
-       .acpi_pm_tmr_ctl_offset = SPT_PMC_ACPI_PM_TMR_CTL_OFFSET,
-       .acpi_pm_tmr_disable_bit = SPT_PMC_BIT_ACPI_PM_TMR_DISABLE,
        .ltr_ignore_max = TGL_NUM_IP_IGN_ALLOWED,
        .lpm_num_maps = TGL_LPM_NUM_MAPS,
        .lpm_res_counter_step_x2 = TGL_PMC_LPM_RES_COUNTER_STEP_X2,