platform-driver-x86.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
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.


  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).