From: Hans de Goede <hdegoede@redhat.com>
To: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>, markgross@kernel.org
Cc: platform-driver-x86@vger.kernel.org, Patil.Reddy@amd.com
Subject: Re: [PATCH v3 07/11] platform/x86/amd/pmf: Get performance metrics from PMFW
Date: Tue, 2 Aug 2022 15:12:43 +0200 [thread overview]
Message-ID: <0c6c70fc-4299-d498-80d1-210804272a59@redhat.com> (raw)
In-Reply-To: <20220802112545.2118632-8-Shyam-sundar.S-k@amd.com>
Hi,
On 8/2/22 13:25, Shyam Sundar S K wrote:
> PMF driver polls for metrics information from PMFW to understand the system
> behavior, power consumption etc.
>
> This metrics table information will be used the PMF features to tweak the
> thermal heuristics. The poll duration can also be changed by the user
> by changing the poll duration time.
>
> Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
Thanks, patch looks good to me:
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Regards,
Hans
> ---
> drivers/platform/x86/amd/pmf/core.c | 52 +++++++++++++++++++++++++++++
> drivers/platform/x86/amd/pmf/pmf.h | 39 ++++++++++++++++++++++
> 2 files changed, 91 insertions(+)
>
> diff --git a/drivers/platform/x86/amd/pmf/core.c b/drivers/platform/x86/amd/pmf/core.c
> index 87a1f9b27d2c..762f769bf7ee 100644
> --- a/drivers/platform/x86/amd/pmf/core.c
> +++ b/drivers/platform/x86/amd/pmf/core.c
> @@ -47,6 +47,11 @@
> #define DELAY_MIN_US 2000
> #define DELAY_MAX_US 3000
>
> +/* override Metrics Table sample size time (in ms) */
> +static int metrics_table_loop_ms = 1000;
> +module_param(metrics_table_loop_ms, int, 0644);
> +MODULE_PARM_DESC(metrics_table_loop_ms, " Metrics Table sample size time (default = 1000ms) ");
> +
> static int current_power_limits_show(struct seq_file *seq, void *unused)
> {
> struct amd_pmf_dev *dev = seq->private;
> @@ -88,6 +93,25 @@ int amd_pmf_get_power_source(void)
> return POWER_SOURCE_DC;
> }
>
> +static void amd_pmf_get_metrics(struct work_struct *work)
> +{
> + struct amd_pmf_dev *dev = container_of(work, struct amd_pmf_dev, work_buffer.work);
> + ktime_t time_elapsed_ms;
> + int socket_power;
> +
> + /* Transfer table contents */
> + memset(dev->buf, 0, sizeof(dev->m_table));
> + amd_pmf_send_cmd(dev, SET_TRANSFER_TABLE, 0, 7, NULL);
> + memcpy(&dev->m_table, dev->buf, sizeof(dev->m_table));
> +
> + time_elapsed_ms = ktime_to_ms(ktime_get()) - dev->start_time;
> + /* Calculate the avg SoC power consumption */
> + socket_power = dev->m_table.apu_power + dev->m_table.dgpu_power;
> +
> + dev->start_time = ktime_to_ms(ktime_get());
> + schedule_delayed_work(&dev->work_buffer, msecs_to_jiffies(metrics_table_loop_ms));
> +}
> +
> static inline u32 amd_pmf_reg_read(struct amd_pmf_dev *dev, int reg_offset)
> {
> return ioread32(dev->regbase + reg_offset);
> @@ -181,6 +205,34 @@ static const struct pci_device_id pmf_pci_ids[] = {
> { }
> };
>
> +int amd_pmf_init_metrics_table(struct amd_pmf_dev *dev)
> +{
> + u64 phys_addr;
> + u32 hi, low;
> +
> + INIT_DELAYED_WORK(&dev->work_buffer, amd_pmf_get_metrics);
> +
> + /* Get Metrics Table Address */
> + dev->buf = kzalloc(sizeof(dev->m_table), GFP_KERNEL);
> + if (!dev->buf)
> + return -ENOMEM;
> +
> + phys_addr = virt_to_phys(dev->buf);
> + hi = phys_addr >> 32;
> + low = phys_addr & GENMASK(31, 0);
> +
> + amd_pmf_send_cmd(dev, SET_DRAM_ADDR_HIGH, 0, hi, NULL);
> + amd_pmf_send_cmd(dev, SET_DRAM_ADDR_LOW, 0, low, NULL);
> +
> + /*
> + * Start collecting the metrics data after a small delay
> + * or else, we might end up getting stale values from PMFW.
> + */
> + schedule_delayed_work(&dev->work_buffer, msecs_to_jiffies(metrics_table_loop_ms * 3));
> +
> + return 0;
> +}
> +
> static void amd_pmf_init_features(struct amd_pmf_dev *dev)
> {
> /* Enable Static Slider */
> diff --git a/drivers/platform/x86/amd/pmf/pmf.h b/drivers/platform/x86/amd/pmf/pmf.h
> index d40613a30ed7..42e4a5f512c0 100644
> --- a/drivers/platform/x86/amd/pmf/pmf.h
> +++ b/drivers/platform/x86/amd/pmf/pmf.h
> @@ -67,6 +67,41 @@ struct apmf_fan_idx {
> u32 fan_ctl_idx;
> } __packed;
>
> +struct smu_pmf_metrics {
> + u16 gfxclk_freq; /* in MHz */
> + u16 socclk_freq; /* in MHz */
> + u16 vclk_freq; /* in MHz */
> + u16 dclk_freq; /* in MHz */
> + u16 memclk_freq; /* in MHz */
> + u16 spare;
> + u16 gfx_activity; /* in Centi */
> + u16 uvd_activity; /* in Centi */
> + u16 voltage[2]; /* in mV */
> + u16 currents[2]; /* in mA */
> + u16 power[2];/* in mW */
> + u16 core_freq[8]; /* in MHz */
> + u16 core_power[8]; /* in mW */
> + u16 core_temp[8]; /* in centi-Celsius */
> + u16 l3_freq; /* in MHz */
> + u16 l3_temp; /* in centi-Celsius */
> + u16 gfx_temp; /* in centi-Celsius */
> + u16 soc_temp; /* in centi-Celsius */
> + u16 throttler_status;
> + u16 current_socketpower; /* in mW */
> + u16 stapm_orig_limit; /* in W */
> + u16 stapm_cur_limit; /* in W */
> + u32 apu_power; /* in mW */
> + u32 dgpu_power; /* in mW */
> + u16 vdd_tdc_val; /* in mA */
> + u16 soc_tdc_val; /* in mA */
> + u16 vdd_edc_val; /* in mA */
> + u16 soc_edcv_al; /* in mA */
> + u16 infra_cpu_maxfreq; /* in MHz */
> + u16 infra_gfx_maxfreq; /* in MHz */
> + u16 skin_temp; /* in centi-Celsius */
> + u16 device_state;
> +} __packed;
> +
> enum amd_stt_skin_temp {
> STT_TEMP_APU,
> STT_TEMP_HS2,
> @@ -105,6 +140,9 @@ struct amd_pmf_dev {
> struct dentry *dbgfs_dir;
> int hb_interval; /* SBIOS heartbeat interval */
> struct delayed_work heart_beat;
> + struct smu_pmf_metrics m_table;
> + struct delayed_work work_buffer;
> + ktime_t start_time;
> };
>
> struct apmf_sps_prop_granular {
> @@ -138,6 +176,7 @@ int apmf_acpi_init(struct amd_pmf_dev *pmf_dev);
> void apmf_acpi_deinit(struct amd_pmf_dev *pmf_dev);
> int is_apmf_func_supported(struct amd_pmf_dev *pdev, unsigned long index);
> int amd_pmf_send_cmd(struct amd_pmf_dev *dev, u8 message, bool get, u32 arg, u32 *data);
> +int amd_pmf_init_metrics_table(struct amd_pmf_dev *dev);
> int amd_pmf_get_power_source(void);
>
> /* SPS Layer */
next prev parent reply other threads:[~2022-08-02 13:12 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-02 11:25 [PATCH v3 00/11] platform/x86/amd/pmf: Introduce AMD PMF Driver Shyam Sundar S K
2022-08-02 11:25 ` [PATCH v3 01/11] platform/x86/amd/pmf: Add support for PMF core layer Shyam Sundar S K
2022-08-02 11:25 ` [PATCH v3 02/11] platform/x86/amd/pmf: Add support for PMF APCI layer Shyam Sundar S K
2022-08-02 12:44 ` Hans de Goede
2022-08-02 12:55 ` Hans de Goede
2022-08-02 11:25 ` [PATCH v3 03/11] platform/x86/amd/pmf: Add support SPS PMF feature Shyam Sundar S K
2022-08-02 12:45 ` Hans de Goede
2022-08-02 11:25 ` [PATCH v3 04/11] platform/x86/amd/pmf: Add debugfs information Shyam Sundar S K
2022-08-02 11:25 ` [PATCH v3 05/11] platform/x86/amd/pmf: Add heartbeat signal support Shyam Sundar S K
2022-08-02 12:52 ` Hans de Goede
2022-08-02 12:57 ` Hans de Goede
2022-08-02 14:23 ` Shyam Sundar S K
2022-08-02 11:25 ` [PATCH v3 06/11] platform/x86/amd/pmf: Add fan control support Shyam Sundar S K
2022-08-02 11:25 ` [PATCH v3 07/11] platform/x86/amd/pmf: Get performance metrics from PMFW Shyam Sundar S K
2022-08-02 13:12 ` Hans de Goede [this message]
2022-08-02 11:25 ` [PATCH v3 08/11] platform/x86/amd/pmf: Add support for Auto mode feature Shyam Sundar S K
2022-08-02 13:18 ` Hans de Goede
2022-08-02 13:20 ` Hans de Goede
2022-08-02 11:25 ` [PATCH v3 09/11] platform/x86/amd/pmf: Handle AMT and CQL events for Auto mode Shyam Sundar S K
2022-08-02 13:24 ` Hans de Goede
2022-08-02 13:27 ` Hans de Goede
2022-08-02 11:25 ` [PATCH v3 10/11] platform/x86/amd/pmf: Force load driver on older supported platforms Shyam Sundar S K
2022-08-02 11:25 ` [PATCH v3 11/11] MAINTAINERS: Add AMD PMF driver entry Shyam Sundar S K
2022-08-02 13:25 ` [PATCH v3 00/11] platform/x86/amd/pmf: Introduce AMD PMF Driver Hans de Goede
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=0c6c70fc-4299-d498-80d1-210804272a59@redhat.com \
--to=hdegoede@redhat.com \
--cc=Patil.Reddy@amd.com \
--cc=Shyam-sundar.S-k@amd.com \
--cc=markgross@kernel.org \
--cc=platform-driver-x86@vger.kernel.org \
/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.