History

platform/x86/amd/pmf: store BIOS output values for user-space metrics via util IOCTL

Add a bios_output[] to amd_pmf_dev struct and store the latest values for BIOS output policies when applying PMF policies. This enables the AMD PMF util layer to expose these BIOS outputs alongside selected thermal and power metrics to user space via /dev/amdpmf_interface and a new IOCTL, supporting real-time monitoring tools such as SystemDeck.

Shyam Sundar S K committed 5 months ago

Commit 1983d7d1 parent 98432ee3 files · +14 −2Browse files

Unified · Split

3 files
  1. drivers/platform/x86/amd/pmf/pmf.h +2 −0
  2. drivers/platform/x86/amd/pmf/tee-if.c +11 −2
  3. include/uapi/linux/amd-pmf.h +1 −0
drivers/platform/x86/amd/pmf/pmf.h+2−0
@@ -130,6 +130,7 @@ struct cookie_header { · 129 unmodified lines
130#define GET_CMD true130#define GET_CMD true
131 131
132#define METRICS_TABLE_ID 7132#define METRICS_TABLE_ID 7
133#define BIOS_OUTPUT_MAX 10
133 134
134typedef void (*apmf_event_handler_t)(acpi_handle handle, u32 event, void *data);135typedef void (*apmf_event_handler_t)(acpi_handle handle, u32 event, void *data);
135 136
@@ -442,6 +443,7 @@ struct amd_pmf_dev { · 306 unmodified lines
442 struct pmf_cbi_ring_buffer cbi_buf;443 struct pmf_cbi_ring_buffer cbi_buf;
443 struct mutex cbi_mutex; /* Protects ring buffer access */444 struct mutex cbi_mutex; /* Protects ring buffer access */
444 struct mutex metrics_mutex;445 struct mutex metrics_mutex;
446 u32 bios_output[BIOS_OUTPUT_MAX];
445};447};
446 448
447struct apmf_sps_prop_granular_v2 {449struct apmf_sps_prop_granular_v2 {
drivers/platform/x86/amd/pmf/tee-if.c+11−2
@@ -8,7 +8,9 @@ · 7 unmodified lines
8 * Author: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>8 * Author: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
9 */9 */
10 10
11#include <linux/array_size.h>
11#include <linux/debugfs.h>12#include <linux/debugfs.h>
13#include <linux/dev_printk.h>
12#include <linux/tee_drv.h>14#include <linux/tee_drv.h>
13#include <linux/uuid.h>15#include <linux/uuid.h>
14#include "pmf.h"16#include "pmf.h"
@@ -97,11 +99,18 @@ static int amd_pmf_get_bios_output_idx(u32 action_idx) · 82 unmodified lines
97 99
98static void amd_pmf_update_bios_output(struct amd_pmf_dev *pdev, struct ta_pmf_action *action)100static void amd_pmf_update_bios_output(struct amd_pmf_dev *pdev, struct ta_pmf_action *action)
99{101{
100 u32 bios_idx;102 int bios_idx;
103 int ret;
101 104
102 bios_idx = amd_pmf_get_bios_output_idx(action->action_index);105 bios_idx = amd_pmf_get_bios_output_idx(action->action_index);
106 if (bios_idx < 0 || bios_idx >= ARRAY_SIZE(pdev->bios_output)) {
107 dev_warn(pdev->dev, "BIOS output index %d out of bounds\n", bios_idx);
108 return;
109 }
103 110
104 amd_pmf_smartpc_apply_bios_output(pdev, action->value, BIT(bios_idx), bios_idx);111 ret = amd_pmf_smartpc_apply_bios_output(pdev, action->value, BIT(bios_idx), bios_idx);
112 if (!ret)
113 pdev->bios_output[bios_idx] = action->value;
105}114}
106 115
107static void amd_pmf_apply_policies(struct amd_pmf_dev *dev, struct ta_pmf_enact_result *out)116static void amd_pmf_apply_policies(struct amd_pmf_dev *dev, struct ta_pmf_enact_result *out)
include/uapi/linux/amd-pmf.h+1−0
@@ -66,6 +66,7 @@ struct amd_pmf_info { · 65 unmodified lines
66 66
67 /* BIOS parameters */67 /* BIOS parameters */
68 __u32 bios_input[AMD_PMF_BIOS_PARAMS_MAX];68 __u32 bios_input[AMD_PMF_BIOS_PARAMS_MAX];
69 __u32 bios_output[AMD_PMF_BIOS_PARAMS_MAX];
69};70};
70 71
71#endif /* _UAPI_LINUX_AMD_PMF_H */72#endif /* _UAPI_LINUX_AMD_PMF_H */