From nobody Sun Feb 8 16:32:43 2026 Received: from SN4PR0501CU005.outbound.protection.outlook.com (mail-southcentralusazon11011066.outbound.protection.outlook.com [40.93.194.66]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9BB333002D4; Fri, 12 Dec 2025 18:19:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.194.66 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765563543; cv=fail; b=m6zk7LiKrTgBKHiIdKa45L9hxqWHCTCAw1P5/kwEiPzGGsuJwjOEcINQzzmoPCDp2+b6z9QUBt+PqnPMc/BC9xa5ttfEKeBukQJDG+h/x87BeS+h8GF8VESvqbIORt6FeP2bdpru/6uZKr22VwQHm4UtNoLwqZVgktqkIALJ7Vs= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765563543; c=relaxed/simple; bh=IN/BSGg/xKw5FkTdifs9JgD4v2RX05s6k+rLhoOsAWY=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Nj0xQJYH9QgdAR8SUcNfEuw/Tq6lFRUR85rWZRwjcxfl951mLNNMPcefvRD0ngTnrmwvYwhFXHzOia1VyNH7+RTBVN1XAyKsw+Vr1hFr3DXNyr9uBkgejbOFg05WqMiRE5fWVd3GthmF38Iql49l0TBn6P+MFO1KK3JeChQl2dY= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=dE4ZOC82; arc=fail smtp.client-ip=40.93.194.66 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="dE4ZOC82" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=D+LzMINsiGFxceZgNTQIG05wQBNryQgLfndeNoe2L/XsUzMtQ5EWIUbwOMkF4KFZOyZvjbNOrDqJ0NizJHBNdeRUAT0cqK9KweKTRROc/mhOwW6XCwrPQ+hJi60uYvr0bybRWWmGufnQjRpPTo0r510fa2eMxYY+14Wmx5MOR45qugnvkXY09c9E3Ha4OULnWzo2QUp8aaheCq+Lp4Tr2OWRWTk5y9PYe2+agHTHkzN0gyYGRgaTydsptzkaz89bh/2mKg8sV2hw3kzVQ8cKcGXtXAfqFPTk/XbdTcODYddaO5QBZj4C9bEXHZiesLGmcIZ0pFawEagrDOm1ciWQow== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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; bh=nA3w352/1hZpfaTUrFo0xBplOOUVgnk5p220tX7LKFY=; b=aPthNQB5UEIoWrkjsBMbSS/oSjBlVJvMof0LTMQxaT33YxLt0eAD0nL9+FykzZOtzZEBfu6IeusLUxmm9CK16381brVOEgq4Fi0J1HlsSnt/Xl69O6A+oXz4uZVBEG62bxG8oYk9xiFekR97MVz/DKYqGn9YoYUniMFmYKb1dMJH4/cliz2iDmvpXa1NxwqldfuXVyKvhul2N+I8jhuShWz0JSIFKIM4hG+uTiZ2aFsSQhRb+JG+pj+DuFJg8nGa/kG/p5EzArAFyCmK84nY3663Amh2FgM2X+yaJqlFwhosevyKxVhLH84KEvnWWxio/42BSXnh7D2NlF141kc8Vg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=linux.intel.com smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=nA3w352/1hZpfaTUrFo0xBplOOUVgnk5p220tX7LKFY=; b=dE4ZOC827Z10fMsyXulX+2b3po/qu4mQxNNkXeBXB01cAYlNfAosz3sOVr/h8oIkAVth+NEom76a992XS8W1RFb8j4E19FyXCwDbpFhfX+8CfYOpnSD9p7yOJd6fccewABwQP1wU2uJFGn8i83n4GJqxJZHh3OPgUTm7eY2baAE= Received: from DS7PR03CA0151.namprd03.prod.outlook.com (2603:10b6:5:3b2::6) by MW4PR12MB7466.namprd12.prod.outlook.com (2603:10b6:303:212::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9412.11; Fri, 12 Dec 2025 18:18:56 +0000 Received: from CY4PEPF0000FCC1.namprd03.prod.outlook.com (2603:10b6:5:3b2:cafe::f7) by DS7PR03CA0151.outlook.office365.com (2603:10b6:5:3b2::6) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9388.15 via Frontend Transport; Fri, 12 Dec 2025 18:18:42 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb08.amd.com; pr=C Received: from satlexmb08.amd.com (165.204.84.17) by CY4PEPF0000FCC1.mail.protection.outlook.com (10.167.242.103) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9412.4 via Frontend Transport; Fri, 12 Dec 2025 18:18:55 +0000 Received: from satlexmb08.amd.com (10.181.42.217) by satlexmb08.amd.com (10.181.42.217) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Fri, 12 Dec 2025 12:18:54 -0600 Received: from xsjlizhih51.xilinx.com (10.180.168.240) by satlexmb08.amd.com (10.181.42.217) with Microsoft SMTP Server id 15.2.2562.17 via Frontend Transport; Fri, 12 Dec 2025 10:18:53 -0800 From: Lizhi Hou To: , , , , CC: Shyam Sundar S K , , , , , , , , "Patil Rajesh Reddy" , Lizhi Hou Subject: [PATCH V2 1/2] platform/x86/amd/pmf: Introduce new interface to export NPU metrics Date: Fri, 12 Dec 2025 10:18:02 -0800 Message-ID: <20251212181803.1825142-2-lizhi.hou@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20251212181803.1825142-1-lizhi.hou@amd.com> References: <20251212181803.1825142-1-lizhi.hou@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CY4PEPF0000FCC1:EE_|MW4PR12MB7466:EE_ X-MS-Office365-Filtering-Correlation-Id: 504d115c-a3c5-4a46-f172-08de39aae96e X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700013|376014|1800799024|82310400026; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?YpzjCNhy+G1tPXX6Ytfgu5ejzHteMweqR5eqjX4NYG1Ml7MXqhDJcfLO7gtd?= =?us-ascii?Q?HEiYgby0CyBHz+2Inzi+oie48eks33cuGAQ1zO9Lo2RgaS2sBBRprM7T0o5L?= =?us-ascii?Q?1cyQOjsRCvhmbVB2TVh3I289kSGBE5Ko9YYFMeaaEGaiep4I+S34BXVPL7rA?= =?us-ascii?Q?JHV/oUtxvTl2d2ZOHSnyeAeL0RUXtX10/CU+NUIcWEucEMzqX1LbaJ7CtpYH?= =?us-ascii?Q?qY+ERH+r9bLa46xkXP2CzaMD7CO9oSwUX4xaftxgx9n0VjD/S05eIIZgJJnB?= =?us-ascii?Q?jMuJT9VMH692BnL493hngiSEA6sJCzcLVgby60YspMHk7exrgxut41xm0Wml?= =?us-ascii?Q?nK9isKOiiqMaS00eB6aEYLOvoDZFmKhcZJ91GlAeTSaZKbhQ9FR56k1MyL9n?= =?us-ascii?Q?5lJg3NdVTmFTZUKEEDceqIhHST0JOGFB8D892KPigJ8rvIKCcGMwX3KGbuWi?= =?us-ascii?Q?jEomTuDTnb2GoFMAuyKarIUdJx0kjU6aunIe07/Hr8nS+VVKriLfC1iyN3q7?= =?us-ascii?Q?Iio8iAYkSUTWD1kzabl9lArBrw07qyk/M6roHJGte+MGnXEgn8uWTMoy4bn9?= =?us-ascii?Q?54mauqok2cctanAoBy7h0JVpMCCrLoBV+qIUEbavoFfAJjcp5g2mKLuQokkp?= =?us-ascii?Q?ja+eCRFgZgb5FDlKDyg3KeHDP7+YndLGdCsnNHa8iWZved84nHHW32QVzoJ7?= =?us-ascii?Q?TR0NDxHcPSo4bXGsWAeHK1Mxa2tJlcaFDKbNYDAUF7cs0MVHF2kKqlZT6sBo?= =?us-ascii?Q?F4NIxFb+4F9R9BrpRTQgSAZnsDie2d/ZzkibhdFrBvPUsw3HVR6488BDqFZJ?= =?us-ascii?Q?HnE8rGwyndxVrNt6xSyFiawRlMuVulOPg+7ZUmQ5pGCHbagw8RNJ6mRf5nNS?= =?us-ascii?Q?ICK7T7HkWiixUliPI5i6edWPpX2tbw3QUmemIki+tsjM53OdUZ/cQraA9b//?= =?us-ascii?Q?Z7aBzV3UydsM0qpkram0+MJ1CR9kDn/XHt8uyQEWfL8wjT3XFrnO00VP7zP+?= =?us-ascii?Q?r7kp4MnxK2bEQn66hneuWI+69LpTk/DQ8tDt32Y1npGasbMgx9o2Udd1VfAk?= =?us-ascii?Q?tH5K3jaasYahVLTvRbDOAK3+HzAIwj2zy4RWcRyEesxdsa6UPUznacV+CXzl?= =?us-ascii?Q?MSuip728criSHprwrJDKsGF8xhcPspTTFfchKRdrVrG5h/oGWtA4IRc3m92q?= =?us-ascii?Q?vPS2ZZBiWdBEQFwJtDaCYhEbmtB4f4kgf32CgkJE8FC06MyJXzs5aNJvILCr?= =?us-ascii?Q?3U+K5dvI/BOjJgOiAjrsZ7U6P41nb3aL6etmOEKxp9sklIEhKaf+629wcPc7?= =?us-ascii?Q?9SF8otON/LBMHbCZhbZseoPJz2XpbYAyLIqZ1C8tE/jCJoNJK0MKwv7r5/lK?= =?us-ascii?Q?3QESi7wAA9N9/+NB2IwWAgSOnCBjYm8V9b99DkO/wcfqxTTHnSWINKuYHcXE?= =?us-ascii?Q?o3SbVJBmNJm1azcUFKqUSxW43ZasGKLqEb+qqwOv71xWR0+3GLwbGr97RAUY?= =?us-ascii?Q?mM9Pye6HnMPaetiWacNUEMwv6qzWohmwmiAr7IYe8WDRH+ZscE+Zs9sYq5rC?= =?us-ascii?Q?AMfKaHfVD8OtG+4ejtA=3D?= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb08.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(36860700013)(376014)(1800799024)(82310400026);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Dec 2025 18:18:55.5907 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 504d115c-a3c5-4a46-f172-08de39aae96e X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb08.amd.com] X-MS-Exchange-CrossTenant-AuthSource: CY4PEPF0000FCC1.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW4PR12MB7466 Content-Type: text/plain; charset="utf-8" From: Shyam Sundar S K The PMF driver retrieves NPU metrics data from the PMFW. Introduce a new interface to make NPU metrics accessible to other drivers like AMDXDNA driver, which can access and utilize this information as needed. Reviewed-by: Mario Limonciello Co-developed-by: Patil Rajesh Reddy Signed-off-by: Patil Rajesh Reddy Signed-off-by: Shyam Sundar S K Signed-off-by: Lizhi Hou --- drivers/platform/x86/amd/pmf/core.c | 75 +++++++++++++++++++++++++++++ drivers/platform/x86/amd/pmf/pmf.h | 2 + include/linux/amd-pmf-io.h | 21 ++++++++ 3 files changed, 98 insertions(+) diff --git a/drivers/platform/x86/amd/pmf/core.c b/drivers/platform/x86/amd= /pmf/core.c index a6a5d416edf9..8e4ce91b3527 100644 --- a/drivers/platform/x86/amd/pmf/core.c +++ b/drivers/platform/x86/amd/pmf/core.c @@ -8,12 +8,15 @@ * Author: Shyam Sundar S K */ =20 +#include +#include #include #include #include #include #include #include +#include #include #include "pmf.h" =20 @@ -53,6 +56,8 @@ static bool force_load; module_param(force_load, bool, 0444); MODULE_PARM_DESC(force_load, "Force load this driver on supported older pl= atforms (experimental)"); =20 +static struct device *pmf_device; + static int amd_pmf_pwr_src_notify_call(struct notifier_block *nb, unsigned= long event, void *data) { struct amd_pmf_dev *pmf =3D container_of(nb, struct amd_pmf_dev, pwr_src_= notifier); @@ -314,6 +319,70 @@ int amd_pmf_init_metrics_table(struct amd_pmf_dev *dev) return 0; } =20 +static int is_npu_metrics_supported(struct amd_pmf_dev *pdev) +{ + switch (pdev->cpu_id) { + case PCI_DEVICE_ID_AMD_1AH_M20H_ROOT: + case PCI_DEVICE_ID_AMD_1AH_M60H_ROOT: + return 0; + default: + return -EOPNOTSUPP; + } +} + +static int amd_pmf_get_smu_metrics(struct amd_pmf_dev *dev, struct amd_pmf= _npu_metrics *data) +{ + int ret, i; + + guard(mutex)(&dev->metrics_mutex); + + if (is_npu_metrics_supported(dev)) + return -EOPNOTSUPP; + + ret =3D amd_pmf_set_dram_addr(dev, true); + if (ret) + return ret; + + memset(dev->buf, 0, dev->mtable_size); + + /* Send SMU command to get NPU metrics */ + ret =3D amd_pmf_send_cmd(dev, SET_TRANSFER_TABLE, SET_CMD, METRICS_TABLE_= ID, NULL); + if (ret) { + dev_err(dev->dev, "SMU command failed to get NPU metrics: %d\n", ret); + return ret; + } + + memcpy(&dev->m_table_v2, dev->buf, dev->mtable_size); + + data->npuclk_freq =3D dev->m_table_v2.npuclk_freq; + for (i =3D 0; i < ARRAY_SIZE(data->npu_busy); i++) + data->npu_busy[i] =3D dev->m_table_v2.npu_busy[i]; + data->npu_power =3D dev->m_table_v2.npu_power; + data->mpnpuclk_freq =3D dev->m_table_v2.mpnpuclk_freq; + data->npu_reads =3D dev->m_table_v2.npu_reads; + data->npu_writes =3D dev->m_table_v2.npu_writes; + + return 0; +} + +int amd_pmf_get_npu_data(struct amd_pmf_npu_metrics *info) +{ + struct amd_pmf_dev *pdev; + + if (!info) + return -EINVAL; + + if (!pmf_device) + return -ENODEV; + + pdev =3D dev_get_drvdata(pmf_device); + if (!pdev) + return -ENODEV; + + return amd_pmf_get_smu_metrics(pdev, info); +} +EXPORT_SYMBOL_GPL(amd_pmf_get_npu_data); + static int amd_pmf_suspend_handler(struct device *dev) { struct amd_pmf_dev *pdev =3D dev_get_drvdata(dev); @@ -469,6 +538,10 @@ static int amd_pmf_probe(struct platform_device *pdev) mutex_init(&dev->update_mutex); mutex_init(&dev->cb_mutex); =20 + err =3D devm_mutex_init(dev->dev, &dev->metrics_mutex); + if (err) + return err; + apmf_acpi_init(dev); platform_set_drvdata(pdev, dev); amd_pmf_dbgfs_register(dev); @@ -477,6 +550,8 @@ static int amd_pmf_probe(struct platform_device *pdev) if (is_apmf_func_supported(dev, APMF_FUNC_SBIOS_HEARTBEAT_V2)) amd_pmf_notify_sbios_heartbeat_event_v2(dev, ON_LOAD); =20 + pmf_device =3D dev->dev; + dev_info(dev->dev, "registered PMF device successfully\n"); =20 return 0; diff --git a/drivers/platform/x86/amd/pmf/pmf.h b/drivers/platform/x86/amd/= pmf/pmf.h index f07e9f4c660a..0354cc5dc79e 100644 --- a/drivers/platform/x86/amd/pmf/pmf.h +++ b/drivers/platform/x86/amd/pmf/pmf.h @@ -12,6 +12,7 @@ #define PMF_H =20 #include +#include #include #include #include @@ -412,6 +413,7 @@ struct amd_pmf_dev { struct apmf_sbios_req_v1 req1; struct pmf_bios_inputs_prev cb_prev; /* To preserve custom BIOS inputs */ bool cb_flag; /* To handle first custom BIOS input */ + struct mutex metrics_mutex; }; =20 struct apmf_sps_prop_granular_v2 { diff --git a/include/linux/amd-pmf-io.h b/include/linux/amd-pmf-io.h index 6fa510f419c0..55198d2875cc 100644 --- a/include/linux/amd-pmf-io.h +++ b/include/linux/amd-pmf-io.h @@ -61,5 +61,26 @@ enum laptop_placement { LP_UNDEFINED, }; =20 +/** + * struct amd_pmf_npu_metrics: Get NPU metrics data from PMF driver + * @npuclk_freq: NPU clock frequency [MHz] + * @npu_busy: NPU busy % [0-100] + * @npu_power: NPU power [mW] + * @mpnpuclk_freq: MPNPU [MHz] + * @npu_reads: NPU read bandwidth [MB/sec] + * @npu_writes: NPU write bandwidth [MB/sec] + */ +struct amd_pmf_npu_metrics { + u16 npuclk_freq; + u16 npu_busy[8]; + u16 npu_power; + u16 mpnpuclk_freq; + u16 npu_reads; + u16 npu_writes; +}; + int amd_get_sfh_info(struct amd_sfh_info *sfh_info, enum sfh_message_type = op); + +/* AMD PMF and NPU interface */ +int amd_pmf_get_npu_data(struct amd_pmf_npu_metrics *info); #endif --=20 2.34.1 From nobody Sun Feb 8 16:32:43 2026 Received: from SN4PR2101CU001.outbound.protection.outlook.com (mail-southcentralusazon11012068.outbound.protection.outlook.com [40.93.195.68]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3977F30102A; Fri, 12 Dec 2025 18:19:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.195.68 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765563543; cv=fail; b=g1eX5slKuODjnLfn/yVK6V1A2whzPYuv5Y5OuZMzNdJLE4cWTVdnyLyOl4qqZ6L2mfcBNhKtQ5Nz0WyRdjUfx0bbno3sLZmZKrSkK/16Hdg7eEi8epDdiAc2KNuSPfvFb6SzxmIIFgqEFqHWstcQrybKH/Nd49iOomutdzk+A5E= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765563543; c=relaxed/simple; bh=k/vW36N+CMGaeRTeNwaouhIWRmmaOWyEt7fZQX+S8gI=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=ABaZHZ4P8x1z5w3HC/yc89z8o7ULZrh6ShZBTv5ys8RrsaDKomYBuLC3VY6+RU++4bsn+XDyeKiySSsNMjAt8JTS4Y476eKwl2jl9aompS56LW7K0+uG5t7C3FCC/emAUzpu7XdWOWD4VFB18nIROpUPJSkandqeI6YEqpZvMis= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=KOCBX6c7; arc=fail smtp.client-ip=40.93.195.68 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="KOCBX6c7" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=aZmwUt83ktGl8xbN6pAPBTznJLtXb4t4Mu85dUjGa4QqyTwxC1SC/Uye35ocjXXexfv15U/zk2heISb1xRNOwkfeAn1nEBkKOXpZjrgo5ojlQBlB35AqTJI25S0PNvJNv0u2gZHwU62R0jFBv+Wxaz1fezc6kFD5hZnYUTuwPUvWEyZh4W5hM5B+of10MT+AKYLHMyqG65p9nBdSJPNPRiDMQWH4Ig++FgALmBQsvuh4r1BEsPkUMECU//LPZ1dSlmTIonPUyougjVhNIBoZSpmiBEdsFYTh6qsM/bJz3FRWGJ/PFTF3lBFXY+UV7SODj6WeNk0YdUe3eCp0nuTo0A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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; bh=IM3hRlIxZB0jKtOtIWpKEqtUOd22XjRm+8Awk1QE3F0=; b=kGfDJMFWgXjXyA6arWr7WR89KAdq9wqRAfHZB82nWetYCp1Kx1T1RGXEM/F8c2bniCHHV8DO9fGnCbgDTeXThB3PdQH8CeZw4iphJndR/KmGc1DLuoIoRvG72zHygc7bCh6ScQR1F0/Zm0HoGzF1p0zPZWqQ+i3V93p4eRua3CgcucijyV+8aUHa7d+TPODOyVLSqEdl5SBJiIlDSH8MpGvNKjC5UYOYhMMKMtAZzNJ0VtNFV4DmAA5nXnSbJTXyjTHxWXkPc1HtPJR6vMYAIOgP2JkhE8GL1obyS08xTZHab20/iAKpcTrAq84yrWoJpUNPrDtkOoWjprzUsgzvnA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=linux.intel.com smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=IM3hRlIxZB0jKtOtIWpKEqtUOd22XjRm+8Awk1QE3F0=; b=KOCBX6c7CNgC/4C8Qls1leJrN+n78IgZluvz6qqA+FXJClANW/m8EL5Chs71hqaYGBa9pDbz16TrlpYrqJlmXYtpMpZfQcX9RROrkeg67WpJJsXdyg/uKQYn4EBwWCuMEQOvaFNjQmKKjNLVw2fpyjmIZaw2czaQS+LPKhwml2Y= Received: from DS7PR03CA0167.namprd03.prod.outlook.com (2603:10b6:5:3b2::22) by SN7PR12MB7130.namprd12.prod.outlook.com (2603:10b6:806:2a2::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9412.9; Fri, 12 Dec 2025 18:18:57 +0000 Received: from CY4PEPF0000FCC1.namprd03.prod.outlook.com (2603:10b6:5:3b2:cafe::f) by DS7PR03CA0167.outlook.office365.com (2603:10b6:5:3b2::22) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9388.15 via Frontend Transport; Fri, 12 Dec 2025 18:18:56 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb08.amd.com; pr=C Received: from satlexmb08.amd.com (165.204.84.17) by CY4PEPF0000FCC1.mail.protection.outlook.com (10.167.242.103) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9412.4 via Frontend Transport; Fri, 12 Dec 2025 18:18:56 +0000 Received: from satlexmb08.amd.com (10.181.42.217) by satlexmb08.amd.com (10.181.42.217) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Fri, 12 Dec 2025 12:18:55 -0600 Received: from xsjlizhih51.xilinx.com (10.180.168.240) by satlexmb08.amd.com (10.181.42.217) with Microsoft SMTP Server id 15.2.2562.17 via Frontend Transport; Fri, 12 Dec 2025 10:18:55 -0800 From: Lizhi Hou To: , , , , CC: Lizhi Hou , , , , , , , , , Mario Limonciello Subject: [PATCH V2 2/2] accel/amdxdna: Add IOCTL to retrieve realtime NPU power estimate Date: Fri, 12 Dec 2025 10:18:03 -0800 Message-ID: <20251212181803.1825142-3-lizhi.hou@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20251212181803.1825142-1-lizhi.hou@amd.com> References: <20251212181803.1825142-1-lizhi.hou@amd.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CY4PEPF0000FCC1:EE_|SN7PR12MB7130:EE_ X-MS-Office365-Filtering-Correlation-Id: 039eda97-8177-412f-e560-08de39aaea1e X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|82310400026|36860700013|376014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?JYNeU/inirDiRMB1m+oXzE3dWW7WPFo0z6qMxB+og9qJJdDQ0r9X2nW4Rh3S?= =?us-ascii?Q?i/DV4Q8fBTIOq8eAZnkR28DiE5jo+vbYu7ICppu1o2DlqWZdJw+j7obH2m+A?= =?us-ascii?Q?XX7tgWzzUJ8GG9X7rXi3Rugv12FzqgDpI1/Rn8/8MpWJxjoYvp6wCpwPhJPE?= =?us-ascii?Q?Uy6zuKCW5mNZsgPXoJGNsiYIgcibqEKCg1gjfcRV/HDA+u5AamZwbO7h+RYg?= =?us-ascii?Q?Zu94hGPZdqSvT5B06rXmItiQIr+CmAR5sVVno58L2kZwz1QevIiFqYttscz8?= =?us-ascii?Q?9scWeSuToTIAinMG/EJiRcjt2U1wQiIEAHoOLh+OLjh/rTnu5saGbmwms3W6?= =?us-ascii?Q?R4i5Yv3JlTlprLvYCrotZiIE2FwhkqEXh7L3bjtpDWb3IaImNbszxUEeIA4t?= =?us-ascii?Q?gVfwHFlrg4fxIiCqXKk2UTdgFgJIPK1wJWE0X0XTkZhWTG1cQSK3zGt5rtFG?= =?us-ascii?Q?jXcAd71H3rAobqNo7glL4sX6s4EvkikNjrU++qz1Gg5DmDjdYO9G0K7+dava?= =?us-ascii?Q?k+puzc7c81CWa3oMjXmut5qTWnpqr5nCm6Y1NP2u/MvGEZzYbKIpPOOLdPg3?= =?us-ascii?Q?ba8LK+FZsc7YKeNxlhLHn1XChU1JVYC3ORnuGbT5120eExLI/zuEdDD/lmYN?= =?us-ascii?Q?s47+RK/9RD+KBb2pOx1VAAkMtrrbKow76x2h8B+74dxIVLE5n9hOofXB6pBw?= =?us-ascii?Q?bxLv007Hi8s6uRRsf6Icrvqsx8jfuUvHbGuZKur9kobkNc8NuEPdAL2uIl7g?= =?us-ascii?Q?lQP8G/Kk6AE6Rlq9GiSpRerTm5gHj4eYjQJOIMCirlzwrilSsBfleou2GtNa?= =?us-ascii?Q?atop4pYMRhGHY8CP8pPIowW0Fy7KBC82C3FNAnA5aH14xh0pYkD8/A768qkJ?= =?us-ascii?Q?d4h+HkCDAD0VgUk0NNlAo2lrpxs40bSy0ye+w3ISD4vjrVY58EbQy29CJYmr?= =?us-ascii?Q?hyRnwe6e26LvL4BqnLtmdlF74j3xUDvZFdfr1ACxwlbgqb32OeaL8ImqI0qp?= =?us-ascii?Q?7b3NzEoGb1nT6NZnA1wlyl6ypgGL2IAZsz81A1paBSY3sLNs6ElwymfPwoHY?= =?us-ascii?Q?+V2sc5IU3prAlWSbJ+DuKps7kXhRTHb9vv/4MMaVkNkwVeo+NjkikVM6TBUo?= =?us-ascii?Q?1gr71Fw+ZK903UM5ZPGvnoIYx2ODDZ/onZRfffu0/h05h63b0+uyujSt3beh?= =?us-ascii?Q?unkhfgXa9Ab+sG/v+jvDWLL4woBpkCTnw7uX8w218ptXvS64QlZoM5K4K8z/?= =?us-ascii?Q?SH14oF7orwSr+Offo+dZ0KMGVbrcYVScUjuKGfLvXZJ/cFTfa8VmVTnit1Pw?= =?us-ascii?Q?s9oE73PMibRTnqKLLb80mpfmeq4rUQoyVG7a3Q1UYwP5qNZjxh2WcNGw8krD?= =?us-ascii?Q?UVaqvadLZI6IMHKfzgPLn6FRz+5lPVWYkA7JktdicV/LTMiryAcUiO1wHQX8?= =?us-ascii?Q?x8G9h1cpJRwsYF2qacRy/0kpRh2AvQq8MhTBcR3aLsEkW/eR9FRl/IYd/Ves?= =?us-ascii?Q?l7HC6rU8/HncHxeIwLE07DL81IW5r4EXeMi76rGE5NC/VFiTTNpN8izaIHa4?= =?us-ascii?Q?fM82t2gylGPli+ZpMEU=3D?= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb08.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(1800799024)(82310400026)(36860700013)(376014);DIR:OUT;SFP:1101; X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Dec 2025 18:18:56.7435 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 039eda97-8177-412f-e560-08de39aaea1e X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb08.amd.com] X-MS-Exchange-CrossTenant-AuthSource: CY4PEPF0000FCC1.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN7PR12MB7130 Content-Type: text/plain; charset="utf-8" The AMD PMF driver provides an interface to obtain realtime power estimates for the NPU. Expose this information to userspace through a new DRM_IOCTL_AMDXDNA_GET_INFO parameter, allowing applications to query the current NPU power level. Reviewed-by: Mario Limonciello (AMD) Reviewed-by: Shyam Sundar S K Signed-off-by: Lizhi Hou --- drivers/accel/amdxdna/aie2_pci.c | 29 +++++++++++++++++++++++++ drivers/accel/amdxdna/aie2_pci.h | 20 +++++++++++++++++ drivers/accel/amdxdna/amdxdna_pci_drv.c | 3 ++- 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/drivers/accel/amdxdna/aie2_pci.c b/drivers/accel/amdxdna/aie2_= pci.c index 81a8e4137bfd..55fbc8f0f455 100644 --- a/drivers/accel/amdxdna/aie2_pci.c +++ b/drivers/accel/amdxdna/aie2_pci.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -777,6 +778,31 @@ static int aie2_get_clock_metadata(struct amdxdna_clie= nt *client, return ret; } =20 +static int aie2_get_sensors(struct amdxdna_client *client, + struct amdxdna_drm_get_info *args) +{ + struct amdxdna_drm_query_sensor sensor =3D {}; + int ret; + + if (args->buffer_size < sizeof(sensor)) + return -EINVAL; + + ret =3D AIE2_GET_PMF_NPU_DATA(npu_power, sensor.input); + if (ret) + return ret; + sensor.type =3D AMDXDNA_SENSOR_TYPE_POWER; + sensor.unitm =3D -3; + scnprintf(sensor.label, sizeof(sensor.label), "Total Power"); + scnprintf(sensor.units, sizeof(sensor.units), "mW"); + + if (copy_to_user(u64_to_user_ptr(args->buffer), &sensor, sizeof(sensor))) + return -EFAULT; + + args->buffer_size =3D sizeof(sensor); + + return 0; +} + static int aie2_hwctx_status_cb(struct amdxdna_hwctx *hwctx, void *arg) { struct amdxdna_drm_hwctx_entry *tmp __free(kfree) =3D NULL; @@ -980,6 +1006,9 @@ static int aie2_get_info(struct amdxdna_client *client= , struct amdxdna_drm_get_i case DRM_AMDXDNA_QUERY_CLOCK_METADATA: ret =3D aie2_get_clock_metadata(client, args); break; + case DRM_AMDXDNA_QUERY_SENSORS: + ret =3D aie2_get_sensors(client, args); + break; case DRM_AMDXDNA_QUERY_HW_CONTEXTS: ret =3D aie2_get_hwctx_status(client, args); break; diff --git a/drivers/accel/amdxdna/aie2_pci.h b/drivers/accel/amdxdna/aie2_= pci.h index c6b5cf4ae5c4..7f588ad99240 100644 --- a/drivers/accel/amdxdna/aie2_pci.h +++ b/drivers/accel/amdxdna/aie2_pci.h @@ -7,6 +7,7 @@ #define _AIE2_PCI_H_ =20 #include +#include #include =20 #include "amdxdna_mailbox.h" @@ -46,6 +47,25 @@ pci_resource_len(NDEV2PDEV(_ndev), (_ndev)->xdna->dev_info->mbox_bar); \ }) =20 +#if IS_ENABLED(CONFIG_AMD_PMF) +#define AIE2_GET_PMF_NPU_DATA(field, val) \ +({ \ + struct amd_pmf_npu_metrics _npu_metrics; \ + int _ret; \ + \ + _ret =3D amd_pmf_get_npu_data(&_npu_metrics); \ + val =3D _ret ? U32_MAX : _npu_metrics.field; \ + (_ret); \ +}) +#else +#define SENSOR_DEFAULT_npu_power U32_MAX +#define AIE2_GET_PMF_NPU_DATA(field, val) \ +({ \ + val =3D SENSOR_DEFAULT_##field; \ + (-EOPNOTSUPP); \ +}) +#endif + enum aie2_smu_reg_idx { SMU_CMD_REG =3D 0, SMU_ARG_REG, diff --git a/drivers/accel/amdxdna/amdxdna_pci_drv.c b/drivers/accel/amdxdn= a/amdxdna_pci_drv.c index 1973ab67721b..643ebd387074 100644 --- a/drivers/accel/amdxdna/amdxdna_pci_drv.c +++ b/drivers/accel/amdxdna/amdxdna_pci_drv.c @@ -32,9 +32,10 @@ MODULE_FIRMWARE("amdnpu/17f0_20/npu.sbin"); * 0.4: Support getting resource information * 0.5: Support getting telemetry data * 0.6: Support preemption + * 0.7: Support getting power data */ #define AMDXDNA_DRIVER_MAJOR 0 -#define AMDXDNA_DRIVER_MINOR 6 +#define AMDXDNA_DRIVER_MINOR 7 =20 /* * Bind the driver base on (vendor_id, device_id) pair and later use the --=20 2.34.1