<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Verdana;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:Aptos;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:12.0pt;
        font-family:"Aptos",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0in;
        font-size:10.0pt;
        font-family:"Courier New";}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:Consolas;}
span.EmailStyle22
        {mso-style-type:personal-compose;
        font-family:"Aptos",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;
        mso-ligatures:none;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple" style="word-wrap:break-word">
<p style="font-family:Calibri;font-size:10pt;color:#0000FF;margin:5pt;font-style:normal;font-weight:normal;text-decoration:none;" align="Left">
[AMD Official Use Only - AMD Internal Distribution Only]<br>
</p>
<br>
<div>
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:"Verdana",sans-serif">Hi Dave,<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> Hunt, David <david.hunt@intel.com>
<br>
<b>Sent:</b> Tuesday, July 23, 2024 3:34 PM<br>
<b>To:</b> Tummala, Sivaprasad <Sivaprasad.Tummala@amd.com>; anatoly.burakov@intel.com; jerinj@marvell.com; lihuisong@huawei.com; david.marchand@redhat.com; Yigit, Ferruh <Ferruh.Yigit@amd.com>; konstantin.ananyev@huawei.com<br>
<b>Cc:</b> dev@dpdk.org<br>
<b>Subject:</b> Re: [PATCH v1 1/4] power: refactor core power management library<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<table class="MsoNormalTable" border="0" cellspacing="0" cellpadding="0" align="left" width="100%" style="width:100.0%">
<tbody>
<tr>
<td style="background:#FFB900;padding:5.0pt 2.0pt 5.0pt 2.0pt"></td>
<td width="100%" style="width:100.0%;background:#FFF8E5;padding:5.0pt 4.0pt 5.0pt 12.0pt">
<div>
<p class="MsoNormal" style="mso-element:frame;mso-element-frame-hspace:2.25pt;mso-element-wrap:around;mso-element-anchor-vertical:paragraph;mso-element-anchor-horizontal:column;mso-height-rule:exactly">
<b><span style="color:#222222">Caution:</span></b><span style="color:#222222"> This message originated from an External Source. Use proper caution when opening attachments, clicking links, or responding.
<o:p></o:p></span></p>
</div>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p>Hi Sivaprasad,<o:p></o:p></p>
<p>A couple of comments below:<o:p></o:p></p>
<div>
<p class="MsoNormal">On 20/07/2024 17:50, Sivaprasad Tummala wrote:<o:p></o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>This patch introduces a comprehensive refactor to the core power<o:p></o:p></pre>
<pre>management library. The primary focus is on improving modularity<o:p></o:p></pre>
<pre>and organization by relocating specific driver implementations<o:p></o:p></pre>
<pre>from the 'lib/power' directory to dedicated directories within<o:p></o:p></pre>
<pre>'drivers/power/core/*'. The adjustment of meson.build files<o:p></o:p></pre>
<pre>enables the selective activation of individual drivers.<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>These changes contribute to a significant enhancement in code<o:p></o:p></pre>
<pre>organization, providing a clearer structure for driver implementations.<o:p></o:p></pre>
<pre>The refactor aims to improve overall code clarity and boost<o:p></o:p></pre>
<pre>maintainability. Additionally, it establishes a foundation for<o:p></o:p></pre>
<pre>future development, allowing for more focused work on individual<o:p></o:p></pre>
<pre>drivers and seamless integration of forthcoming enhancements.<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Signed-off-by: Sivaprasad Tummala <a href="mailto:sivaprasad.tummala@amd.com"><sivaprasad.tummala@amd.com></a><o:p></o:p></pre>
<pre>---<o:p></o:p></pre>
<pre> drivers/meson.build                           |   1 +<o:p></o:p></pre>
<pre> .../power/acpi/acpi_cpufreq.c                 |  22 +-<o:p></o:p></pre>
<pre> .../power/acpi/acpi_cpufreq.h                 |   6 +-<o:p></o:p></pre>
<pre> drivers/power/acpi/meson.build                |  10 +<o:p></o:p></pre>
<pre> .../power/amd_pstate/amd_pstate_cpufreq.c     |  24 +-<o:p></o:p></pre>
<pre> .../power/amd_pstate/amd_pstate_cpufreq.h     |   8 +-<o:p></o:p></pre>
<pre> drivers/power/amd_pstate/meson.build          |  10 +<o:p></o:p></pre>
<pre> .../power/cppc/cppc_cpufreq.c                 |  22 +-<o:p></o:p></pre>
<pre> .../power/cppc/cppc_cpufreq.h                 |   8 +-<o:p></o:p></pre>
<pre> drivers/power/cppc/meson.build                |  10 +<o:p></o:p></pre>
<pre> .../power/kvm_vm}/guest_channel.c             |   0<o:p></o:p></pre>
<pre> .../power/kvm_vm}/guest_channel.h             |   0<o:p></o:p></pre>
<pre> .../power/kvm_vm/kvm_vm.c                     |  22 +-<o:p></o:p></pre>
<pre> .../power/kvm_vm/kvm_vm.h                     |   6 +-<o:p></o:p></pre>
<pre> drivers/power/kvm_vm/meson.build              |  16 +<o:p></o:p></pre>
<pre> drivers/power/meson.build                     |  12 +<o:p></o:p></pre>
<pre> drivers/power/pstate/meson.build              |  10 +<o:p></o:p></pre>
<pre> .../power/pstate/pstate_cpufreq.c             |  22 +-<o:p></o:p></pre>
<pre> .../power/pstate/pstate_cpufreq.h             |   6 +-<o:p></o:p></pre>
<pre> lib/power/meson.build                         |   7 +-<o:p></o:p></pre>
<pre> lib/power/power_common.c                      |   2 +-<o:p></o:p></pre>
<pre> lib/power/power_common.h                      |  16 +-<o:p></o:p></pre>
<pre> lib/power/rte_power.c                         | 287 ++++++------------<o:p></o:p></pre>
<pre> lib/power/rte_power.h                         | 139 ++++++---<o:p></o:p></pre>
<pre> lib/power/rte_power_core_ops.h                | 208 +++++++++++++<o:p></o:p></pre>
<pre> lib/power/version.map                         |  14 +<o:p></o:p></pre>
<pre> 26 files changed, 618 insertions(+), 270 deletions(-)<o:p></o:p></pre>
<pre> rename lib/power/power_acpi_cpufreq.c => drivers/power/acpi/acpi_cpufreq.c (95%)<o:p></o:p></pre>
<pre> rename lib/power/power_acpi_cpufreq.h => drivers/power/acpi/acpi_cpufreq.h (98%)<o:p></o:p></pre>
<pre> create mode 100644 drivers/power/acpi/meson.build<o:p></o:p></pre>
<pre> rename lib/power/power_amd_pstate_cpufreq.c => drivers/power/amd_pstate/amd_pstate_cpufreq.c (95%)<o:p></o:p></pre>
<pre> rename lib/power/power_amd_pstate_cpufreq.h => drivers/power/amd_pstate/amd_pstate_cpufreq.h (97%)<o:p></o:p></pre>
<pre> create mode 100644 drivers/power/amd_pstate/meson.build<o:p></o:p></pre>
<pre> rename lib/power/power_cppc_cpufreq.c => drivers/power/cppc/cppc_cpufreq.c (95%)<o:p></o:p></pre>
<pre> rename lib/power/power_cppc_cpufreq.h => drivers/power/cppc/cppc_cpufreq.h (97%)<o:p></o:p></pre>
<pre> create mode 100644 drivers/power/cppc/meson.build<o:p></o:p></pre>
<pre> rename {lib/power => drivers/power/kvm_vm}/guest_channel.c (100%)<o:p></o:p></pre>
<pre> rename {lib/power => drivers/power/kvm_vm}/guest_channel.h (100%)<o:p></o:p></pre>
<pre> rename lib/power/power_kvm_vm.c => drivers/power/kvm_vm/kvm_vm.c (82%)<o:p></o:p></pre>
<pre> rename lib/power/power_kvm_vm.h => drivers/power/kvm_vm/kvm_vm.h (98%)<o:p></o:p></pre>
<pre> create mode 100644 drivers/power/kvm_vm/meson.build<o:p></o:p></pre>
<pre> create mode 100644 drivers/power/meson.build<o:p></o:p></pre>
<pre> create mode 100644 drivers/power/pstate/meson.build<o:p></o:p></pre>
<pre> rename lib/power/power_pstate_cpufreq.c => drivers/power/pstate/pstate_cpufreq.c (96%)<o:p></o:p></pre>
<pre> rename lib/power/power_pstate_cpufreq.h => drivers/power/pstate/pstate_cpufreq.h (98%)<o:p></o:p></pre>
<pre> create mode 100644 lib/power/rte_power_core_ops.h<o:p></o:p></pre>
</blockquote>
<p>--snip--<o:p></o:p></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>diff --git a/lib/power/rte_power.c b/lib/power/rte_power.c<o:p></o:p></pre>
<pre>index 36c3f3da98..8afb5949b9 100644<o:p></o:p></pre>
<pre>--- a/lib/power/rte_power.c<o:p></o:p></pre>
<pre>+++ b/lib/power/rte_power.c<o:p></o:p></pre>
<pre>@@ -8,153 +8,86 @@<o:p></o:p></pre>
<pre> #include <rte_spinlock.h><o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> #include "rte_power.h"<o:p></o:p></pre>
<pre>-#include "power_acpi_cpufreq.h"<o:p></o:p></pre>
<pre>-#include "power_cppc_cpufreq.h"<o:p></o:p></pre>
<pre> #include "power_common.h"<o:p></o:p></pre>
<pre>-#include "power_kvm_vm.h"<o:p></o:p></pre>
<pre>-#include "power_pstate_cpufreq.h"<o:p></o:p></pre>
<pre>-#include "power_amd_pstate_cpufreq.h"<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>-enum power_management_env global_default_env = PM_ENV_NOT_SET;<o:p></o:p></pre>
<pre>+static enum power_management_env global_default_env = PM_ENV_NOT_SET;<o:p></o:p></pre>
<pre>+static struct rte_power_core_ops *global_power_core_ops;<o:p></o:p></pre>
</blockquote>
<p><o:p> </o:p></p>
<p>Suggest initialising this to NULL so we can check in rte_power_get_core_ops if it's null and throw an error.
<o:p></o:p></p>
<p><span style="font-size:9.0pt;font-family:"Verdana",sans-serif">[Siva] rte_power_core_ops as static global is initialized to NULL at runtime. Not sure, if it’s still required to initialize to NULL.
<o:p></o:p></span></p>
<p>--snip--<o:p></o:p></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>+struct rte_power_core_ops *<o:p></o:p></pre>
<pre>+rte_power_get_core_ops(void)<o:p></o:p></pre>
<pre>+{<o:p></o:p></pre>
</blockquote>
<p><o:p> </o:p></p>
<p>Need a check here to see if rte_power_get_core_ops is NULL. If it is, then the developer has probably called a frequency change API before the relevant init function, so throw an error.
<o:p></o:p></p>
<p>Also, all the functions that call this need to check if it returns NULL so as to avoid a segfault when they attempts to call the op function.<o:p></o:p></p>
<p><span style="font-size:9.0pt;font-family:"Verdana",sans-serif">[Siva] ACK. Will fix this in next version.<o:p></o:p></span></p>
<p><o:p> </o:p></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre><o:p> </o:p></pre>
<pre>+       return global_power_core_ops;<o:p></o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
</blockquote>
<p class="MsoNormal"><o:p> </o:p></p>
<p>--snip--<o:p></o:p></p>
<p><o:p> </o:p></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre>diff --git a/lib/power/rte_power.h b/lib/power/rte_power.h<o:p></o:p></pre>
<pre>index 4fa4afe399..5e4aacf08b 100644<o:p></o:p></pre>
<pre>--- a/lib/power/rte_power.h<o:p></o:p></pre>
<pre>+++ b/lib/power/rte_power.h<o:p></o:p></pre>
<pre>@@ -1,5 +1,6 @@<o:p></o:p></pre>
<pre> /* SPDX-License-Identifier: BSD-3-Clause<o:p></o:p></pre>
<pre>  * Copyright(c) 2010-2014 Intel Corporation<o:p></o:p></pre>
<pre>+ * Copyright(c) 2024 Advanced Micro Devices, Inc.<o:p></o:p></pre>
<pre>  */<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> #ifndef _RTE_POWER_H<o:p></o:p></pre>
<pre>@@ -14,14 +15,21 @@<o:p></o:p></pre>
<pre> #include <rte_log.h><o:p></o:p></pre>
<pre> #include <rte_power_guest_channel.h><o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>+#include "rte_power_core_ops.h"<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre> #ifdef __cplusplus<o:p></o:p></pre>
<pre> extern "C" {<o:p></o:p></pre>
<pre> #endif<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> /* Power Management Environment State */<o:p></o:p></pre>
<pre>-enum power_management_env {PM_ENV_NOT_SET, PM_ENV_ACPI_CPUFREQ, PM_ENV_KVM_VM,<o:p></o:p></pre>
<pre>-               PM_ENV_PSTATE_CPUFREQ, PM_ENV_CPPC_CPUFREQ,<o:p></o:p></pre>
<pre>-               PM_ENV_AMD_PSTATE_CPUFREQ};<o:p></o:p></pre>
<pre>+enum power_management_env {<o:p></o:p></pre>
<pre>+       PM_ENV_NOT_SET = 0,<o:p></o:p></pre>
<pre>+       PM_ENV_ACPI_CPUFREQ,<o:p></o:p></pre>
<pre>+       PM_ENV_KVM_VM,<o:p></o:p></pre>
<pre>+       PM_ENV_PSTATE_CPUFREQ,<o:p></o:p></pre>
<pre>+       PM_ENV_CPPC_CPUFREQ,<o:p></o:p></pre>
<pre>+       PM_ENV_AMD_PSTATE_CPUFREQ<o:p></o:p></pre>
<pre>+};<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> /**<o:p></o:p></pre>
<pre>  * Check if a specific power management environment type is supported on a<o:p></o:p></pre>
<pre>@@ -66,6 +74,15 @@ void rte_power_unset_env(void);<o:p></o:p></pre>
<pre>  */<o:p></o:p></pre>
<pre> enum power_management_env rte_power_get_env(void);<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>+/**<o:p></o:p></pre>
<pre>+ * @internal Get the power ops struct from its index.<o:p></o:p></pre>
<pre>+ *<o:p></o:p></pre>
<pre>+ * @return<o:p></o:p></pre>
<pre>+ *   The pointer to the ops struct in the table if registered.<o:p></o:p></pre>
<pre>+ */<o:p></o:p></pre>
<pre>+struct rte_power_core_ops *<o:p></o:p></pre>
<pre>+rte_power_get_core_ops(void);<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre> /**<o:p></o:p></pre>
<pre>  * Initialize power management for a specific lcore. If rte_power_set_env() has<o:p></o:p></pre>
<pre>  * not been called then an auto-detect of the environment will start and<o:p></o:p></pre>
<pre>@@ -108,10 +125,13 @@ int rte_power_exit(unsigned int lcore_id);<o:p></o:p></pre>
<pre>  * @return<o:p></o:p></pre>
<pre>  *  The number of available frequencies.<o:p></o:p></pre>
<pre>  */<o:p></o:p></pre>
<pre>-typedef uint32_t (*rte_power_freqs_t)(unsigned int lcore_id, uint32_t *freqs,<o:p></o:p></pre>
<pre>-               uint32_t num);<o:p></o:p></pre>
<pre>+static inline uint32_t<o:p></o:p></pre>
<pre>+rte_power_freqs(unsigned int lcore_id, uint32_t *freqs, uint32_t n)<o:p></o:p></pre>
<pre>+{<o:p></o:p></pre>
<pre>+       struct rte_power_core_ops *ops = rte_power_get_core_ops();<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>-extern rte_power_freqs_t rte_power_freqs;<o:p></o:p></pre>
<pre>+       return ops->get_avail_freqs(lcore_id, freqs, n);<o:p></o:p></pre>
</blockquote>
<p><o:p> </o:p></p>
<p>This function will segfault if is called before the appropriate init is performed. See comments above on global_power_core_ops.<o:p></o:p></p>
<p>Same for all the functions below that call global_power_core_ops().<o:p></o:p></p>
<p><o:p> </o:p></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre><o:p> </o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> /**<o:p></o:p></pre>
<pre>  * Return the current index of available frequencies of a specific lcore.<o:p></o:p></pre>
<pre>@@ -124,9 +144,13 @@ extern rte_power_freqs_t rte_power_freqs;<o:p></o:p></pre>
<pre>  * @return<o:p></o:p></pre>
<pre>  *  The current index of available frequencies.<o:p></o:p></pre>
<pre>  */<o:p></o:p></pre>
<pre>-typedef uint32_t (*rte_power_get_freq_t)(unsigned int lcore_id);<o:p></o:p></pre>
<pre>+static inline uint32_t<o:p></o:p></pre>
<pre>+rte_power_get_freq(unsigned int lcore_id)<o:p></o:p></pre>
<pre>+{<o:p></o:p></pre>
<pre>+       struct rte_power_core_ops *ops = rte_power_get_core_ops();<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>-extern rte_power_get_freq_t rte_power_get_freq;<o:p></o:p></pre>
<pre>+       return ops->get_freq(lcore_id);<o:p></o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> /**<o:p></o:p></pre>
<pre>  * Set the new frequency for a specific lcore by indicating the index of<o:p></o:p></pre>
<pre>@@ -144,82 +168,101 @@ extern rte_power_get_freq_t rte_power_get_freq;<o:p></o:p></pre>
<pre>  *  - 0 on success without frequency changed.<o:p></o:p></pre>
<pre>  *  - Negative on error.<o:p></o:p></pre>
<pre>  */<o:p></o:p></pre>
<pre>-typedef int (*rte_power_set_freq_t)(unsigned int lcore_id, uint32_t index);<o:p></o:p></pre>
<pre>-<o:p></o:p></pre>
<pre>-extern rte_power_set_freq_t rte_power_set_freq;<o:p></o:p></pre>
<pre>+static inline uint32_t<o:p></o:p></pre>
<pre>+rte_power_set_freq(unsigned int lcore_id, uint32_t index)<o:p></o:p></pre>
<pre>+{<o:p></o:p></pre>
<pre>+       struct rte_power_core_ops *ops = rte_power_get_core_ops();<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>-/**<o:p></o:p></pre>
<pre>- * Function pointer definition for generic frequency change functions. Review<o:p></o:p></pre>
<pre>- * each environments specific documentation for usage.<o:p></o:p></pre>
<pre>- *<o:p></o:p></pre>
<pre>- * @param lcore_id<o:p></o:p></pre>
<pre>- *  lcore id.<o:p></o:p></pre>
<pre>- *<o:p></o:p></pre>
<pre>- * @return<o:p></o:p></pre>
<pre>- *  - 1 on success with frequency changed.<o:p></o:p></pre>
<pre>- *  - 0 on success without frequency changed.<o:p></o:p></pre>
<pre>- *  - Negative on error.<o:p></o:p></pre>
<pre>- */<o:p></o:p></pre>
<pre>-typedef int (*rte_power_freq_change_t)(unsigned int lcore_id);<o:p></o:p></pre>
<pre>+       return ops->set_freq(lcore_id, index);<o:p></o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> /**<o:p></o:p></pre>
<pre>  * Scale up the frequency of a specific lcore according to the available<o:p></o:p></pre>
<pre>  * frequencies.<o:p></o:p></pre>
<pre>  * Review each environments specific documentation for usage.<o:p></o:p></pre>
<pre>  */<o:p></o:p></pre>
<pre>-extern rte_power_freq_change_t rte_power_freq_up;<o:p></o:p></pre>
<pre>+static inline int<o:p></o:p></pre>
<pre>+rte_power_freq_up(unsigned int lcore_id)<o:p></o:p></pre>
<pre>+{<o:p></o:p></pre>
<pre>+       struct rte_power_core_ops *ops = rte_power_get_core_ops();<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+       return ops->freq_up(lcore_id);<o:p></o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> /**<o:p></o:p></pre>
<pre>  * Scale down the frequency of a specific lcore according to the available<o:p></o:p></pre>
<pre>  * frequencies.<o:p></o:p></pre>
<pre>  * Review each environments specific documentation for usage.<o:p></o:p></pre>
<pre>  */<o:p></o:p></pre>
<pre>-extern rte_power_freq_change_t rte_power_freq_down;<o:p></o:p></pre>
<pre>+static inline int<o:p></o:p></pre>
<pre>+rte_power_freq_down(unsigned int lcore_id)<o:p></o:p></pre>
<pre>+{<o:p></o:p></pre>
<pre>+       struct rte_power_core_ops *ops = rte_power_get_core_ops();<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+       return ops->freq_down(lcore_id);<o:p></o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> /**<o:p></o:p></pre>
<pre>  * Scale up the frequency of a specific lcore to the highest according to the<o:p></o:p></pre>
<pre>  * available frequencies.<o:p></o:p></pre>
<pre>  * Review each environments specific documentation for usage.<o:p></o:p></pre>
<pre>  */<o:p></o:p></pre>
<pre>-extern rte_power_freq_change_t rte_power_freq_max;<o:p></o:p></pre>
<pre>+static inline int<o:p></o:p></pre>
<pre>+rte_power_freq_max(unsigned int lcore_id)<o:p></o:p></pre>
<pre>+{<o:p></o:p></pre>
<pre>+       struct rte_power_core_ops *ops = rte_power_get_core_ops();<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+       return ops->freq_max(lcore_id);<o:p></o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> /**<o:p></o:p></pre>
<pre>  * Scale down the frequency of a specific lcore to the lowest according to the<o:p></o:p></pre>
<pre>  * available frequencies.<o:p></o:p></pre>
<pre>  * Review each environments specific documentation for usage..<o:p></o:p></pre>
<pre>  */<o:p></o:p></pre>
<pre>-extern rte_power_freq_change_t rte_power_freq_min;<o:p></o:p></pre>
<pre>+static inline int<o:p></o:p></pre>
<pre>+rte_power_freq_min(unsigned int lcore_id)<o:p></o:p></pre>
<pre>+{<o:p></o:p></pre>
<pre>+       struct rte_power_core_ops *ops = rte_power_get_core_ops();<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+       return ops->freq_min(lcore_id);<o:p></o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> /**<o:p></o:p></pre>
<pre>  * Query the Turbo Boost status of a specific lcore.<o:p></o:p></pre>
<pre>  * Review each environments specific documentation for usage..<o:p></o:p></pre>
<pre>  */<o:p></o:p></pre>
<pre>-extern rte_power_freq_change_t rte_power_turbo_status;<o:p></o:p></pre>
<pre>+static inline int<o:p></o:p></pre>
<pre>+rte_power_turbo_status(unsigned int lcore_id)<o:p></o:p></pre>
<pre>+{<o:p></o:p></pre>
<pre>+       struct rte_power_core_ops *ops = rte_power_get_core_ops();<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+       return ops->turbo_status(lcore_id);<o:p></o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> /**<o:p></o:p></pre>
<pre>  * Enable Turbo Boost for this lcore.<o:p></o:p></pre>
<pre>  * Review each environments specific documentation for usage..<o:p></o:p></pre>
<pre>  */<o:p></o:p></pre>
<pre>-extern rte_power_freq_change_t rte_power_freq_enable_turbo;<o:p></o:p></pre>
<pre>+static inline int<o:p></o:p></pre>
<pre>+rte_power_freq_enable_turbo(unsigned int lcore_id)<o:p></o:p></pre>
<pre>+{<o:p></o:p></pre>
<pre>+       struct rte_power_core_ops *ops = rte_power_get_core_ops();<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+       return ops->enable_turbo(lcore_id);<o:p></o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> /**<o:p></o:p></pre>
<pre>  * Disable Turbo Boost for this lcore.<o:p></o:p></pre>
<pre>  * Review each environments specific documentation for usage..<o:p></o:p></pre>
<pre>  */<o:p></o:p></pre>
<pre>-extern rte_power_freq_change_t rte_power_freq_disable_turbo;<o:p></o:p></pre>
<pre>+static inline int<o:p></o:p></pre>
<pre>+rte_power_freq_disable_turbo(unsigned int lcore_id)<o:p></o:p></pre>
<pre>+{<o:p></o:p></pre>
<pre>+       struct rte_power_core_ops *ops = rte_power_get_core_ops();<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>-/**<o:p></o:p></pre>
<pre>- * Power capabilities summary.<o:p></o:p></pre>
<pre>- */<o:p></o:p></pre>
<pre>-struct rte_power_core_capabilities {<o:p></o:p></pre>
<pre>-       union {<o:p></o:p></pre>
<pre>-               uint64_t capabilities;<o:p></o:p></pre>
<pre>-               struct {<o:p></o:p></pre>
<pre>-                       uint64_t turbo:1;      /**< Turbo can be enabled. */<o:p></o:p></pre>
<pre>-                       uint64_t priority:1;   /**< SST-BF high freq core */<o:p></o:p></pre>
<pre>-               };<o:p></o:p></pre>
<pre>-       };<o:p></o:p></pre>
<pre>-};<o:p></o:p></pre>
<pre>+       return ops->disable_turbo(lcore_id);<o:p></o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> /**<o:p></o:p></pre>
<pre>  * Returns power capabilities for a specific lcore.<o:p></o:p></pre>
<pre>@@ -235,10 +278,14 @@ struct rte_power_core_capabilities {<o:p></o:p></pre>
<pre>  *  - 0 on success.<o:p></o:p></pre>
<pre>  *  - Negative on error.<o:p></o:p></pre>
<pre>  */<o:p></o:p></pre>
<pre>-typedef int (*rte_power_get_capabilities_t)(unsigned int lcore_id,<o:p></o:p></pre>
<pre>-               struct rte_power_core_capabilities *caps);<o:p></o:p></pre>
<pre>+static inline int<o:p></o:p></pre>
<pre>+rte_power_get_capabilities(unsigned int lcore_id,<o:p></o:p></pre>
<pre>+               struct rte_power_core_capabilities *caps)<o:p></o:p></pre>
<pre>+{<o:p></o:p></pre>
<pre>+       struct rte_power_core_ops *ops = rte_power_get_core_ops();<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>-extern rte_power_get_capabilities_t rte_power_get_capabilities;<o:p></o:p></pre>
<pre>+       return ops->get_caps(lcore_id, caps);<o:p></o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> #ifdef __cplusplus<o:p></o:p></pre>
<pre> }<o:p></o:p></pre>
</blockquote>
<p><o:p> </o:p></p>
<p>--snip--<o:p></o:p></p>
<p><o:p> </o:p></p>
</div>
</div>
</div>
</div>
</body>
</html>