Hi all:
AMD P-State unit test(amd-pstate-ut) is a kernel module for testing
the functions of amd-pstate driver.
It could import as a module to launch some test tasks.
1) It can help all users to verify their processor support (SBIOS/
Firmware or Hardware).
2) Kernel can have a basic function test to avoid the kernel regression
during the update.
3) We can introduce more functional or performance tests to align the
together, it will benefit power and performance scale optimization.
We upstream out AMD P-state driver into Linux kernel and use this unit
test module to verify the required conditions and basic functions of
amd-pstate before integration test.
We use test module in the kselftest frameworks to implement it.
We create amd-pstate-ut module and tie it into kselftest.
For example: The test case aput_acpi_cpc is used to check whether the
_CPC object is exist in SBIOS.
The amd-pstate initialization will fail if the _CPC in ACPI SBIOS is not
existed at the detected processor, so it is a necessary condition.
At present, it only implements the basic framework and some simple test
cases.
TODO : 1) we will add more test cases to improve the depth and coverage of
the test. E.X. use the script to trigger the tbench, gitsource, kernbench,
netperf, speedometer, and etc. testing and monitor the cpu frequency and
performance goals change, power consumption at runtime.
Please check the documentation amd-pstate.rst for details of the test steps.
See patch series in below git repo:
V1: https://lore.kernel.org/linux-pm/[email protected]/
V2: https://lore.kernel.org/lkml/[email protected]/
V3: https://lore.kernel.org/lkml/[email protected]/
V4: https://lore.kernel.org/lkml/[email protected]/
V5: https://lore.kernel.org/lkml/[email protected]/
V6: https://lore.kernel.org/lkml/[email protected]/
V7: https://lore.kernel.org/lkml/[email protected]/
Changes from V1 -> V2:
- cpufreq: amd-pstate:
- - add a trailing of amd-pstate.h to MAINTAINER AMD PSTATE DRIVER.
- selftests: cpufreq:
- - add a wrapper shell script for the amd_pstate_testmod module.
- selftests: cpufreq:
- - remove amd_pstate_testmod kernel module to
.../cpufreq/amd_pstate_testmod.
- Documentation: amd-pstate:
- - amd_pstate_testmod rst document is not provided at present.
Changes from V2 -> V3:
- cpufreq: amd-pstate:
- - adjust the order of add amd-pstate.h in MAINTAINERS.
- selftests: cpufreq:
- - remove the call of amd_pstate_testmod.sh from cpufreq Makefile to
main.sh.
- selftests: cpufreq:
- - add explain the goal or intention of the AMD P-State Unit Test
module.
- - modify comments.
- - use the checkpatch.pl to check my patches.
- - add conditions judgment before formal test.
- - delete some unnecessary test cases.
- - modify test cases about perf and performance etc.
Changes from V3 -> V4:
- selftests: amd-pstate:
- - remove script and test module to tools/testing/selftests/amd-pstate/
- - uniformly named amd-pstate-ut.
- - check current architectures and cpufreq driver in amd-pstate-ut.sh
- - delete codes about conditions in amd-pstate-ut.c
- Documentation: amd-pstate:
- - add introduce document about amd-pstate unit test.
Changes from V4 -> V5:
- selftests: amd-pstate:
- - add print the current scaling_driver.
- - add amd-pstate-ut.ko into TEST_GEN_FILES.
- - move "insmod/rmmod amd-pstate-ut.ko" stuff into script amd_pstate_ut.sh
- - add a check of read back from X86_FEATURE_CPPC in get_shared_mem().
- Documentation: amd-pstate:
- - delete the test step about insmod/rmmod amd-pstate-ut.ko
Changes from V5 -> V6:
- cpufreq: amd-pstate:
- - add amd-pstate-ut test codes to drivers/cpurfreq
- - add the macro CONFIG_X86_AMD_PSTATE_UT
- selftests: amd-pstate:
- - delete amd-pstate-ut test codes from tools/testing/selftests/amd-pstate/
Changes from V6 -> V7:
- cpufreq: amd-pstate:
- - modify X86_AMD_PSTATE_UT dependencies and default value.
- - modify a brief description of the amd-pstate-ut module.
- - remove kselftest_module.h header include.
- - modify shortform for AMD P-State unit test.
- - add prefix for the names of test cases.
- - in the file operation log, add the file path.
- - add comments about the test cases.
- - correct syntax errors.
- selftests: amd-pstate:
- - delete TEST_GEN_FILES$(TEST_GEN_FILES): $(HEADERS) form amd-pstate Makefile.
- - simplify the judgment about ARCH.
- - add the judgment about cpu vendor.
- - modify the method about load the amd-pstate-ut module.
- Documentation: amd-pstate:
- - update the name of the test function.
- - update kernel log about test result.
Changes from V7 -> V8:
- cpufreq: amd-pstate:
- - amend commit message.
- - amend module description.
- Documentation: amd-pstate:
- - amend commit message.
- - Remove the personal data.
Thanks,
Jasmine
Meng Li (4):
cpufreq: amd-pstate: Expose struct amd_cpudata
cpufreq: amd-pstate: Add test module for amd-pstate driver
selftests: amd-pstate: Add test trigger for amd-pstate driver
Documentation: amd-pstate: Add unit test introduction
Documentation/admin-guide/pm/amd-pstate.rst | 76 +++++
MAINTAINERS | 1 +
drivers/cpufreq/Kconfig.x86 | 7 +
drivers/cpufreq/Makefile | 1 +
drivers/cpufreq/amd-pstate-ut.c | 293 ++++++++++++++++++
drivers/cpufreq/amd-pstate.c | 60 +---
include/linux/amd-pstate.h | 77 +++++
tools/testing/selftests/Makefile | 1 +
tools/testing/selftests/amd-pstate/Makefile | 9 +
.../selftests/amd-pstate/amd-pstate-ut.sh | 55 ++++
tools/testing/selftests/amd-pstate/config | 1 +
11 files changed, 522 insertions(+), 59 deletions(-)
create mode 100644 drivers/cpufreq/amd-pstate-ut.c
create mode 100644 include/linux/amd-pstate.h
create mode 100644 tools/testing/selftests/amd-pstate/Makefile
create mode 100755 tools/testing/selftests/amd-pstate/amd-pstate-ut.sh
create mode 100644 tools/testing/selftests/amd-pstate/config
--
2.25.1
Introduce the AMD P-State unit test module design and implementation.
It also talks about kselftest and how to use.
Signed-off-by: Meng Li <[email protected]>
Acked-by: Huang Rui <[email protected]>
Reviewed-by: Shuah Khan <[email protected]>
---
Documentation/admin-guide/pm/amd-pstate.rst | 76 +++++++++++++++++++++
1 file changed, 76 insertions(+)
diff --git a/Documentation/admin-guide/pm/amd-pstate.rst b/Documentation/admin-guide/pm/amd-pstate.rst
index 83b58eb4ab4d..8f3d30c5a0d8 100644
--- a/Documentation/admin-guide/pm/amd-pstate.rst
+++ b/Documentation/admin-guide/pm/amd-pstate.rst
@@ -182,6 +182,7 @@ to the ``struct sugov_cpu`` that the utilization update belongs to.
Then, ``amd-pstate`` updates the desired performance according to the CPU
scheduler assigned.
+.. _processor_support:
Processor Support
=======================
@@ -282,6 +283,8 @@ efficiency frequency management method on AMD processors.
Kernel Module Options for ``amd-pstate``
=========================================
+.. _shared_mem:
+
``shared_mem``
Use a module param (shared_mem) to enable related processors manually with
**amd_pstate.shared_mem=1**.
@@ -393,6 +396,76 @@ about part of the output. ::
CPU_005 712 116384 39 49 166 0.7565 9645075 2214891 38431470 25.1 11.646 469 2.496 kworker/5:0-40
CPU_006 712 116408 39 49 166 0.6769 8950227 1839034 37192089 24.06 11.272 470 2.496 kworker/6:0-1264
+Unit Tests for amd-pstate
+-------------------------
+
+``amd-pstate-ut`` is a test module for testing the ``amd-pstate`` driver.
+
+ * It can help all users to verify their processor support (SBIOS/Firmware or Hardware).
+
+ * Kernel can have a basic function test to avoid the kernel regression during the update.
+
+ * We can introduce more functional or performance tests to align the result together, it will benefit power and performance scale optimization.
+
+1. Test case decriptions
+
+ +---------+--------------------------------+------------------------------------------------------------------------------------+
+ | Index | Functions | Description |
+ +=========+================================+====================================================================================+
+ | 0 | amd_pstate_ut_acpi_cpc_valid || Check whether the _CPC object is present in SBIOS. |
+ | | || |
+ | | || The detail refer to `Processor Support <processor_support_>`_. |
+ +---------+--------------------------------+------------------------------------------------------------------------------------+
+ | 1 | amd_pstate_ut_check_enabled || Check whether AMD P-State is enabled. |
+ | | || |
+ | | || AMD P-States and ACPI hardware P-States always can be supported in one processor. |
+ | | | But AMD P-States has the higher priority and if it is enabled with |
+ | | | :c:macro:`MSR_AMD_CPPC_ENABLE` or ``cppc_set_enable``, it will respond to the |
+ | | | request from AMD P-States. |
+ +---------+--------------------------------+------------------------------------------------------------------------------------+
+ | 2 | amd_pstate_ut_check_perf || Check if the each performance values are reasonable. |
+ | | || highest_perf >= nominal_perf > lowest_nonlinear_perf > lowest_perf > 0. |
+ +---------+--------------------------------+------------------------------------------------------------------------------------+
+ | 3 | amd_pstate_ut_check_freq || Check if the each frequency values and max freq when set support boost mode |
+ | | | are reasonable. |
+ | | || max_freq >= nominal_freq > lowest_nonlinear_freq > min_freq > 0 |
+ | | || If boost is not active but supported, this maximum frequency will be larger than |
+ | | | the one in ``cpuinfo``. |
+ +---------+--------------------------------+------------------------------------------------------------------------------------+
+
+#. How to execute the tests
+
+ We use test module in the kselftest frameworks to implement it.
+ We create amd-pstate-ut module and tie it into kselftest.(for
+ details refer to Linux Kernel Selftests [4]_).
+
+ 1. Build
+
+ + open the :c:macro:`CONFIG_X86_AMD_PSTATE` configuration option.
+ + set the :c:macro:`CONFIG_X86_AMD_PSTATE_UT` configuration option to M.
+ + make project
+ + make selftest ::
+
+ $ cd linux
+ $ make -C tools/testing/selftests
+
+ #. Installation & Steps ::
+
+ $ make -C tools/testing/selftests install INSTALL_PATH=~/kselftest
+ $ sudo ./kselftest/run_kselftest.sh -c amd-pstate
+ TAP version 13
+ 1..1
+ # selftests: amd-pstate: amd-pstate-ut.sh
+ # amd-pstate-ut: ok
+ ok 1 selftests: amd-pstate: amd-pstate-ut.sh
+
+ #. Results ::
+
+ $ dmesg | grep "amd_pstate_ut" | tee log.txt
+ [12977.570663] amd_pstate_ut: 1 amd_pstate_ut_acpi_cpc_valid success!
+ [12977.570673] amd_pstate_ut: 2 amd_pstate_ut_check_enabled success!
+ [12977.571207] amd_pstate_ut: 3 amd_pstate_ut_check_perf success!
+ [12977.571212] amd_pstate_ut: 4 amd_pstate_ut_check_freq success!
Reference
===========
@@ -405,3 +478,6 @@ Reference
.. [3] Processor Programming Reference (PPR) for AMD Family 19h Model 51h, Revision A1 Processors
https://www.amd.com/system/files/TechDocs/56569-A1-PUB.zip
+
+.. [4] Linux Kernel Selftests,
+ https://www.kernel.org/doc/html/latest/dev-tools/kselftest.html
--
2.25.1
These series look pretty good for me, thank you Jassmine!
Thanks,
Ray
On Thu, May 26, 2022 at 11:47:21AM +0800, Meng, Li (Jassmine) wrote:
> Hi all:
>
> AMD P-State unit test(amd-pstate-ut) is a kernel module for testing
> the functions of amd-pstate driver.
> It could import as a module to launch some test tasks.
> 1) It can help all users to verify their processor support (SBIOS/
> Firmware or Hardware).
> 2) Kernel can have a basic function test to avoid the kernel regression
> during the update.
> 3) We can introduce more functional or performance tests to align the
> together, it will benefit power and performance scale optimization.
>
> We upstream out AMD P-state driver into Linux kernel and use this unit
> test module to verify the required conditions and basic functions of
> amd-pstate before integration test.
>
> We use test module in the kselftest frameworks to implement it.
> We create amd-pstate-ut module and tie it into kselftest.
>
> For example: The test case aput_acpi_cpc is used to check whether the
> _CPC object is exist in SBIOS.
> The amd-pstate initialization will fail if the _CPC in ACPI SBIOS is not
> existed at the detected processor, so it is a necessary condition.
>
> At present, it only implements the basic framework and some simple test
> cases.
>
> TODO : 1) we will add more test cases to improve the depth and coverage of
> the test. E.X. use the script to trigger the tbench, gitsource, kernbench,
> netperf, speedometer, and etc. testing and monitor the cpu frequency and
> performance goals change, power consumption at runtime.
>
> Please check the documentation amd-pstate.rst for details of the test steps.
>
> See patch series in below git repo:
> V1: https://lore.kernel.org/linux-pm/[email protected]/
> V2: https://lore.kernel.org/lkml/[email protected]/
> V3: https://lore.kernel.org/lkml/[email protected]/
> V4: https://lore.kernel.org/lkml/[email protected]/
> V5: https://lore.kernel.org/lkml/[email protected]/
> V6: https://lore.kernel.org/lkml/[email protected]/
> V7: https://lore.kernel.org/lkml/[email protected]/
>
> Changes from V1 -> V2:
> - cpufreq: amd-pstate:
> - - add a trailing of amd-pstate.h to MAINTAINER AMD PSTATE DRIVER.
> - selftests: cpufreq:
> - - add a wrapper shell script for the amd_pstate_testmod module.
> - selftests: cpufreq:
> - - remove amd_pstate_testmod kernel module to
> .../cpufreq/amd_pstate_testmod.
> - Documentation: amd-pstate:
> - - amd_pstate_testmod rst document is not provided at present.
>
> Changes from V2 -> V3:
> - cpufreq: amd-pstate:
> - - adjust the order of add amd-pstate.h in MAINTAINERS.
> - selftests: cpufreq:
> - - remove the call of amd_pstate_testmod.sh from cpufreq Makefile to
> main.sh.
> - selftests: cpufreq:
> - - add explain the goal or intention of the AMD P-State Unit Test
> module.
> - - modify comments.
> - - use the checkpatch.pl to check my patches.
> - - add conditions judgment before formal test.
> - - delete some unnecessary test cases.
> - - modify test cases about perf and performance etc.
>
> Changes from V3 -> V4:
> - selftests: amd-pstate:
> - - remove script and test module to tools/testing/selftests/amd-pstate/
> - - uniformly named amd-pstate-ut.
> - - check current architectures and cpufreq driver in amd-pstate-ut.sh
> - - delete codes about conditions in amd-pstate-ut.c
> - Documentation: amd-pstate:
> - - add introduce document about amd-pstate unit test.
>
> Changes from V4 -> V5:
> - selftests: amd-pstate:
> - - add print the current scaling_driver.
> - - add amd-pstate-ut.ko into TEST_GEN_FILES.
> - - move "insmod/rmmod amd-pstate-ut.ko" stuff into script amd_pstate_ut.sh
> - - add a check of read back from X86_FEATURE_CPPC in get_shared_mem().
> - Documentation: amd-pstate:
> - - delete the test step about insmod/rmmod amd-pstate-ut.ko
>
> Changes from V5 -> V6:
> - cpufreq: amd-pstate:
> - - add amd-pstate-ut test codes to drivers/cpurfreq
> - - add the macro CONFIG_X86_AMD_PSTATE_UT
> - selftests: amd-pstate:
> - - delete amd-pstate-ut test codes from tools/testing/selftests/amd-pstate/
>
> Changes from V6 -> V7:
> - cpufreq: amd-pstate:
> - - modify X86_AMD_PSTATE_UT dependencies and default value.
> - - modify a brief description of the amd-pstate-ut module.
> - - remove kselftest_module.h header include.
> - - modify shortform for AMD P-State unit test.
> - - add prefix for the names of test cases.
> - - in the file operation log, add the file path.
> - - add comments about the test cases.
> - - correct syntax errors.
> - selftests: amd-pstate:
> - - delete TEST_GEN_FILES$(TEST_GEN_FILES): $(HEADERS) form amd-pstate Makefile.
> - - simplify the judgment about ARCH.
> - - add the judgment about cpu vendor.
> - - modify the method about load the amd-pstate-ut module.
> - Documentation: amd-pstate:
> - - update the name of the test function.
> - - update kernel log about test result.
>
> Changes from V7 -> V8:
> - cpufreq: amd-pstate:
> - - amend commit message.
> - - amend module description.
> - Documentation: amd-pstate:
> - - amend commit message.
> - - Remove the personal data.
>
> Thanks,
> Jasmine
>
> Meng Li (4):
> cpufreq: amd-pstate: Expose struct amd_cpudata
> cpufreq: amd-pstate: Add test module for amd-pstate driver
> selftests: amd-pstate: Add test trigger for amd-pstate driver
> Documentation: amd-pstate: Add unit test introduction
>
> Documentation/admin-guide/pm/amd-pstate.rst | 76 +++++
> MAINTAINERS | 1 +
> drivers/cpufreq/Kconfig.x86 | 7 +
> drivers/cpufreq/Makefile | 1 +
> drivers/cpufreq/amd-pstate-ut.c | 293 ++++++++++++++++++
> drivers/cpufreq/amd-pstate.c | 60 +---
> include/linux/amd-pstate.h | 77 +++++
> tools/testing/selftests/Makefile | 1 +
> tools/testing/selftests/amd-pstate/Makefile | 9 +
> .../selftests/amd-pstate/amd-pstate-ut.sh | 55 ++++
> tools/testing/selftests/amd-pstate/config | 1 +
> 11 files changed, 522 insertions(+), 59 deletions(-)
> create mode 100644 drivers/cpufreq/amd-pstate-ut.c
> create mode 100644 include/linux/amd-pstate.h
> create mode 100644 tools/testing/selftests/amd-pstate/Makefile
> create mode 100755 tools/testing/selftests/amd-pstate/amd-pstate-ut.sh
> create mode 100644 tools/testing/selftests/amd-pstate/config
>
> --
> 2.25.1
>
Expose struct amd_cpudata to AMD P-State unit test module.
This data struct will be used on the following AMD P-State unit test
(amd-pstate-ut) module. The amd-pstate-ut module can get some
AMD infomations by this data struct. For example: highest perf,
nominal perf, boost supported etc.
Signed-off-by: Meng Li <[email protected]>
Acked-by: Huang Rui <[email protected]>
Acked-by: Shuah Khan <[email protected]>
---
MAINTAINERS | 1 +
drivers/cpufreq/amd-pstate.c | 60 +---------------------------
include/linux/amd-pstate.h | 77 ++++++++++++++++++++++++++++++++++++
3 files changed, 79 insertions(+), 59 deletions(-)
create mode 100644 include/linux/amd-pstate.h
diff --git a/MAINTAINERS b/MAINTAINERS
index edc96cdb85e8..c2e5299b0051 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1021,6 +1021,7 @@ L: [email protected]
S: Supported
F: Documentation/admin-guide/pm/amd-pstate.rst
F: drivers/cpufreq/amd-pstate*
+F: include/linux/amd-pstate.h
F: tools/power/x86/amd_pstate_tracer/amd_pstate_trace.py
AMD PTDMA DRIVER
diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c
index 7be38bc6a673..5f7a00a64f76 100644
--- a/drivers/cpufreq/amd-pstate.c
+++ b/drivers/cpufreq/amd-pstate.c
@@ -36,6 +36,7 @@
#include <linux/delay.h>
#include <linux/uaccess.h>
#include <linux/static_call.h>
+#include <linux/amd-pstate.h>
#include <acpi/processor.h>
#include <acpi/cppc_acpi.h>
@@ -65,65 +66,6 @@ MODULE_PARM_DESC(shared_mem,
static struct cpufreq_driver amd_pstate_driver;
-/**
- * struct amd_aperf_mperf
- * @aperf: actual performance frequency clock count
- * @mperf: maximum performance frequency clock count
- * @tsc: time stamp counter
- */
-struct amd_aperf_mperf {
- u64 aperf;
- u64 mperf;
- u64 tsc;
-};
-
-/**
- * struct amd_cpudata - private CPU data for AMD P-State
- * @cpu: CPU number
- * @req: constraint request to apply
- * @cppc_req_cached: cached performance request hints
- * @highest_perf: the maximum performance an individual processor may reach,
- * assuming ideal conditions
- * @nominal_perf: the maximum sustained performance level of the processor,
- * assuming ideal operating conditions
- * @lowest_nonlinear_perf: the lowest performance level at which nonlinear power
- * savings are achieved
- * @lowest_perf: the absolute lowest performance level of the processor
- * @max_freq: the frequency that mapped to highest_perf
- * @min_freq: the frequency that mapped to lowest_perf
- * @nominal_freq: the frequency that mapped to nominal_perf
- * @lowest_nonlinear_freq: the frequency that mapped to lowest_nonlinear_perf
- * @cur: Difference of Aperf/Mperf/tsc count between last and current sample
- * @prev: Last Aperf/Mperf/tsc count value read from register
- * @freq: current cpu frequency value
- * @boost_supported: check whether the Processor or SBIOS supports boost mode
- *
- * The amd_cpudata is key private data for each CPU thread in AMD P-State, and
- * represents all the attributes and goals that AMD P-State requests at runtime.
- */
-struct amd_cpudata {
- int cpu;
-
- struct freq_qos_request req[2];
- u64 cppc_req_cached;
-
- u32 highest_perf;
- u32 nominal_perf;
- u32 lowest_nonlinear_perf;
- u32 lowest_perf;
-
- u32 max_freq;
- u32 min_freq;
- u32 nominal_freq;
- u32 lowest_nonlinear_freq;
-
- struct amd_aperf_mperf cur;
- struct amd_aperf_mperf prev;
-
- u64 freq;
- bool boost_supported;
-};
-
static inline int pstate_enable(bool enable)
{
return wrmsrl_safe(MSR_AMD_CPPC_ENABLE, enable);
diff --git a/include/linux/amd-pstate.h b/include/linux/amd-pstate.h
new file mode 100644
index 000000000000..1c4b8659f171
--- /dev/null
+++ b/include/linux/amd-pstate.h
@@ -0,0 +1,77 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * linux/include/linux/amd-pstate.h
+ *
+ * Copyright (C) 2022 Advanced Micro Devices, Inc.
+ *
+ * Author: Meng Li <[email protected]>
+ */
+
+#ifndef _LINUX_AMD_PSTATE_H
+#define _LINUX_AMD_PSTATE_H
+
+#include <linux/pm_qos.h>
+
+/*********************************************************************
+ * AMD P-state INTERFACE *
+ *********************************************************************/
+/**
+ * struct amd_aperf_mperf
+ * @aperf: actual performance frequency clock count
+ * @mperf: maximum performance frequency clock count
+ * @tsc: time stamp counter
+ */
+struct amd_aperf_mperf {
+ u64 aperf;
+ u64 mperf;
+ u64 tsc;
+};
+
+/**
+ * struct amd_cpudata - private CPU data for AMD P-State
+ * @cpu: CPU number
+ * @req: constraint request to apply
+ * @cppc_req_cached: cached performance request hints
+ * @highest_perf: the maximum performance an individual processor may reach,
+ * assuming ideal conditions
+ * @nominal_perf: the maximum sustained performance level of the processor,
+ * assuming ideal operating conditions
+ * @lowest_nonlinear_perf: the lowest performance level at which nonlinear power
+ * savings are achieved
+ * @lowest_perf: the absolute lowest performance level of the processor
+ * @max_freq: the frequency that mapped to highest_perf
+ * @min_freq: the frequency that mapped to lowest_perf
+ * @nominal_freq: the frequency that mapped to nominal_perf
+ * @lowest_nonlinear_freq: the frequency that mapped to lowest_nonlinear_perf
+ * @cur: Difference of Aperf/Mperf/tsc count between last and current sample
+ * @prev: Last Aperf/Mperf/tsc count value read from register
+ * @freq: current cpu frequency value
+ * @boost_supported: check whether the Processor or SBIOS supports boost mode
+ *
+ * The amd_cpudata is key private data for each CPU thread in AMD P-State, and
+ * represents all the attributes and goals that AMD P-State requests at runtime.
+ */
+struct amd_cpudata {
+ int cpu;
+
+ struct freq_qos_request req[2];
+ u64 cppc_req_cached;
+
+ u32 highest_perf;
+ u32 nominal_perf;
+ u32 lowest_nonlinear_perf;
+ u32 lowest_perf;
+
+ u32 max_freq;
+ u32 min_freq;
+ u32 nominal_freq;
+ u32 lowest_nonlinear_freq;
+
+ struct amd_aperf_mperf cur;
+ struct amd_aperf_mperf prev;
+
+ u64 freq;
+ bool boost_supported;
+};
+
+#endif /* _LINUX_AMD_PSTATE_H */
--
2.25.1
Add amd-pstate test trigger in kselftest, it will load/unload
amd-pstate-ut module to test some cases etc.
Signed-off-by: Meng Li <[email protected]>
Acked-by: Huang Rui <[email protected]>
Reviewed-by: Shuah Khan <[email protected]>
---
tools/testing/selftests/Makefile | 1 +
tools/testing/selftests/amd-pstate/Makefile | 9 +++
.../selftests/amd-pstate/amd-pstate-ut.sh | 55 +++++++++++++++++++
tools/testing/selftests/amd-pstate/config | 1 +
4 files changed, 66 insertions(+)
create mode 100644 tools/testing/selftests/amd-pstate/Makefile
create mode 100755 tools/testing/selftests/amd-pstate/amd-pstate-ut.sh
create mode 100644 tools/testing/selftests/amd-pstate/config
diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile
index 2319ec87f53d..975c13368286 100644
--- a/tools/testing/selftests/Makefile
+++ b/tools/testing/selftests/Makefile
@@ -1,5 +1,6 @@
# SPDX-License-Identifier: GPL-2.0
TARGETS += alsa
+TARGETS += amd-pstate
TARGETS += arm64
TARGETS += bpf
TARGETS += breakpoints
diff --git a/tools/testing/selftests/amd-pstate/Makefile b/tools/testing/selftests/amd-pstate/Makefile
new file mode 100644
index 000000000000..199867f44b32
--- /dev/null
+++ b/tools/testing/selftests/amd-pstate/Makefile
@@ -0,0 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+# Makefile for amd-pstate/ function selftests
+
+# No binaries, but make sure arg-less "make" doesn't trigger "run_tests"
+all:
+
+TEST_PROGS := amd-pstate-ut.sh
+
+include ../lib.mk
diff --git a/tools/testing/selftests/amd-pstate/amd-pstate-ut.sh b/tools/testing/selftests/amd-pstate/amd-pstate-ut.sh
new file mode 100755
index 000000000000..273364650285
--- /dev/null
+++ b/tools/testing/selftests/amd-pstate/amd-pstate-ut.sh
@@ -0,0 +1,55 @@
+#!/bin/sh
+# SPDX-License-Identifier: GPL-2.0
+
+# amd-pstate-ut is a test module for testing the amd-pstate driver.
+# It can only run on x86 architectures and current cpufreq driver
+# must be amd-pstate.
+# (1) It can help all users to verify their processor support
+# (SBIOS/Firmware or Hardware).
+# (2) Kernel can have a basic function test to avoid the kernel
+# regression during the update.
+# (3) We can introduce more functional or performance tests to align
+# the result together, it will benefit power and performance scale optimization.
+
+# Kselftest framework requirement - SKIP code is 4.
+ksft_skip=4
+
+# amd-pstate-ut only run on x86/x86_64 AMD systems.
+ARCH=$(uname -m 2>/dev/null | sed -e 's/i.86/x86/' -e 's/x86_64/x86/')
+VENDOR=$(cat /proc/cpuinfo | grep -m 1 'vendor_id' | awk '{print $NF}')
+
+if ! echo "$ARCH" | grep -q x86; then
+ echo "$0 # Skipped: Test can only run on x86 architectures."
+ exit $ksft_skip
+fi
+
+if ! echo "$VENDOR" | grep -iq amd; then
+ echo "$0 # Skipped: Test can only run on AMD CPU."
+ echo "$0 # Current cpu vendor is $VENDOR."
+ exit $ksft_skip
+fi
+
+scaling_driver=$(cat /sys/devices/system/cpu/cpufreq/policy0/scaling_driver)
+if [ "$scaling_driver" != "amd-pstate" ]; then
+ echo "$0 # Skipped: Test can only run on amd-pstate driver."
+ echo "$0 # Current cpufreq scaling drvier is $scaling_driver."
+ exit $ksft_skip
+fi
+
+msg="Skip all tests:"
+if [ ! -w /dev ]; then
+ echo $msg please run this as root >&2
+ exit $ksft_skip
+fi
+
+if ! /sbin/modprobe -q -n amd-pstate-ut; then
+ echo "amd-pstate-ut: module amd-pstate-ut is not found [SKIP]"
+ exit $ksft_skip
+fi
+if /sbin/modprobe -q amd-pstate-ut; then
+ /sbin/modprobe -q -r amd-pstate-ut
+ echo "amd-pstate-ut: ok"
+else
+ echo "amd-pstate-ut: [FAIL]"
+ exit 1
+fi
diff --git a/tools/testing/selftests/amd-pstate/config b/tools/testing/selftests/amd-pstate/config
new file mode 100644
index 000000000000..f43103c9adc4
--- /dev/null
+++ b/tools/testing/selftests/amd-pstate/config
@@ -0,0 +1 @@
+CONFIG_X86_AMD_PSTATE_UT=m
--
2.25.1
On 5/25/22 9:47 PM, Meng Li wrote:
> Hi all:
>
> AMD P-State unit test(amd-pstate-ut) is a kernel module for testing
> the functions of amd-pstate driver.
> It could import as a module to launch some test tasks.
> 1) It can help all users to verify their processor support (SBIOS/
> Firmware or Hardware).
> 2) Kernel can have a basic function test to avoid the kernel regression
> during the update.
> 3) We can introduce more functional or performance tests to align the
> together, it will benefit power and performance scale optimization.
>
> We upstream out AMD P-state driver into Linux kernel and use this unit
> test module to verify the required conditions and basic functions of
> amd-pstate before integration test.
>
> We use test module in the kselftest frameworks to implement it.
> We create amd-pstate-ut module and tie it into kselftest.
>
> For example: The test case aput_acpi_cpc is used to check whether the
> _CPC object is exist in SBIOS.
> The amd-pstate initialization will fail if the _CPC in ACPI SBIOS is not
> existed at the detected processor, so it is a necessary condition.
>
> At present, it only implements the basic framework and some simple test
> cases.
>
> TODO : 1) we will add more test cases to improve the depth and coverage of
> the test. E.X. use the script to trigger the tbench, gitsource, kernbench,
> netperf, speedometer, and etc. testing and monitor the cpu frequency and
> performance goals change, power consumption at runtime.
>
> Please check the documentation amd-pstate.rst for details of the test steps.
>
> See patch series in below git repo:
> V1: https://lore.kernel.org/linux-pm/[email protected]/
> V2: https://lore.kernel.org/lkml/[email protected]/
> V3: https://lore.kernel.org/lkml/[email protected]/
> V4: https://lore.kernel.org/lkml/[email protected]/
> V5: https://lore.kernel.org/lkml/[email protected]/
> V6: https://lore.kernel.org/lkml/[email protected]/
> V7: https://lore.kernel.org/lkml/[email protected]/
>
>
> Changes from V7 -> V8:
> - cpufreq: amd-pstate:
> - - amend commit message.
> - - amend module description.
> - Documentation: amd-pstate:
> - - amend commit message.
> - - Remove the personal data.
>
Looks good to me. Thank you.
Rafael, Viresh,
How do you want to handle this patch series? We are in merge window
and this would be for Linux 5.20 based on the changes and content.
Would you like to take the entire patch series through your tree, you
have my Ack(s) and Reviewed-by(s)
thanks,
-- Shuah
On 5/26/22 9:44 AM, Shuah Khan wrote:
> On 5/25/22 9:47 PM, Meng Li wrote:
>> Hi all:
>>
>> AMD P-State unit test(amd-pstate-ut) is a kernel module for testing
>> the functions of amd-pstate driver.
>> It could import as a module to launch some test tasks.
>> 1) It can help all users to verify their processor support (SBIOS/
>> Firmware or Hardware).
>> 2) Kernel can have a basic function test to avoid the kernel regression
>> during the update.
>> 3) We can introduce more functional or performance tests to align the
>> together, it will benefit power and performance scale optimization.
>>
>> We upstream out AMD P-state driver into Linux kernel and use this unit
>> test module to verify the required conditions and basic functions of
>> amd-pstate before integration test.
>>
>> We use test module in the kselftest frameworks to implement it.
>> We create amd-pstate-ut module and tie it into kselftest.
>>
>> For example: The test case aput_acpi_cpc is used to check whether the
>> _CPC object is exist in SBIOS.
>> The amd-pstate initialization will fail if the _CPC in ACPI SBIOS is not
>> existed at the detected processor, so it is a necessary condition.
>>
>> At present, it only implements the basic framework and some simple test
>> cases.
>>
>> TODO : 1) we will add more test cases to improve the depth and coverage of
>> the test. E.X. use the script to trigger the tbench, gitsource, kernbench,
>> netperf, speedometer, and etc. testing and monitor the cpu frequency and
>> performance goals change, power consumption at runtime.
>>
>> Please check the documentation amd-pstate.rst for details of the test steps.
>>
>> See patch series in below git repo:
>> V1: https://lore.kernel.org/linux-pm/[email protected]/
>> V2: https://lore.kernel.org/lkml/[email protected]/
>> V3: https://lore.kernel.org/lkml/[email protected]/
>> V4: https://lore.kernel.org/lkml/[email protected]/
>> V5: https://lore.kernel.org/lkml/[email protected]/
>> V6: https://lore.kernel.org/lkml/[email protected]/
>> V7: https://lore.kernel.org/lkml/[email protected]/
>>
>
>>
>> Changes from V7 -> V8:
>> - cpufreq: amd-pstate:
>> - - amend commit message.
>> - - amend module description.
>> - Documentation: amd-pstate:
>> - - amend commit message.
>> - - Remove the personal data.
>>
>
> Looks good to me. Thank you.
>
> Rafael, Viresh,
>
> How do you want to handle this patch series? We are in merge window
> and this would be for Linux 5.20 based on the changes and content.
>
> Would you like to take the entire patch series through your tree, you
> have my Ack(s) and Reviewed-by(s)
>
Picking this back up since rc1 is out. How do we want to handle this patch
series?
thanks,
-- Shuah
On Fri, Jun 10, 2022 at 04:28:27AM +0800, Shuah Khan wrote:
> On 5/26/22 9:44 AM, Shuah Khan wrote:
> > On 5/25/22 9:47 PM, Meng Li wrote:
> >> Hi all:
> >>
> >> AMD P-State unit test(amd-pstate-ut) is a kernel module for testing
> >> the functions of amd-pstate driver.
> >> It could import as a module to launch some test tasks.
> >> 1) It can help all users to verify their processor support (SBIOS/
> >> Firmware or Hardware).
> >> 2) Kernel can have a basic function test to avoid the kernel regression
> >> during the update.
> >> 3) We can introduce more functional or performance tests to align the
> >> together, it will benefit power and performance scale optimization.
> >>
> >> We upstream out AMD P-state driver into Linux kernel and use this unit
> >> test module to verify the required conditions and basic functions of
> >> amd-pstate before integration test.
> >>
> >> We use test module in the kselftest frameworks to implement it.
> >> We create amd-pstate-ut module and tie it into kselftest.
> >>
> >> For example: The test case aput_acpi_cpc is used to check whether the
> >> _CPC object is exist in SBIOS.
> >> The amd-pstate initialization will fail if the _CPC in ACPI SBIOS is not
> >> existed at the detected processor, so it is a necessary condition.
> >>
> >> At present, it only implements the basic framework and some simple test
> >> cases.
> >>
> >> TODO : 1) we will add more test cases to improve the depth and coverage of
> >> the test. E.X. use the script to trigger the tbench, gitsource, kernbench,
> >> netperf, speedometer, and etc. testing and monitor the cpu frequency and
> >> performance goals change, power consumption at runtime.
> >>
> >> Please check the documentation amd-pstate.rst for details of the test steps.
> >>
> >> See patch series in below git repo:
> >> V1: https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flore.kernel.org%2Flinux-pm%2F20220323071502.2674156-1-li.meng%40amd.com%2F&data=05%7C01%7Cray.huang%40amd.com%7Cca871cbe21d34368046408da4a569d82%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637904033129149948%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=RhdyH9UelmQuEGokmUcPZKla%2FTr1j9GC%2BzC%2BPGD22xo%3D&reserved=0
> >> V2: https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flore.kernel.org%2Flkml%2F20220413090510.4039589-1-li.meng%40amd.com%2F&data=05%7C01%7Cray.huang%40amd.com%7Cca871cbe21d34368046408da4a569d82%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637904033129149948%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=f8%2BUhVE94oDnm9aWy2Bz9FmV9f2fBwOF%2B%2FfioZCjX5c%3D&reserved=0
> >> V3: https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flore.kernel.org%2Flkml%2F20220421074152.599419-1-li.meng%40amd.com%2F&data=05%7C01%7Cray.huang%40amd.com%7Cca871cbe21d34368046408da4a569d82%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637904033129149948%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=QOYa%2FjtTrh3sXhMmMBPPIsY12%2BjVG%2B9hn1myQ0HhOpA%3D&reserved=0
> >> V4: https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flore.kernel.org%2Flkml%2F20220427135315.3447550-1-li.meng%40amd.com%2F&data=05%7C01%7Cray.huang%40amd.com%7Cca871cbe21d34368046408da4a569d82%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637904033129149948%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=e4GBakHlYTqv0dhAUOmPu1CueJceKIjQCZ8OeHhgFqs%3D&reserved=0
> >> V5: https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flore.kernel.org%2Flkml%2F20220505022913.329259-1-li.meng%40amd.com%2F&data=05%7C01%7Cray.huang%40amd.com%7Cca871cbe21d34368046408da4a569d82%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637904033129149948%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=l3zbZC6SjF0R%2BeAGN%2F32M4FnT16OTDv5FvCfKf%2FXDyw%3D&reserved=0
> >> V6: https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flore.kernel.org%2Flkml%2F20220519134737.359290-1-li.meng%40amd.com%2F&data=05%7C01%7Cray.huang%40amd.com%7Cca871cbe21d34368046408da4a569d82%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637904033129149948%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=KW5KbwUOe1DReaKRvu2AttcXsCJYYr5zHrB%2FZvxPAYo%3D&reserved=0
> >> V7: https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flore.kernel.org%2Flkml%2F20220522115423.1147282-1-li.meng%40amd.com%2F&data=05%7C01%7Cray.huang%40amd.com%7Cca871cbe21d34368046408da4a569d82%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637904033129149948%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=JscI%2F69EuDNzZsQMGbgkyF3rAChKJl1nz2sZLxdm5H8%3D&reserved=0
> >>
> >
> >>
> >> Changes from V7 -> V8:
> >> - cpufreq: amd-pstate:
> >> - - amend commit message.
> >> - - amend module description.
> >> - Documentation: amd-pstate:
> >> - - amend commit message.
> >> - - Remove the personal data.
> >>
> >
> > Looks good to me. Thank you.
> >
> > Rafael, Viresh,
> >
> > How do you want to handle this patch series? We are in merge window
> > and this would be for Linux 5.20 based on the changes and content.
> >
> > Would you like to take the entire patch series through your tree, you
> > have my Ack(s) and Reviewed-by(s)
> >
>
> Picking this back up since rc1 is out. How do we want to handle this patch
> series?
>
Rafael, Shuah,
Would you mind to put this patch series in bleeding-edge of linux-pm kernel
tree? Because we have some patches that based on the include/linux/amd-pstate.h
in patch 1 for amd-pstate driver next step.
Thanks,
Ray
On 6/9/22 2:28 PM, Shuah Khan wrote:
> On 5/26/22 9:44 AM, Shuah Khan wrote:
>> On 5/25/22 9:47 PM, Meng Li wrote:
>>> Hi all:
>>>
>>> AMD P-State unit test(amd-pstate-ut) is a kernel module for testing
>>> the functions of amd-pstate driver.
>>> It could import as a module to launch some test tasks.
>>> 1) It can help all users to verify their processor support (SBIOS/
>>> Firmware or Hardware).
>>> 2) Kernel can have a basic function test to avoid the kernel regression
>>> during the update.
>>> 3) We can introduce more functional or performance tests to align the
>>> together, it will benefit power and performance scale optimization.
>>>
>>> We upstream out AMD P-state driver into Linux kernel and use this unit
>>> test module to verify the required conditions and basic functions of
>>> amd-pstate before integration test.
>>>
>>> We use test module in the kselftest frameworks to implement it.
>>> We create amd-pstate-ut module and tie it into kselftest.
>>>
>>> For example: The test case aput_acpi_cpc is used to check whether the
>>> _CPC object is exist in SBIOS.
>>> The amd-pstate initialization will fail if the _CPC in ACPI SBIOS is not
>>> existed at the detected processor, so it is a necessary condition.
>>>
>>> At present, it only implements the basic framework and some simple test
>>> cases.
>>>
>>> TODO : 1) we will add more test cases to improve the depth and coverage of
>>> the test. E.X. use the script to trigger the tbench, gitsource, kernbench,
>>> netperf, speedometer, and etc. testing and monitor the cpu frequency and
>>> performance goals change, power consumption at runtime.
>>>
>>> Please check the documentation amd-pstate.rst for details of the test steps.
>>>
>>> See patch series in below git repo:
>>> V1: https://lore.kernel.org/linux-pm/[email protected]/
>>> V2: https://lore.kernel.org/lkml/[email protected]/
>>> V3: https://lore.kernel.org/lkml/[email protected]/
>>> V4: https://lore.kernel.org/lkml/[email protected]/
>>> V5: https://lore.kernel.org/lkml/[email protected]/
>>> V6: https://lore.kernel.org/lkml/[email protected]/
>>> V7: https://lore.kernel.org/lkml/[email protected]/
>>>
>>
>>>
>>> Changes from V7 -> V8:
>>> - cpufreq: amd-pstate:
>>> - - amend commit message.
>>> - - amend module description.
>>> - Documentation: amd-pstate:
>>> - - amend commit message.
>>> - - Remove the personal data.
>>>
>>
>> Looks good to me. Thank you.
>>
>> Rafael, Viresh,
>>
>> How do you want to handle this patch series? We are in merge window
>> and this would be for Linux 5.20 based on the changes and content.
>>
>> Would you like to take the entire patch series through your tree, you
>> have my Ack(s) and Reviewed-by(s)
>>
>
> Picking this back up since rc1 is out. How do we want to handle this patch
> series?
>
Please send me rebased version. I will apply it for the net release.
thanks,
-- Shuah