From: "Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>
To: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
Cc: Hans de Goede <hansg@kernel.org>,
platform-driver-x86@vger.kernel.org, mario.limonciello@amd.com,
Sanket.Goswami@amd.com
Subject: Re: [PATCH v4 6/7] platform/x86/amd/pmf: Introduce AMD PMF testing tool for driver metrics and features
Date: Tue, 19 May 2026 13:40:20 +0300 (EEST) [thread overview]
Message-ID: <6a14c3a2-1d61-7431-eab5-6bac57580c36@linux.intel.com> (raw)
In-Reply-To: <20260507144524.664001-7-Shyam-sundar.S-k@amd.com>
On Thu, 7 May 2026, Shyam Sundar S K wrote:
> This tool leverages amd-pmf ioctls exposed via the util layer, allowing
> validation of its newly integrated util layer and /dev/amdpmf_interface.
> It includes a user-space test application, test_amd_pmf, designed to
> interact with the PMF driver and retrieve relevant metrics for the
> testing and analysis.
>
> It provides definitions for test metrics, feature IDs, and device states,
> and includes tests for various AMD PMF metrics such as power source, skin
> temperature, battery state, and custom BIOS inputs/outputs. It also
> enables the testing of PMF metrics data and feature support reporting.
>
> Co-developed-by: Sanket Goswami <Sanket.Goswami@amd.com>
> Signed-off-by: Sanket Goswami <Sanket.Goswami@amd.com>
> Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
> ---
> tools/platform/x86/amd/Makefile | 60 +++++++++++++
> tools/platform/x86/amd/test-pmf.c | 142 ++++++++++++++++++++++++++++++
> 2 files changed, 202 insertions(+)
> create mode 100644 tools/platform/x86/amd/Makefile
> create mode 100644 tools/platform/x86/amd/test-pmf.c
>
> diff --git a/tools/platform/x86/amd/Makefile b/tools/platform/x86/amd/Makefile
> new file mode 100644
> index 000000000000..5d820df5871f
> --- /dev/null
> +++ b/tools/platform/x86/amd/Makefile
> @@ -0,0 +1,60 @@
> +# SPDX-License-Identifier: GPL-2.0
> +ifeq ($(srctree),)
> +srctree := $(patsubst %/,%,$(dir $(CURDIR)))
> +srctree := $(patsubst %/,%,$(dir $(srctree)))
> +srctree := $(patsubst %/,%,$(dir $(srctree)))
> +srctree := $(patsubst %/,%,$(dir $(srctree)))
> +endif
> +
> +# Include common tools build infrastructure
> +include $(srctree)/tools/scripts/Makefile.include
> +
> +CC = $(CROSS_COMPILE)gcc
> +BUILD_OUTPUT := $(CURDIR)
> +PREFIX ?= /usr
> +DESTDIR ?=
> +
> +ifeq ("$(origin O)", "command line")
> + BUILD_OUTPUT := $(O)
> +endif
> +
> +# Include paths: tools/include has linux/kernel.h with ARRAY_SIZE
> +INCLUDES = -I$(srctree)/tools/include
> +INCLUDES += -I$(srctree)/tools/include/uapi
> +INCLUDES += -I$(srctree)/include/uapi
> +INCLUDES += -I$(srctree)/include
> +
> +override CFLAGS += -O2 -Wall -Wextra -D_GNU_SOURCE $(INCLUDES)
> +override CFLAGS += -D_FILE_OFFSET_BITS=64
> +override CFLAGS += -D__EXPORTED_HEADERS__
> +
> +TARGETS = test_amd_pmf
> +
> +all: $(TARGETS)
> +
> +test_amd_pmf: test-pmf.c
> + $(QUIET_CC)$(CC) $(CFLAGS) $< -o $(BUILD_OUTPUT)/$@ $(LDFLAGS)
> +
> +.PHONY: clean
> +clean:
> + $(call QUIET_CLEAN, test_amd_pmf)$(RM) $(BUILD_OUTPUT)/test_amd_pmf
> +
> +.PHONY: install
> +install: $(TARGETS)
> + $(INSTALL) -d $(DESTDIR)$(PREFIX)/bin
> + $(INSTALL) $(BUILD_OUTPUT)/test_amd_pmf $(DESTDIR)$(PREFIX)/bin/test_amd_pmf
> +
> +.PHONY: help
> +help:
> + @echo "AMD Platform Tools Makefile"
> + @echo ""
> + @echo "Targets:"
> + @echo " all - Build all tools (default)"
> + @echo " test_amd_pmf - Build the PMF test tool"
> + @echo " clean - Remove built files"
> + @echo " install - Install tools to $(PREFIX)/bin"
> + @echo ""
> + @echo "Variables:"
> + @echo " O=<dir> - Build output directory"
> + @echo " PREFIX - Installation prefix (default: /usr)"
> + @echo " DESTDIR - Destination directory for install"
> diff --git a/tools/platform/x86/amd/test-pmf.c b/tools/platform/x86/amd/test-pmf.c
> new file mode 100644
> index 000000000000..a57f5c0e2565
> --- /dev/null
> +++ b/tools/platform/x86/amd/test-pmf.c
> @@ -0,0 +1,142 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * AMD Platform Management Framework Test Tool
> + *
> + * Copyright (c) 2026, Advanced Micro Devices, Inc.
> + * All Rights Reserved.
> + *
> + * Authors: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
> + * Sanket Goswami <Sanket.Goswami@amd.com>
> + */
> +
> +#include <errno.h>
> +#include <fcntl.h>
> +#include <inttypes.h>
> +#include <stdbool.h>
> +#include <stdint.h>
> +#include <stdio.h>
> +#include <string.h>
> +#include <sys/ioctl.h>
> +#include <unistd.h>
Add an empty like here.
> +#include <linux/amd-pmf.h>
> +#include <linux/kernel.h>
> +
> +#define DEVICE_NODE "/dev/amdpmf_interface"
> +
> +/* Feature flag names */
> +static const char * const feature_names[] = {
> + "Auto Mode",
> + "Static Power Slider",
> + "Policy Builder (Smart PC)",
> + "Dynamic Power Slider AC",
> + "Dynamic Power Slider DC",
> +};
> +
> +/* Print feature flags */
> +static void pmf_print_features(uint32_t flags)
> +{
> + int i;
> +
> + for (i = 0; i < (int)ARRAY_SIZE(feature_names); i++) {
Why can't this be done without cast?
> + if (flags & (1U << i))
> + printf(" [x] %s\n", feature_names[i]);
> + else
> + printf(" [ ] %s\n", feature_names[i]);
I suggest using elvis operator for " "/"x" variation.
> + }
> +}
> +
> +/* Print BIOS parameters */
> +static void pmf_print_bios_params(const char *type, const __u32 *params)
> +{
> + int i;
> +
> + for (i = 0; i < AMD_PMF_BIOS_PARAMS_MAX; i++)
> + printf(" Custom BIOS %s%d: %u\n", type, i + 1, params[i]);
> +}
> +
> +/* Open the PMF device */
> +static int pmf_open_device(void)
> +{
> + int fd;
> +
> + fd = open(DEVICE_NODE, O_RDONLY);
> + if (fd < 0)
> + fprintf(stderr, "Error: Cannot open %s: %s\n", DEVICE_NODE, strerror(errno));
> +
> + return fd;
> +}
> +
> +/* Query PMF info using the single IOCTL */
> +static int pmf_get_info(int fd, struct amd_pmf_info *info)
> +{
> + int ret;
> +
> + /* Zero-initialize and set size for versioning */
> + memset(info, 0, sizeof(*info));
> + info->size = sizeof(*info);
> +
> + ret = ioctl(fd, IOCTL_AMD_PMF_POPULATE_DATA, info);
> + if (ret < 0) {
> + fprintf(stderr, "Error: IOCTL_AMD_PMF_POPULATE_DATA failed: %s\n", strerror(errno));
> + return ret;
> + }
> +
> + return 0;
> +}
> +
> +static void pmf_print_info(const struct amd_pmf_info *info)
> +{
> + printf("=================================================\n");
> + printf(" AMD PMF Metrics info and Feature Status\n");
> + printf("=================================================\n\n");
I suppose you could make this banner a const char * and call printf() only
once for it (it can be nicely formatted to multiple lines by splitting
"" per line).
> +
> + /* Feature status */
> + printf("Feature Status:\n");
> + pmf_print_features(info->features_supported);
> +
> + /* Device states */
> + printf("\nDevice States:\n");
> + printf(" Platform Type: %s\n", amd_pmf_get_pt(info->platform_type));
> + printf(" Laptop Placement: %s\n", amd_pmf_get_lp(info->laptop_placement));
> + printf(" Lid State: %s\n", info->lid_state ? "Closed" : "Open");
> + printf(" User Presence: %s\n", info->user_presence ? "Present" : "Away");
> + printf(" Slider Position: %s\n", amd_pmf_get_sp(info->slider_position));
> +
> + /* Thermal and power metrics */
> + printf("\nThermal/Power Metrics:\n");
> + printf(" Skin Temperature: %d\n", info->skin_temp / 100);
> + printf(" GFX Busy: %u\n", info->gfx_busy);
> + printf(" Ambient Light: %d\n", info->ambient_light);
> + printf(" Avg C0 Residency: %u\n", info->avg_c0_residency);
> + printf(" Max C0 Residency: %u\n", info->max_c0_residency);
> + printf(" Socket Power: %u\n", info->socket_power);
> +
> + /* BIOS parameters */
> + printf("\nCustom BIOS Input Parameters:\n");
> + pmf_print_bios_params("Input", info->bios_input);
> + printf("\nCustom BIOS Output Parameters:\n");
> + pmf_print_bios_params("Output", info->bios_output);
> +
> + printf("\n=================================================\n");
> +}
> +
> +int main(void)
> +{
> + struct amd_pmf_info info;
> + int fd, ret;
> +
> + fd = pmf_open_device();
> + if (fd < 0)
> + return -1;
> +
> + /* Query all info with single IOCTL */
> + ret = pmf_get_info(fd, &info);
> + close(fd);
> +
> + if (ret < 0)
> + return -1;
> +
> + pmf_print_info(&info);
> +
> + return 0;
> +}
>
--
i.
next prev parent reply other threads:[~2026-05-19 10:40 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-07 14:45 [PATCH v4 0/7] platform/x86/amd/pmf: Introduce PMF util layer with userspace interface Shyam Sundar S K
2026-05-07 14:45 ` [PATCH v4 1/7] platform/x86/amd/pmf: Add util layer and userspace character device interface Shyam Sundar S K
2026-05-19 10:27 ` Ilpo Järvinen
2026-05-07 14:45 ` [PATCH v4 2/7] platform/x86/amd/pmf: store BIOS output values for user-space metrics via util IOCTL Shyam Sundar S K
2026-05-07 14:45 ` [PATCH v4 3/7] platform/x86/amd/pmf: Add feature discovery support to util interface Shyam Sundar S K
2026-05-19 10:31 ` Ilpo Järvinen
2026-05-07 14:45 ` [PATCH v4 4/7] platform/x86/amd/pmf: Store commonly used enums in the header file Shyam Sundar S K
2026-05-19 10:33 ` Ilpo Järvinen
2026-05-07 14:45 ` [PATCH v4 5/7] platform/x86/amd/pmf: Move debug helper functions to UAPI header Shyam Sundar S K
2026-05-07 14:45 ` [PATCH v4 6/7] platform/x86/amd/pmf: Introduce AMD PMF testing tool for driver metrics and features Shyam Sundar S K
2026-05-19 10:40 ` Ilpo Järvinen [this message]
2026-05-20 18:54 ` Shyam Sundar S K
2026-05-07 14:45 ` [PATCH v4 7/7] Documentation/ABI: add testing entry for AMD PMF character device interface Shyam Sundar S K
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=6a14c3a2-1d61-7431-eab5-6bac57580c36@linux.intel.com \
--to=ilpo.jarvinen@linux.intel.com \
--cc=Sanket.Goswami@amd.com \
--cc=Shyam-sundar.S-k@amd.com \
--cc=hansg@kernel.org \
--cc=mario.limonciello@amd.com \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).