blob: 24cf9926dc5901a46293569c9dd33de4f7a9148d [file]
/* SPDX-License-Identifier: GPL-2.0-or-later WITH Linux-syscall-note */
/*
* AMD Platform Management Framework (PMF) UAPI Header
*
* Copyright (c) 2026, Advanced Micro Devices, Inc.
* All Rights Reserved.
*
* This file defines the user-space API for interacting with the AMD PMF
* driver. It provides ioctl interfaces to query platform-specific metrics
* such as power source, slider position, platform type, laptop placement,
* and various BIOS input/output parameters.
*/
#ifndef _UAPI_LINUX_AMD_PMF_H
#define _UAPI_LINUX_AMD_PMF_H
#include <linux/bits.h>
#include <linux/ioctl.h>
#include <linux/types.h>
/**
* AMD_PMF_IOC_MAGIC - Magic number for AMD PMF ioctl commands
*
* This magic number uniquely identifies AMD PMF ioctl operations.
*/
#define AMD_PMF_IOC_MAGIC 'p'
/**
* IOCTL_AMD_PMF_POPULATE_DATA - ioctl command to retrieve PMF metrics data
*
* This ioctl command is used to populate the amd_pmf_info structure
* with the requested PMF metrics information.
*/
#define IOCTL_AMD_PMF_POPULATE_DATA _IOWR(AMD_PMF_IOC_MAGIC, 0x00, __u64)
#define AMD_PMF_BIOS_PARAMS_MAX 10
/* AMD PMF feature flags - bitmask indicating supported features */
#define AMD_PMF_FEAT_AUTO_MODE BIT(0)
#define AMD_PMF_FEAT_STATIC_POWER_SLIDER BIT(1)
#define AMD_PMF_FEAT_POLICY_BUILDER BIT(2)
#define AMD_PMF_FEAT_DYNAMIC_POWER_SLIDER_AC BIT(3)
#define AMD_PMF_FEAT_DYNAMIC_POWER_SLIDER_DC BIT(4)
/**
* enum amd_pmf_laptop_placement - Describes the physical placement of the laptop
* @AMD_PMF_LP_UNKNOWN: Placement cannot be determined
* @AMD_PMF_ON_TABLE: Laptop is placed on a stable surface like a table or desk
* @AMD_PMF_ON_LAP_MOTION: Laptop is on a lap with detected motion
* @AMD_PMF_IN_BAG: Laptop is detected to be inside a bag or case
* @AMD_PMF_OUT_OF_BAG: Laptop has been removed from bag or case
* @AMD_PMF_LP_UNDEFINED: Placement state is undefined
*
* This enumeration represents the physical placement state of the laptop
* as detected by platform sensors. Used for adaptive power management
* and thermal policies.
*/
enum amd_pmf_laptop_placement {
AMD_PMF_LP_UNKNOWN,
AMD_PMF_ON_TABLE,
AMD_PMF_ON_LAP_MOTION,
AMD_PMF_IN_BAG,
AMD_PMF_OUT_OF_BAG,
AMD_PMF_LP_UNDEFINED,
};
/**
* enum amd_pmf_ta_slider - Trusted Application power slider positions
* @AMD_PMF_TA_BEST_BATTERY: Maximum battery savings, minimal performance
* @AMD_PMF_TA_BETTER_BATTERY: Balanced towards battery life
* @AMD_PMF_TA_BETTER_PERFORMANCE: Balanced towards performance
* @AMD_PMF_TA_BEST_PERFORMANCE: Maximum performance, higher power consumption
* @AMD_PMF_TA_MAX: Sentinel value indicating maximum enum value
*
* This enumeration defines the power slider positions used by the
* AMD PMF Trusted Application for dynamic power management decisions.
* These correspond to the Windows power slider UI positions.
*/
enum amd_pmf_ta_slider {
AMD_PMF_TA_BEST_BATTERY,
AMD_PMF_TA_BETTER_BATTERY,
AMD_PMF_TA_BETTER_PERFORMANCE,
AMD_PMF_TA_BEST_PERFORMANCE,
AMD_PMF_TA_MAX,
};
/**
* enum amd_pmf_platform_type - Describes the physical form factor orientation
* @AMD_PMF_PTYPE_UNKNOWN: Platform type cannot be determined
* @AMD_PMF_LID_CLOSE: Laptop lid is closed
* @AMD_PMF_CLAMSHELL: Traditional laptop mode with keyboard and screen
* @AMD_PMF_FLAT: Device is lying flat on a surface
* @AMD_PMF_TENT: Device is in tent mode (keyboard folded back, standing)
* @AMD_PMF_STAND: Device is propped up in stand orientation
* @AMD_PMF_TABLET: Device is in tablet mode with keyboard hidden
* @AMD_PMF_BOOK: Device is in book reading orientation
* @AMD_PMF_PRESENTATION: Device is in presentation mode
* @AMD_PMF_PULL_FWD: Screen is pulled forward towards user
* @AMD_PMF_PTYPE_INVALID: Invalid platform type marker
*
* This enumeration describes the current physical orientation or form
* factor of convertible/2-in-1 devices. Used for optimizing power and
* thermal management based on device posture.
*/
enum amd_pmf_platform_type {
AMD_PMF_PTYPE_UNKNOWN,
AMD_PMF_LID_CLOSE,
AMD_PMF_CLAMSHELL,
AMD_PMF_FLAT,
AMD_PMF_TENT,
AMD_PMF_STAND,
AMD_PMF_TABLET,
AMD_PMF_BOOK,
AMD_PMF_PRESENTATION,
AMD_PMF_PULL_FWD,
AMD_PMF_PTYPE_INVALID = 0xf,
};
static inline const char *amd_pmf_get_platform_type(unsigned int platform_type)
{
switch (platform_type) {
case AMD_PMF_CLAMSHELL:
return "CLAMSHELL";
case AMD_PMF_LID_CLOSE:
return "LID_CLOSE";
case AMD_PMF_FLAT:
return "FLAT";
case AMD_PMF_TENT:
return "TENT";
case AMD_PMF_STAND:
return "STAND";
case AMD_PMF_TABLET:
return "TABLET";
case AMD_PMF_BOOK:
return "BOOK";
case AMD_PMF_PRESENTATION:
return "PRESENTATION";
case AMD_PMF_PULL_FWD:
return "PULL_FWD";
default:
return "UNKNOWN";
}
}
static inline const char *amd_pmf_get_laptop_placement(unsigned int device_state)
{
switch (device_state) {
case AMD_PMF_ON_TABLE:
return "ON_TABLE";
case AMD_PMF_ON_LAP_MOTION:
return "ON_LAP_MOTION";
case AMD_PMF_IN_BAG:
return "IN_BAG";
case AMD_PMF_OUT_OF_BAG:
return "OUT_OF_BAG";
default:
return "UNKNOWN";
}
}
static inline const char *amd_pmf_get_slider_position(unsigned int state)
{
switch (state) {
case AMD_PMF_TA_BEST_PERFORMANCE:
return "PERFORMANCE";
case AMD_PMF_TA_BETTER_PERFORMANCE:
return "BALANCED";
case AMD_PMF_TA_BEST_BATTERY:
return "POWER_SAVER";
case AMD_PMF_TA_BETTER_BATTERY:
return "BALANCED_BATTERY";
default:
return "Unknown TA Slider State";
}
}
struct amd_pmf_info {
__u64 size;
/* Feature info */
__u32 features_supported;
/* Power and state info */
__u32 platform_type;
__u32 power_source;
__u32 laptop_placement;
__u32 lid_state;
__u32 user_presence;
__u32 slider_position;
/* Thermal and power metrics */
__s32 skin_temp;
__u32 gfx_busy;
__s32 ambient_light;
__u32 avg_c0_residency;
__u32 max_c0_residency;
__u32 socket_power;
/* BIOS parameters */
__u32 bios_input[AMD_PMF_BIOS_PARAMS_MAX];
__u32 bios_output[AMD_PMF_BIOS_PARAMS_MAX];
};
#endif /* _UAPI_LINUX_AMD_PMF_H */