Message ID | 20220427135315.3447550-1-li.meng@amd.com |
---|---|
Headers | show |
Series | Add unit test module for AMD P-State driver | expand |
Hi Li, On Wed, Apr 27, 2022 at 09:53:13PM +0800, Meng, Li (Jassmine) wrote: > 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 <li.meng@amd.com> I have acked this patch at the last version. Next time you can add my Ack here directly. Acked-by: Huang Rui <ray.huang@amd.com> > --- > 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 61d9f114c37f..6f814eda95b5 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -1020,6 +1020,7 @@ L: linux-pm@vger.kernel.org > 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..4dffb7db3807 > --- /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) 2007-2010 Advanced Micro Devices, Inc. > + * > + * Author: Meng Li <li.meng@amd.com> > + */ > + > +#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 >
On Wed, Apr 27, 2022 at 09:53:15PM +0800, Meng, Li (Jassmine) wrote: > Introduce the AMD P-State unit test module design and implementation. > > Signed-off-by: Meng Li <li.meng@amd.com> > --- > Documentation/admin-guide/pm/amd-pstate.rst | 87 +++++++++++++++++++++ > 1 file changed, 87 insertions(+) > > diff --git a/Documentation/admin-guide/pm/amd-pstate.rst b/Documentation/admin-guide/pm/amd-pstate.rst > index 83b58eb4ab4d..395b8b5c680c 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,87 @@ 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 | aput_acpi_cpc || Check whether the _CPC object is present in SBIOS. | > + | | || | > + | | || The detail refer to `Processor Support <processor_support_>`_. | > + +---------+--------------------------------+------------------------------------------------------------------------------------+ > + | 1 | aput_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 | aput_check_perf || Check if the each performance values are reasonable. | > + | | || highest_perf >= nominal_perf > lowest_nonlinear_perf > lowest_perf > 0. | > + +---------+--------------------------------+------------------------------------------------------------------------------------+ > + | 3 | aput_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 :: > + > + jasminemeng@jasmine-meng:~/amd-brahma$ cd linux > + jasminemeng@jasmine-meng:~/amd-brahma/linux$ make modules M=tools/testing/selftests/amd-pstate/amd-pstate-ut > + CC [M] tools/testing/selftests/amd-pstate/amd-pstate-ut/amd-pstate-ut.o > + MODPOST tools/testing/selftests/amd-pstate/amd-pstate-ut/Module.symvers > + CC [M] tools/testing/selftests/amd-pstate/amd-pstate-ut/amd-pstate-ut.mod.o > + LD [M] tools/testing/selftests/amd-pstate/amd-pstate-ut/amd-pstate-ut.ko > + BTF [M] tools/testing/selftests/amd-pstate/amd-pstate-ut/amd-pstate-ut.ko > + jasminemeng@jasmine-meng:~/amd-brahma/linux$ make -C tools/testing/selftests > + > + #. Installation & Steps :: > + > + jasmine@jasmine-MayanDAP-RMB:~/amd-brahma/linux$ make -C tools/testing/selftests install INSTALL_PATH=~/kselftest > + jasmine@jasmine-MayanDAP-RMB:~$ sudo cp amd-pstate-ut.ko /lib/modules/5.18.0-rc2+/ We should not mention a specfic kernel version "5.18.0-rc2+" here. > + jasmine@jasmine-MayanDAP-RMB:~$ sudo depmod > + jasmine@jasmine-MayanDAP-RMB:~$ sudo ./kselftest/run_kselftest.sh -c amd-pstate "Can we move "insmod/rmmod amd-pstate-ut.ko" stuff into script amd_pstate_ut.sh? Thanks, Ray > + 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 :: > + > + jasmine@jasmine-MayanDAP-RMB:~$ dmesg | grep "amd-pstate-ut" | tee log.txt > + [76697.480217] amd-pstate-ut: loaded. > + [76697.480222] amd-pstate-ut: ****** Begin 1 acpi_cpc_valid ****** > + [76697.480227] amd-pstate-ut: ****** End 1 acpi_cpc_valid ****** > + [76697.480228] amd-pstate-ut: ****** Begin 2 check_enabled ****** > + [76697.480253] amd-pstate-ut: ****** End 2 check_enabled ****** > + [76697.480255] amd-pstate-ut: ****** Begin 3 check_perf ****** > + [76697.480554] amd-pstate-ut: ****** End 3 check_perf ****** > + [76697.480556] amd-pstate-ut: ****** Begin 4 check_freq ****** > + [76697.480558] amd-pstate-ut: ****** End 4 check_freq ****** > + [76697.480559] amd-pstate-ut: all 4 tests passed > + [76697.482507] amd-pstate-ut: unloaded. > + > > Reference > =========== > @@ -405,3 +489,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 >