get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/136936/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 136936,
    "url": "https://patches.dpdk.org/api/patches/136936/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20240220153326.6236-4-sivaprasad.tummala@amd.com/",
    "project": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20240220153326.6236-4-sivaprasad.tummala@amd.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20240220153326.6236-4-sivaprasad.tummala@amd.com",
    "date": "2024-02-20T15:33:26",
    "name": "[RFC,2/2] power: refactor uncore power management library",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "2e6951c0b30d3d64536697d38f10311bc346bb5a",
    "submitter": {
        "id": 2510,
        "url": "https://patches.dpdk.org/api/people/2510/?format=api",
        "name": "Sivaprasad Tummala",
        "email": "Sivaprasad.Tummala@amd.com"
    },
    "delegate": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20240220153326.6236-4-sivaprasad.tummala@amd.com/mbox/",
    "series": [
        {
            "id": 31156,
            "url": "https://patches.dpdk.org/api/series/31156/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=31156",
            "date": "2024-02-20T15:33:23",
            "name": "power: refactor power management library",
            "version": 1,
            "mbox": "https://patches.dpdk.org/series/31156/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/136936/comments/",
    "check": "fail",
    "checks": "https://patches.dpdk.org/api/patches/136936/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id B1A7743B55;\n\tTue, 20 Feb 2024 16:34:10 +0100 (CET)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id DDA7740A6E;\n\tTue, 20 Feb 2024 16:33:58 +0100 (CET)",
            "from NAM10-MW2-obe.outbound.protection.outlook.com\n (mail-mw2nam10on2088.outbound.protection.outlook.com [40.107.94.88])\n by mails.dpdk.org (Postfix) with ESMTP id AD17F40A6E\n for <dev@dpdk.org>; Tue, 20 Feb 2024 16:33:57 +0100 (CET)",
            "from BN9PR03CA0484.namprd03.prod.outlook.com (2603:10b6:408:130::9)\n by MN2PR12MB4582.namprd12.prod.outlook.com (2603:10b6:208:26b::18)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7316.20; Tue, 20 Feb\n 2024 15:33:53 +0000",
            "from BN1PEPF00004687.namprd05.prod.outlook.com\n (2603:10b6:408:130:cafe::58) by BN9PR03CA0484.outlook.office365.com\n (2603:10b6:408:130::9) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7292.40 via Frontend\n Transport; Tue, 20 Feb 2024 15:33:53 +0000",
            "from SATLEXMB04.amd.com (165.204.84.17) by\n BN1PEPF00004687.mail.protection.outlook.com (10.167.243.132) with Microsoft\n SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id\n 15.20.7292.25 via Frontend Transport; Tue, 20 Feb 2024 15:33:53 +0000",
            "from ubuntu2004.linuxvmimages.local (10.180.168.240) by\n SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server\n (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id\n 15.1.2507.35; Tue, 20 Feb 2024 09:33:48 -0600"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=BUaI1pcgHBnAbK6UMRyDd8cE0f8WUHWtnnvCQi7+SXmkL9U63PbdjA47qi/RdKHySTUiz1GsLI9riLMZpMdoZ4bqxeKtHihpAlZIcLnbkQURisycUZ2BP4zGBWmiLiflD15dlgBpWo3Ytm2ReJrLCZqYc4w0ElGcPrFQYx1gLbeB7K9jbQ/m/fKamli2sKyzkUeB3GGdTpmoKWeUpNgUKoQ8ZDrEECO9CUeDL/X9/T2r00gEbT90+/yyWbwoQ9mhWk304ZyrMYRJ1+SHWFRbwcp/SBCMfl2ZEDsNpdyRUVeiICA4u79jS9TYRMB+bWVwvotJGjvhd4vDfJV1CxCWgg==",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector9901;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;\n bh=Z2L6KRJ+HRuMQ5mmttzbvjWGEnuDF03GPk+DBWet3xA=;\n b=Y5kgwrLiHKQYV3idsvLBim7q0JJxfM5J4bKCjBaIqQaeNsj3pFb7jthsUvZ+IGNA+xtPf+naEv1QgIEdkeQ4Oq3GuQ18AGu9/OTFPaJMg8JKYX4sGkjyy05bSwsrwZ2667q//b0lRXm7UUM/+rToDcCXoFCZFo3keVS4E3H8cAUIVphNH3jgUkcf1mOhPkRNl8oZMaKXS+smDe0Tc3xzrwW+qp0GqbHQMutQmRBcQ15hD6XI14iAHuVbHTH9IP03AEwOFdpFH9+ztO+I5H6Gj2HhlELPD758Mu9JuRgugThaEzdhv8oamNPsqfRnboDS/q5xWIP6g25l/IHxmdBecQ==",
        "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=pass (sender ip is\n 165.204.84.17) smtp.rcpttodomain=intel.com smtp.mailfrom=amd.com; dmarc=pass\n (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com;\n dkim=none (message not signed); arc=none (0)",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=Z2L6KRJ+HRuMQ5mmttzbvjWGEnuDF03GPk+DBWet3xA=;\n b=PBCiJ1qxrYqwvGYBEwY7W2fJl1OohyhspK0Y8p2X7aHrwAUaHtlNrhLfjIGGZ8+6568oGkwzfPnICCVcZ1jjc3+LuSCCvRV1i7q0wG4UfhyaUg1eVqr88LzBoT70pPYUhiSUC+8X4a5UkapfeTg5tvrDR+prQKLHy+03ly+Ak1Q=",
        "X-MS-Exchange-Authentication-Results": "spf=pass (sender IP is 165.204.84.17)\n smtp.mailfrom=amd.com; dkim=none (message not signed)\n header.d=none;dmarc=pass action=none header.from=amd.com;",
        "Received-SPF": "Pass (protection.outlook.com: domain of amd.com designates\n 165.204.84.17 as permitted sender) receiver=protection.outlook.com;\n client-ip=165.204.84.17; helo=SATLEXMB04.amd.com; pr=C",
        "From": "Sivaprasad Tummala <sivaprasad.tummala@amd.com>",
        "To": "<david.hunt@intel.com>, <anatoly.burakov@intel.com>, <jerinj@marvell.com>,\n <radu.nicolau@intel.com>, <gakhil@marvell.com>,\n <cristian.dumitrescu@intel.com>, <ferruh.yigit@amd.com>,\n <konstantin.ananyev@huawei.com>",
        "CC": "<dev@dpdk.org>",
        "Subject": "[RFC PATCH 2/2] power: refactor uncore power management library",
        "Date": "Tue, 20 Feb 2024 16:33:26 +0100",
        "Message-ID": "<20240220153326.6236-4-sivaprasad.tummala@amd.com>",
        "X-Mailer": "git-send-email 2.25.1",
        "In-Reply-To": "<20240220153326.6236-1-sivaprasad.tummala@amd.com>",
        "References": "<20240220153326.6236-1-sivaprasad.tummala@amd.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-Originating-IP": "[10.180.168.240]",
        "X-ClientProxiedBy": "SATLEXMB04.amd.com (10.181.40.145) To SATLEXMB04.amd.com\n (10.181.40.145)",
        "X-EOPAttributedMessage": "0",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-TrafficTypeDiagnostic": "BN1PEPF00004687:EE_|MN2PR12MB4582:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "3e9db743-b520-47b4-9bc8-08dc32295816",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n 3+FbjdUD0AR95DApsI/rPDJo5MsUud10/VxTef8TNVAiY+Y6avhR3lTDCwRn5DIViFDZLVUEOGy6Hngz04VDylUUSYkyijv+/xAOyI2sG7xqH1Ep3wzmJ/cfB1kzp4kJa+MiuYlr0FYALOc9mJxfyI/K9BzS39FyV0XiXpM3rmmtOGnyDykb5tIQPydmkqxMdQ/FbfA9Zqk+J5iUFXfaOdJYsL+oTM/F5ElvFwBBiGKFtVs27MUw+EXN2duAbppfq7C0V5HDZR3AtvJ6XynhXgVyCRe5bxboOHow1yChVSymdCoxFYgl+eK2AO928rY0cqIjqbyUS3xI3yHfxn012GH4mDLeA1ReGKdy3DGtyiSA2IkWlAWYTVT3h0xbkfvrr/lHcxDPnCL5lSHGwoTx78UDY5AknsKKWfRteEhv+DRJ81MmpfARk8y8BcW51rUh8MIhKLlXqhZPm835IxNEY1ejsqwV+qLiB8NKfNiaHJUF9s4IVnO+7s4qAQ20Ca+ISAeyxBFTGJzFzXHhYeeDO89iXqkSQY8q+TpWc2ojxLX37BbkYrWsMnlsQOAGNAHAWt4iwVyi+vQWa64CsM5hOR1vu4s+A5Rkccxk9aUSOgBAsXmW0Hhzm0BwkI4DBSbFzbx3DGCOXSyxFbs3blTZEsazlH2ObO+R9xdqA7m7l54=",
        "X-Forefront-Antispam-Report": "CIP:165.204.84.17; CTRY:US; LANG:en; SCL:1; SRV:;\n IPV:CAL; SFV:NSPM; H:SATLEXMB04.amd.com; PTR:InfoDomainNonexistent; CAT:NONE;\n SFS:(13230031)(36860700004)(40470700004)(46966006); DIR:OUT; SFP:1101;",
        "X-OriginatorOrg": "amd.com",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "20 Feb 2024 15:33:53.2223 (UTC)",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 3e9db743-b520-47b4-9bc8-08dc32295816",
        "X-MS-Exchange-CrossTenant-Id": "3dd8961f-e488-4e60-8e11-a82d994e183d",
        "X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp": "\n TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d; Ip=[165.204.84.17];\n Helo=[SATLEXMB04.amd.com]",
        "X-MS-Exchange-CrossTenant-AuthSource": "\n BN1PEPF00004687.namprd05.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Anonymous",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "HybridOnPrem",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "MN2PR12MB4582",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org"
    },
    "content": "This patch refactors the power management library, addressing uncore\npower management. The primary changes involve the creation of dedicated\ndirectories for each driver within 'drivers/power/uncore/*'. The\nadjustment of meson.build files enables the selective activation\nof individual drivers.\n\nThis refactor significantly improves code organization, enhances\nclarity and boosts maintainability. It lays the foundation for more\nfocused development on individual drivers and facilitates seamless\nintegration of future enhancements, particularly the AMD uncore driver.\n\nSigned-off-by: Sivaprasad Tummala <sivaprasad.tummala@amd.com>\n---\n drivers/power/meson.build                     |   1 +\n drivers/power/uncore/intel/meson.build        |   9 +\n .../power/uncore/intel}/power_intel_uncore.c  |  15 ++\n .../power/uncore/intel}/power_intel_uncore.h  |   0\n drivers/power/uncore/meson.build              |   8 +\n lib/power/meson.build                         |   1 -\n lib/power/rte_power_uncore.c                  | 163 +++++++-----------\n lib/power/rte_power_uncore.h                  | 150 ++++++++++++++--\n lib/power/version.map                         |   1 +\n 9 files changed, 236 insertions(+), 112 deletions(-)\n create mode 100644 drivers/power/uncore/intel/meson.build\n rename {lib/power => drivers/power/uncore/intel}/power_intel_uncore.c (95%)\n rename {lib/power => drivers/power/uncore/intel}/power_intel_uncore.h (100%)\n create mode 100644 drivers/power/uncore/meson.build",
    "diff": "diff --git a/drivers/power/meson.build b/drivers/power/meson.build\nindex 7d9034c7ac..0803e99027 100644\n--- a/drivers/power/meson.build\n+++ b/drivers/power/meson.build\n@@ -3,6 +3,7 @@\n \n drivers = [\n         'core',\n+        'uncore',\n ]\n \n std_deps = ['power']\ndiff --git a/drivers/power/uncore/intel/meson.build b/drivers/power/uncore/intel/meson.build\nnew file mode 100644\nindex 0000000000..187ab15aec\n--- /dev/null\n+++ b/drivers/power/uncore/intel/meson.build\n@@ -0,0 +1,9 @@\n+# SPDX-License-Identifier: BSD-3-Clause\n+# Copyright(c) 2017 Intel Corporation\n+# Copyright(c) 2024 AMD Limited\n+\n+sources = files('power_intel_uncore.c')\n+\n+headers = files('power_intel_uncore.h')\n+\n+deps += ['power']\ndiff --git a/lib/power/power_intel_uncore.c b/drivers/power/uncore/intel/power_intel_uncore.c\nsimilarity index 95%\nrename from lib/power/power_intel_uncore.c\nrename to drivers/power/uncore/intel/power_intel_uncore.c\nindex 3ce8fccec2..3af4cc3bc7 100644\n--- a/lib/power/power_intel_uncore.c\n+++ b/drivers/power/uncore/intel/power_intel_uncore.c\n@@ -476,3 +476,18 @@ power_intel_uncore_get_num_dies(unsigned int pkg)\n \n \treturn count;\n }\n+\n+static struct rte_power_uncore_ops intel_uncore_ops = {\n+\t.init = power_intel_uncore_init,\n+\t.exit = power_intel_uncore_exit,\n+\t.get_avail_freqs = power_intel_uncore_freqs,\n+\t.get_num_pkgs = power_intel_uncore_get_num_pkgs,\n+\t.get_num_dies = power_intel_uncore_get_num_dies,\n+\t.get_num_freqs = power_intel_uncore_get_num_freqs,\n+\t.get_freq = power_get_intel_uncore_freq,\n+\t.set_freq = power_set_intel_uncore_freq,\n+\t.freq_max = power_intel_uncore_freq_max,\n+\t.freq_min = power_intel_uncore_freq_min,\n+};\n+\n+RTE_POWER_REGISTER_UNCORE_OPS(intel_uncore_ops);\ndiff --git a/lib/power/power_intel_uncore.h b/drivers/power/uncore/intel/power_intel_uncore.h\nsimilarity index 100%\nrename from lib/power/power_intel_uncore.h\nrename to drivers/power/uncore/intel/power_intel_uncore.h\ndiff --git a/drivers/power/uncore/meson.build b/drivers/power/uncore/meson.build\nnew file mode 100644\nindex 0000000000..005c0dc622\n--- /dev/null\n+++ b/drivers/power/uncore/meson.build\n@@ -0,0 +1,8 @@\n+# SPDX-License-Identifier: BSD-3-Clause\n+# Copyright(c) 2024 AMD Limited\n+\n+drivers = [\n+        'intel',\n+]\n+\n+std_deps = ['power']\ndiff --git a/lib/power/meson.build b/lib/power/meson.build\nindex 207d96d877..459e9b6e9b 100644\n--- a/lib/power/meson.build\n+++ b/lib/power/meson.build\n@@ -13,7 +13,6 @@ if not is_linux\n endif\n sources = files(\n         'power_common.c',\n-        'power_intel_uncore.c',\n         'rte_power.c',\n         'rte_power_uncore.c',\n         'rte_power_pmd_mgmt.c',\ndiff --git a/lib/power/rte_power_uncore.c b/lib/power/rte_power_uncore.c\nindex 48c75a5da0..8feb41736b 100644\n--- a/lib/power/rte_power_uncore.c\n+++ b/lib/power/rte_power_uncore.c\n@@ -15,88 +15,68 @@\n enum rte_uncore_power_mgmt_env default_uncore_env = RTE_UNCORE_PM_ENV_NOT_SET;\n \n static rte_spinlock_t global_env_cfg_lock = RTE_SPINLOCK_INITIALIZER;\n+static struct rte_power_uncore_ops rte_power_uncore_ops[PM_ENV_MAX];\n \n-static uint32_t\n-power_get_dummy_uncore_freq(unsigned int pkg __rte_unused,\n-\t       unsigned int die __rte_unused)\n-{\n-\treturn 0;\n-}\n-\n-static int\n-power_set_dummy_uncore_freq(unsigned int pkg __rte_unused,\n-\t       unsigned int die __rte_unused, uint32_t index __rte_unused)\n-{\n-\treturn 0;\n-}\n-\n-static int\n-power_dummy_uncore_freq_max(unsigned int pkg __rte_unused,\n-\t       unsigned int die __rte_unused)\n-{\n-\treturn 0;\n-}\n \n-static int\n-power_dummy_uncore_freq_min(unsigned int pkg __rte_unused,\n-\t       unsigned int die __rte_unused)\n+/* register the ops struct in rte_power_uncore_ops, return 0 on success. */\n+int\n+rte_power_register_uncore_ops(const struct rte_power_uncore_ops *op)\n {\n-\treturn 0;\n-}\n+\tstruct rte_power_uncore_ops *ops;\n+\n+\tif ((op->env != RTE_UNCORE_PM_ENV_INTEL_UNCORE) &&\n+\t\t(op->env != RTE_UNCORE_PM_ENV_AMD_HSMP)) {\n+\t\tPOWER_LOG(ERR,\n+\t\t\t\"Unsupported uncore power management environment\\n\");\n+\t\t\treturn -EINVAL;\n+\t\treturn -EINVAL;\n+\t}\n \n-static int\n-power_dummy_uncore_freqs(unsigned int pkg __rte_unused, unsigned int die __rte_unused,\n-\t\tuint32_t *freqs __rte_unused, uint32_t num __rte_unused)\n-{\n-\treturn 0;\n-}\n+\tif (op->status != 0) {\n+\t\tPOWER_LOG(ERR,\n+\t\t\t\"uncore Power management env[%d] ops registered already\\n\",\n+\t\t\top->env);\n+\t\treturn -EINVAL;\n+\t}\n \n-static int\n-power_dummy_uncore_get_num_freqs(unsigned int pkg __rte_unused,\n-\t       unsigned int die __rte_unused)\n-{\n-\treturn 0;\n-}\n+\tif (!op->init || !op->exit || !op->get_num_pkgs || !op->get_num_dies ||\n+\t\t!op->get_num_freqs || !op->get_avail_freqs || !op->get_freq ||\n+\t\t!op->set_freq || !op->freq_max || !op->freq_min) {\n+\t\tPOWER_LOG(ERR, \"Missing callbacks while registering power ops\\n\");\n+\t\treturn -EINVAL;\n+\t}\n+\tops = &rte_power_uncore_ops[op->env];\n+\tops->env = op->env;\n+\tops->init = op->init;\n+\tops->exit = op->exit;\n+\tops->get_num_pkgs = op->get_num_pkgs;\n+\tops->get_num_dies = op->get_num_dies;\n+\tops->get_num_freqs = op->get_num_freqs;\n+\tops->get_avail_freqs = op->get_avail_freqs;\n+\tops->get_freq = op->get_freq;\n+\tops->set_freq = op->set_freq;\n+\tops->freq_max = op->freq_max;\n+\tops->freq_min = op->freq_min;\n+\tops->status = 1; /* registered */\n \n-static unsigned int\n-power_dummy_uncore_get_num_pkgs(void)\n-{\n \treturn 0;\n }\n \n-static unsigned int\n-power_dummy_uncore_get_num_dies(unsigned int pkg __rte_unused)\n+struct rte_power_uncore_ops *\n+rte_power_get_uncore_ops(int ops_index)\n {\n-\treturn 0;\n-}\n+\tRTE_VERIFY((ops_index != RTE_UNCORE_PM_ENV_INTEL_UNCORE) &&\n+\t\t\t(ops_index != RTE_UNCORE_PM_ENV_AMD_HSMP));\n+\tRTE_VERIFY(rte_power_uncore_ops[ops_index].status != 0);\n \n-/* function pointers */\n-rte_power_get_uncore_freq_t rte_power_get_uncore_freq = power_get_dummy_uncore_freq;\n-rte_power_set_uncore_freq_t rte_power_set_uncore_freq = power_set_dummy_uncore_freq;\n-rte_power_uncore_freq_change_t rte_power_uncore_freq_max = power_dummy_uncore_freq_max;\n-rte_power_uncore_freq_change_t rte_power_uncore_freq_min = power_dummy_uncore_freq_min;\n-rte_power_uncore_freqs_t rte_power_uncore_freqs = power_dummy_uncore_freqs;\n-rte_power_uncore_get_num_freqs_t rte_power_uncore_get_num_freqs = power_dummy_uncore_get_num_freqs;\n-rte_power_uncore_get_num_pkgs_t rte_power_uncore_get_num_pkgs = power_dummy_uncore_get_num_pkgs;\n-rte_power_uncore_get_num_dies_t rte_power_uncore_get_num_dies = power_dummy_uncore_get_num_dies;\n-\n-static void\n-reset_power_uncore_function_ptrs(void)\n-{\n-\trte_power_get_uncore_freq = power_get_dummy_uncore_freq;\n-\trte_power_set_uncore_freq = power_set_dummy_uncore_freq;\n-\trte_power_uncore_freq_max = power_dummy_uncore_freq_max;\n-\trte_power_uncore_freq_min = power_dummy_uncore_freq_min;\n-\trte_power_uncore_freqs  = power_dummy_uncore_freqs;\n-\trte_power_uncore_get_num_freqs = power_dummy_uncore_get_num_freqs;\n-\trte_power_uncore_get_num_pkgs = power_dummy_uncore_get_num_pkgs;\n-\trte_power_uncore_get_num_dies = power_dummy_uncore_get_num_dies;\n+\treturn &rte_power_uncore_ops[ops_index];\n }\n \n int\n rte_power_set_uncore_env(enum rte_uncore_power_mgmt_env env)\n {\n-\tint ret;\n+\tint ret = 0;\n+\tstruct rte_power_uncore_ops *ops;\n \n \trte_spinlock_lock(&global_env_cfg_lock);\n \n@@ -113,24 +93,15 @@ rte_power_set_uncore_env(enum rte_uncore_power_mgmt_env env)\n \t\t */\n \t\tenv = RTE_UNCORE_PM_ENV_INTEL_UNCORE;\n \n-\tret = 0;\n-\tif (env == RTE_UNCORE_PM_ENV_INTEL_UNCORE) {\n-\t\trte_power_get_uncore_freq = power_get_intel_uncore_freq;\n-\t\trte_power_set_uncore_freq = power_set_intel_uncore_freq;\n-\t\trte_power_uncore_freq_min  = power_intel_uncore_freq_min;\n-\t\trte_power_uncore_freq_max  = power_intel_uncore_freq_max;\n-\t\trte_power_uncore_freqs = power_intel_uncore_freqs;\n-\t\trte_power_uncore_get_num_freqs = power_intel_uncore_get_num_freqs;\n-\t\trte_power_uncore_get_num_pkgs = power_intel_uncore_get_num_pkgs;\n-\t\trte_power_uncore_get_num_dies = power_intel_uncore_get_num_dies;\n-\t} else {\n+\t}\n+\n+\tops = rte_power_get_uncore_ops(env);\n+\tif (ops->status == 0) {\n \t\tPOWER_LOG(ERR, \"Invalid Power Management Environment(%d) set\", env);\n \t\tret = -1;\n-\t\tgoto out;\n-\t}\n+\t} else\n+\t\tdefault_uncore_env = env;\n \n-\tdefault_uncore_env = env;\n-out:\n \trte_spinlock_unlock(&global_env_cfg_lock);\n \treturn ret;\n }\n@@ -140,7 +111,6 @@ rte_power_unset_uncore_env(void)\n {\n \trte_spinlock_lock(&global_env_cfg_lock);\n \tdefault_uncore_env = RTE_UNCORE_PM_ENV_NOT_SET;\n-\treset_power_uncore_function_ptrs();\n \trte_spinlock_unlock(&global_env_cfg_lock);\n }\n \n@@ -154,18 +124,18 @@ int\n rte_power_uncore_init(unsigned int pkg, unsigned int die)\n {\n \tint ret = -1;\n+\tstruct rte_power_uncore_ops *ops;\n \n-\tswitch (default_uncore_env) {\n-\tcase RTE_UNCORE_PM_ENV_INTEL_UNCORE:\n-\t\treturn power_intel_uncore_init(pkg, die);\n-\tdefault:\n-\t\tPOWER_LOG(INFO, \"Uncore Env isn't set yet!\");\n-\t\tbreak;\n+\tif ((default_uncore_env != RTE_UNCORE_PM_ENV_NOT_SET) &&\n+\t\t(default_uncore_env != RTE_UNCORE_PM_ENV_AUTO_DETECT)) {\n+\t\tops = rte_power_get_uncore_ops(default_uncore_env);\n+\t\treturn ops->init(pkg, die);\n \t}\n \n \t/* Auto detect Environment */\n \tPOWER_LOG(INFO, \"Attempting to initialise Intel Uncore power mgmt...\");\n-\tret = power_intel_uncore_init(pkg, die);\n+\tops = rte_power_get_uncore_ops(RTE_UNCORE_PM_ENV_INTEL_UNCORE);\n+\tret = ops->init(pkg, die);\n \tif (ret == 0) {\n \t\trte_power_set_uncore_env(RTE_UNCORE_PM_ENV_INTEL_UNCORE);\n \t\tgoto out;\n@@ -183,12 +153,13 @@ rte_power_uncore_init(unsigned int pkg, unsigned int die)\n int\n rte_power_uncore_exit(unsigned int pkg, unsigned int die)\n {\n-\tswitch (default_uncore_env) {\n-\tcase RTE_UNCORE_PM_ENV_INTEL_UNCORE:\n-\t\treturn power_intel_uncore_exit(pkg, die);\n-\tdefault:\n-\t\tPOWER_LOG(ERR, \"Uncore Env has not been set, unable to exit gracefully\");\n-\t\tbreak;\n+\tstruct rte_power_uncore_ops *ops;\n+\n+\tif (default_uncore_env == RTE_UNCORE_PM_ENV_NOT_SET) {\n+\t\tPOWER_LOG(ERR,\n+\t\t\t\"Uncore Env has not been set, unable to exit gracefully\");\n+\t\treturn -1;\n \t}\n-\treturn -1;\n+\tops = rte_power_get_uncore_ops(default_uncore_env);\n+\treturn ops->exit(pkg, die);\n }\ndiff --git a/lib/power/rte_power_uncore.h b/lib/power/rte_power_uncore.h\nindex 99859042dd..fe14a1bbe5 100644\n--- a/lib/power/rte_power_uncore.h\n+++ b/lib/power/rte_power_uncore.h\n@@ -58,6 +58,81 @@ void rte_power_unset_uncore_env(void);\n __rte_experimental\n enum rte_uncore_power_mgmt_env rte_power_get_uncore_env(void);\n \n+/**\n+ * Function pointers for generic frequency change functions.\n+ *\n+ * @param pkg\n+ *  Package number.\n+ *  Each physical CPU in a system is referred to as a package.\n+ * @param die\n+ *  Die number.\n+ *  Each package can have several dies connected together via the uncore mesh.\n+ *\n+ * @return\n+ *  - 1 on success with frequency changed.\n+ *  - 0 on success without frequency changed.\n+ *  - Negative on error.\n+ */\n+typedef int (*rte_power_uncore_init_t)(unsigned int pkg, unsigned int die);\n+typedef int (*rte_power_uncore_exit_t)(unsigned int pkg, unsigned int die);\n+\n+typedef uint32_t (*rte_power_get_uncore_freq_t)(unsigned int pkg, unsigned int die);\n+typedef int (*rte_power_set_uncore_freq_t)(unsigned int pkg, unsigned int die, uint32_t index);\n+typedef int (*rte_power_uncore_get_num_freqs_t)(unsigned int pkg, unsigned int die);\n+typedef int (*rte_power_uncore_freqs_t)(unsigned int pkg, unsigned int die,\n+\t\t\t\t\tuint32_t *freqs, uint32_t num);\n+typedef int (*rte_power_uncore_freq_change_t)(unsigned int pkg, unsigned int die);\n+typedef unsigned int (*rte_power_uncore_get_num_pkgs_t)(void);\n+typedef unsigned int (*rte_power_uncore_get_num_dies_t)(unsigned int pkg);\n+\n+/** Structure defining uncore power operations structure */\n+struct rte_power_uncore_ops {\n+\tuint8_t status;                         /**< ops register status. */\n+\tenum rte_uncore_power_mgmt_env env;          /**< power mgmt env. */\n+\trte_power_uncore_init_t init;    /**< Initialize power management. */\n+\trte_power_uncore_exit_t exit;    /**< Exit power management. */\n+\trte_power_uncore_get_num_pkgs_t get_num_pkgs;\n+\trte_power_uncore_get_num_dies_t get_num_dies;\n+\trte_power_uncore_get_num_freqs_t get_num_freqs; /**< Number of available frequencies. */\n+\trte_power_uncore_freqs_t get_avail_freqs; /**< Get the available frequencies. */\n+\trte_power_get_uncore_freq_t get_freq; /**< Get frequency index. */\n+\trte_power_set_uncore_freq_t set_freq; /**< Set frequency index. */\n+\trte_power_uncore_freq_change_t freq_max;  /**< Scale up frequency to highest. */\n+\trte_power_uncore_freq_change_t freq_min;  /**< Scale up frequency to lowest. */\n+} __rte_cache_aligned;\n+\n+\n+/**\n+ * Register power uncore frequency operations.\n+ * @param ops\n+ *   Pointer to an ops structure to register.\n+ * @return\n+ *   - >=0: Success; return the index of the ops struct in the table.\n+ *   - -EINVAL - error while registering ops struct.\n+ */\n+__rte_internal\n+int rte_power_register_uncore_ops(const struct rte_power_uncore_ops *ops);\n+\n+/**\n+ * Macro to statically register the ops of an uncore driver.\n+ */\n+#define RTE_POWER_REGISTER_UNCORE_OPS(ops)\t\t\\\n+\t(RTE_INIT(power_hdlr_init_uncore_##ops)         \\\n+\t{                                               \\\n+\t\trte_power_register_uncore_ops(&ops);    \\\n+\t})\n+\n+/**\n+ * @internal Get the power uncore ops struct from its index.\n+ *\n+ * @param ops_index\n+ *   The index of the ops struct in the ops struct table.\n+ * @return\n+ *   The pointer to the ops struct in the table if registered.\n+ */\n+struct rte_power_uncore_ops *\n+rte_power_get_uncore_ops(int ops_index);\n+\n /**\n  * Initialize uncore frequency management for specific die on a package.\n  * It will get the available frequencies and prepare to set new die frequencies.\n@@ -116,9 +191,14 @@ rte_power_uncore_exit(unsigned int pkg, unsigned int die);\n  *  The current index of available frequencies.\n  *  If error, it will return 'RTE_POWER_INVALID_FREQ_INDEX = (~0)'.\n  */\n-typedef uint32_t (*rte_power_get_uncore_freq_t)(unsigned int pkg, unsigned int die);\n+static inline uint32_t\n+rte_power_get_uncore_freq(unsigned int pkg, unsigned int die)\n+{\n+\tstruct rte_power_uncore_ops *ops;\n \n-extern rte_power_get_uncore_freq_t rte_power_get_uncore_freq;\n+\tops = rte_power_get_uncore_ops(rte_power_get_uncore_env());\n+\treturn ops->get_freq(pkg, die);\n+}\n \n /**\n  * Set minimum and maximum uncore frequency for specified die on a package\n@@ -141,9 +221,15 @@ extern rte_power_get_uncore_freq_t rte_power_get_uncore_freq;\n  *  - 0 on success without frequency changed.\n  *  - Negative on error.\n  */\n-typedef int (*rte_power_set_uncore_freq_t)(unsigned int pkg, unsigned int die, uint32_t index);\n+static inline uint32_t\n+rte_power_set_uncore_freq(unsigned int pkg, unsigned int die, uint32_t index)\n+{\n+\tstruct rte_power_uncore_ops *ops;\n+\n+\tops = rte_power_get_uncore_ops(rte_power_get_uncore_env());\n+\treturn ops->set_freq(pkg, die, index);\n+}\n \n-extern rte_power_set_uncore_freq_t rte_power_set_uncore_freq;\n \n /**\n  * Function pointer definition for generic frequency change functions.\n@@ -169,7 +255,14 @@ typedef int (*rte_power_uncore_freq_change_t)(unsigned int pkg, unsigned int die\n  *\n  * This function should NOT be called in the fast path.\n  */\n-extern rte_power_uncore_freq_change_t rte_power_uncore_freq_max;\n+static inline uint32_t\n+rte_power_uncore_freq_max(unsigned int pkg, unsigned int die)\n+{\n+\tstruct rte_power_uncore_ops *ops;\n+\n+\tops = rte_power_get_uncore_ops(rte_power_get_uncore_env());\n+\treturn ops->freq_max(pkg, die);\n+}\n \n /**\n  * Set minimum and maximum uncore frequency for specified die on a package\n@@ -178,7 +271,14 @@ extern rte_power_uncore_freq_change_t rte_power_uncore_freq_max;\n  *\n  * This function should NOT be called in the fast path.\n  */\n-extern rte_power_uncore_freq_change_t rte_power_uncore_freq_min;\n+static inline uint32_t\n+rte_power_uncore_freq_min(unsigned int pkg, unsigned int die)\n+{\n+\tstruct rte_power_uncore_ops *ops;\n+\n+\tops = rte_power_get_uncore_ops(rte_power_get_uncore_env());\n+\treturn ops->freq_min(pkg, die);\n+}\n \n /**\n  * Return the list of available frequencies in the index array.\n@@ -200,10 +300,15 @@ extern rte_power_uncore_freq_change_t rte_power_uncore_freq_min;\n  *  - The number of available index's in frequency array.\n  *  - Negative on error.\n  */\n-typedef int (*rte_power_uncore_freqs_t)(unsigned int pkg, unsigned int die,\n-\t\tuint32_t *freqs, uint32_t num);\n+static inline uint32_t\n+rte_power_uncore_freqs(unsigned int pkg, unsigned int die,\n+\t\tuint32_t *freqs, uint32_t num)\n+{\n+\tstruct rte_power_uncore_ops *ops;\n \n-extern rte_power_uncore_freqs_t rte_power_uncore_freqs;\n+\tops = rte_power_get_uncore_ops(rte_power_get_uncore_env());\n+\treturn ops->get_avail_freqs(pkg, die, freqs, num);\n+}\n \n /**\n  * Return the list length of available frequencies in the index array.\n@@ -221,9 +326,14 @@ extern rte_power_uncore_freqs_t rte_power_uncore_freqs;\n  *  - The number of available index's in frequency array.\n  *  - Negative on error.\n  */\n-typedef int (*rte_power_uncore_get_num_freqs_t)(unsigned int pkg, unsigned int die);\n+static inline int\n+rte_power_uncore_get_num_freqs(unsigned int pkg, unsigned int die)\n+{\n+\tstruct rte_power_uncore_ops *ops;\n \n-extern rte_power_uncore_get_num_freqs_t rte_power_uncore_get_num_freqs;\n+\tops = rte_power_get_uncore_ops(rte_power_get_uncore_env());\n+\treturn ops->get_num_freqs(pkg, die);\n+}\n \n /**\n  * Return the number of packages (CPUs) on a system\n@@ -235,9 +345,14 @@ extern rte_power_uncore_get_num_freqs_t rte_power_uncore_get_num_freqs;\n  *  - Zero on error.\n  *  - Number of package on system on success.\n  */\n-typedef unsigned int (*rte_power_uncore_get_num_pkgs_t)(void);\n+static inline unsigned int\n+rte_power_uncore_get_num_pkgs(void)\n+{\n+\tstruct rte_power_uncore_ops *ops;\n \n-extern rte_power_uncore_get_num_pkgs_t rte_power_uncore_get_num_pkgs;\n+\tops = rte_power_get_uncore_ops(rte_power_get_uncore_env());\n+\treturn ops->get_num_pkgs(void);\n+}\n \n /**\n  * Return the number of dies for pakckages (CPUs) specified\n@@ -253,9 +368,14 @@ extern rte_power_uncore_get_num_pkgs_t rte_power_uncore_get_num_pkgs;\n  *  - Zero on error.\n  *  - Number of dies for package on sucecss.\n  */\n-typedef unsigned int (*rte_power_uncore_get_num_dies_t)(unsigned int pkg);\n+static inline unsigned int\n+rte_power_uncore_get_num_dies(unsigned int pkg)\n+{\n+\tstruct rte_power_uncore_ops *ops;\n \n-extern rte_power_uncore_get_num_dies_t rte_power_uncore_get_num_dies;\n+\tops = rte_power_get_uncore_ops(rte_power_get_uncore_env());\n+\treturn ops->get_num_dies(pkg);\n+}\n \n #ifdef __cplusplus\n }\ndiff --git a/lib/power/version.map b/lib/power/version.map\nindex 2f89645ec2..d8a6f9436c 100644\n--- a/lib/power/version.map\n+++ b/lib/power/version.map\n@@ -57,6 +57,7 @@ INTERNAL {\n        global:\n \n        rte_power_register_ops;\n+       rte_power_register_uncore_ops;\n        cpufreq_check_scaling_driver;\n        power_set_governor;\n        open_core_sysfs_file;\n",
    "prefixes": [
        "RFC",
        "2/2"
    ]
}