From: "David E. Box" <david.e.box@linux.intel.com>
To: Rajneesh Bhardwaj <irenic.rajneesh@gmail.com>,
Marek Maslanka <mmaslanka@google.com>
Cc: LKML <linux-kernel@vger.kernel.org>,
"David E Box" <david.e.box@intel.com>,
"Hans de Goede" <hdegoede@redhat.com>,
"Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>,
platform-driver-x86@vger.kernel.org,
"Rafael J Wysocki" <rjw@rjwysocki.net>
Subject: Re: [PATCH v2] platform/x86:intel/pmc: Enable the ACPI PM Timer to be turned off when suspended
Date: Thu, 11 Jul 2024 08:34:44 -0700 [thread overview]
Message-ID: <0da168ef21485ee944ceedbc1b77f3141f741dfe.camel@linux.intel.com> (raw)
In-Reply-To: <CAE2upjS-hzciBNm+csXM+i-dnW1knBEyAwcGDya1WCezxD7M=Q@mail.gmail.com>
Hi Marek. Thanks for the patch.
On Wed, 2024-07-03 at 12:30 -0400, Rajneesh Bhardwaj wrote:
> On Wed, Jul 3, 2024 at 7:39 AM Marek Maslanka <mmaslanka@google.com> wrote:
> >
> > Allow to disable ACPI PM Timer on suspend and enable on resume. A
> > disabled timer helps optimise power consumption when the system is
> > suspended. On resume the timer is only reactivated if it was activated
> > prior to suspend, so unless the ACPI PM timer is enabled in the BIOS,
> > this won't change anything.
>
> Back in the days IIRC, it was frowned upon but I am not sure anymore.
> Maybe Rafael or David will have some opinion on this change. Is this
> something that could be done in a platform specific manner such as in
> coreboot?
I discussed with Rafael. This is generally a good idea, but need to ensure that
the ACPI PM Timer isn't being used as a clock source. This could mess with the
timekeeping system. Also, maybe a better idea is to disable it altogether at
probe time if it's not being used as a clock source. This should only be the
case when TSC is unstable and HPET is unavailable, but need to confirm.
David
>
> >
> > Signed-off-by: Marek Maslanka <mmaslanka@google.com>
> > ---
> > drivers/platform/x86/intel/pmc/adl.c | 2 ++
> > drivers/platform/x86/intel/pmc/cnp.c | 2 ++
> > drivers/platform/x86/intel/pmc/core.c | 37 +++++++++++++++++++++++++++
> > drivers/platform/x86/intel/pmc/core.h | 8 ++++++
> > drivers/platform/x86/intel/pmc/icl.c | 2 ++
> > drivers/platform/x86/intel/pmc/mtl.c | 2 ++
> > drivers/platform/x86/intel/pmc/spt.c | 2 ++
> > drivers/platform/x86/intel/pmc/tgl.c | 2 ++
> > 8 files changed, 57 insertions(+)
> >
> > diff --git a/drivers/platform/x86/intel/pmc/adl.c
> > b/drivers/platform/x86/intel/pmc/adl.c
> > index e7878558fd909..9d9c07f44ff61 100644
> > --- a/drivers/platform/x86/intel/pmc/adl.c
> > +++ b/drivers/platform/x86/intel/pmc/adl.c
> > @@ -295,6 +295,8 @@ 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,
> > diff --git a/drivers/platform/x86/intel/pmc/cnp.c
> > b/drivers/platform/x86/intel/pmc/cnp.c
> > index dd72974bf71e2..513c02670c5aa 100644
> > --- a/drivers/platform/x86/intel/pmc/cnp.c
> > +++ b/drivers/platform/x86/intel/pmc/cnp.c
> > @@ -200,6 +200,8 @@ 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,
> > };
> > diff --git a/drivers/platform/x86/intel/pmc/core.c
> > b/drivers/platform/x86/intel/pmc/core.c
> > index 10c96c1a850af..e97ac7a8a18bc 100644
> > --- a/drivers/platform/x86/intel/pmc/core.c
> > +++ b/drivers/platform/x86/intel/pmc/core.c
> > @@ -1171,6 +1171,35 @@ static bool pmc_core_is_pson_residency_enabled(struct
> > pmc_dev *pmcdev)
> > return val == 1;
> > }
> >
> > +/*
> > + * Enable or disable APCI PM Timer
> > + *
> > + * @return: Previous APCI PM Timer enabled state
> > + */
> > +static bool pmc_core_enable_apci_pm_timer(struct pmc_dev *pmcdev, bool
> > enable)
> > +{
> > + struct pmc *pmc = pmcdev->pmcs[PMC_IDX_MAIN];
> > + const struct pmc_reg_map *map = pmc->map;
> > + bool state;
> > + u32 reg;
> > +
> > + if (!map->acpi_pm_tmr_ctl_offset)
> > + return false;
> > +
> > + mutex_lock(&pmcdev->lock);
> > +
> > + reg = pmc_core_reg_read(pmc, map->acpi_pm_tmr_ctl_offset);
> > + state = !(reg & map->acpi_pm_tmr_disable_bit);
> > + if (enable)
> > + 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);
> > +
> > + mutex_unlock(&pmcdev->lock);
> > +
> > + return state;
> > +}
> >
> > static void pmc_core_dbgfs_unregister(struct pmc_dev *pmcdev)
> > {
> > @@ -1446,6 +1475,10 @@ static __maybe_unused int pmc_core_suspend(struct
> > device *dev)
> > if (pmcdev->suspend)
> > pmcdev->suspend(pmcdev);
> >
> > + /* Disable APCI PM Timer */
> > + pmcdev->enable_acpi_pm_timer_on_resume =
> > + pmc_core_enable_apci_pm_timer(pmcdev, false);
> > +
> > /* Check if the syspend will actually use S0ix */
> > if (pm_suspend_via_firmware())
> > return 0;
> > @@ -1500,6 +1533,10 @@ int pmc_core_resume_common(struct pmc_dev *pmcdev)
> > int offset = pmc->map->lpm_status_offset;
> > int i;
> >
> > + /* Enable APCI PM Timer */
> > + if (pmcdev->enable_acpi_pm_timer_on_resume)
> > + pmc_core_enable_apci_pm_timer(pmcdev, true);
> > +
> > /* Check if the syspend used S0ix */
> > if (pm_suspend_via_firmware())
> > return 0;
> > diff --git a/drivers/platform/x86/intel/pmc/core.h
> > b/drivers/platform/x86/intel/pmc/core.h
> > index 83504c49a0e31..fe1a94f693b63 100644
> > --- a/drivers/platform/x86/intel/pmc/core.h
> > +++ b/drivers/platform/x86/intel/pmc/core.h
> > @@ -67,6 +67,8 @@ 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,
> > @@ -147,6 +149,8 @@ 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
> > @@ -344,6 +348,8 @@ 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;
> > };
> >
> > /**
> > @@ -417,6 +423,8 @@ 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 {
> > diff --git a/drivers/platform/x86/intel/pmc/icl.c
> > b/drivers/platform/x86/intel/pmc/icl.c
> > index 71b0fd6cb7d84..cbbd440544688 100644
> > --- a/drivers/platform/x86/intel/pmc/icl.c
> > +++ b/drivers/platform/x86/intel/pmc/icl.c
> > @@ -46,6 +46,8 @@ 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,
> > };
> > diff --git a/drivers/platform/x86/intel/pmc/mtl.c
> > b/drivers/platform/x86/intel/pmc/mtl.c
> > index c7d15d864039d..91f2fa728f5c8 100644
> > --- a/drivers/platform/x86/intel/pmc/mtl.c
> > +++ b/drivers/platform/x86/intel/pmc/mtl.c
> > @@ -462,6 +462,8 @@ 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,
> > diff --git a/drivers/platform/x86/intel/pmc/spt.c
> > b/drivers/platform/x86/intel/pmc/spt.c
> > index ab993a69e33ee..2cd2b3c68e468 100644
> > --- a/drivers/platform/x86/intel/pmc/spt.c
> > +++ b/drivers/platform/x86/intel/pmc/spt.c
> > @@ -130,6 +130,8 @@ const struct pmc_reg_map spt_reg_map = {
> > .ppfear_buckets = SPT_PPFEAR_NUM_ENTRIES,
> > .pm_cfg_offset = SPT_PMC_PM_CFG_OFFSET,
> > .pm_read_disable_bit = SPT_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 = SPT_NUM_IP_IGN_ALLOWED,
> > .pm_vric1_offset = SPT_PMC_VRIC1_OFFSET,
> > };
> > diff --git a/drivers/platform/x86/intel/pmc/tgl.c
> > b/drivers/platform/x86/intel/pmc/tgl.c
> > index e0580de180773..371b4e30f1426 100644
> > --- a/drivers/platform/x86/intel/pmc/tgl.c
> > +++ b/drivers/platform/x86/intel/pmc/tgl.c
> > @@ -197,6 +197,8 @@ 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,
> > --
> > 2.45.2.803.g4e1b14247a-goog
> >
>
>
next prev parent reply other threads:[~2024-07-11 15:34 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-01 22:25 [PATCH] platform/x86:intel/pmc: Enable the ACPI PM Timer to be turned off when suspended Marek Maslanka
2024-07-02 8:02 ` Hans de Goede
2024-07-02 22:41 ` Marek Maślanka
2024-07-03 11:38 ` [PATCH v2] " Marek Maslanka
2024-07-03 16:30 ` Rajneesh Bhardwaj
2024-07-11 15:34 ` David E. Box [this message]
2024-07-15 12:39 ` Marek Maślanka
2024-07-30 12:05 ` [PATCH v3] " Marek Maslanka
2024-07-30 12:57 ` Ilpo Järvinen
2024-07-30 16:08 ` Thomas Gleixner
2024-07-31 14:44 ` Marek Maślanka
2024-07-31 16:33 ` Thomas Gleixner
2024-07-31 21:41 ` Marek Maślanka
2024-07-31 21:46 ` Thomas Gleixner
2024-08-06 7:24 ` Ilpo Järvinen
2024-08-09 13:13 ` [PATCH v4 1/2] clocksource: acpi_pm: Add external callback for suspend/resume Marek Maslanka
2024-08-09 13:13 ` [PATCH v4 2/2] platform/x86:intel/pmc: Enable the ACPI PM Timer to be turned off when suspended Marek Maslanka
2024-08-09 16:36 ` Thomas Gleixner
2024-08-12 4:40 ` [PATCH v5 " Marek Maslanka
2024-08-12 7:49 ` Ilpo Järvinen
2024-08-12 18:42 ` [PATCH v6 " Marek Maslanka
2024-08-19 11:31 ` Hans de Goede
2024-09-06 18:56 ` [tip: timers/core] " tip-bot2 for Marek Maslanka
2024-08-09 19:15 ` [PATCH v4 1/2] clocksource: acpi_pm: Add external callback for suspend/resume Thomas Gleixner
2024-08-12 4:37 ` [PATCH v5 " Marek Maslanka
2024-08-12 8:03 ` Hans de Goede
2024-08-12 18:41 ` [PATCH v6 " Marek Maslanka
2024-08-19 11:31 ` Hans de Goede
2024-08-19 11:35 ` Hans de Goede
2024-08-19 18:31 ` Daniel Lezcano
2024-09-06 18:56 ` [tip: timers/core] " tip-bot2 for Marek Maslanka
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=0da168ef21485ee944ceedbc1b77f3141f741dfe.camel@linux.intel.com \
--to=david.e.box@linux.intel.com \
--cc=david.e.box@intel.com \
--cc=hdegoede@redhat.com \
--cc=ilpo.jarvinen@linux.intel.com \
--cc=irenic.rajneesh@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mmaslanka@google.com \
--cc=platform-driver-x86@vger.kernel.org \
--cc=rjw@rjwysocki.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.