From nobody Wed Apr 1 09:45:44 2026 Received: from CH1PR05CU001.outbound.protection.outlook.com (mail-northcentralusazon11010001.outbound.protection.outlook.com [52.101.193.1]) (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 E1CE8387346 for ; Mon, 30 Mar 2026 16:37:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.193.1 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774888650; cv=fail; b=RR13kQQlwsZsoFgrhaWT5PqzhHilKR543QFq8jXZcTrF9ZzBjfYlXxlEMmqE27jeU0I+wEK0Y+9nB3KM6xbJBBDMzKICsFkHTD59GEhZbeFJLQz6gNjWGrAqLEXZkHDef62E4i7wJso/6QlkAEp5ECd4umBwoD3py5mtHtEIXpY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774888650; c=relaxed/simple; bh=hpxdmRM1SwaDkFUjlx+R9n/9aLIw0gvXLnHfJU9FKhQ=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=n/jZS1e8eTWZ5lbpuP8T40gkHgQU6s3zXelr+6ztQdK9y5i6XJFMDlMhu0o6svpheBzx+/lNZBPOmD7/dnt1HcsV35ILEg3092BnHWbmHRnnA7i2K0pTVMP5ibQezNVA4NaqY986CjE2JFwQrpZA9sKhhbYno6tcZ9A52NlIeo4= 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=S+5t2yKa; arc=fail smtp.client-ip=52.101.193.1 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="S+5t2yKa" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=QG/teyT20LevK+03nzgPCQCKWI0rKe9L3N0nGTuI7DHDqFtgF8N2mOEoSVuW4ju3JtGO68zpZOnBgtqh+zk6eOvXDnLZ7+ZsO3Tc8Lb9qGY9UellIO37emj98g6CwVZ8FOljR2Vs5ta3H7H4n7IL2p8swnTATdFu3eNx9zUEq/UCZ5P4OR87oHW1j8gjbsyi5Q57jR+Dh2o7QFzjzy0sK3qUyp0S6LcCFeX4KWsoUQfVeRsRAjH5q2CyMdftTuPY/VXyJrCYMf3sQnppyqvh+NJt9FznYxH8YKTUpKkddu/gaKYbWPDTlLlsIICafB2hAvRNDfSUH5s4Rk89Uzedpw== 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=6C5FzGcTmCZhUnlgFUPViKEK9cqk86tMxfZk43TBTTk=; b=Mm4ic4mWNmlkv0zxPngBexEALEUL6cjVBkDyizsCz2R22ZKSwPqc53IpxL1bvWTnj/oXcugksDJcx9Hc77IKISncnl9LmxxEk7s4uYIxwYNo+hTfhwELTRElSG5iqImdIdISCRFmk4wiuzxK9bysetMWjUqaNEM2ygOVvQcd9iYZjLUkQkbudbZ96L+qwbFukGx5J1pVDmZvo4Aukc4OVE5JS0GFuZYFbwViX3dmjx/r5PbIARBCjWvnYjRLsLzKlVthU4WJTN48KbZsAT4k2ARqVA9R1TJoNaaUmqJTNP2xUFoQU3m/9vRzjfa6dAdATk+R6WEarLgh/J0oTKDIZg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=kernel.org 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=6C5FzGcTmCZhUnlgFUPViKEK9cqk86tMxfZk43TBTTk=; b=S+5t2yKagNOQvf3nGH5ITwjinMNSEC+APfDLhdlqCe/n4xYSt6YWLdqdDDgiouIO3R5K7bZlbr2lLv00tglY+FDNdtQDgsP5RBMMi4HSAWpaiZ/xTczpJy2/A8ZdSIX7v1PrCIq1HWYU6qgJMiBhRUyxe3Wls63GbKOkPwXGlGw= Received: from SA0PR12CA0028.namprd12.prod.outlook.com (2603:10b6:806:6f::33) by CH2PR12MB4165.namprd12.prod.outlook.com (2603:10b6:610:a4::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9769.15; Mon, 30 Mar 2026 16:37:16 +0000 Received: from SN1PEPF0002636B.namprd02.prod.outlook.com (2603:10b6:806:6f:cafe::a) by SA0PR12CA0028.outlook.office365.com (2603:10b6:806:6f::33) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9745.28 via Frontend Transport; Mon, 30 Mar 2026 16:37:16 +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=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SN1PEPF0002636B.mail.protection.outlook.com (10.167.241.136) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9745.21 via Frontend Transport; Mon, 30 Mar 2026 16:37:16 +0000 Received: from satlexmb07.amd.com (10.181.42.216) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Mon, 30 Mar 2026 11:37:15 -0500 Received: from xsjlizhih51.xilinx.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server id 15.2.2562.17 via Frontend Transport; Mon, 30 Mar 2026 11:37:14 -0500 From: Lizhi Hou To: , , , , CC: Lizhi Hou , , , Subject: [PATCH V1 1/6] accel/amdxdna: Create shared functions for AIE2 and AIE4 Date: Mon, 30 Mar 2026 09:37:00 -0700 Message-ID: <20260330163705.3153647-2-lizhi.hou@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260330163705.3153647-1-lizhi.hou@amd.com> References: <20260330163705.3153647-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: SN1PEPF0002636B:EE_|CH2PR12MB4165:EE_ X-MS-Office365-Filtering-Correlation-Id: 39d02fea-4efb-46be-959e-08de8e7a9a7b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|1800799024|36860700016|376014|56012099003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: RFXkRVNYVDCc9uIivQACa3Huv5BTuISjMueWe/9RV9Aktoc1P0WpIY9NCKJY9zHPr8W9zoHlk01nHoglNDhegUTMUtwwqiWSrTRZxgmT0R8W5DpZUAmKigzSmLBk2BAUMl9pFGwOUswb4VTTKyUdzpN4k7WhsEup5IS4JPgYDJKU1lw4D/KHeQOhoWDpmeOSObqGDxDW2+lCxS5WKp40BYcx4TXk+UzgQRsYXwW/K34M0f18kZKryjQYidVGrFEB/Ykj8eYcs1XncCSigq8aV9c0g+rVwitBqkcHmiSl9rHCWYR8+DaoQYilrRrCNE6WweZ1yE55m+xiRo+rb7oadC+W9MrfjauI1zuGd2G1rf0DGLakCokkpYSMdAxKz9XrbkTBm/1UdjGn81nmq5pEKFkM9wqJElkMJDAaGbT51tTIY0j4AILfYYSrLSQ2SYZ/OerBCunN2HwlF2NGdoZMP8t/R+l9mSV3ymO/z4epg7ySk7bzwZs8fVK7wTcFvDgGzJLuxhaa/Zynoxf+V9CSKrjXZKVk5/sSlvBcC7jM95P/hf+eSV0yiVRfblSSBudhX//DCyxC2fV322wvToxS6K4KGh5J+7c3LRT7Kg6daSRrRmavx86YDKAoL43CapEdJiRamOTc0oBeXMAYYt1+D/nthqdCBg1vDiYVV75sTLaeuWMvhco9cnMwZDpptc3qG3AkaeINjlSPMKS3soRj2YpCIuI653rwb9TD5xzaUklHF/fVGGlcdtK6HyEqktcivZ3sWDOHWqpfG5Znpz9Y1g== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(82310400026)(1800799024)(36860700016)(376014)(56012099003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: QaQ54Q6d9xOHLSEvSSAJW3qQYwIwBTdqis38hA+ETsFh9R5DkBaZICCPC0NT5j7qjdWMWoIO8KN8uQVaWvgrJcBd8ufBaHE5hiSLnewZk69SuhzJhVG5uTmdTIfn42vZ8lInUoh53szWLPIxiY9SWsAnjjtuKEjjwN4CDSqsPjvsBnkdk6ARTX5OWW7JLHId7z1AgGdQNXqF5EuT/n9esDqnh/aFMXif2UP5+FPGbpTwubKANzwh6bqMcHOk2TRFnfw2Acl/9m7E4rhEJgUtoY4lq1pb7CeMGjfG6sA70qHlrwjtbeFM1x0KtGzHdPvetvcou/b0F2gCQW6fXlYaWPLaK+VW3biFioL4ihvkufqsyI7galdrtflYEpej5b/wGuDGCmWS637IBwVXi07wwy1iuT6g9X0kB3ARuFhWhUsGsdWXx8Q/bYIPA14layLI X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Mar 2026 16:37:16.1352 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 39d02fea-4efb-46be-959e-08de8e7a9a7b 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=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SN1PEPF0002636B.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH2PR12MB4165 Content-Type: text/plain; charset="utf-8" The AIE4 platform uses a mailbox management channel mechanism similar to AIE2 to communicate with the firmware. Create aie.h and aie.c and move the functions and structures that can be shared by both platforms from the AIE2-specific files into these common files. This allows AIE2 and AIE4 to reuse the same implementation and reduces code duplication. Signed-off-by: Lizhi Hou Reviewed-by: Mario Limonciello (AMD) --- drivers/accel/amdxdna/Makefile | 1 + drivers/accel/amdxdna/aie.c | 89 +++++++++++++++ drivers/accel/amdxdna/aie.h | 31 ++++++ drivers/accel/amdxdna/aie2_ctx.c | 4 +- drivers/accel/amdxdna/aie2_error.c | 12 +-- drivers/accel/amdxdna/aie2_message.c | 138 +++++++++--------------- drivers/accel/amdxdna/aie2_pci.c | 107 ++++++------------ drivers/accel/amdxdna/aie2_pci.h | 26 +---- drivers/accel/amdxdna/aie2_pm.c | 6 +- drivers/accel/amdxdna/aie2_smu.c | 22 ++-- drivers/accel/amdxdna/amdxdna_pci_drv.h | 8 ++ drivers/accel/amdxdna/npu1_regs.c | 4 +- drivers/accel/amdxdna/npu4_regs.c | 4 +- drivers/accel/amdxdna/npu5_regs.c | 2 +- drivers/accel/amdxdna/npu6_regs.c | 2 +- 15 files changed, 246 insertions(+), 210 deletions(-) create mode 100644 drivers/accel/amdxdna/aie.c create mode 100644 drivers/accel/amdxdna/aie.h diff --git a/drivers/accel/amdxdna/Makefile b/drivers/accel/amdxdna/Makefile index cf9bf19dedb9..5c7911554c46 100644 --- a/drivers/accel/amdxdna/Makefile +++ b/drivers/accel/amdxdna/Makefile @@ -1,6 +1,7 @@ # SPDX-License-Identifier: GPL-2.0-only =20 amdxdna-y :=3D \ + aie.o \ aie2_ctx.o \ aie2_error.o \ aie2_message.o \ diff --git a/drivers/accel/amdxdna/aie.c b/drivers/accel/amdxdna/aie.c new file mode 100644 index 000000000000..4b3d4493128e --- /dev/null +++ b/drivers/accel/amdxdna/aie.c @@ -0,0 +1,89 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2026, Advanced Micro Devices, Inc. + */ + +#include + +#include "aie.h" +#include "amdxdna_mailbox_helper.h" +#include "amdxdna_mailbox.h" +#include "amdxdna_pci_drv.h" + +void aie_dump_mgmt_chann_debug(struct aie_device *aie) +{ + struct amdxdna_dev *xdna =3D aie->xdna; + + XDNA_DBG(xdna, "i2x tail 0x%x", aie->mgmt_i2x.mb_tail_ptr_reg); + XDNA_DBG(xdna, "i2x head 0x%x", aie->mgmt_i2x.mb_head_ptr_reg); + XDNA_DBG(xdna, "i2x ringbuf 0x%x", aie->mgmt_i2x.rb_start_addr); + XDNA_DBG(xdna, "i2x rsize 0x%x", aie->mgmt_i2x.rb_size); + XDNA_DBG(xdna, "x2i tail 0x%x", aie->mgmt_x2i.mb_tail_ptr_reg); + XDNA_DBG(xdna, "x2i head 0x%x", aie->mgmt_x2i.mb_head_ptr_reg); + XDNA_DBG(xdna, "x2i ringbuf 0x%x", aie->mgmt_x2i.rb_start_addr); + XDNA_DBG(xdna, "x2i rsize 0x%x", aie->mgmt_x2i.rb_size); + XDNA_DBG(xdna, "x2i chann index 0x%x", aie->mgmt_chan_idx); + XDNA_DBG(xdna, "mailbox protocol major 0x%x", aie->mgmt_prot_major); + XDNA_DBG(xdna, "mailbox protocol minor 0x%x", aie->mgmt_prot_minor); +} + +void aie_destroy_chann(struct aie_device *aie, struct mailbox_channel **ch= ann) +{ + struct amdxdna_dev *xdna =3D aie->xdna; + + drm_WARN_ON(&xdna->ddev, !mutex_is_locked(&xdna->dev_lock)); + + if (!*chann) + return; + + xdna_mailbox_stop_channel(*chann); + xdna_mailbox_free_channel(*chann); + *chann =3D NULL; +} + +int aie_send_mgmt_msg_wait(struct aie_device *aie, struct xdna_mailbox_msg= *msg) +{ + struct amdxdna_dev *xdna =3D aie->xdna; + struct xdna_notify *hdl =3D msg->handle; + int ret; + + drm_WARN_ON(&xdna->ddev, !mutex_is_locked(&xdna->dev_lock)); + + if (!aie->mgmt_chann) + return -ENODEV; + + ret =3D xdna_send_msg_wait(xdna, aie->mgmt_chann, msg); + if (ret =3D=3D -ETIME) + aie_destroy_chann(aie, &aie->mgmt_chann); + + if (!ret && *hdl->status) { + XDNA_ERR(xdna, "command opcode 0x%x failed, status 0x%x", + msg->opcode, *hdl->data); + ret =3D -EINVAL; + } + + return ret; +} + +int aie_check_protocol(struct aie_device *aie, u32 fw_major, u32 fw_minor) +{ + const struct amdxdna_fw_feature_tbl *feature; + bool found =3D false; + + for (feature =3D aie->xdna->dev_info->fw_feature_tbl; + feature->major; feature++) { + if (feature->major !=3D fw_major) + continue; + if (fw_minor < feature->min_minor) + continue; + if (feature->max_minor > 0 && fw_minor > feature->max_minor) + continue; + + aie->feature_mask |=3D feature->features; + + /* firmware version matches one of the driver support entry */ + found =3D true; + } + + return found ? 0 : -EOPNOTSUPP; +} diff --git a/drivers/accel/amdxdna/aie.h b/drivers/accel/amdxdna/aie.h new file mode 100644 index 000000000000..1bea14b79c7c --- /dev/null +++ b/drivers/accel/amdxdna/aie.h @@ -0,0 +1,31 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (C) 2026, Advanced Micro Devices, Inc. + */ +#ifndef _AIE_H_ +#define _AIE_H_ + +#include "amdxdna_pci_drv.h" +#include "amdxdna_mailbox.h" + +struct aie_device { + struct amdxdna_dev *xdna; + struct mailbox_channel *mgmt_chann; + struct xdna_mailbox_chann_res mgmt_x2i; + struct xdna_mailbox_chann_res mgmt_i2x; + u32 mgmt_chan_idx; + u32 mgmt_prot_major; + u32 mgmt_prot_minor; + unsigned long feature_mask; +}; + +#define DECLARE_AIE_MSG(name, op) \ + DECLARE_XDNA_MSG_COMMON(name, op, -1) +#define AIE_FEATURE_ON(aie, feature) test_bit(feature, &(aie)->feature_mas= k) + +void aie_dump_mgmt_chann_debug(struct aie_device *aie); +void aie_destroy_chann(struct aie_device *aie, struct mailbox_channel **ch= ann); +int aie_send_mgmt_msg_wait(struct aie_device *aie, struct xdna_mailbox_msg= *msg); +int aie_check_protocol(struct aie_device *aie, u32 fw_major, u32 fw_minor); + +#endif /* _AIE_H_ */ diff --git a/drivers/accel/amdxdna/aie2_ctx.c b/drivers/accel/amdxdna/aie2_= ctx.c index 66dbbfd322a2..a942ac626d07 100644 --- a/drivers/accel/amdxdna/aie2_ctx.c +++ b/drivers/accel/amdxdna/aie2_ctx.c @@ -525,7 +525,7 @@ static int aie2_alloc_resource(struct amdxdna_hwctx *hw= ctx) struct alloc_requests *xrs_req; int ret; =20 - if (AIE2_FEATURE_ON(xdna->dev_handle, AIE2_TEMPORAL_ONLY)) { + if (AIE_FEATURE_ON(&xdna->dev_handle->aie, AIE2_TEMPORAL_ONLY)) { hwctx->num_unused_col =3D xdna->dev_handle->total_col - hwctx->num_col; hwctx->num_col =3D xdna->dev_handle->total_col; return aie2_create_context(xdna->dev_handle, hwctx); @@ -562,7 +562,7 @@ static void aie2_release_resource(struct amdxdna_hwctx = *hwctx) struct amdxdna_dev *xdna =3D hwctx->client->xdna; int ret; =20 - if (AIE2_FEATURE_ON(xdna->dev_handle, AIE2_TEMPORAL_ONLY)) { + if (AIE_FEATURE_ON(&xdna->dev_handle->aie, AIE2_TEMPORAL_ONLY)) { ret =3D aie2_destroy_context(xdna->dev_handle, hwctx); if (ret && ret !=3D -ENODEV) XDNA_ERR(xdna, "Destroy temporal only context failed, ret %d", ret); diff --git a/drivers/accel/amdxdna/aie2_error.c b/drivers/accel/amdxdna/aie= 2_error.c index 58abb59b6153..9d20e956c020 100644 --- a/drivers/accel/amdxdna/aie2_error.c +++ b/drivers/accel/amdxdna/aie2_error.c @@ -249,12 +249,12 @@ static u32 aie2_error_backtrack(struct amdxdna_dev_hd= l *ndev, void *err_info, u3 enum aie_error_category cat; =20 cat =3D aie_get_error_category(err->row, err->event_id, err->mod_type); - XDNA_ERR(ndev->xdna, "Row: %d, Col: %d, module %d, event ID %d, category= %d", + XDNA_ERR(ndev->aie.xdna, "Row: %d, Col: %d, module %d, event ID %d, cate= gory %d", err->row, err->col, err->mod_type, err->event_id, cat); =20 if (err->col >=3D 32) { - XDNA_WARN(ndev->xdna, "Invalid column number"); + XDNA_WARN(ndev->aie.xdna, "Invalid column number"); break; } =20 @@ -294,7 +294,7 @@ static void aie2_error_worker(struct work_struct *err_w= ork) =20 e =3D container_of(err_work, struct async_event, work); =20 - xdna =3D e->ndev->xdna; + xdna =3D e->ndev->aie.xdna; =20 if (e->resp.status =3D=3D MAX_AIE2_STATUS_CODE) return; @@ -329,7 +329,7 @@ static void aie2_error_worker(struct work_struct *err_w= ork) =20 void aie2_error_async_events_free(struct amdxdna_dev_hdl *ndev) { - struct amdxdna_dev *xdna =3D ndev->xdna; + struct amdxdna_dev *xdna =3D ndev->aie.xdna; struct async_events *events; =20 events =3D ndev->async_events; @@ -344,7 +344,7 @@ void aie2_error_async_events_free(struct amdxdna_dev_hd= l *ndev) =20 int aie2_error_async_events_alloc(struct amdxdna_dev_hdl *ndev) { - struct amdxdna_dev *xdna =3D ndev->xdna; + struct amdxdna_dev *xdna =3D ndev->aie.xdna; u32 total_col =3D ndev->total_col; u32 total_size =3D ASYNC_BUF_SIZE * total_col; struct async_events *events; @@ -402,7 +402,7 @@ int aie2_error_async_events_alloc(struct amdxdna_dev_hd= l *ndev) =20 int aie2_get_array_async_error(struct amdxdna_dev_hdl *ndev, struct amdxdn= a_drm_get_array *args) { - struct amdxdna_dev *xdna =3D ndev->xdna; + struct amdxdna_dev *xdna =3D ndev->aie.xdna; =20 drm_WARN_ON(&xdna->ddev, !mutex_is_locked(&xdna->dev_lock)); =20 diff --git a/drivers/accel/amdxdna/aie2_message.c b/drivers/accel/amdxdna/a= ie2_message.c index a1c546c3e81c..ccf87b1aa1cc 100644 --- a/drivers/accel/amdxdna/aie2_message.c +++ b/drivers/accel/amdxdna/aie2_message.c @@ -16,6 +16,7 @@ #include #include =20 +#include "aie.h" #include "aie2_msg_priv.h" #include "aie2_pci.h" #include "amdxdna_ctx.h" @@ -24,38 +25,12 @@ #include "amdxdna_mailbox_helper.h" #include "amdxdna_pci_drv.h" =20 -#define DECLARE_AIE2_MSG(name, op) \ - DECLARE_XDNA_MSG_COMMON(name, op, MAX_AIE2_STATUS_CODE) - #define EXEC_MSG_OPS(xdna) ((xdna)->dev_handle->exec_msg_ops) =20 -static int aie2_send_mgmt_msg_wait(struct amdxdna_dev_hdl *ndev, - struct xdna_mailbox_msg *msg) -{ - struct amdxdna_dev *xdna =3D ndev->xdna; - struct xdna_notify *hdl =3D msg->handle; - int ret; - - if (!ndev->mgmt_chann) - return -ENODEV; - - ret =3D xdna_send_msg_wait(xdna, ndev->mgmt_chann, msg); - if (ret =3D=3D -ETIME) - aie2_destroy_mgmt_chann(ndev); - - if (!ret && *hdl->status !=3D AIE2_STATUS_SUCCESS) { - XDNA_ERR(xdna, "command opcode 0x%x failed, status 0x%x", - msg->opcode, *hdl->data); - ret =3D -EINVAL; - } - - return ret; -} - void *aie2_alloc_msg_buffer(struct amdxdna_dev_hdl *ndev, u32 *size, dma_addr_t *dma_addr) { - struct amdxdna_dev *xdna =3D ndev->xdna; + struct amdxdna_dev *xdna =3D ndev->aie.xdna; void *vaddr; int order; =20 @@ -79,7 +54,7 @@ void *aie2_alloc_msg_buffer(struct amdxdna_dev_hdl *ndev,= u32 *size, void aie2_free_msg_buffer(struct amdxdna_dev_hdl *ndev, size_t size, void *cpu_addr, dma_addr_t dma_addr) { - struct amdxdna_dev *xdna =3D ndev->xdna; + struct amdxdna_dev *xdna =3D ndev->aie.xdna; =20 if (amdxdna_iova_on(xdna)) { amdxdna_iommu_free(xdna, size, cpu_addr, dma_addr); @@ -91,12 +66,12 @@ void aie2_free_msg_buffer(struct amdxdna_dev_hdl *ndev,= size_t size, =20 int aie2_suspend_fw(struct amdxdna_dev_hdl *ndev) { - DECLARE_AIE2_MSG(suspend, MSG_OP_SUSPEND); + DECLARE_AIE_MSG(suspend, MSG_OP_SUSPEND); int ret; =20 - ret =3D aie2_send_mgmt_msg_wait(ndev, &msg); + ret =3D aie_send_mgmt_msg_wait(&ndev->aie, &msg); if (ret) { - XDNA_ERR(ndev->xdna, "Failed to suspend fw, ret %d", ret); + XDNA_ERR(ndev->aie.xdna, "Failed to suspend fw, ret %d", ret); return ret; } =20 @@ -105,22 +80,22 @@ int aie2_suspend_fw(struct amdxdna_dev_hdl *ndev) =20 int aie2_resume_fw(struct amdxdna_dev_hdl *ndev) { - DECLARE_AIE2_MSG(suspend, MSG_OP_RESUME); + DECLARE_AIE_MSG(suspend, MSG_OP_RESUME); =20 - return aie2_send_mgmt_msg_wait(ndev, &msg); + return aie_send_mgmt_msg_wait(&ndev->aie, &msg); } =20 int aie2_set_runtime_cfg(struct amdxdna_dev_hdl *ndev, u32 type, u64 value) { - DECLARE_AIE2_MSG(set_runtime_cfg, MSG_OP_SET_RUNTIME_CONFIG); + DECLARE_AIE_MSG(set_runtime_cfg, MSG_OP_SET_RUNTIME_CONFIG); int ret; =20 req.type =3D type; req.value =3D value; =20 - ret =3D aie2_send_mgmt_msg_wait(ndev, &msg); + ret =3D aie_send_mgmt_msg_wait(&ndev->aie, &msg); if (ret) { - XDNA_ERR(ndev->xdna, "Failed to set runtime config, ret %d", ret); + XDNA_ERR(ndev->aie.xdna, "Failed to set runtime config, ret %d", ret); return ret; } =20 @@ -129,13 +104,13 @@ int aie2_set_runtime_cfg(struct amdxdna_dev_hdl *ndev= , u32 type, u64 value) =20 int aie2_get_runtime_cfg(struct amdxdna_dev_hdl *ndev, u32 type, u64 *valu= e) { - DECLARE_AIE2_MSG(get_runtime_cfg, MSG_OP_GET_RUNTIME_CONFIG); + DECLARE_AIE_MSG(get_runtime_cfg, MSG_OP_GET_RUNTIME_CONFIG); int ret; =20 req.type =3D type; - ret =3D aie2_send_mgmt_msg_wait(ndev, &msg); + ret =3D aie_send_mgmt_msg_wait(&ndev->aie, &msg); if (ret) { - XDNA_ERR(ndev->xdna, "Failed to get runtime config, ret %d", ret); + XDNA_ERR(ndev->aie.xdna, "Failed to get runtime config, ret %d", ret); return ret; } =20 @@ -145,20 +120,20 @@ int aie2_get_runtime_cfg(struct amdxdna_dev_hdl *ndev= , u32 type, u64 *value) =20 int aie2_assign_mgmt_pasid(struct amdxdna_dev_hdl *ndev, u16 pasid) { - DECLARE_AIE2_MSG(assign_mgmt_pasid, MSG_OP_ASSIGN_MGMT_PASID); + DECLARE_AIE_MSG(assign_mgmt_pasid, MSG_OP_ASSIGN_MGMT_PASID); =20 req.pasid =3D pasid; =20 - return aie2_send_mgmt_msg_wait(ndev, &msg); + return aie_send_mgmt_msg_wait(&ndev->aie, &msg); } =20 int aie2_query_aie_version(struct amdxdna_dev_hdl *ndev, struct aie_versio= n *version) { - DECLARE_AIE2_MSG(aie_version_info, MSG_OP_QUERY_AIE_VERSION); - struct amdxdna_dev *xdna =3D ndev->xdna; + DECLARE_AIE_MSG(aie_version_info, MSG_OP_QUERY_AIE_VERSION); + struct amdxdna_dev *xdna =3D ndev->aie.xdna; int ret; =20 - ret =3D aie2_send_mgmt_msg_wait(ndev, &msg); + ret =3D aie_send_mgmt_msg_wait(&ndev->aie, &msg); if (ret) return ret; =20 @@ -173,10 +148,10 @@ int aie2_query_aie_version(struct amdxdna_dev_hdl *nd= ev, struct aie_version *ver =20 int aie2_query_aie_metadata(struct amdxdna_dev_hdl *ndev, struct aie_metad= ata *metadata) { - DECLARE_AIE2_MSG(aie_tile_info, MSG_OP_QUERY_AIE_TILE_INFO); + DECLARE_AIE_MSG(aie_tile_info, MSG_OP_QUERY_AIE_TILE_INFO); int ret; =20 - ret =3D aie2_send_mgmt_msg_wait(ndev, &msg); + ret =3D aie_send_mgmt_msg_wait(&ndev->aie, &msg); if (ret) return ret; =20 @@ -211,10 +186,10 @@ int aie2_query_aie_metadata(struct amdxdna_dev_hdl *n= dev, struct aie_metadata *m int aie2_query_firmware_version(struct amdxdna_dev_hdl *ndev, struct amdxdna_fw_ver *fw_ver) { - DECLARE_AIE2_MSG(firmware_version, MSG_OP_GET_FIRMWARE_VERSION); + DECLARE_AIE_MSG(firmware_version, MSG_OP_GET_FIRMWARE_VERSION); int ret; =20 - ret =3D aie2_send_mgmt_msg_wait(ndev, &msg); + ret =3D aie_send_mgmt_msg_wait(&ndev->aie, &msg); if (ret) return ret; =20 @@ -228,12 +203,12 @@ int aie2_query_firmware_version(struct amdxdna_dev_hd= l *ndev, =20 static int aie2_destroy_context_req(struct amdxdna_dev_hdl *ndev, u32 id) { - DECLARE_AIE2_MSG(destroy_ctx, MSG_OP_DESTROY_CONTEXT); - struct amdxdna_dev *xdna =3D ndev->xdna; + DECLARE_AIE_MSG(destroy_ctx, MSG_OP_DESTROY_CONTEXT); + struct amdxdna_dev *xdna =3D ndev->aie.xdna; int ret; =20 req.context_id =3D id; - ret =3D aie2_send_mgmt_msg_wait(ndev, &msg); + ret =3D aie_send_mgmt_msg_wait(&ndev->aie, &msg); if (ret && ret !=3D -ENODEV) XDNA_WARN(xdna, "Destroy context failed, ret %d", ret); else if (ret =3D=3D -ENODEV) @@ -245,7 +220,7 @@ static int aie2_destroy_context_req(struct amdxdna_dev_= hdl *ndev, u32 id) static u32 aie2_get_context_priority(struct amdxdna_dev_hdl *ndev, struct amdxdna_hwctx *hwctx) { - if (!AIE2_FEATURE_ON(ndev, AIE2_PREEMPT)) + if (!AIE_FEATURE_ON(&ndev->aie, AIE2_PREEMPT)) return PRIORITY_HIGH; =20 switch (hwctx->qos.priority) { @@ -264,8 +239,8 @@ static u32 aie2_get_context_priority(struct amdxdna_dev= _hdl *ndev, =20 int aie2_create_context(struct amdxdna_dev_hdl *ndev, struct amdxdna_hwctx= *hwctx) { - DECLARE_AIE2_MSG(create_ctx, MSG_OP_CREATE_CONTEXT); - struct amdxdna_dev *xdna =3D ndev->xdna; + DECLARE_AIE_MSG(create_ctx, MSG_OP_CREATE_CONTEXT); + struct amdxdna_dev *xdna =3D ndev->aie.xdna; struct xdna_mailbox_chann_res x2i; struct xdna_mailbox_chann_res i2x; struct cq_pair *cq_pair; @@ -280,7 +255,7 @@ int aie2_create_context(struct amdxdna_dev_hdl *ndev, s= truct amdxdna_hwctx *hwct req.pasid =3D amdxdna_pasid_on(hwctx->client) ? hwctx->client->pasid : 0; req.context_priority =3D aie2_get_context_priority(ndev, hwctx); =20 - ret =3D aie2_send_mgmt_msg_wait(ndev, &msg); + ret =3D aie_send_mgmt_msg_wait(&ndev->aie, &msg); if (ret) return ret; =20 @@ -344,7 +319,7 @@ int aie2_create_context(struct amdxdna_dev_hdl *ndev, s= truct amdxdna_hwctx *hwct =20 int aie2_destroy_context(struct amdxdna_dev_hdl *ndev, struct amdxdna_hwct= x *hwctx) { - struct amdxdna_dev *xdna =3D ndev->xdna; + struct amdxdna_dev *xdna =3D ndev->aie.xdna; int ret; =20 if (!hwctx->priv->mbox_chann) @@ -363,14 +338,14 @@ int aie2_destroy_context(struct amdxdna_dev_hdl *ndev= , struct amdxdna_hwctx *hwc =20 int aie2_map_host_buf(struct amdxdna_dev_hdl *ndev, u32 context_id, u64 ad= dr, u64 size) { - DECLARE_AIE2_MSG(map_host_buffer, MSG_OP_MAP_HOST_BUFFER); - struct amdxdna_dev *xdna =3D ndev->xdna; + DECLARE_AIE_MSG(map_host_buffer, MSG_OP_MAP_HOST_BUFFER); + struct amdxdna_dev *xdna =3D ndev->aie.xdna; int ret; =20 req.context_id =3D context_id; req.buf_addr =3D addr; req.buf_size =3D size; - ret =3D aie2_send_mgmt_msg_wait(ndev, &msg); + ret =3D aie_send_mgmt_msg_wait(&ndev->aie, &msg); if (ret) return ret; =20 @@ -392,8 +367,8 @@ static int amdxdna_hwctx_col_map(struct amdxdna_hwctx *= hwctx, void *arg) int aie2_query_status(struct amdxdna_dev_hdl *ndev, char __user *buf, u32 size, u32 *cols_filled) { - DECLARE_AIE2_MSG(aie_column_info, MSG_OP_QUERY_COL_STATUS); - struct amdxdna_dev *xdna =3D ndev->xdna; + DECLARE_AIE_MSG(aie_column_info, MSG_OP_QUERY_COL_STATUS); + struct amdxdna_dev *xdna =3D ndev->aie.xdna; u32 buf_sz =3D size, aie_bitmap =3D 0; struct amdxdna_client *client; dma_addr_t dma_addr; @@ -415,7 +390,7 @@ int aie2_query_status(struct amdxdna_dev_hdl *ndev, cha= r __user *buf, req.aie_bitmap =3D aie_bitmap; =20 drm_clflush_virt_range(buff_addr, size); /* device can access */ - ret =3D aie2_send_mgmt_msg_wait(ndev, &msg); + ret =3D aie_send_mgmt_msg_wait(&ndev->aie, &msg); if (ret) { XDNA_ERR(xdna, "Error during NPU query, status %d", ret); goto fail; @@ -446,8 +421,8 @@ int aie2_query_telemetry(struct amdxdna_dev_hdl *ndev, char __user *buf, u32 size, struct amdxdna_drm_query_telemetry_header *header) { - DECLARE_AIE2_MSG(get_telemetry, MSG_OP_GET_TELEMETRY); - struct amdxdna_dev *xdna =3D ndev->xdna; + DECLARE_AIE_MSG(get_telemetry, MSG_OP_GET_TELEMETRY); + struct amdxdna_dev *xdna =3D ndev->aie.xdna; dma_addr_t dma_addr; u32 buf_sz =3D size; u8 *addr; @@ -465,7 +440,7 @@ int aie2_query_telemetry(struct amdxdna_dev_hdl *ndev, req.type =3D header->type; =20 drm_clflush_virt_range(addr, size); /* device can access */ - ret =3D aie2_send_mgmt_msg_wait(ndev, &msg); + ret =3D aie_send_mgmt_msg_wait(&ndev->aie, &msg); if (ret) { XDNA_ERR(xdna, "Query telemetry failed, status %d", ret); goto free_buf; @@ -506,8 +481,8 @@ int aie2_register_asyn_event_msg(struct amdxdna_dev_hdl= *ndev, dma_addr_t addr, req.buf_addr =3D addr; req.buf_size =3D size; =20 - XDNA_DBG(ndev->xdna, "Register addr 0x%llx size 0x%x", addr, size); - return xdna_mailbox_send_msg(ndev->mgmt_chann, &msg, TX_TIMEOUT); + XDNA_DBG(ndev->aie.xdna, "Register addr 0x%llx size 0x%x", addr, size); + return xdna_mailbox_send_msg(ndev->aie.mgmt_chann, &msg, TX_TIMEOUT); } =20 int aie2_config_cu(struct amdxdna_hwctx *hwctx, @@ -866,7 +841,6 @@ static int aie2_init_exec_req(void *req, struct amdxdna= _gem_obj *cmd_abo, int ret; u32 op; =20 - op =3D amdxdna_cmd_get_op(cmd_abo); switch (op) { case ERT_START_CU: @@ -915,12 +889,12 @@ aie2_cmdlist_fill_slot(void *slot, struct amdxdna_gem= _obj *cmd_abo, ret =3D EXEC_MSG_OPS(xdna)->fill_dpu_slot(cmd_abo, slot, size); break; case ERT_START_NPU_PREEMPT: - if (!AIE2_FEATURE_ON(xdna->dev_handle, AIE2_PREEMPT)) + if (!AIE_FEATURE_ON(&xdna->dev_handle->aie, AIE2_PREEMPT)) return -EOPNOTSUPP; ret =3D EXEC_MSG_OPS(xdna)->fill_preempt_slot(cmd_abo, slot, size); break; case ERT_START_NPU_PREEMPT_ELF: - if (!AIE2_FEATURE_ON(xdna->dev_handle, AIE2_PREEMPT)) + if (!AIE_FEATURE_ON(&xdna->dev_handle->aie, AIE2_PREEMPT)) return -EOPNOTSUPP; ret =3D EXEC_MSG_OPS(xdna)->fill_elf_slot(cmd_abo, slot, size); break; @@ -935,26 +909,12 @@ aie2_cmdlist_fill_slot(void *slot, struct amdxdna_gem= _obj *cmd_abo, =20 void aie2_msg_init(struct amdxdna_dev_hdl *ndev) { - if (AIE2_FEATURE_ON(ndev, AIE2_NPU_COMMAND)) + if (AIE_FEATURE_ON(&ndev->aie, AIE2_NPU_COMMAND)) ndev->exec_msg_ops =3D &npu_exec_message_ops; else ndev->exec_msg_ops =3D &legacy_exec_message_ops; } =20 -void aie2_destroy_mgmt_chann(struct amdxdna_dev_hdl *ndev) -{ - struct amdxdna_dev *xdna =3D ndev->xdna; - - drm_WARN_ON(&xdna->ddev, !mutex_is_locked(&xdna->dev_lock)); - - if (!ndev->mgmt_chann) - return; - - xdna_mailbox_stop_channel(ndev->mgmt_chann); - xdna_mailbox_free_channel(ndev->mgmt_chann); - ndev->mgmt_chann =3D NULL; -} - static inline struct amdxdna_gem_obj * aie2_cmdlist_get_cmd_buf(struct amdxdna_sched_job *job) { @@ -1199,14 +1159,14 @@ int aie2_config_debug_bo(struct amdxdna_hwctx *hwct= x, struct amdxdna_sched_job * int aie2_query_app_health(struct amdxdna_dev_hdl *ndev, u32 context_id, struct app_health_report *report) { - DECLARE_AIE2_MSG(get_app_health, MSG_OP_GET_APP_HEALTH); - struct amdxdna_dev *xdna =3D ndev->xdna; + DECLARE_AIE_MSG(get_app_health, MSG_OP_GET_APP_HEALTH); + struct amdxdna_dev *xdna =3D ndev->aie.xdna; struct app_health_report *buf; dma_addr_t dma_addr; u32 buf_size; int ret; =20 - if (!AIE2_FEATURE_ON(ndev, AIE2_APP_HEALTH)) { + if (!AIE_FEATURE_ON(&ndev->aie, AIE2_APP_HEALTH)) { XDNA_DBG(xdna, "App health feature not supported"); return -EOPNOTSUPP; } @@ -1223,7 +1183,7 @@ int aie2_query_app_health(struct amdxdna_dev_hdl *nde= v, u32 context_id, req.buf_size =3D buf_size; =20 drm_clflush_virt_range(buf, sizeof(*report)); - ret =3D aie2_send_mgmt_msg_wait(ndev, &msg); + ret =3D aie_send_mgmt_msg_wait(&ndev->aie, &msg); if (ret) { XDNA_ERR(xdna, "Get app health failed, ret %d status 0x%x", ret, resp.st= atus); goto free_buf; diff --git a/drivers/accel/amdxdna/aie2_pci.c b/drivers/accel/amdxdna/aie2_= pci.c index f1ac4e00bd9f..03bac963516d 100644 --- a/drivers/accel/amdxdna/aie2_pci.c +++ b/drivers/accel/amdxdna/aie2_pci.c @@ -60,45 +60,6 @@ struct mgmt_mbox_chann_info { __u32 rsvd[4]; }; =20 -static int aie2_check_protocol(struct amdxdna_dev_hdl *ndev, u32 fw_major,= u32 fw_minor) -{ - const struct aie2_fw_feature_tbl *feature; - bool found =3D false; - - for (feature =3D ndev->priv->fw_feature_tbl; feature->major; feature++) { - if (feature->major !=3D fw_major) - continue; - if (fw_minor < feature->min_minor) - continue; - if (feature->max_minor > 0 && fw_minor > feature->max_minor) - continue; - - ndev->feature_mask |=3D feature->features; - - /* firmware version matches one of the driver support entry */ - found =3D true; - } - - return found ? 0 : -EOPNOTSUPP; -} - -static void aie2_dump_chann_info_debug(struct amdxdna_dev_hdl *ndev) -{ - struct amdxdna_dev *xdna =3D ndev->xdna; - - XDNA_DBG(xdna, "i2x tail 0x%x", ndev->mgmt_i2x.mb_tail_ptr_reg); - XDNA_DBG(xdna, "i2x head 0x%x", ndev->mgmt_i2x.mb_head_ptr_reg); - XDNA_DBG(xdna, "i2x ringbuf 0x%x", ndev->mgmt_i2x.rb_start_addr); - XDNA_DBG(xdna, "i2x rsize 0x%x", ndev->mgmt_i2x.rb_size); - XDNA_DBG(xdna, "x2i tail 0x%x", ndev->mgmt_x2i.mb_tail_ptr_reg); - XDNA_DBG(xdna, "x2i head 0x%x", ndev->mgmt_x2i.mb_head_ptr_reg); - XDNA_DBG(xdna, "x2i ringbuf 0x%x", ndev->mgmt_x2i.rb_start_addr); - XDNA_DBG(xdna, "x2i rsize 0x%x", ndev->mgmt_x2i.rb_size); - XDNA_DBG(xdna, "x2i chann index 0x%x", ndev->mgmt_chan_idx); - XDNA_DBG(xdna, "mailbox protocol major 0x%x", ndev->mgmt_prot_major); - XDNA_DBG(xdna, "mailbox protocol minor 0x%x", ndev->mgmt_prot_minor); -} - static int aie2_get_mgmt_chann_info(struct amdxdna_dev_hdl *ndev) { struct mgmt_mbox_chann_info info_regs; @@ -128,13 +89,13 @@ static int aie2_get_mgmt_chann_info(struct amdxdna_dev= _hdl *ndev) reg[i] =3D readl(ndev->sram_base + off + i * sizeof(u32)); =20 if (info_regs.magic !=3D MGMT_MBOX_MAGIC) { - XDNA_ERR(ndev->xdna, "Invalid mbox magic 0x%x", info_regs.magic); + XDNA_ERR(ndev->aie.xdna, "Invalid mbox magic 0x%x", info_regs.magic); ret =3D -EINVAL; goto done; } =20 - i2x =3D &ndev->mgmt_i2x; - x2i =3D &ndev->mgmt_x2i; + i2x =3D &ndev->aie.mgmt_i2x; + x2i =3D &ndev->aie.mgmt_x2i; =20 i2x->mb_head_ptr_reg =3D AIE2_MBOX_OFF(ndev, info_regs.i2x_head); i2x->mb_tail_ptr_reg =3D AIE2_MBOX_OFF(ndev, info_regs.i2x_tail); @@ -146,14 +107,15 @@ static int aie2_get_mgmt_chann_info(struct amdxdna_de= v_hdl *ndev) x2i->rb_start_addr =3D AIE2_SRAM_OFF(ndev, info_regs.x2i_buf); x2i->rb_size =3D info_regs.x2i_buf_sz; =20 - ndev->mgmt_chan_idx =3D info_regs.msi_id; - ndev->mgmt_prot_major =3D info_regs.prot_major; - ndev->mgmt_prot_minor =3D info_regs.prot_minor; + ndev->aie.mgmt_chan_idx =3D info_regs.msi_id; + ndev->aie.mgmt_prot_major =3D info_regs.prot_major; + ndev->aie.mgmt_prot_minor =3D info_regs.prot_minor; =20 - ret =3D aie2_check_protocol(ndev, ndev->mgmt_prot_major, ndev->mgmt_prot_= minor); + ret =3D aie_check_protocol(&ndev->aie, ndev->aie.mgmt_prot_major, + ndev->aie.mgmt_prot_minor); =20 done: - aie2_dump_chann_info_debug(ndev); + aie_dump_mgmt_chann_debug(&ndev->aie); =20 /* Must clear address at FW_ALIVE_OFF */ writel(0, SRAM_GET_ADDR(ndev, FW_ALIVE_OFF)); @@ -173,13 +135,14 @@ int aie2_runtime_cfg(struct amdxdna_dev_hdl *ndev, continue; =20 if (cfg->feature_mask && - bitmap_subset(&cfg->feature_mask, &ndev->feature_mask, AIE2_FEATURE_= MAX)) + bitmap_subset(&cfg->feature_mask, &ndev->aie.feature_mask, + AIE2_FEATURE_MAX)) continue; =20 value =3D val ? *val : cfg->value; ret =3D aie2_set_runtime_cfg(ndev, cfg->type, value); if (ret) { - XDNA_ERR(ndev->xdna, "Set type %d value %d failed", + XDNA_ERR(ndev->aie.xdna, "Set type %d value %d failed", cfg->type, value); return ret; } @@ -194,13 +157,13 @@ static int aie2_xdna_reset(struct amdxdna_dev_hdl *nd= ev) =20 ret =3D aie2_suspend_fw(ndev); if (ret) { - XDNA_ERR(ndev->xdna, "Suspend firmware failed"); + XDNA_ERR(ndev->aie.xdna, "Suspend firmware failed"); return ret; } =20 ret =3D aie2_resume_fw(ndev); if (ret) { - XDNA_ERR(ndev->xdna, "Resume firmware failed"); + XDNA_ERR(ndev->aie.xdna, "Resume firmware failed"); return ret; } =20 @@ -213,19 +176,19 @@ static int aie2_mgmt_fw_init(struct amdxdna_dev_hdl *= ndev) =20 ret =3D aie2_runtime_cfg(ndev, AIE2_RT_CFG_INIT, NULL); if (ret) { - XDNA_ERR(ndev->xdna, "Runtime config failed"); + XDNA_ERR(ndev->aie.xdna, "Runtime config failed"); return ret; } =20 ret =3D aie2_assign_mgmt_pasid(ndev, 0); if (ret) { - XDNA_ERR(ndev->xdna, "Can not assign PASID"); + XDNA_ERR(ndev->aie.xdna, "Can not assign PASID"); return ret; } =20 ret =3D aie2_xdna_reset(ndev); if (ret) { - XDNA_ERR(ndev->xdna, "Reset firmware failed"); + XDNA_ERR(ndev->aie.xdna, "Reset firmware failed"); return ret; } =20 @@ -236,21 +199,21 @@ static int aie2_mgmt_fw_query(struct amdxdna_dev_hdl = *ndev) { int ret; =20 - ret =3D aie2_query_firmware_version(ndev, &ndev->xdna->fw_ver); + ret =3D aie2_query_firmware_version(ndev, &ndev->aie.xdna->fw_ver); if (ret) { - XDNA_ERR(ndev->xdna, "query firmware version failed"); + XDNA_ERR(ndev->aie.xdna, "query firmware version failed"); return ret; } =20 ret =3D aie2_query_aie_version(ndev, &ndev->version); if (ret) { - XDNA_ERR(ndev->xdna, "Query AIE version failed"); + XDNA_ERR(ndev->aie.xdna, "Query AIE version failed"); return ret; } =20 ret =3D aie2_query_aie_metadata(ndev, &ndev->metadata); if (ret) { - XDNA_ERR(ndev->xdna, "Query AIE metadata failed"); + XDNA_ERR(ndev->aie.xdna, "Query AIE metadata failed"); return ret; } =20 @@ -262,8 +225,8 @@ static int aie2_mgmt_fw_query(struct amdxdna_dev_hdl *n= dev) static void aie2_mgmt_fw_fini(struct amdxdna_dev_hdl *ndev) { if (aie2_suspend_fw(ndev)) - XDNA_ERR(ndev->xdna, "Suspend_fw failed"); - XDNA_DBG(ndev->xdna, "Firmware suspended"); + XDNA_ERR(ndev->aie.xdna, "Suspend_fw failed"); + XDNA_DBG(ndev->aie.xdna, "Firmware suspended"); } =20 static int aie2_xrs_load(void *cb_arg, struct xrs_action_load *action) @@ -331,7 +294,7 @@ static void aie2_hw_stop(struct amdxdna_dev *xdna) =20 aie2_runtime_cfg(ndev, AIE2_RT_CFG_CLK_GATING, NULL); aie2_mgmt_fw_fini(ndev); - aie2_destroy_mgmt_chann(ndev); + aie_destroy_chann(&ndev->aie, &ndev->aie.mgmt_chann); drmm_kfree(&xdna->ddev, ndev->mbox); ndev->mbox =3D NULL; aie2_psp_stop(ndev->psp_hdl); @@ -374,8 +337,8 @@ static int aie2_hw_start(struct amdxdna_dev *xdna) goto disable_dev; } =20 - ndev->mgmt_chann =3D xdna_mailbox_alloc_channel(ndev->mbox); - if (!ndev->mgmt_chann) { + ndev->aie.mgmt_chann =3D xdna_mailbox_alloc_channel(ndev->mbox); + if (!ndev->aie.mgmt_chann) { XDNA_ERR(xdna, "failed to alloc channel"); ret =3D -ENODEV; goto disable_dev; @@ -399,17 +362,17 @@ static int aie2_hw_start(struct amdxdna_dev *xdna) goto stop_psp; } =20 - mgmt_mb_irq =3D pci_irq_vector(pdev, ndev->mgmt_chan_idx); + mgmt_mb_irq =3D pci_irq_vector(pdev, ndev->aie.mgmt_chan_idx); if (mgmt_mb_irq < 0) { ret =3D mgmt_mb_irq; XDNA_ERR(xdna, "failed to alloc irq vector, ret %d", ret); goto stop_psp; } =20 - xdna_mailbox_intr_reg =3D ndev->mgmt_i2x.mb_head_ptr_reg + 4; - ret =3D xdna_mailbox_start_channel(ndev->mgmt_chann, - &ndev->mgmt_x2i, - &ndev->mgmt_i2x, + xdna_mailbox_intr_reg =3D ndev->aie.mgmt_i2x.mb_head_ptr_reg + 4; + ret =3D xdna_mailbox_start_channel(ndev->aie.mgmt_chann, + &ndev->aie.mgmt_x2i, + &ndev->aie.mgmt_i2x, xdna_mailbox_intr_reg, mgmt_mb_irq); if (ret) { @@ -448,14 +411,14 @@ static int aie2_hw_start(struct amdxdna_dev *xdna) =20 stop_fw: aie2_suspend_fw(ndev); - xdna_mailbox_stop_channel(ndev->mgmt_chann); + xdna_mailbox_stop_channel(ndev->aie.mgmt_chann); stop_psp: aie2_psp_stop(ndev->psp_hdl); fini_smu: aie2_smu_fini(ndev); free_channel: - xdna_mailbox_free_channel(ndev->mgmt_chann); - ndev->mgmt_chann =3D NULL; + xdna_mailbox_free_channel(ndev->aie.mgmt_chann); + ndev->aie.mgmt_chann =3D NULL; disable_dev: pci_disable_device(pdev); =20 @@ -516,7 +479,7 @@ static int aie2_init(struct amdxdna_dev *xdna) return -ENOMEM; =20 ndev->priv =3D xdna->dev_info->dev_priv; - ndev->xdna =3D xdna; + ndev->aie.xdna =3D xdna; =20 for (i =3D 0; i < ARRAY_SIZE(npu_fw); i++) { fw_full_path =3D kasprintf(GFP_KERNEL, "%s%s", ndev->priv->fw_path, npu_= fw[i]); diff --git a/drivers/accel/amdxdna/aie2_pci.h b/drivers/accel/amdxdna/aie2_= pci.h index efcf4be035f0..90fb0aafaf40 100644 --- a/drivers/accel/amdxdna/aie2_pci.h +++ b/drivers/accel/amdxdna/aie2_pci.h @@ -10,6 +10,7 @@ #include #include =20 +#include "aie.h" #include "aie2_msg_priv.h" #include "amdxdna_mailbox.h" =20 @@ -20,7 +21,7 @@ #define AIE2_DEVM_BASE 0x4000000 #define AIE2_DEVM_SIZE SZ_64M =20 -#define NDEV2PDEV(ndev) (to_pci_dev((ndev)->xdna->ddev.dev)) +#define NDEV2PDEV(ndev) (to_pci_dev((ndev)->aie.xdna->ddev.dev)) =20 #define AIE2_SRAM_OFF(ndev, addr) ((addr) - (ndev)->priv->sram_dev_addr) #define AIE2_MBOX_OFF(ndev, addr) ((addr) - (ndev)->priv->mbox_dev_addr) @@ -45,7 +46,7 @@ ({ \ typeof(ndev) _ndev =3D (ndev); \ ((_ndev)->priv->mbox_size) ? (_ndev)->priv->mbox_size : \ - pci_resource_len(NDEV2PDEV(_ndev), (_ndev)->xdna->dev_info->mbox_bar); \ + pci_resource_len(NDEV2PDEV(_ndev), (_ndev)->aie.xdna->dev_info->mbox_bar)= ; \ }) =20 #if IS_ENABLED(CONFIG_AMD_PMF) @@ -203,23 +204,16 @@ struct aie2_exec_msg_ops { }; =20 struct amdxdna_dev_hdl { - struct amdxdna_dev *xdna; + struct aie_device aie; const struct amdxdna_dev_priv *priv; void __iomem *sram_base; void __iomem *smu_base; void __iomem *mbox_base; struct psp_device *psp_hdl; =20 - struct xdna_mailbox_chann_res mgmt_x2i; - struct xdna_mailbox_chann_res mgmt_i2x; - u32 mgmt_chan_idx; - u32 mgmt_prot_major; - u32 mgmt_prot_minor; - u32 total_col; struct aie_version version; struct aie_metadata metadata; - unsigned long feature_mask; struct aie2_exec_msg_ops *exec_msg_ops; =20 /* power management and clock*/ @@ -237,7 +231,6 @@ struct amdxdna_dev_hdl { =20 /* Mailbox and the management channel */ struct mailbox *mbox; - struct mailbox_channel *mgmt_chann; struct async_events *async_events; =20 enum aie2_dev_status dev_status; @@ -266,21 +259,12 @@ enum aie2_fw_feature { AIE2_FEATURE_MAX }; =20 -struct aie2_fw_feature_tbl { - u64 features; - u32 major; - u32 max_minor; - u32 min_minor; -}; - #define AIE2_ALL_FEATURES GENMASK_ULL(AIE2_FEATURE_MAX - 1, AIE2_NPU_COMMA= ND) -#define AIE2_FEATURE_ON(ndev, feature) test_bit(feature, &(ndev)->feature_= mask) =20 struct amdxdna_dev_priv { const char *fw_path; const struct rt_config *rt_config; const struct dpm_clk_freq *dpm_clk_tbl; - const struct aie2_fw_feature_tbl *fw_feature_tbl; =20 #define COL_ALIGN_NONE 0 #define COL_ALIGN_NATURE 1 @@ -306,7 +290,7 @@ extern const struct dpm_clk_freq npu1_dpm_clk_table[]; extern const struct dpm_clk_freq npu4_dpm_clk_table[]; extern const struct rt_config npu1_default_rt_cfg[]; extern const struct rt_config npu4_default_rt_cfg[]; -extern const struct aie2_fw_feature_tbl npu4_fw_feature_table[]; +extern const struct amdxdna_fw_feature_tbl npu4_fw_feature_table[]; =20 /* aie2_smu.c */ int aie2_smu_init(struct amdxdna_dev_hdl *ndev); diff --git a/drivers/accel/amdxdna/aie2_pm.c b/drivers/accel/amdxdna/aie2_p= m.c index 29bd4403a94d..5ec6728d04fd 100644 --- a/drivers/accel/amdxdna/aie2_pm.c +++ b/drivers/accel/amdxdna/aie2_pm.c @@ -31,14 +31,14 @@ int aie2_pm_set_dpm(struct amdxdna_dev_hdl *ndev, u32 d= pm_level) { int ret; =20 - ret =3D amdxdna_pm_resume_get_locked(ndev->xdna); + ret =3D amdxdna_pm_resume_get_locked(ndev->aie.xdna); if (ret) return ret; =20 ret =3D ndev->priv->hw_ops.set_dpm(ndev, dpm_level); if (!ret) ndev->dpm_level =3D dpm_level; - amdxdna_pm_suspend_put(ndev->xdna); + amdxdna_pm_suspend_put(ndev->aie.xdna); =20 return ret; } @@ -81,7 +81,7 @@ int aie2_pm_init(struct amdxdna_dev_hdl *ndev) =20 int aie2_pm_set_mode(struct amdxdna_dev_hdl *ndev, enum amdxdna_power_mode= _type target) { - struct amdxdna_dev *xdna =3D ndev->xdna; + struct amdxdna_dev *xdna =3D ndev->aie.xdna; u32 clk_gating, dpm_level; int ret; =20 diff --git a/drivers/accel/amdxdna/aie2_smu.c b/drivers/accel/amdxdna/aie2_= smu.c index d8c31924e501..727637dac3a8 100644 --- a/drivers/accel/amdxdna/aie2_smu.c +++ b/drivers/accel/amdxdna/aie2_smu.c @@ -46,7 +46,7 @@ static int aie2_smu_exec(struct amdxdna_dev_hdl *ndev, u3= 2 reg_cmd, ret =3D readx_poll_timeout(readl, SMU_REG(ndev, SMU_RESP_REG), resp, resp, AIE2_INTERVAL, AIE2_TIMEOUT); if (ret) { - XDNA_ERR(ndev->xdna, "smu cmd %d timed out", reg_cmd); + XDNA_ERR(ndev->aie.xdna, "smu cmd %d timed out", reg_cmd); return ret; } =20 @@ -54,7 +54,7 @@ static int aie2_smu_exec(struct amdxdna_dev_hdl *ndev, u3= 2 reg_cmd, *out =3D readl(SMU_REG(ndev, SMU_OUT_REG)); =20 if (resp !=3D SMU_RESULT_OK) { - XDNA_ERR(ndev->xdna, "smu cmd %d failed, 0x%x", reg_cmd, resp); + XDNA_ERR(ndev->aie.xdna, "smu cmd %d failed, 0x%x", reg_cmd, resp); return -EINVAL; } =20 @@ -69,7 +69,7 @@ int npu1_set_dpm(struct amdxdna_dev_hdl *ndev, u32 dpm_le= vel) ret =3D aie2_smu_exec(ndev, AIE2_SMU_SET_MPNPUCLK_FREQ, ndev->priv->dpm_clk_tbl[dpm_level].npuclk, &freq); if (ret) { - XDNA_ERR(ndev->xdna, "Set npu clock to %d failed, ret %d\n", + XDNA_ERR(ndev->aie.xdna, "Set npu clock to %d failed, ret %d\n", ndev->priv->dpm_clk_tbl[dpm_level].npuclk, ret); return ret; } @@ -78,7 +78,7 @@ int npu1_set_dpm(struct amdxdna_dev_hdl *ndev, u32 dpm_le= vel) ret =3D aie2_smu_exec(ndev, AIE2_SMU_SET_HCLK_FREQ, ndev->priv->dpm_clk_tbl[dpm_level].hclk, &freq); if (ret) { - XDNA_ERR(ndev->xdna, "Set h clock to %d failed, ret %d\n", + XDNA_ERR(ndev->aie.xdna, "Set h clock to %d failed, ret %d\n", ndev->priv->dpm_clk_tbl[dpm_level].hclk, ret); return ret; } @@ -87,7 +87,7 @@ int npu1_set_dpm(struct amdxdna_dev_hdl *ndev, u32 dpm_le= vel) ndev->max_tops =3D 2 * ndev->total_col; ndev->curr_tops =3D ndev->max_tops * freq / 1028; =20 - XDNA_DBG(ndev->xdna, "MP-NPU clock %d, H clock %d\n", + XDNA_DBG(ndev->aie.xdna, "MP-NPU clock %d, H clock %d\n", ndev->npuclk_freq, ndev->hclk_freq); =20 return 0; @@ -99,14 +99,14 @@ int npu4_set_dpm(struct amdxdna_dev_hdl *ndev, u32 dpm_= level) =20 ret =3D aie2_smu_exec(ndev, AIE2_SMU_SET_HARD_DPMLEVEL, dpm_level, NULL); if (ret) { - XDNA_ERR(ndev->xdna, "Set hard dpm level %d failed, ret %d ", + XDNA_ERR(ndev->aie.xdna, "Set hard dpm level %d failed, ret %d ", dpm_level, ret); return ret; } =20 ret =3D aie2_smu_exec(ndev, AIE2_SMU_SET_SOFT_DPMLEVEL, dpm_level, NULL); if (ret) { - XDNA_ERR(ndev->xdna, "Set soft dpm level %d failed, ret %d", + XDNA_ERR(ndev->aie.xdna, "Set soft dpm level %d failed, ret %d", dpm_level, ret); return ret; } @@ -116,7 +116,7 @@ int npu4_set_dpm(struct amdxdna_dev_hdl *ndev, u32 dpm_= level) ndev->max_tops =3D NPU4_DPM_TOPS(ndev, ndev->max_dpm_level); ndev->curr_tops =3D NPU4_DPM_TOPS(ndev, dpm_level); =20 - XDNA_DBG(ndev->xdna, "MP-NPU clock %d, H clock %d\n", + XDNA_DBG(ndev->aie.xdna, "MP-NPU clock %d, H clock %d\n", ndev->npuclk_freq, ndev->hclk_freq); =20 return 0; @@ -132,13 +132,13 @@ int aie2_smu_init(struct amdxdna_dev_hdl *ndev) */ ret =3D aie2_smu_exec(ndev, AIE2_SMU_POWER_OFF, 0, NULL); if (ret) { - XDNA_ERR(ndev->xdna, "Access power failed, ret %d", ret); + XDNA_ERR(ndev->aie.xdna, "Access power failed, ret %d", ret); return ret; } =20 ret =3D aie2_smu_exec(ndev, AIE2_SMU_POWER_ON, 0, NULL); if (ret) { - XDNA_ERR(ndev->xdna, "Power on failed, ret %d", ret); + XDNA_ERR(ndev->aie.xdna, "Power on failed, ret %d", ret); return ret; } =20 @@ -152,5 +152,5 @@ void aie2_smu_fini(struct amdxdna_dev_hdl *ndev) ndev->priv->hw_ops.set_dpm(ndev, 0); ret =3D aie2_smu_exec(ndev, AIE2_SMU_POWER_OFF, 0, NULL); if (ret) - XDNA_ERR(ndev->xdna, "Power off failed, ret %d", ret); + XDNA_ERR(ndev->aie.xdna, "Power off failed, ret %d", ret); } diff --git a/drivers/accel/amdxdna/amdxdna_pci_drv.h b/drivers/accel/amdxdn= a/amdxdna_pci_drv.h index 0661749917d6..5e0bf565a1ae 100644 --- a/drivers/accel/amdxdna/amdxdna_pci_drv.h +++ b/drivers/accel/amdxdna/amdxdna_pci_drv.h @@ -66,6 +66,13 @@ struct amdxdna_dev_ops { int (*get_array)(struct amdxdna_client *client, struct amdxdna_drm_get_ar= ray *args); }; =20 +struct amdxdna_fw_feature_tbl { + u64 features; + u32 major; + u32 max_minor; + u32 min_minor; +}; + /* * struct amdxdna_dev_info - Device hardware information * Record device static information, like reg, mbox, PSP, SMU bar index @@ -83,6 +90,7 @@ struct amdxdna_dev_info { size_t dev_mem_size; char *vbnv; const struct amdxdna_dev_priv *dev_priv; + const struct amdxdna_fw_feature_tbl *fw_feature_tbl; const struct amdxdna_dev_ops *ops; }; =20 diff --git a/drivers/accel/amdxdna/npu1_regs.c b/drivers/accel/amdxdna/npu1= _regs.c index 1320e924e548..2ea7568a2e99 100644 --- a/drivers/accel/amdxdna/npu1_regs.c +++ b/drivers/accel/amdxdna/npu1_regs.c @@ -65,7 +65,7 @@ const struct dpm_clk_freq npu1_dpm_clk_table[] =3D { { 0 } }; =20 -static const struct aie2_fw_feature_tbl npu1_fw_feature_table[] =3D { +static const struct amdxdna_fw_feature_tbl npu1_fw_feature_table[] =3D { { .major =3D 5, .min_minor =3D 7 }, { .features =3D BIT_U64(AIE2_NPU_COMMAND), .major =3D 5, .min_minor =3D 8= }, { 0 } @@ -75,7 +75,6 @@ static const struct amdxdna_dev_priv npu1_dev_priv =3D { .fw_path =3D "amdnpu/1502_00/", .rt_config =3D npu1_default_rt_cfg, .dpm_clk_tbl =3D npu1_dpm_clk_table, - .fw_feature_tbl =3D npu1_fw_feature_table, .col_align =3D COL_ALIGN_NONE, .mbox_dev_addr =3D NPU1_MBOX_BAR_BASE, .mbox_size =3D 0, /* Use BAR size */ @@ -120,5 +119,6 @@ const struct amdxdna_dev_info dev_npu1_info =3D { .vbnv =3D "RyzenAI-npu1", .device_type =3D AMDXDNA_DEV_TYPE_KMQ, .dev_priv =3D &npu1_dev_priv, + .fw_feature_tbl =3D npu1_fw_feature_table, .ops =3D &aie2_ops, }; diff --git a/drivers/accel/amdxdna/npu4_regs.c b/drivers/accel/amdxdna/npu4= _regs.c index 619bff042e52..9689c56c83be 100644 --- a/drivers/accel/amdxdna/npu4_regs.c +++ b/drivers/accel/amdxdna/npu4_regs.c @@ -88,7 +88,7 @@ const struct dpm_clk_freq npu4_dpm_clk_table[] =3D { { 0 } }; =20 -const struct aie2_fw_feature_tbl npu4_fw_feature_table[] =3D { +const struct amdxdna_fw_feature_tbl npu4_fw_feature_table[] =3D { { .major =3D 6, .min_minor =3D 12 }, { .features =3D BIT_U64(AIE2_NPU_COMMAND), .major =3D 6, .min_minor =3D 1= 5 }, { .features =3D BIT_U64(AIE2_PREEMPT), .major =3D 6, .min_minor =3D 12 }, @@ -102,7 +102,6 @@ static const struct amdxdna_dev_priv npu4_dev_priv =3D { .fw_path =3D "amdnpu/17f0_10/", .rt_config =3D npu4_default_rt_cfg, .dpm_clk_tbl =3D npu4_dpm_clk_table, - .fw_feature_tbl =3D npu4_fw_feature_table, .col_align =3D COL_ALIGN_NATURE, .mbox_dev_addr =3D NPU4_MBOX_BAR_BASE, .mbox_size =3D 0, /* Use BAR size */ @@ -147,5 +146,6 @@ const struct amdxdna_dev_info dev_npu4_info =3D { .vbnv =3D "RyzenAI-npu4", .device_type =3D AMDXDNA_DEV_TYPE_KMQ, .dev_priv =3D &npu4_dev_priv, + .fw_feature_tbl =3D npu4_fw_feature_table, .ops =3D &aie2_ops, /* NPU4 can share NPU1's callback */ }; diff --git a/drivers/accel/amdxdna/npu5_regs.c b/drivers/accel/amdxdna/npu5= _regs.c index c0ac5daf32ee..98ee8780f3f5 100644 --- a/drivers/accel/amdxdna/npu5_regs.c +++ b/drivers/accel/amdxdna/npu5_regs.c @@ -66,7 +66,6 @@ static const struct amdxdna_dev_priv npu5_dev_priv =3D { .fw_path =3D "amdnpu/17f0_11/", .rt_config =3D npu4_default_rt_cfg, .dpm_clk_tbl =3D npu4_dpm_clk_table, - .fw_feature_tbl =3D npu4_fw_feature_table, .col_align =3D COL_ALIGN_NATURE, .mbox_dev_addr =3D NPU5_MBOX_BAR_BASE, .mbox_size =3D 0, /* Use BAR size */ @@ -111,5 +110,6 @@ const struct amdxdna_dev_info dev_npu5_info =3D { .vbnv =3D "RyzenAI-npu5", .device_type =3D AMDXDNA_DEV_TYPE_KMQ, .dev_priv =3D &npu5_dev_priv, + .fw_feature_tbl =3D npu4_fw_feature_table, .ops =3D &aie2_ops, }; diff --git a/drivers/accel/amdxdna/npu6_regs.c b/drivers/accel/amdxdna/npu6= _regs.c index ce591ed0d483..31400cca5ec4 100644 --- a/drivers/accel/amdxdna/npu6_regs.c +++ b/drivers/accel/amdxdna/npu6_regs.c @@ -66,7 +66,6 @@ static const struct amdxdna_dev_priv npu6_dev_priv =3D { .fw_path =3D "amdnpu/17f0_10/", .rt_config =3D npu4_default_rt_cfg, .dpm_clk_tbl =3D npu4_dpm_clk_table, - .fw_feature_tbl =3D npu4_fw_feature_table, .col_align =3D COL_ALIGN_NATURE, .mbox_dev_addr =3D NPU6_MBOX_BAR_BASE, .mbox_size =3D 0, /* Use BAR size */ @@ -112,5 +111,6 @@ const struct amdxdna_dev_info dev_npu6_info =3D { .vbnv =3D "RyzenAI-npu6", .device_type =3D AMDXDNA_DEV_TYPE_KMQ, .dev_priv =3D &npu6_dev_priv, + .fw_feature_tbl =3D npu4_fw_feature_table, .ops =3D &aie2_ops, }; --=20 2.34.1 From nobody Wed Apr 1 09:45:44 2026 Received: from CY7PR03CU001.outbound.protection.outlook.com (mail-westcentralusazon11010043.outbound.protection.outlook.com [40.93.198.43]) (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 11AD9388380 for ; Mon, 30 Mar 2026 16:37:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.198.43 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774888650; cv=fail; b=MG+ODSSA9LtNgIe38I8r5P2wj4qVaQ6OUfUau6q9d7IU2rQkK7iLSqQxB3TqsTY4izrwZMFOqXRDZwY9ivUTstAf4LHthiYQbwegFKq/WMmhCgN88tgfCI3DNfXE+xgaKyHqQ/y6hivQflXsQPWDP0Wd/Y56hTJFWWk8ON8CqBY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774888650; c=relaxed/simple; bh=X8gDv1KsM/12ZHdDIz/upRZyxIBqC6J6vWlhuQDmZdA=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=MVgQ878Rtm+dmyrdMldQ4QxYZLKnEVkjQ+3ixfBfWXFDaJXg1/FNwoCNpFmcZQDKHICQLtVDbcM4C+/ZRzar7TG04zGWEFtT2AgzteLAzEVziBVLnBHr/Ji5o8XaVs9rwd1qPL0fZRrO7zM9mAgBvHbaBOSLPBB3r0LrdEVML3Y= 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=Gx17rWKR; arc=fail smtp.client-ip=40.93.198.43 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="Gx17rWKR" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=kjfhvOF2RsHBKzT57JVJ8/sOc0t0JpDVPtWWQbC3gGxnQO3+fWQt2ZJMKni5wwyaZE+d8lrserv8xgE5+jjI2OtfPAajM/JVVe4EiiMeBlBS4CH3Ma0ALwYk/OZ8ve3n8SBoRT7XFgFiLo4DRlSyHtCcPY2Hk+U/OhQnT0YMF93CRN79Q6DAWGSzhdJt1DotZwzS/W/TIibgKPIiACk6I7vDGhGudLwOW39hmFvrQDG4vNOM6ZR0KMMKvLJpz61oO89QMd2muUQusbuecsDD7tTeS8Jq0ViXAino63kN2GD5sJyajmw0HVzhk9ZWZjhp3mUVWd9mA1eHqSW1zINwEQ== 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=Gbk+fI3qUPEvHzlbbF4/6KRx8U2umnzCO1cweGCZrHg=; b=HvMgAaSBsB+PkahT4ie2Ts+YjqazFWsaO5LM12xC3aPpqe3RwEMaKBB2JEgPHe82M1XOInBABTQOsExEp3fPzZvH6bWfZXe+EiE2dbP/2m8lx8HO0dZ7B1aRoLDyn+nof2InK+P7XBjCfFIhaWmmopqElu0yKhXgYWE9+hKVbjszAvBQAZsISWnzGRlVvGH1POylY+HO7NryNC6UC3iO5UwCbg244hLqdSL5GCHwsFf/71XhELk++W75031nTWsJpvyQ4LCRdTPzeJtUxmaB9GefNUXeh2oODUYvGskqGrK70n00VvLp4MVUIUmR/LrEoyd/K5Qq5Yd/bz4AL0ChHg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=kernel.org 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=Gbk+fI3qUPEvHzlbbF4/6KRx8U2umnzCO1cweGCZrHg=; b=Gx17rWKRu4tadVCJ4+LXCKJBsgCSg6lqv59mYtogTZV/ZuecwDfCx54hYmUNJ0ikckNJFq7oTzrcr5ara0bm3/3htM1Y0wgG+8YdeYCvxYxIlKVBtfrSHMLQ1TIfjuF/SYby5+8FA7ci3qKNT4JbPpQfNTJ6qlr8yEbg8xcnz5k= Received: from SA1PR03CA0013.namprd03.prod.outlook.com (2603:10b6:806:2d3::9) by PH8PR12MB7445.namprd12.prod.outlook.com (2603:10b6:510:217::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9769.15; Mon, 30 Mar 2026 16:37:19 +0000 Received: from SN1PEPF0002636D.namprd02.prod.outlook.com (2603:10b6:806:2d3:cafe::69) by SA1PR03CA0013.outlook.office365.com (2603:10b6:806:2d3::9) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9745.28 via Frontend Transport; Mon, 30 Mar 2026 16:37:19 +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=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SN1PEPF0002636D.mail.protection.outlook.com (10.167.241.138) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9745.21 via Frontend Transport; Mon, 30 Mar 2026 16:37:18 +0000 Received: from SATLEXMB04.amd.com (10.181.40.145) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.2.2562.17; Mon, 30 Mar 2026 11:37:16 -0500 Received: from satlexmb07.amd.com (10.181.42.216) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.39; Mon, 30 Mar 2026 11:37:16 -0500 Received: from xsjlizhih51.xilinx.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server id 15.2.2562.17 via Frontend Transport; Mon, 30 Mar 2026 11:37:15 -0500 From: Lizhi Hou To: , , , , CC: David Zhang , , , , Hayden Laccabue , Lizhi Hou Subject: [PATCH V1 2/6] accel/amdxdna: Add basic support for AIE4 devices Date: Mon, 30 Mar 2026 09:37:01 -0700 Message-ID: <20260330163705.3153647-3-lizhi.hou@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260330163705.3153647-1-lizhi.hou@amd.com> References: <20260330163705.3153647-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 Received-SPF: None (SATLEXMB04.amd.com: lizhi.hou@amd.com does not designate permitted sender hosts) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN1PEPF0002636D:EE_|PH8PR12MB7445:EE_ X-MS-Office365-Filtering-Correlation-Id: dcefdccf-5180-4ea9-3b66-08de8e7a9bee X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|376014|36860700016|1800799024|18002099003|22082099003|56012099003; X-Microsoft-Antispam-Message-Info: iDzpdTlLNS8u213Gwz9T/weeJdaaq83HbY7h8qLnPnIn4XxO0e2B480KmrC0jOdFsusXwqxUp//RTqJTuZsPkeh1TKvy/4+LdHgq8mW5jO9ztT9jkXFYbKWTzil5dIy1A2YFyZRryHNFqjdZqZZHZzpe286/K8Pf69kLXk7z9J/Fp3yqK9J2DOELefKE/iD9RWI+clUuuADJxaNPbRd3b1c9toEqxIcMuMVV2bmiTHy2R3RzvgtW7d71/pm9ia3uAW1VGZJUqyq86ouAVJhJ/vDkblST9/RbB0mjYGRKXYnU27WrXcb8+JYP6YqmCnPi8saDzwEokLeu3fw7GErCgQMXAJIKi+3whUhS0uZ3KvOi+eiVtqAVbcT9GunqZNrOrAM7byw4qN3RBaGY2c/gtUC2+PVanecp9p4REJFhHEcli35kxNZHi9Cq0q8Wf+kcH886ssNtKbQDAiZJV74RIzok+89+gem7jYA6YUcnaQt4FZqFn8a7ZexLToPKdDBmaURSipeEHw0HdoegDGDb0RR1r86jUi2kHvQRR7Pa3NvliCC1aSyRTJiIoxNq+NqghSPRmt7ZF3GDfGfVIHXnnHXHkzXEfEQhOeMrC4ItMCtZSMlFmsyOalA7D8Tja2TDlQUSCe1hDvDERneL1x30w0t6pFrCO20lngyA88/9oRvm3JBYzf8e49+yYa0SUsAYiOPpz/mQcNQE9FdX6wcn7Qk0pRKK1PCXeqW1oZfP55bVibwO2cM1YuK9g6pgjLZ99g8Luq+kVxZW0HjzRTUTRw== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(82310400026)(376014)(36860700016)(1800799024)(18002099003)(22082099003)(56012099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: f0OdDf3fsh+aCVILIcYnHFTVJyNxfSk3cMhqJpEMop4K1dU5hyz/TtKONtywZZkHwlJ725k3TcwvYU+0QTYRgSAROzr3wZBdrC7eTWcwrxdFhcEpiQHe73iXf+5vcwPPj2BTGB7caCwlAXskl0RENPuiv8IuvKsCcinellMWvd+SdwmpvdKzAC0EuZCMGObP4IKCEsIWcMnxn+eriy3TS5S5c5kam3qslqPaoAV/rcGaayM/wvwC6lKCnqQrQ+teJm+Saf6RoVoP28enHktco6uLUH0g52GCLCrvft6wiHa71LWOecJffAUPX7UAMh2BEP4s03223tzGi7XVD5iEwZj9hOuMO1+TjksMzXIv12jO0sGH1oZY1f8cSN+jor5o5MXqvSYSYCPu9/LMvLFCG9UFHjEm3lG2E6RvpIia3wdKRP6MAaAiOR/l+qShyhW8 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Mar 2026 16:37:18.6095 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: dcefdccf-5180-4ea9-3b66-08de8e7a9bee 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=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SN1PEPF0002636D.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH8PR12MB7445 Content-Type: text/plain; charset="utf-8" From: David Zhang Add initial support for AIE4 devices (PCI device IDs 0x17F2 and 0x1B0B), including: Device initialization Basic mailbox communication SR-IOV enablement This lays the groundwork for full AIE4 support. Co-developed-by: Hayden Laccabue Signed-off-by: Hayden Laccabue Signed-off-by: David Zhang Signed-off-by: Lizhi Hou Reviewed-by: Mario Limonciello (AMD) --- drivers/accel/amdxdna/Makefile | 5 + drivers/accel/amdxdna/aie.h | 3 + drivers/accel/amdxdna/aie2_pci.c | 2 +- drivers/accel/amdxdna/aie2_pci.h | 3 - drivers/accel/amdxdna/aie2_smu.c | 2 +- drivers/accel/amdxdna/aie4_message.c | 27 ++ drivers/accel/amdxdna/aie4_msg_priv.h | 49 ++++ drivers/accel/amdxdna/aie4_pci.c | 364 ++++++++++++++++++++++++ drivers/accel/amdxdna/aie4_pci.h | 48 ++++ drivers/accel/amdxdna/aie4_sriov.c | 88 ++++++ drivers/accel/amdxdna/amdxdna_mailbox.c | 19 +- drivers/accel/amdxdna/amdxdna_mailbox.h | 8 +- drivers/accel/amdxdna/amdxdna_pci_drv.c | 19 +- drivers/accel/amdxdna/amdxdna_pci_drv.h | 2 + drivers/accel/amdxdna/npu3_regs.c | 39 +++ include/uapi/drm/amdxdna_accel.h | 3 +- 16 files changed, 666 insertions(+), 15 deletions(-) create mode 100644 drivers/accel/amdxdna/aie4_message.c create mode 100644 drivers/accel/amdxdna/aie4_msg_priv.h create mode 100644 drivers/accel/amdxdna/aie4_pci.c create mode 100644 drivers/accel/amdxdna/aie4_pci.h create mode 100644 drivers/accel/amdxdna/aie4_sriov.c create mode 100644 drivers/accel/amdxdna/npu3_regs.c diff --git a/drivers/accel/amdxdna/Makefile b/drivers/accel/amdxdna/Makefile index 5c7911554c46..a61cd6c0db30 100644 --- a/drivers/accel/amdxdna/Makefile +++ b/drivers/accel/amdxdna/Makefile @@ -10,6 +10,8 @@ amdxdna-y :=3D \ aie2_psp.o \ aie2_smu.o \ aie2_solver.o \ + aie4_message.o \ + aie4_pci.o \ amdxdna_ctx.o \ amdxdna_gem.o \ amdxdna_iommu.o \ @@ -20,7 +22,10 @@ amdxdna-y :=3D \ amdxdna_sysfs.o \ amdxdna_ubuf.o \ npu1_regs.o \ + npu3_regs.o \ npu4_regs.o \ npu5_regs.o \ npu6_regs.o + +amdxdna-$(CONFIG_PCI_IOV) +=3D aie4_sriov.o obj-$(CONFIG_DRM_ACCEL_AMDXDNA) =3D amdxdna.o diff --git a/drivers/accel/amdxdna/aie.h b/drivers/accel/amdxdna/aie.h index 1bea14b79c7c..6c53870d0098 100644 --- a/drivers/accel/amdxdna/aie.h +++ b/drivers/accel/amdxdna/aie.h @@ -8,6 +8,9 @@ #include "amdxdna_pci_drv.h" #include "amdxdna_mailbox.h" =20 +#define AIE_INTERVAL 20000 /* us */ +#define AIE_TIMEOUT 1000000 /* us */ + struct aie_device { struct amdxdna_dev *xdna; struct mailbox_channel *mgmt_chann; diff --git a/drivers/accel/amdxdna/aie2_pci.c b/drivers/accel/amdxdna/aie2_= pci.c index 03bac963516d..708d0b7fd2e3 100644 --- a/drivers/accel/amdxdna/aie2_pci.c +++ b/drivers/accel/amdxdna/aie2_pci.c @@ -79,7 +79,7 @@ static int aie2_get_mgmt_chann_info(struct amdxdna_dev_hd= l *ndev) * is alive. */ ret =3D readx_poll_timeout(readl, SRAM_GET_ADDR(ndev, FW_ALIVE_OFF), - addr, addr, AIE2_INTERVAL, AIE2_TIMEOUT); + addr, addr, AIE_INTERVAL, AIE_TIMEOUT); if (ret || !addr) return -ETIME; =20 diff --git a/drivers/accel/amdxdna/aie2_pci.h b/drivers/accel/amdxdna/aie2_= pci.h index 90fb0aafaf40..96960a2219a4 100644 --- a/drivers/accel/amdxdna/aie2_pci.h +++ b/drivers/accel/amdxdna/aie2_pci.h @@ -14,9 +14,6 @@ #include "aie2_msg_priv.h" #include "amdxdna_mailbox.h" =20 -#define AIE2_INTERVAL 20000 /* us */ -#define AIE2_TIMEOUT 1000000 /* us */ - /* Firmware determines device memory base address and size */ #define AIE2_DEVM_BASE 0x4000000 #define AIE2_DEVM_SIZE SZ_64M diff --git a/drivers/accel/amdxdna/aie2_smu.c b/drivers/accel/amdxdna/aie2_= smu.c index 727637dac3a8..1b966bbef2e5 100644 --- a/drivers/accel/amdxdna/aie2_smu.c +++ b/drivers/accel/amdxdna/aie2_smu.c @@ -44,7 +44,7 @@ static int aie2_smu_exec(struct amdxdna_dev_hdl *ndev, u3= 2 reg_cmd, writel(1, SMU_REG(ndev, SMU_INTR_REG)); =20 ret =3D readx_poll_timeout(readl, SMU_REG(ndev, SMU_RESP_REG), resp, - resp, AIE2_INTERVAL, AIE2_TIMEOUT); + resp, AIE_INTERVAL, AIE_TIMEOUT); if (ret) { XDNA_ERR(ndev->aie.xdna, "smu cmd %d timed out", reg_cmd); return ret; diff --git a/drivers/accel/amdxdna/aie4_message.c b/drivers/accel/amdxdna/a= ie4_message.c new file mode 100644 index 000000000000..d621dd32ac40 --- /dev/null +++ b/drivers/accel/amdxdna/aie4_message.c @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2026, Advanced Micro Devices, Inc. + */ + +#include +#include +#include + +#include "aie.h" +#include "aie4_msg_priv.h" +#include "aie4_pci.h" +#include "amdxdna_mailbox.h" +#include "amdxdna_mailbox_helper.h" +#include "amdxdna_pci_drv.h" + +int aie4_suspend_fw(struct amdxdna_dev_hdl *ndev) +{ + DECLARE_AIE_MSG(aie4_msg_suspend, AIE4_MSG_OP_SUSPEND); + int ret; + + ret =3D aie_send_mgmt_msg_wait(&ndev->aie, &msg); + if (ret) + XDNA_ERR(ndev->aie.xdna, "Failed to suspend fw, ret %d", ret); + + return ret; +} diff --git a/drivers/accel/amdxdna/aie4_msg_priv.h b/drivers/accel/amdxdna/= aie4_msg_priv.h new file mode 100644 index 000000000000..88463cc3a98a --- /dev/null +++ b/drivers/accel/amdxdna/aie4_msg_priv.h @@ -0,0 +1,49 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (C) 2026, Advanced Micro Devices, Inc. + */ + +#ifndef _AIE4_MSG_PRIV_H_ +#define _AIE4_MSG_PRIV_H_ + +#include + +enum aie4_msg_opcode { + AIE4_MSG_OP_SUSPEND =3D 0x10003, + + AIE4_MSG_OP_CREATE_VFS =3D 0x20001, + AIE4_MSG_OP_DESTROY_VFS =3D 0x20002, +}; + +enum aie4_msg_status { + AIE4_MSG_STATUS_SUCCESS =3D 0x0, + AIE4_MSG_STATUS_ERROR =3D 0x1, + AIE4_MSG_STATUS_NOTSUPP =3D 0x2, + MAX_AIE4_MSG_STATUS_CODE =3D 0x4, +}; + +struct aie4_msg_suspend_req { + __u32 rsvd; +} __packed; + +struct aie4_msg_suspend_resp { + enum aie4_msg_status status; +} __packed; + +struct aie4_msg_create_vfs_req { + __u32 vf_cnt; +} __packed; + +struct aie4_msg_create_vfs_resp { + enum aie4_msg_status status; +} __packed; + +struct aie4_msg_destroy_vfs_req { + __u32 rsvd; +} __packed; + +struct aie4_msg_destroy_vfs_resp { + enum aie4_msg_status status; +} __packed; + +#endif /* _AIE4_MSG_PRIV_H_ */ diff --git a/drivers/accel/amdxdna/aie4_pci.c b/drivers/accel/amdxdna/aie4_= pci.c new file mode 100644 index 000000000000..0f360c1ccebd --- /dev/null +++ b/drivers/accel/amdxdna/aie4_pci.c @@ -0,0 +1,364 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2026, Advanced Micro Devices, Inc. + */ + +#include +#include +#include + +#include "aie4_pci.h" +#include "amdxdna_pci_drv.h" + +#define NO_IOHUB 0 + +/* + * The management mailbox channel is allocated by firmware. + * The related register and ring buffer information is on SRAM BAR. + * This struct is the register layout. + */ +struct mailbox_info { + __u32 valid; + __u32 protocol_major; + __u32 protocol_minor; + __u32 x2i_tail_offset; + __u32 x2i_head_offset; + __u32 x2i_buffer_addr; + __u32 x2i_buffer_size; + __u32 i2x_tail_offset; + __u32 i2x_head_offset; + __u32 i2x_buffer_addr; + __u32 i2x_buffer_size; + __u32 i2x_msi_idx; + __u32 reserved[4]; +}; + +static int aie4_fw_is_alive(struct amdxdna_dev *xdna) +{ + const struct amdxdna_dev_priv *npriv =3D xdna->dev_info->dev_priv; + struct amdxdna_dev_hdl *ndev =3D xdna->dev_handle; + u32 __iomem *src; + u32 fw_is_valid; + int ret; + + src =3D ndev->rbuf_base + npriv->mbox_info_off; + + ret =3D readx_poll_timeout(readl, src + offsetof(struct mailbox_info, val= id), + fw_is_valid, (fw_is_valid =3D=3D 0x1), + AIE_INTERVAL, AIE_TIMEOUT); + if (ret) + XDNA_ERR(xdna, "fw_is_valid=3D%d after %d ms", + fw_is_valid, DIV_ROUND_CLOSEST(AIE_TIMEOUT, 1000000)); + + return ret; +} + +static void aie4_read_mbox_info(struct amdxdna_dev *xdna, + struct mailbox_info *mbox_info) +{ + const struct amdxdna_dev_priv *npriv =3D xdna->dev_info->dev_priv; + struct amdxdna_dev_hdl *ndev =3D xdna->dev_handle; + u32 *dst =3D (u32 *)mbox_info; + u32 __iomem *src; + int i; + + src =3D ndev->rbuf_base + npriv->mbox_info_off; + + for (i =3D 0; i < sizeof(*mbox_info) / sizeof(u32); i++) + dst[i] =3D readl(&src[i]); +} + +static int aie4_mailbox_info(struct amdxdna_dev *xdna, + struct mailbox_info *mbox_info) +{ + int ret; + + ret =3D aie4_fw_is_alive(xdna); + if (ret) + return ret; + + aie4_read_mbox_info(xdna, mbox_info); + + ret =3D aie_check_protocol(&xdna->dev_handle->aie, + mbox_info->protocol_major, + mbox_info->protocol_minor); + if (ret) + XDNA_ERR(xdna, "mailbox major.minor %d.%d is not supported", + mbox_info->protocol_major, mbox_info->protocol_minor); + + return ret; +} + +static void aie4_mailbox_fini(struct amdxdna_dev_hdl *ndev) +{ + struct amdxdna_dev *xdna =3D ndev->aie.xdna; + + aie_destroy_chann(&ndev->aie, &ndev->aie.mgmt_chann); + drmm_kfree(&xdna->ddev, ndev->mbox); + ndev->mbox =3D NULL; +} + +static int aie4_irq_init(struct amdxdna_dev *xdna) +{ + struct pci_dev *pdev =3D to_pci_dev(xdna->ddev.dev); + int ret, nvec; + + nvec =3D pci_msix_vec_count(pdev); + XDNA_DBG(xdna, "irq vectors:%d", nvec); + if (nvec <=3D 0) { + XDNA_ERR(xdna, "does not get number of interrupt vector"); + return -EINVAL; + } + + ret =3D pci_alloc_irq_vectors(pdev, nvec, nvec, PCI_IRQ_MSIX); + if (ret < 0) { + XDNA_ERR(xdna, "failed to alloc irq vector, ret: %d", ret); + return ret; + } + + return 0; +} + +static int aie4_mailbox_start(struct amdxdna_dev *xdna, + struct mailbox_info *mbi) +{ + struct pci_dev *pdev =3D to_pci_dev(xdna->ddev.dev); + struct amdxdna_dev_hdl *ndev =3D xdna->dev_handle; + const struct amdxdna_dev_priv *npriv =3D xdna->dev_info->dev_priv; + struct xdna_mailbox_chann_res *i2x; + struct xdna_mailbox_chann_res *x2i; + int mgmt_mb_irq; + int ret; + + struct xdna_mailbox_res mbox_res =3D { + .ringbuf_base =3D ndev->rbuf_base, + .ringbuf_size =3D pci_resource_len(pdev, npriv->mbox_rbuf_bar), + .mbox_base =3D ndev->mbox_base, + .mbox_size =3D pci_resource_len(pdev, npriv->mbox_bar), + .name =3D "xdna_aie4_mailbox", + }; + + i2x =3D &ndev->aie.mgmt_i2x; + x2i =3D &ndev->aie.mgmt_x2i; + + x2i->mb_head_ptr_reg =3D mbi->x2i_head_offset; + x2i->mb_tail_ptr_reg =3D mbi->x2i_tail_offset; + x2i->rb_start_addr =3D mbi->x2i_buffer_addr; + x2i->rb_size =3D mbi->x2i_buffer_size; + + i2x->rb_start_addr =3D mbi->i2x_buffer_addr; + i2x->rb_size =3D mbi->i2x_buffer_size; + i2x->mb_head_ptr_reg =3D mbi->i2x_head_offset; + i2x->mb_tail_ptr_reg =3D mbi->i2x_tail_offset; + + ndev->aie.mgmt_chan_idx =3D mbi->i2x_msi_idx; + aie_dump_mgmt_chann_debug(&ndev->aie); + + ndev->mbox =3D xdnam_mailbox_create(&xdna->ddev, &mbox_res); + if (!ndev->mbox) { + XDNA_ERR(xdna, "failed to create mailbox device"); + return -ENODEV; + } + + ndev->aie.mgmt_chann =3D xdna_mailbox_alloc_channel(ndev->mbox); + if (!ndev->aie.mgmt_chann) { + XDNA_ERR(xdna, "failed to alloc mailbox channel"); + return -ENODEV; + } + + mgmt_mb_irq =3D pci_irq_vector(pdev, ndev->aie.mgmt_chan_idx); + if (mgmt_mb_irq < 0) { + XDNA_ERR(xdna, "failed to alloc irq vector, return %d", mgmt_mb_irq); + ret =3D mgmt_mb_irq; + goto free_channel; + } + + ret =3D xdna_mailbox_start_channel(ndev->aie.mgmt_chann, + &ndev->aie.mgmt_x2i, + &ndev->aie.mgmt_i2x, + NO_IOHUB, + mgmt_mb_irq); + if (ret) { + XDNA_ERR(xdna, "failed to start management mailbox channel"); + ret =3D -EINVAL; + goto free_channel; + } + + XDNA_DBG(xdna, "Mailbox management channel created"); + return 0; + +free_channel: + xdna_mailbox_free_channel(ndev->aie.mgmt_chann); + ndev->aie.mgmt_chann =3D NULL; + return ret; +} + +static int aie4_mailbox_init(struct amdxdna_dev *xdna) +{ + struct mailbox_info mbox_info; + int ret; + + ret =3D aie4_mailbox_info(xdna, &mbox_info); + if (ret) + return ret; + + return aie4_mailbox_start(xdna, &mbox_info); +} + +static void aie4_fw_unload(struct amdxdna_dev_hdl *ndev) +{ + /* TODO */ +} + +static int aie4_fw_load(struct amdxdna_dev_hdl *ndev) +{ + /* TODO */ + return 0; +} + +static int aie4_hw_start(struct amdxdna_dev *xdna) +{ + struct amdxdna_dev_hdl *ndev =3D xdna->dev_handle; + int ret; + + ret =3D aie4_fw_load(ndev); + if (ret) + return ret; + + ret =3D aie4_mailbox_init(xdna); + if (ret) + goto fw_unload; + + return 0; + +fw_unload: + aie4_fw_unload(ndev); + + return ret; +} + +static void aie4_mgmt_fw_fini(struct amdxdna_dev_hdl *ndev) +{ + int ret; + + /* No paired resume needed, fw is stateless */ + ret =3D aie4_suspend_fw(ndev); + if (ret) + XDNA_ERR(ndev->aie.xdna, "suspend_fw failed, ret %d", ret); + else + XDNA_DBG(ndev->aie.xdna, "npu firmware suspended"); +} + +static void aie4_hw_stop(struct amdxdna_dev *xdna) +{ + struct amdxdna_dev_hdl *ndev =3D xdna->dev_handle; + + drm_WARN_ON(&xdna->ddev, !mutex_is_locked(&xdna->dev_lock)); + + aie4_mgmt_fw_fini(ndev); + aie4_mailbox_fini(ndev); + + aie4_fw_unload(ndev); +} + +static int aie4_pcidev_init(struct amdxdna_dev_hdl *ndev) +{ + struct amdxdna_dev *xdna =3D ndev->aie.xdna; + struct pci_dev *pdev =3D to_pci_dev(xdna->ddev.dev); + void __iomem *tbl[PCI_NUM_RESOURCES] =3D {0}; + unsigned long bars =3D 0; + int ret, i; + + /* Enable managed PCI device */ + ret =3D pcim_enable_device(pdev); + if (ret) { + XDNA_ERR(xdna, "pcim enable device failed, ret %d", ret); + return ret; + } + + ret =3D dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); + if (ret) { + XDNA_ERR(xdna, "failed to set DMA mask to 64:%d", ret); + return ret; + } + + set_bit(xdna->dev_info->mbox_bar, &bars); + set_bit(xdna->dev_info->sram_bar, &bars); + + for (i =3D 0; i < PCI_NUM_RESOURCES; i++) { + if (!test_bit(i, &bars)) + continue; + tbl[i] =3D pcim_iomap(pdev, i, 0); + if (!tbl[i]) { + XDNA_ERR(xdna, "map bar %d failed", i); + return -ENOMEM; + } + } + + ndev->mbox_base =3D tbl[xdna->dev_info->mbox_bar]; + ndev->rbuf_base =3D tbl[xdna->dev_info->sram_bar]; + + pci_set_master(pdev); + + ret =3D aie4_irq_init(xdna); + if (ret) + goto clear_master; + + ret =3D aie4_hw_start(xdna); + if (ret) + goto clear_master; + + return 0; + +clear_master: + pci_clear_master(pdev); + + return ret; +} + +static void aie4_pcidev_fini(struct amdxdna_dev_hdl *ndev) +{ + struct amdxdna_dev *xdna =3D ndev->aie.xdna; + struct pci_dev *pdev =3D to_pci_dev(xdna->ddev.dev); + + aie4_hw_stop(xdna); + + pci_clear_master(pdev); +} + +static void aie4_fini(struct amdxdna_dev *xdna) +{ + struct amdxdna_dev_hdl *ndev =3D xdna->dev_handle; + + aie4_sriov_stop(ndev); + aie4_pcidev_fini(ndev); +} + +static int aie4_init(struct amdxdna_dev *xdna) +{ + struct amdxdna_dev_hdl *ndev; + int ret; + + ndev =3D drmm_kzalloc(&xdna->ddev, sizeof(*ndev), GFP_KERNEL); + if (!ndev) + return -ENOMEM; + + ndev->priv =3D xdna->dev_info->dev_priv; + ndev->aie.xdna =3D xdna; + xdna->dev_handle =3D ndev; + + ret =3D aie4_pcidev_init(ndev); + if (ret) { + XDNA_ERR(xdna, "Setup PCI device failed, ret %d", ret); + return ret; + } + + XDNA_DBG(xdna, "aie4 init finished"); + return 0; +} + +const struct amdxdna_dev_ops aie4_ops =3D { + .init =3D aie4_init, + .fini =3D aie4_fini, + .sriov_configure =3D aie4_sriov_configure, +}; diff --git a/drivers/accel/amdxdna/aie4_pci.h b/drivers/accel/amdxdna/aie4_= pci.h new file mode 100644 index 000000000000..f3810a969431 --- /dev/null +++ b/drivers/accel/amdxdna/aie4_pci.h @@ -0,0 +1,48 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (C) 2026, Advanced Micro Devices, Inc. + */ + +#ifndef _AIE4_PCI_H_ +#define _AIE4_PCI_H_ + +#include +#include +#include + +#include "aie.h" +#include "amdxdna_mailbox.h" + +struct amdxdna_dev_priv { + u32 mbox_bar; + u32 mbox_rbuf_bar; + u64 mbox_info_off; +}; + +struct amdxdna_dev_hdl { + struct aie_device aie; + const struct amdxdna_dev_priv *priv; + void __iomem *mbox_base; + void __iomem *rbuf_base; + + struct mailbox *mbox; +}; + +/* aie4_message.c */ +int aie4_suspend_fw(struct amdxdna_dev_hdl *ndev); + +/* aie4_sriov.c */ +#if IS_ENABLED(CONFIG_PCI_IOV) +int aie4_sriov_configure(struct amdxdna_dev *xdna, int num_vfs); +int aie4_sriov_stop(struct amdxdna_dev_hdl *ndev); +#else +#define aie4_sriov_configure NULL +static inline int aie4_sriov_stop(struct amdxdna_dev_hdl *ndev) +{ + return 0; +} +#endif + +extern const struct amdxdna_dev_ops aie4_ops; + +#endif /* _AIE4_PCI_H_ */ diff --git a/drivers/accel/amdxdna/aie4_sriov.c b/drivers/accel/amdxdna/aie= 4_sriov.c new file mode 100644 index 000000000000..e1ce633768a5 --- /dev/null +++ b/drivers/accel/amdxdna/aie4_sriov.c @@ -0,0 +1,88 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2026, Advanced Micro Devices, Inc. + */ + +#include +#include +#include + +#include "aie.h" +#include "aie4_msg_priv.h" +#include "aie4_pci.h" +#include "amdxdna_mailbox.h" +#include "amdxdna_mailbox_helper.h" +#include "amdxdna_pci_drv.h" + +static int aie4_destroy_vfs(struct amdxdna_dev_hdl *ndev) +{ + DECLARE_AIE_MSG(aie4_msg_destroy_vfs, AIE4_MSG_OP_DESTROY_VFS); + int ret; + + ret =3D aie_send_mgmt_msg_wait(&ndev->aie, &msg); + if (ret) + XDNA_ERR(ndev->aie.xdna, "destroy vfs op failed: %d", ret); + + return ret; +} + +static int aie4_create_vfs(struct amdxdna_dev_hdl *ndev, int num_vfs) +{ + DECLARE_AIE_MSG(aie4_msg_create_vfs, AIE4_MSG_OP_CREATE_VFS); + int ret; + + req.vf_cnt =3D num_vfs; + ret =3D aie_send_mgmt_msg_wait(&ndev->aie, &msg); + if (ret) + XDNA_ERR(ndev->aie.xdna, "create vfs op failed: %d", ret); + + return ret; +} + +int aie4_sriov_stop(struct amdxdna_dev_hdl *ndev) +{ + struct amdxdna_dev *xdna =3D ndev->aie.xdna; + struct pci_dev *pdev =3D to_pci_dev(xdna->ddev.dev); + int ret; + + if (!pci_num_vf(pdev)) + return 0; + + ret =3D pci_vfs_assigned(pdev); + if (ret) { + XDNA_ERR(xdna, "VFs are still assigned to VMs"); + return -EPERM; + } + + pci_disable_sriov(pdev); + return aie4_destroy_vfs(ndev); +} + +static int aie4_sriov_start(struct amdxdna_dev_hdl *ndev, int num_vfs) +{ + struct amdxdna_dev *xdna =3D ndev->aie.xdna; + struct pci_dev *pdev =3D to_pci_dev(xdna->ddev.dev); + int ret; + + ret =3D aie4_create_vfs(ndev, num_vfs); + if (ret) + return ret; + + ret =3D pci_enable_sriov(pdev, num_vfs); + if (ret) { + XDNA_ERR(xdna, "configure VFs failed, ret: %d", ret); + aie4_destroy_vfs(ndev); + return ret; + } + + return num_vfs; +} + +int aie4_sriov_configure(struct amdxdna_dev *xdna, int num_vfs) +{ + struct amdxdna_dev_hdl *ndev =3D xdna->dev_handle; + + drm_WARN_ON(&xdna->ddev, !mutex_is_locked(&xdna->dev_lock)); + + return (num_vfs) ? aie4_sriov_start(ndev, num_vfs) : aie4_sriov_stop(ndev= ); +} diff --git a/drivers/accel/amdxdna/amdxdna_mailbox.c b/drivers/accel/amdxdn= a/amdxdna_mailbox.c index e681a090752d..84a7e92562ad 100644 --- a/drivers/accel/amdxdna/amdxdna_mailbox.c +++ b/drivers/accel/amdxdna/amdxdna_mailbox.c @@ -112,6 +112,18 @@ static u32 mailbox_reg_read(struct mailbox_channel *mb= _chann, u32 mbox_reg) return readl(ringbuf_addr); } =20 +static inline void mailbox_irq_acknowledge(struct mailbox_channel *mb_chan= n) +{ + if (mb_chann->iohub_int_addr) + mailbox_reg_write(mb_chann, mb_chann->iohub_int_addr, 0); +} + +static inline u32 mailbox_irq_status(struct mailbox_channel *mb_chann) +{ + return (mb_chann->iohub_int_addr) ? + mailbox_reg_read(mb_chann, mb_chann->iohub_int_addr) : 0; +} + static inline void mailbox_set_headptr(struct mailbox_channel *mb_chann, u32 headptr_val) { @@ -199,7 +211,6 @@ mailbox_send_msg(struct mailbox_channel *mb_chann, stru= ct mailbox_msg *mb_msg) start_addr =3D mb_chann->res[CHAN_RES_X2I].rb_start_addr; tmp_tail =3D tail + mb_msg->pkg_size; =20 - check_again: if (tail >=3D head && tmp_tail > ringbuf_size) { write_addr =3D mb_chann->mb->res.ringbuf_base + start_addr + tail; @@ -357,7 +368,7 @@ static void mailbox_rx_worker(struct work_struct *rx_wo= rk) } =20 again: - mailbox_reg_write(mb_chann, mb_chann->iohub_int_addr, 0); + mailbox_irq_acknowledge(mb_chann); =20 while (1) { /* @@ -382,7 +393,7 @@ static void mailbox_rx_worker(struct work_struct *rx_wo= rk) * the interrupt register to make sure there is not any new response * before exiting. */ - if (mailbox_reg_read(mb_chann, mb_chann->iohub_int_addr)) + if (mailbox_irq_status(mb_chann)) goto again; } =20 @@ -520,7 +531,7 @@ xdna_mailbox_start_channel(struct mailbox_channel *mb_c= hann, } =20 mb_chann->bad_state =3D false; - mailbox_reg_write(mb_chann, mb_chann->iohub_int_addr, 0); + mailbox_irq_acknowledge(mb_chann); =20 MB_DBG(mb_chann, "Mailbox channel started (irq: %d)", mb_chann->msix_irq); return 0; diff --git a/drivers/accel/amdxdna/amdxdna_mailbox.h b/drivers/accel/amdxdn= a/amdxdna_mailbox.h index 8b1e00945da4..2908404303ae 100644 --- a/drivers/accel/amdxdna/amdxdna_mailbox.h +++ b/drivers/accel/amdxdna/amdxdna_mailbox.h @@ -1,10 +1,10 @@ /* SPDX-License-Identifier: GPL-2.0 */ /* - * Copyright (C) 2022-2024, Advanced Micro Devices, Inc. + * Copyright (C) 2022-2026, Advanced Micro Devices, Inc. */ =20 -#ifndef _AIE2_MAILBOX_H_ -#define _AIE2_MAILBOX_H_ +#ifndef _AIE_MAILBOX_H_ +#define _AIE_MAILBOX_H_ =20 struct mailbox; struct mailbox_channel; @@ -124,4 +124,4 @@ void xdna_mailbox_stop_channel(struct mailbox_channel *= mailbox_chann); int xdna_mailbox_send_msg(struct mailbox_channel *mailbox_chann, const struct xdna_mailbox_msg *msg, u64 tx_timeout); =20 -#endif /* _AIE2_MAILBOX_ */ +#endif /* _AIE_MAILBOX_ */ diff --git a/drivers/accel/amdxdna/amdxdna_pci_drv.c b/drivers/accel/amdxdn= a/amdxdna_pci_drv.c index b50a7d1f8a11..09d7d88bb6f1 100644 --- a/drivers/accel/amdxdna/amdxdna_pci_drv.c +++ b/drivers/accel/amdxdna/amdxdna_pci_drv.c @@ -37,9 +37,10 @@ MODULE_FIRMWARE("amdnpu/17f0_11/npu_7.sbin"); * 0.6: Support preemption * 0.7: Support getting power and utilization data * 0.8: Support BO usage query + * 0.9: Add new device type AMDXDNA_DEV_TYPE_PF */ #define AMDXDNA_DRIVER_MAJOR 0 -#define AMDXDNA_DRIVER_MINOR 8 +#define AMDXDNA_DRIVER_MINOR 9 =20 /* * Bind the driver base on (vendor_id, device_id) pair and later use the @@ -49,6 +50,8 @@ MODULE_FIRMWARE("amdnpu/17f0_11/npu_7.sbin"); static const struct pci_device_id pci_ids[] =3D { { PCI_DEVICE(PCI_VENDOR_ID_AMD, 0x1502) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, 0x17f0) }, + { PCI_DEVICE(PCI_VENDOR_ID_AMD, 0x17f2) }, + { PCI_DEVICE(PCI_VENDOR_ID_AMD, 0x1B0B) }, {0} }; =20 @@ -59,6 +62,8 @@ static const struct amdxdna_device_id amdxdna_ids[] =3D { { 0x17f0, 0x10, &dev_npu4_info }, { 0x17f0, 0x11, &dev_npu5_info }, { 0x17f0, 0x20, &dev_npu6_info }, + { 0x17f2, 0x10, &dev_npu3_pf_info }, + { 0x1B0B, 0x10, &dev_npu3_pf_info }, {0} }; =20 @@ -365,12 +370,24 @@ static const struct dev_pm_ops amdxdna_pm_ops =3D { RUNTIME_PM_OPS(amdxdna_pm_suspend, amdxdna_pm_resume, NULL) }; =20 +static int amdxdna_sriov_configure(struct pci_dev *pdev, int num_vfs) +{ + struct amdxdna_dev *xdna =3D pci_get_drvdata(pdev); + + guard(mutex)(&xdna->dev_lock); + if (xdna->dev_info->ops->sriov_configure) + return xdna->dev_info->ops->sriov_configure(xdna, num_vfs); + + return -ENOENT; +} + static struct pci_driver amdxdna_pci_driver =3D { .name =3D KBUILD_MODNAME, .id_table =3D pci_ids, .probe =3D amdxdna_probe, .remove =3D amdxdna_remove, .driver.pm =3D &amdxdna_pm_ops, + .sriov_configure =3D amdxdna_sriov_configure, }; =20 module_pci_driver(amdxdna_pci_driver); diff --git a/drivers/accel/amdxdna/amdxdna_pci_drv.h b/drivers/accel/amdxdn= a/amdxdna_pci_drv.h index 5e0bf565a1ae..eabbf57f2b38 100644 --- a/drivers/accel/amdxdna/amdxdna_pci_drv.h +++ b/drivers/accel/amdxdna/amdxdna_pci_drv.h @@ -55,6 +55,7 @@ struct amdxdna_dev_ops { void (*fini)(struct amdxdna_dev *xdna); int (*resume)(struct amdxdna_dev *xdna); int (*suspend)(struct amdxdna_dev *xdna); + int (*sriov_configure)(struct amdxdna_dev *xdna, int num_vfs); int (*hwctx_init)(struct amdxdna_hwctx *hwctx); void (*hwctx_fini)(struct amdxdna_hwctx *hwctx); int (*hwctx_config)(struct amdxdna_hwctx *hwctx, u32 type, u64 value, voi= d *buf, u32 size); @@ -157,6 +158,7 @@ struct amdxdna_client { =20 /* Add device info below */ extern const struct amdxdna_dev_info dev_npu1_info; +extern const struct amdxdna_dev_info dev_npu3_pf_info; extern const struct amdxdna_dev_info dev_npu4_info; extern const struct amdxdna_dev_info dev_npu5_info; extern const struct amdxdna_dev_info dev_npu6_info; diff --git a/drivers/accel/amdxdna/npu3_regs.c b/drivers/accel/amdxdna/npu3= _regs.c new file mode 100644 index 000000000000..f6e20f4858db --- /dev/null +++ b/drivers/accel/amdxdna/npu3_regs.c @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2026, Advanced Micro Devices, Inc. + */ + +#include +#include + +#include "aie4_pci.h" +#include "amdxdna_pci_drv.h" + +#define NPU3_MBOX_BAR 0 + +#define NPU3_MBOX_BUFFER_BAR 2 +#define NPU3_MBOX_INFO_OFF 0x0 + +/* PCIe BAR Index for NPU3 */ +#define NPU3_REG_BAR_INDEX 0 + +static const struct amdxdna_fw_feature_tbl npu3_fw_feature_table[] =3D { + { .major =3D 5, .min_minor =3D 10 }, + { 0 } +}; + +static const struct amdxdna_dev_priv npu3_dev_priv =3D { + .mbox_bar =3D NPU3_MBOX_BAR, + .mbox_rbuf_bar =3D NPU3_MBOX_BUFFER_BAR, + .mbox_info_off =3D NPU3_MBOX_INFO_OFF, +}; + +const struct amdxdna_dev_info dev_npu3_pf_info =3D { + .mbox_bar =3D NPU3_MBOX_BAR, + .sram_bar =3D NPU3_MBOX_BUFFER_BAR, + .vbnv =3D "RyzenAI-npu3-pf", + .device_type =3D AMDXDNA_DEV_TYPE_PF, + .dev_priv =3D &npu3_dev_priv, + .fw_feature_tbl =3D npu3_fw_feature_table, + .ops =3D &aie4_ops, +}; diff --git a/include/uapi/drm/amdxdna_accel.h b/include/uapi/drm/amdxdna_ac= cel.h index 61d3686fa3b1..0b11e8e3ea5d 100644 --- a/include/uapi/drm/amdxdna_accel.h +++ b/include/uapi/drm/amdxdna_accel.h @@ -29,7 +29,8 @@ extern "C" { =20 enum amdxdna_device_type { AMDXDNA_DEV_TYPE_UNKNOWN =3D -1, - AMDXDNA_DEV_TYPE_KMQ, + AMDXDNA_DEV_TYPE_KMQ =3D 0, + AMDXDNA_DEV_TYPE_PF =3D 2, }; =20 enum amdxdna_drm_ioctl_id { --=20 2.34.1 From nobody Wed Apr 1 09:45:44 2026 Received: from DM5PR21CU001.outbound.protection.outlook.com (mail-centralusazon11011043.outbound.protection.outlook.com [52.101.62.43]) (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 6331ABE5E for ; Mon, 30 Mar 2026 16:37:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.62.43 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774888648; cv=fail; b=C7ZjlzoSwEAyh03GqFy5v8+o6nqKd6asTL8bXjkEInI3x5tn427C5Z9mdS3ffL/J7qtEjWQFa83CJheAoQl+kYWTjpAZWZKaMCSy5M5vQlc9azT4CzdL6tE0Cbzf5oTqhBVRg338NNsMURbcTTSevn/RIZGJR5T7DUUI3Evnwbg= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774888648; c=relaxed/simple; bh=k2VaBfYd0DVf95CWrvksgzp+6P1nHRQnl3DSCBD+oiU=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=tfmc3/ozBYY3ip+8C6wFa9HiuLjjbCcstitG5QqPLYdmCfFpPKp8NvGq9Kp5DOkPMEtFJniErBmAJm7lDz3kq6kLH1WOSI3oPPxpnkurnVBPg4RvGHXLZFdKCihMkFZenP1YwGbcbeUerPjEjCQhCdP+m/qklxq/hok0oDYbPos= 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=BjQSCEk4; arc=fail smtp.client-ip=52.101.62.43 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="BjQSCEk4" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=bAjwxLP758PAQThMI/hO5WVWAeRZ9nBG/VMDmrWMnOPiQ+is89AZNPxMRnU3IBQ8gDb+rTUJ6C6rUTJ6bFM5VIxFobicjHSJn8wIrkLUNCQAwF6hH1VeJ3flRvgvToHfNZ3BtypWuWytXTPCG1R+97LZrCx1oqz76+E1mGMPAojKJdV8zBarQDRQHZYCyMOkmNXTdvhXVvBHUfZzECqK/YgxJBQXpTtY94I0Rir38s5F8mI6bu+3BEdD5aNLRw/8ikVZATlAFcY4puWO9hzQ53+JJdiJnUujHjmwcPyFpV6C+QYZIMxD8ZFxPJPaTisRAtKnyE7Tudgak1bsvGoKOQ== 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=LTvBVoSU2gjFJiK5+YJurq1tEyyy628UYSGIf/yOr2s=; b=wDk7wov8hVIBmykzKc2hkN/BvAGJNmZTdEXwG1sTRlM299u8U9lBkuk7RMX+FAoqbxs620ZX0p9YcGiLAkPBejXXSIP2dTIIQII7TJeC47S6ez4ixSYzMmE32UTtY00hrf1vXdxbGXP3SKnznO64yHpJFo0Oa9BBX3X9RYQl4Kf0jOUlbi57Pyu+33kDBcPf4vqmMMOcxv34Lx8xdGoch6qY9i7IxOCPI7GJknZYVpvw7UVF42AQ6MxujhMhgiEYSDvRqo7TRNJ82lYGHBhoJHUhKMFgZ4rtdjVnFhvmKvYC6AGlISSMiYpZpca3tf+suxbBQc86uXPn+uUNqLrhCw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=kernel.org 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=LTvBVoSU2gjFJiK5+YJurq1tEyyy628UYSGIf/yOr2s=; b=BjQSCEk4J7SCp90/fqy4eyuWI0sK8kn+q0Zi38pyuWJtQ+iiuX55uZP5mVztzy1vHT9z3PhzY9IzZdMyXn948QxGDS+OM6YEwz/cYKjGO7zzN4WpEEv4r1zRIqd1+jcPHxtU+0j6yRuyfl3HW09gzA5rK3HbAXdk78aJW2A7Kz0= Received: from SA1PR03CA0004.namprd03.prod.outlook.com (2603:10b6:806:2d3::8) by CY8PR12MB7219.namprd12.prod.outlook.com (2603:10b6:930:59::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9769.15; Mon, 30 Mar 2026 16:37:19 +0000 Received: from SN1PEPF0002636D.namprd02.prod.outlook.com (2603:10b6:806:2d3:cafe::be) by SA1PR03CA0004.outlook.office365.com (2603:10b6:806:2d3::8) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9745.28 via Frontend Transport; Mon, 30 Mar 2026 16:37:19 +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=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SN1PEPF0002636D.mail.protection.outlook.com (10.167.241.138) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9745.21 via Frontend Transport; Mon, 30 Mar 2026 16:37:19 +0000 Received: from Satlexmb09.amd.com (10.181.42.218) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Mon, 30 Mar 2026 11:37:17 -0500 Received: from satlexmb07.amd.com (10.181.42.216) by satlexmb09.amd.com (10.181.42.218) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Mon, 30 Mar 2026 09:37:17 -0700 Received: from xsjlizhih51.xilinx.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server id 15.2.2562.17 via Frontend Transport; Mon, 30 Mar 2026 11:37:16 -0500 From: Lizhi Hou To: , , , , CC: David Zhang , , , , Hayden Laccabue , Lizhi Hou Subject: [PATCH V1 3/6] accel/amdxdna: Create common PSP interfaces for AIE2 and AIE4 Date: Mon, 30 Mar 2026 09:37:02 -0700 Message-ID: <20260330163705.3153647-4-lizhi.hou@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260330163705.3153647-1-lizhi.hou@amd.com> References: <20260330163705.3153647-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: SN1PEPF0002636D:EE_|CY8PR12MB7219:EE_ X-MS-Office365-Filtering-Correlation-Id: 8a100118-ad0e-45f0-7bae-08de8e7a9c83 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700016|82310400026|376014|1800799024|22082099003|56012099003|18002099003; X-Microsoft-Antispam-Message-Info: gsmihKi7YNTgajNEivK5yw59aaWljvPrg8qPYw1cGADDtneybYYfKLtPd7s9hpfFDq9g3Ms0vA6Agk5DtwGejLmwUTneBIhUrc42NemFy0wG+Y2GHN1jj7Ewnmy7eGkCm3MCIGGoEvlYccvthfwVJbwJN5/VzqHqUetZ17JUbH6xtntEtOnefZbH8ubDibTwKeo/oxk1gs9f2AdzzPDhL/Jy73Bf+CO95iSZpo4JFc6B+vyskcjvyg2vi2WnVrCrytcqAmjg5/ldnie6Uhj7Pgbed9WJizbAa34Zq3LWeCdNqUTCyCWQvYdFUQxAz9IKLp/6c8CxEnxycsDuBLZ4PAao6b1jUJSEPhKgE2TuyffxhDNH9lhQ8rCRJ+/kliKUtYUKzUunc+JovAqA+aSRRSO9ob6WBJuE1gVzEnKu81znM6D5rdIRXQ87PsOw9Pdi8TA+pDl3lMg7UrHq/SZwkSI/47y9frYiP+1z3wpmRSmxQMsvrUoDG9DDgP8tale6qioGBgakxAXxakmO/LW/w7F7O2Zovz3+fIYopmdU8yXH19tKTKfI81shxNCF65Lztfq3462FiMnyelODx/6OM72kVhw4fCY5qhlFhzNAyBWBc2wg3YUdyvEJLcdEprw9IOfBppbH++IgHZLTcI8ZhjtAyqpHF/fM7JeFMtc5G2dNmfy0TOWwBjMP6SJ3om3y5koyQt0MSp6ISLQsOdR30XqEDX0VUfbAg0R7LWcCOYrp+bcL0GtOs//s5HyAO219jKjM/BwQ3stpCbDv48mUOw== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(36860700016)(82310400026)(376014)(1800799024)(22082099003)(56012099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: FbP4ISLL+L1sr0tB0k+xWdY+TEJhnrIWo7vigDEgJUMnAwGpbY89Fu/xK/6A5fRnrgImj+5ec0H0R7HVXnTuAqdHRagMJUlz0DuhsRP+Gw58tDgm0rNadvMlen+2aloA8z8oEQbUNhVgmQEzkQWDIaOGpX8XgOZSyyBk2/d3pmO5PRIVD7xBtk9XWCrfAjOPhfYLA5EPnjEbmfDfA00rGpYOc/OrO/hwMHAzJ0U3gO04+S5B6FnDAyU+7VmMrdxkJy1wF8D26DuEO1pTKf4V1vJN+OW+XAFQkhx8cRnpUOQoNPlgoVsgU+TV9fxu6eiTA1Pyc+0Or9r5ySyhRLZesaESggLGaVJ9lxhBEV1NVv9gffQ0m/qch8VWIuSwLNhfNCeaCwrYU237DwLnkOMxmsEe1WXGHGr8E9fdjv0KCoqF12YvhkO467cq1e7dqGqh X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Mar 2026 16:37:19.5510 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 8a100118-ad0e-45f0-7bae-08de8e7a9c83 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=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SN1PEPF0002636D.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY8PR12MB7219 Content-Type: text/plain; charset="utf-8" From: David Zhang The AIE2 and AIE4 use the similar interface to PSP (Platform Security Processor). Move the PSP implementation into aie_psp.c so both platforms use the same path and future AIE4 PSP work can build on it. Co-developed-by: Hayden Laccabue Signed-off-by: Hayden Laccabue Signed-off-by: David Zhang Signed-off-by: Lizhi Hou Reviewed-by: Mario Limonciello (AMD) --- drivers/accel/amdxdna/Makefile | 2 +- drivers/accel/amdxdna/aie.h | 41 +++++++++++++++++ drivers/accel/amdxdna/aie2_message.c | 2 +- drivers/accel/amdxdna/aie2_pci.c | 12 ++--- drivers/accel/amdxdna/aie2_pci.h | 44 ++----------------- .../accel/amdxdna/{aie2_psp.c =3D> aie_psp.c} | 17 +++---- 6 files changed, 60 insertions(+), 58 deletions(-) rename drivers/accel/amdxdna/{aie2_psp.c =3D> aie_psp.c} (88%) diff --git a/drivers/accel/amdxdna/Makefile b/drivers/accel/amdxdna/Makefile index a61cd6c0db30..d3c0fe765a8b 100644 --- a/drivers/accel/amdxdna/Makefile +++ b/drivers/accel/amdxdna/Makefile @@ -2,12 +2,12 @@ =20 amdxdna-y :=3D \ aie.o \ + aie_psp.o \ aie2_ctx.o \ aie2_error.o \ aie2_message.o \ aie2_pci.o \ aie2_pm.o \ - aie2_psp.o \ aie2_smu.o \ aie2_solver.o \ aie4_message.o \ diff --git a/drivers/accel/amdxdna/aie.h b/drivers/accel/amdxdna/aie.h index 6c53870d0098..124c0f7e9ca0 100644 --- a/drivers/accel/amdxdna/aie.h +++ b/drivers/accel/amdxdna/aie.h @@ -11,6 +11,8 @@ #define AIE_INTERVAL 20000 /* us */ #define AIE_TIMEOUT 1000000 /* us */ =20 +struct psp_device; + struct aie_device { struct amdxdna_dev *xdna; struct mailbox_channel *mgmt_chann; @@ -20,15 +22,54 @@ struct aie_device { u32 mgmt_prot_major; u32 mgmt_prot_minor; unsigned long feature_mask; + + struct psp_device *psp_hdl; }; =20 #define DECLARE_AIE_MSG(name, op) \ DECLARE_XDNA_MSG_COMMON(name, op, -1) #define AIE_FEATURE_ON(aie, feature) test_bit(feature, &(aie)->feature_mas= k) =20 +#define PSP_REG_BAR(ndev, idx) ((ndev)->priv->psp_regs_off[(idx)].bar_idx) +#define PSP_REG_OFF(ndev, idx) ((ndev)->priv->psp_regs_off[(idx)].offset) + +#define DEFINE_BAR_OFFSET(reg_name, bar, reg_addr) \ + [reg_name] =3D {bar##_BAR_INDEX, (reg_addr) - bar##_BAR_BASE} + +enum psp_reg_idx { + PSP_CMD_REG =3D 0, + PSP_ARG0_REG, + PSP_ARG1_REG, + PSP_ARG2_REG, + PSP_NUM_IN_REGS, /* number of input registers */ + PSP_INTR_REG =3D PSP_NUM_IN_REGS, + PSP_STATUS_REG, + PSP_RESP_REG, + PSP_PWAITMODE_REG, + PSP_MAX_REGS /* Keep this at the end */ +}; + +struct aie_bar_off_pair { + int bar_idx; + u32 offset; +}; + +struct psp_config { + const void *fw_buf; + u32 fw_size; + void __iomem *psp_regs[PSP_MAX_REGS]; +}; + +/* aie.c */ void aie_dump_mgmt_chann_debug(struct aie_device *aie); void aie_destroy_chann(struct aie_device *aie, struct mailbox_channel **ch= ann); int aie_send_mgmt_msg_wait(struct aie_device *aie, struct xdna_mailbox_msg= *msg); int aie_check_protocol(struct aie_device *aie, u32 fw_major, u32 fw_minor); =20 +/* aie_psp.c */ +struct psp_device *aiem_psp_create(struct drm_device *ddev, struct psp_con= fig *conf); +int aie_psp_start(struct psp_device *psp); +void aie_psp_stop(struct psp_device *psp); +int aie_psp_waitmode_poll(struct psp_device *psp); + #endif /* _AIE_H_ */ diff --git a/drivers/accel/amdxdna/aie2_message.c b/drivers/accel/amdxdna/a= ie2_message.c index ccf87b1aa1cc..e5e7da7a8f40 100644 --- a/drivers/accel/amdxdna/aie2_message.c +++ b/drivers/accel/amdxdna/aie2_message.c @@ -75,7 +75,7 @@ int aie2_suspend_fw(struct amdxdna_dev_hdl *ndev) return ret; } =20 - return aie2_psp_waitmode_poll(ndev->psp_hdl); + return aie_psp_waitmode_poll(ndev->aie.psp_hdl); } =20 int aie2_resume_fw(struct amdxdna_dev_hdl *ndev) diff --git a/drivers/accel/amdxdna/aie2_pci.c b/drivers/accel/amdxdna/aie2_= pci.c index 708d0b7fd2e3..e4b7893bd429 100644 --- a/drivers/accel/amdxdna/aie2_pci.c +++ b/drivers/accel/amdxdna/aie2_pci.c @@ -297,7 +297,7 @@ static void aie2_hw_stop(struct amdxdna_dev *xdna) aie_destroy_chann(&ndev->aie, &ndev->aie.mgmt_chann); drmm_kfree(&xdna->ddev, ndev->mbox); ndev->mbox =3D NULL; - aie2_psp_stop(ndev->psp_hdl); + aie_psp_stop(ndev->aie.psp_hdl); aie2_smu_fini(ndev); aie2_error_async_events_free(ndev); pci_disable_device(pdev); @@ -350,7 +350,7 @@ static int aie2_hw_start(struct amdxdna_dev *xdna) goto free_channel; } =20 - ret =3D aie2_psp_start(ndev->psp_hdl); + ret =3D aie_psp_start(ndev->aie.psp_hdl); if (ret) { XDNA_ERR(xdna, "failed to start psp, ret %d", ret); goto fini_smu; @@ -413,7 +413,7 @@ static int aie2_hw_start(struct amdxdna_dev *xdna) aie2_suspend_fw(ndev); xdna_mailbox_stop_channel(ndev->aie.mgmt_chann); stop_psp: - aie2_psp_stop(ndev->psp_hdl); + aie_psp_stop(ndev->aie.psp_hdl); fini_smu: aie2_smu_fini(ndev); free_channel: @@ -463,7 +463,7 @@ static int aie2_init(struct amdxdna_dev *xdna) void __iomem *tbl[PCI_NUM_RESOURCES] =3D {0}; struct init_config xrs_cfg =3D { 0 }; struct amdxdna_dev_hdl *ndev; - struct psp_config psp_conf; + struct psp_config psp_conf =3D { 0 }; const struct firmware *fw; unsigned long bars =3D 0; char *fw_full_path; @@ -551,8 +551,8 @@ static int aie2_init(struct amdxdna_dev *xdna) psp_conf.fw_buf =3D fw->data; for (i =3D 0; i < PSP_MAX_REGS; i++) psp_conf.psp_regs[i] =3D tbl[PSP_REG_BAR(ndev, i)] + PSP_REG_OFF(ndev, i= ); - ndev->psp_hdl =3D aie2m_psp_create(&xdna->ddev, &psp_conf); - if (!ndev->psp_hdl) { + ndev->aie.psp_hdl =3D aiem_psp_create(&xdna->ddev, &psp_conf); + if (!ndev->aie.psp_hdl) { XDNA_ERR(xdna, "failed to create psp"); ret =3D -ENOMEM; goto release_fw; diff --git a/drivers/accel/amdxdna/aie2_pci.h b/drivers/accel/amdxdna/aie2_= pci.h index 96960a2219a4..4f036b9fa096 100644 --- a/drivers/accel/amdxdna/aie2_pci.h +++ b/drivers/accel/amdxdna/aie2_pci.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0 */ /* - * Copyright (C) 2023-2024, Advanced Micro Devices, Inc. + * Copyright (C) 2023-2026, Advanced Micro Devices, Inc. */ =20 #ifndef _AIE2_PCI_H_ @@ -23,8 +23,6 @@ #define AIE2_SRAM_OFF(ndev, addr) ((addr) - (ndev)->priv->sram_dev_addr) #define AIE2_MBOX_OFF(ndev, addr) ((addr) - (ndev)->priv->mbox_dev_addr) =20 -#define PSP_REG_BAR(ndev, idx) ((ndev)->priv->psp_regs_off[(idx)].bar_idx) -#define PSP_REG_OFF(ndev, idx) ((ndev)->priv->psp_regs_off[(idx)].offset) #define SRAM_REG_OFF(ndev, idx) ((ndev)->priv->sram_offs[(idx)].offset) =20 #define SMU_REG(ndev, idx) \ @@ -88,30 +86,11 @@ enum aie2_sram_reg_idx { SRAM_MAX_INDEX /* Keep this at the end */ }; =20 -enum psp_reg_idx { - PSP_CMD_REG =3D 0, - PSP_ARG0_REG, - PSP_ARG1_REG, - PSP_ARG2_REG, - PSP_NUM_IN_REGS, /* number of input registers */ - PSP_INTR_REG =3D PSP_NUM_IN_REGS, - PSP_STATUS_REG, - PSP_RESP_REG, - PSP_PWAITMODE_REG, - PSP_MAX_REGS /* Keep this at the end */ -}; - struct amdxdna_client; struct amdxdna_fw_ver; struct amdxdna_hwctx; struct amdxdna_sched_job; =20 -struct psp_config { - const void *fw_buf; - u32 fw_size; - void __iomem *psp_regs[PSP_MAX_REGS]; -}; - struct aie_version { u16 major; u16 minor; @@ -206,7 +185,6 @@ struct amdxdna_dev_hdl { void __iomem *sram_base; void __iomem *smu_base; void __iomem *mbox_base; - struct psp_device *psp_hdl; =20 u32 total_col; struct aie_version version; @@ -236,14 +214,6 @@ struct amdxdna_dev_hdl { struct amdxdna_async_error last_async_err; }; =20 -#define DEFINE_BAR_OFFSET(reg_name, bar, reg_addr) \ - [reg_name] =3D {bar##_BAR_INDEX, (reg_addr) - bar##_BAR_BASE} - -struct aie2_bar_off_pair { - int bar_idx; - u32 offset; -}; - struct aie2_hw_ops { int (*set_dpm)(struct amdxdna_dev_hdl *ndev, u32 dpm_level); }; @@ -271,9 +241,9 @@ struct amdxdna_dev_priv { u32 mbox_size; u32 hwctx_limit; u32 sram_dev_addr; - struct aie2_bar_off_pair sram_offs[SRAM_MAX_INDEX]; - struct aie2_bar_off_pair psp_regs_off[PSP_MAX_REGS]; - struct aie2_bar_off_pair smu_regs_off[SMU_MAX_REGS]; + struct aie_bar_off_pair sram_offs[SRAM_MAX_INDEX]; + struct aie_bar_off_pair psp_regs_off[PSP_MAX_REGS]; + struct aie_bar_off_pair smu_regs_off[SMU_MAX_REGS]; struct aie2_hw_ops hw_ops; }; =20 @@ -300,12 +270,6 @@ int aie2_pm_init(struct amdxdna_dev_hdl *ndev); int aie2_pm_set_mode(struct amdxdna_dev_hdl *ndev, enum amdxdna_power_mode= _type target); int aie2_pm_set_dpm(struct amdxdna_dev_hdl *ndev, u32 dpm_level); =20 -/* aie2_psp.c */ -struct psp_device *aie2m_psp_create(struct drm_device *ddev, struct psp_co= nfig *conf); -int aie2_psp_start(struct psp_device *psp); -void aie2_psp_stop(struct psp_device *psp); -int aie2_psp_waitmode_poll(struct psp_device *psp); - /* aie2_error.c */ int aie2_error_async_events_alloc(struct amdxdna_dev_hdl *ndev); void aie2_error_async_events_free(struct amdxdna_dev_hdl *ndev); diff --git a/drivers/accel/amdxdna/aie2_psp.c b/drivers/accel/amdxdna/aie_p= sp.c similarity index 88% rename from drivers/accel/amdxdna/aie2_psp.c rename to drivers/accel/amdxdna/aie_psp.c index 3a7130577e3e..8743b812a449 100644 --- a/drivers/accel/amdxdna/aie2_psp.c +++ b/drivers/accel/amdxdna/aie_psp.c @@ -1,19 +1,16 @@ // SPDX-License-Identifier: GPL-2.0 /* - * Copyright (C) 2022-2024, Advanced Micro Devices, Inc. + * Copyright (C) 2026, Advanced Micro Devices, Inc. */ =20 #include -#include #include #include -#include #include #include +#include =20 -#include "aie2_pci.h" -#include "amdxdna_mailbox.h" -#include "amdxdna_pci_drv.h" +#include "aie.h" =20 #define PSP_STATUS_READY BIT(31) =20 @@ -76,7 +73,7 @@ static int psp_exec(struct psp_device *psp, u32 *reg_vals) return 0; } =20 -int aie2_psp_waitmode_poll(struct psp_device *psp) +int aie_psp_waitmode_poll(struct psp_device *psp) { struct amdxdna_dev *xdna =3D to_xdna_dev(psp->ddev); u32 mode_reg; @@ -91,7 +88,7 @@ int aie2_psp_waitmode_poll(struct psp_device *psp) return ret; } =20 -void aie2_psp_stop(struct psp_device *psp) +void aie_psp_stop(struct psp_device *psp) { u32 reg_vals[PSP_NUM_IN_REGS] =3D { PSP_RELEASE_TMR, }; int ret; @@ -101,7 +98,7 @@ void aie2_psp_stop(struct psp_device *psp) drm_err(psp->ddev, "release tmr failed, ret %d", ret); } =20 -int aie2_psp_start(struct psp_device *psp) +int aie_psp_start(struct psp_device *psp) { u32 reg_vals[PSP_NUM_IN_REGS]; int ret; @@ -129,7 +126,7 @@ int aie2_psp_start(struct psp_device *psp) return 0; } =20 -struct psp_device *aie2m_psp_create(struct drm_device *ddev, struct psp_co= nfig *conf) +struct psp_device *aiem_psp_create(struct drm_device *ddev, struct psp_con= fig *conf) { struct psp_device *psp; u64 offset; --=20 2.34.1 From nobody Wed Apr 1 09:45:44 2026 Received: from MW6PR02CU001.outbound.protection.outlook.com (mail-westus2azon11012013.outbound.protection.outlook.com [52.101.48.13]) (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 A7366387362 for ; Mon, 30 Mar 2026 16:37:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.48.13 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774888648; cv=fail; b=IlvQO4fAVq3Bs9F3FabojBvTvgocsa36IGitULFzJNNsq0vBt3lyk4Y1ZMCRm+c59aO1roKBLrnBL8fPWx9rhYeiEQ2MBqVwvdA2v9HpyGC75OuyvQXGn7vmjvVZJqcE6jaIFESmRiYvKbZl9XHr6xQ93efSYY85cOthCXN425s= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774888648; c=relaxed/simple; bh=v/L/MBxal0LSR5mJ5LHOgdSYfSHLaTrlEBPJfTCKGsg=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=OkCmdPSQS9IIpFvs96pKRbwJ2V6v6OcT6Tr5knAGCGhZSmrw0Sdduyybaflzz2QR2x9z2S6/4eMmOAg75rU4gacYrao/boRlMIltdH4QKWoRlyao01jrPXo93/Z/3OXP8uSb5ftFy4WfHT7Wj9SjexSRZnvw9t7Er72A42H4lDM= 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=NRGAs+i2; arc=fail smtp.client-ip=52.101.48.13 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="NRGAs+i2" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=LPKwyu2RVqP/Ipgjjl8lgS7ShNXfsLBtYpHx1bJ85+Fi+MzKRdljbHVAu1LV5no7VdAh3xm5YQbrAhaIq5a65EQsqN9AttQE3tyTIngzD100fpZE1NCAykcfc8Z1x0q3zyK7nOVrrJemV9o9jQWWhFM509+O2Ei2RhEFqXEtwMT4mGx17D1mvPFyCW0XTKCmfsWX0YIQgDPEVqzXEO9EvHuTxzKb2fnfad4XvdjFdP/JzztW2NP532QwbDpYnzlrBcuvowMkOSwJQ+bttT/UT0zUblstXgFR95t7Ri2vVA1XYrLhNLUxoYyPTKxUbn+OK/nPVTQt9sDoKLkoc1Ag6w== 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=8o0P9fRF8q6RdF7bn4NICLGsxL25a6TXCaRrEuyiZ+4=; b=DQ+ptOpYLEpfiQHDzOvnfMEe05mAwz5QXTVZEyHoodxQ58n9mtofkVSA2rRMngVfynu7kkLz2fFH6l71j1SpZpcmwPvHsJjE2JgrNvbL0ps0vaThdDIlpeLlqN55UWRC9W1Gw0jMg4ggDafFg4UQFxdqJuNMr0XDlGOPNxnOQ9usHPffCNAWRER0BvIzDMuR+BE7CR5SIFCIwyjN8aMlhgfdFYzxam22pybxBLn3utiM3CbF3/NRiDae1xgxAqV09ucSSgriVYrx8ODiLC/jU4IdJG9wWePq/5VkdK4JG4bhqudhrJ5Drffpxj6eJGUIVl9u4HKVg0LBSRClFsFQ2g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=kernel.org 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=8o0P9fRF8q6RdF7bn4NICLGsxL25a6TXCaRrEuyiZ+4=; b=NRGAs+i2/WmqYKY2RGm4l4CopbvNKOYrvRC/cluYDH07qCV5fjfFPOxkXiaeziO/Tsz7M6gUMwiNRz9AazWEBWb3qhFsFzzCniXXxBR6Ipx4CM9hSJHV1oy8PMi+l+Po/Z5QKNqa1STUEK494Jt8C/85Y4Z9h+DK43d4g0Otnmo= Received: from SA0PR11CA0048.namprd11.prod.outlook.com (2603:10b6:806:d0::23) by PH7PR12MB6468.namprd12.prod.outlook.com (2603:10b6:510:1f4::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9769.15; Mon, 30 Mar 2026 16:37:19 +0000 Received: from SA2PEPF00003AE6.namprd02.prod.outlook.com (2603:10b6:806:d0:cafe::15) by SA0PR11CA0048.outlook.office365.com (2603:10b6:806:d0::23) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9745.28 via Frontend Transport; Mon, 30 Mar 2026 16:37:05 +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 SA2PEPF00003AE6.mail.protection.outlook.com (10.167.248.6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9745.21 via Frontend Transport; Mon, 30 Mar 2026 16:37:18 +0000 Received: from Satlexmb09.amd.com (10.181.42.218) 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; Mon, 30 Mar 2026 11:37:18 -0500 Received: from satlexmb07.amd.com (10.181.42.216) by satlexmb09.amd.com (10.181.42.218) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Mon, 30 Mar 2026 09:37:18 -0700 Received: from xsjlizhih51.xilinx.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server id 15.2.2562.17 via Frontend Transport; Mon, 30 Mar 2026 11:37:17 -0500 From: Lizhi Hou To: , , , , CC: David Zhang , , , , Hayden Laccabue , Lizhi Hou Subject: [PATCH V1 4/6] accel/amdxdna: Add AIE4 firmware loading Date: Mon, 30 Mar 2026 09:37:03 -0700 Message-ID: <20260330163705.3153647-5-lizhi.hou@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260330163705.3153647-1-lizhi.hou@amd.com> References: <20260330163705.3153647-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: SA2PEPF00003AE6:EE_|PH7PR12MB6468:EE_ X-MS-Office365-Filtering-Correlation-Id: 83056c46-4c7f-4f44-2054-08de8e7a9c16 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700016|1800799024|376014|82310400026|56012099003|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: 0WxHDreE/WzKimcGXm+lSprzXB5ObUjwAlf0Zc2XGQ40k3SDv8LHjLaho+FKGz7zM6KpRSg077SqLKi55bWHPuwNOZjBFr4BLVzBeRZ5TaaX65ZxmE8ZIwK/kk4b4Ow6KBh9ii/OkJh+AKl10yA75P1jQoyaQKIALeuN9HkRPKxXBjrTRSk4U1nYtS3xEqjbLXC1oATL3EbT88AiH9P4SQttx9cpnlovQieKq1v5ZxXOZ0JSd4lCbPUgCCS9hmRArAjUQEmQyJtQGc5OA64C8dQg4Bvj2Vf9lKP7LzJCU/0FWvh3Rr1bc9uL6I22Opqe2HcMd6OsmCiLtTMkuH0uHQr5zfNfxaxbt7GMb/zVSZX8A3O5nX0+BVX3xrZTEJZYWrdvYdteBIYpe5L+duSXs/1v1kJ+zMcGUpkJyWvdR3g28YYnCGsMyHDbrcgbcgC3n+EP1EslLHfcrQv9/cWvgAlxFUZCcH+VTwVAuYnwvsY/QdSjMHqcMef/InCQGnAm2lggzrp7WhpsbLu3AGl8s52CS2ukLuOH2es9QGvCTtmzxE6Pk0qwrq7J/JYbmj8AOpBpX13fCk5mHzE86yCAs9+aTW3xRUDCmYHCfX/OeoX3qW6KIkBvrZpP1g1uJnbrPdNMNgDgjYIeNwvUmyw63Uk2a0gpovVRD93nD5/+JFwQ1X/o3ntPR2h8kJ65Bx/g9r5HZLhJhlskmp1Rsy75PD820D/YFn1/YadvQIsVOLDIwgeeK0yuewiuCALp+UtHki3gh40eYfyrQNwuC8fa7A== 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)(36860700016)(1800799024)(376014)(82310400026)(56012099003)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: ul1/FicWhX0aVqZ74fX8A5WuTIs5ZZehrjiHeqEOxMitl6fztbF3vsCZPd6qw7tze1YgBib0yrIZSeoeQCBQ39e924g4brOU3Z92IwmeGPnK20adDSrIia5irMZQEq7Vv7FcuvWeYpI06aZbw/XD/xmv4IUmtQ5qmudAJJuAl7ubmkORzaF2WfuMK+anpCKI2x3QP8ThvlxPe5S6En1SLCNG8x6b4W2fSvKlE7jOhLPVF0fwCFtRaoS2Awze3PTAOGMuCnO6lyYHkcJTKGAm5xEX1xDVmazWHo3x2LKeIpFtyWp4GBP7+Janz0d9NKcv6E9IReSloD26ideN5/AVmpwkLBiJFy8wNXn7NIt6d3s6DcqZT8Zkl1+WEiT77muuI6+qc+/T/umhEMOhfDbxjXAk9niaB0OrZTO1Enhr8D90H2blhiw11xq8Wlam+Fcg X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Mar 2026 16:37:18.8574 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 83056c46-4c7f-4f44-2054-08de8e7a9c16 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: SA2PEPF00003AE6.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB6468 Content-Type: text/plain; charset="utf-8" From: David Zhang Add support for loading AIE4 firmware through the common PSP interfaces. Compared to AIE2, AIE4 introduces an additional CERT firmware image. aiem_psp_create() performs CERT setup when the CERT image size is non-zero. Co-developed-by: Hayden Laccabue Signed-off-by: Hayden Laccabue Signed-off-by: David Zhang Signed-off-by: Lizhi Hou Reviewed-by: Mario Limonciello (AMD) --- drivers/accel/amdxdna/aie.h | 4 + drivers/accel/amdxdna/aie2_pci.c | 2 + drivers/accel/amdxdna/aie4_pci.c | 109 ++++++++++++++++++++++- drivers/accel/amdxdna/aie4_pci.h | 4 + drivers/accel/amdxdna/aie_psp.c | 141 +++++++++++++++++++++++------- drivers/accel/amdxdna/npu3_regs.c | 23 +++++ 6 files changed, 247 insertions(+), 36 deletions(-) diff --git a/drivers/accel/amdxdna/aie.h b/drivers/accel/amdxdna/aie.h index 124c0f7e9ca0..423ed34af9ee 100644 --- a/drivers/accel/amdxdna/aie.h +++ b/drivers/accel/amdxdna/aie.h @@ -57,7 +57,11 @@ struct aie_bar_off_pair { struct psp_config { const void *fw_buf; u32 fw_size; + const void *certfw_buf; + u32 certfw_size; void __iomem *psp_regs[PSP_MAX_REGS]; + u32 arg2_mask; + u32 notify_val; }; =20 /* aie.c */ diff --git a/drivers/accel/amdxdna/aie2_pci.c b/drivers/accel/amdxdna/aie2_= pci.c index e4b7893bd429..0489e668cd73 100644 --- a/drivers/accel/amdxdna/aie2_pci.c +++ b/drivers/accel/amdxdna/aie2_pci.c @@ -549,6 +549,8 @@ static int aie2_init(struct amdxdna_dev *xdna) =20 psp_conf.fw_size =3D fw->size; psp_conf.fw_buf =3D fw->data; + psp_conf.arg2_mask =3D GENMASK(23, 0); + psp_conf.notify_val =3D 1; for (i =3D 0; i < PSP_MAX_REGS; i++) psp_conf.psp_regs[i] =3D tbl[PSP_REG_BAR(ndev, i)] + PSP_REG_OFF(ndev, i= ); ndev->aie.psp_hdl =3D aiem_psp_create(&xdna->ddev, &psp_conf); diff --git a/drivers/accel/amdxdna/aie4_pci.c b/drivers/accel/amdxdna/aie4_= pci.c index 0f360c1ccebd..e7993b315996 100644 --- a/drivers/accel/amdxdna/aie4_pci.c +++ b/drivers/accel/amdxdna/aie4_pci.c @@ -6,11 +6,15 @@ #include #include #include +#include +#include =20 #include "aie4_pci.h" #include "amdxdna_pci_drv.h" =20 -#define NO_IOHUB 0 +#define NO_IOHUB 0 +#define CERTFW_MAX_SIZE (SZ_32K + SZ_256) +#define PSP_NOTIFY_INTR 0xD007BE11 =20 /* * The management mailbox channel is allocated by firmware. @@ -207,13 +211,12 @@ static int aie4_mailbox_init(struct amdxdna_dev *xdna) =20 static void aie4_fw_unload(struct amdxdna_dev_hdl *ndev) { - /* TODO */ + aie_psp_stop(ndev->aie.psp_hdl); } =20 static int aie4_fw_load(struct amdxdna_dev_hdl *ndev) { - /* TODO */ - return 0; + return aie_psp_start(ndev->aie.psp_hdl); } =20 static int aie4_hw_start(struct amdxdna_dev *xdna) @@ -261,11 +264,98 @@ static void aie4_hw_stop(struct amdxdna_dev *xdna) aie4_fw_unload(ndev); } =20 +static int aie4_request_firmware(struct amdxdna_dev_hdl *ndev, + const struct firmware **npufw, + const struct firmware **certfw) +{ + struct amdxdna_dev *xdna =3D ndev->aie.xdna; + struct pci_dev *pdev =3D to_pci_dev(xdna->ddev.dev); + char fw_name[128]; + int ret; + + ret =3D snprintf(fw_name, sizeof(fw_name), "amdnpu/%04x_%02x/%s", + pdev->device, pdev->revision, ndev->priv->npufw_path); + if (ret >=3D sizeof(fw_name)) { + XDNA_ERR(xdna, "npu firmware path is truncated"); + return -EINVAL; + } + + ret =3D request_firmware(npufw, fw_name, &pdev->dev); + if (ret) { + XDNA_ERR(xdna, "failed to request_firmware %s, ret %d", fw_name, ret); + return ret; + } + + ret =3D snprintf(fw_name, sizeof(fw_name), "amdnpu/%04x_%02x/%s", + pdev->device, pdev->revision, ndev->priv->certfw_path); + if (ret >=3D sizeof(fw_name)) { + XDNA_ERR(xdna, "cert firmware path is truncated"); + ret =3D -EINVAL; + goto release_npufw; + } + + ret =3D request_firmware(certfw, fw_name, &pdev->dev); + if (ret) { + XDNA_ERR(xdna, "failed to request_firmware %s, ret %d", fw_name, ret); + goto release_npufw; + } + + if ((*certfw)->size > CERTFW_MAX_SIZE) { + XDNA_ERR(xdna, "CERTFW over maximum size of 32 KB + 256 B"); + ret =3D -EINVAL; + goto release_certfw; + } + + return 0; + +release_certfw: + release_firmware(*certfw); +release_npufw: + release_firmware(*npufw); + + return ret; +} + +static void aie4_release_firmware(struct amdxdna_dev_hdl *ndev, + const struct firmware *npufw, + const struct firmware *certfw) +{ + release_firmware(certfw); + release_firmware(npufw); +} + +static int aie4_prepare_firmware(struct amdxdna_dev_hdl *ndev, + const struct firmware *npufw, + const struct firmware *certfw, + void __iomem *tbl[PCI_NUM_RESOURCES]) +{ + struct amdxdna_dev *xdna =3D ndev->aie.xdna; + struct psp_config psp_conf; + int i; + + psp_conf.fw_size =3D npufw->size; + psp_conf.fw_buf =3D npufw->data; + psp_conf.certfw_size =3D certfw->size; + psp_conf.certfw_buf =3D certfw->data; + psp_conf.arg2_mask =3D ~0; + psp_conf.notify_val =3D PSP_NOTIFY_INTR; + for (i =3D 0; i < PSP_MAX_REGS; i++) + psp_conf.psp_regs[i] =3D tbl[PSP_REG_BAR(ndev, i)] + PSP_REG_OFF(ndev, i= ); + ndev->aie.psp_hdl =3D aiem_psp_create(&xdna->ddev, &psp_conf); + if (!ndev->aie.psp_hdl) { + XDNA_ERR(xdna, "failed to create psp"); + return -ENOMEM; + } + + return 0; +} + static int aie4_pcidev_init(struct amdxdna_dev_hdl *ndev) { struct amdxdna_dev *xdna =3D ndev->aie.xdna; struct pci_dev *pdev =3D to_pci_dev(xdna->ddev.dev); void __iomem *tbl[PCI_NUM_RESOURCES] =3D {0}; + const struct firmware *npufw, *certfw; unsigned long bars =3D 0; int ret, i; =20 @@ -282,6 +372,8 @@ static int aie4_pcidev_init(struct amdxdna_dev_hdl *nde= v) return ret; } =20 + for (i =3D 0; i < PSP_MAX_REGS; i++) + set_bit(PSP_REG_BAR(ndev, i), &bars); set_bit(xdna->dev_info->mbox_bar, &bars); set_bit(xdna->dev_info->sram_bar, &bars); =20 @@ -300,6 +392,15 @@ static int aie4_pcidev_init(struct amdxdna_dev_hdl *nd= ev) =20 pci_set_master(pdev); =20 + ret =3D aie4_request_firmware(ndev, &npufw, &certfw); + if (ret) + goto clear_master; + + ret =3D aie4_prepare_firmware(ndev, npufw, certfw, tbl); + aie4_release_firmware(ndev, npufw, certfw); + if (ret) + goto clear_master; + ret =3D aie4_irq_init(xdna); if (ret) goto clear_master; diff --git a/drivers/accel/amdxdna/aie4_pci.h b/drivers/accel/amdxdna/aie4_= pci.h index f3810a969431..ee388ccf7196 100644 --- a/drivers/accel/amdxdna/aie4_pci.h +++ b/drivers/accel/amdxdna/aie4_pci.h @@ -14,9 +14,13 @@ #include "amdxdna_mailbox.h" =20 struct amdxdna_dev_priv { + const char *npufw_path; + const char *certfw_path; u32 mbox_bar; u32 mbox_rbuf_bar; u64 mbox_info_off; + + struct aie_bar_off_pair psp_regs_off[PSP_MAX_REGS]; }; =20 struct amdxdna_dev_hdl { diff --git a/drivers/accel/amdxdna/aie_psp.c b/drivers/accel/amdxdna/aie_ps= p.c index 8743b812a449..458dca7cc5a0 100644 --- a/drivers/accel/amdxdna/aie_psp.c +++ b/drivers/accel/amdxdna/aie_psp.c @@ -18,6 +18,7 @@ #define PSP_VALIDATE 1 #define PSP_START 2 #define PSP_RELEASE_TMR 3 +#define PSP_VALIDATE_CERT 4 =20 /* PSP special arguments */ #define PSP_START_COPY_FW 1 @@ -27,10 +28,20 @@ #define PSP_ERROR_BAD_STATE 0xFFFF0007 =20 #define PSP_FW_ALIGN 0x10000 +#define PSP_CFW_ALIGN 0x8000 #define PSP_POLL_INTERVAL 20000 /* us */ #define PSP_POLL_TIMEOUT 1000000 /* us */ =20 -#define PSP_REG(p, reg) ((p)->psp_regs[reg]) +#define PSP_REG(p, reg) ((p)->conf.psp_regs[reg]) +#define PSP_SET_CMD(psp, reg_vals, cmd, arg0, arg1, arg2) \ +({ \ + u32 *_regs =3D reg_vals; \ + u32 _cmd =3D cmd; \ + _regs[0] =3D _cmd; \ + _regs[1] =3D arg0; \ + _regs[2] =3D arg1; \ + _regs[3] =3D ((arg2) | ((_cmd) << 24)) & (psp)->conf.arg2_mask; \ +}) =20 struct psp_device { struct drm_device *ddev; @@ -38,7 +49,9 @@ struct psp_device { u32 fw_buf_sz; u64 fw_paddr; void *fw_buffer; - void __iomem *psp_regs[PSP_MAX_REGS]; + u32 certfw_buf_sz; + u64 certfw_paddr; + void *certfw_buffer; }; =20 static int psp_exec(struct psp_device *psp, u32 *reg_vals) @@ -47,13 +60,22 @@ static int psp_exec(struct psp_device *psp, u32 *reg_va= ls) int ret, i; u32 ready; =20 + /* Check for PSP ready before any write */ + ret =3D readx_poll_timeout(readl, PSP_REG(psp, PSP_STATUS_REG), ready, + FIELD_GET(PSP_STATUS_READY, ready), + PSP_POLL_INTERVAL, PSP_POLL_TIMEOUT); + if (ret) { + drm_err(psp->ddev, "PSP is not ready, ret 0x%x", ret); + return ret; + } + /* Write command and argument registers */ for (i =3D 0; i < PSP_NUM_IN_REGS; i++) writel(reg_vals[i], PSP_REG(psp, i)); =20 /* clear and set PSP INTR register to kick off */ writel(0, PSP_REG(psp, PSP_INTR_REG)); - writel(1, PSP_REG(psp, PSP_INTR_REG)); + writel(psp->conf.notify_val, PSP_REG(psp, PSP_INTR_REG)); =20 /* PSP should be busy. Wait for ready, so we know task is done. */ ret =3D readx_poll_timeout(readl, PSP_REG(psp, PSP_STATUS_REG), ready, @@ -90,69 +112,124 @@ int aie_psp_waitmode_poll(struct psp_device *psp) =20 void aie_psp_stop(struct psp_device *psp) { - u32 reg_vals[PSP_NUM_IN_REGS] =3D { PSP_RELEASE_TMR, }; + u32 reg_vals[PSP_NUM_IN_REGS]; int ret; =20 + PSP_SET_CMD(psp, reg_vals, PSP_RELEASE_TMR, 0, 0, 0); + ret =3D psp_exec(psp, reg_vals); if (ret) drm_err(psp->ddev, "release tmr failed, ret %d", ret); } =20 -int aie_psp_start(struct psp_device *psp) +static int psp_validate_fw(struct psp_device *psp, u8 cmd, u64 paddr, u32 = buf_sz) { u32 reg_vals[PSP_NUM_IN_REGS]; int ret; =20 - reg_vals[0] =3D PSP_VALIDATE; - reg_vals[1] =3D lower_32_bits(psp->fw_paddr); - reg_vals[2] =3D upper_32_bits(psp->fw_paddr); - reg_vals[3] =3D psp->fw_buf_sz; + PSP_SET_CMD(psp, reg_vals, cmd, lower_32_bits(paddr), + upper_32_bits(paddr), buf_sz); =20 ret =3D psp_exec(psp, reg_vals); - if (ret) { + if (ret) drm_err(psp->ddev, "failed to validate fw, ret %d", ret); - return ret; - } =20 - memset(reg_vals, 0, sizeof(reg_vals)); - reg_vals[0] =3D PSP_START; - reg_vals[1] =3D PSP_START_COPY_FW; + return ret; +} + +static int psp_start(struct psp_device *psp) +{ + u32 reg_vals[PSP_NUM_IN_REGS]; + int ret; + + PSP_SET_CMD(psp, reg_vals, PSP_START, PSP_START_COPY_FW, 0, 0); + ret =3D psp_exec(psp, reg_vals); - if (ret) { + if (ret) drm_err(psp->ddev, "failed to start fw, ret %d", ret); + + return ret; +} + +int aie_psp_start(struct psp_device *psp) +{ + int ret; + + ret =3D psp_validate_fw(psp, PSP_VALIDATE, + psp->fw_paddr, psp->fw_buf_sz); + if (ret) return ret; - } =20 - return 0; + if (!psp->certfw_buf_sz) + goto psp_start; + + ret =3D psp_validate_fw(psp, PSP_VALIDATE_CERT, + psp->certfw_paddr, psp->certfw_buf_sz); + if (ret) + return ret; +psp_start: + return psp_start(psp); +} + +/* + * PSP requires host physical address to load firmware. + * Allocate a buffer, obtain its physical address, align, and copy data in. + */ +static void *psp_alloc_fw_buf(struct psp_device *psp, const void *fw_data, + u32 fw_size, u32 align, u32 *buf_sz, + u64 *paddr) +{ + u32 alloc_sz; + void *buffer; + u64 offset; + + *buf_sz =3D ALIGN(fw_size, align); + alloc_sz =3D *buf_sz + align; + + buffer =3D drmm_kmalloc(psp->ddev, alloc_sz, GFP_KERNEL); + if (!buffer) + return NULL; + + *paddr =3D virt_to_phys(buffer); + offset =3D ALIGN(*paddr, align) - *paddr; + *paddr +=3D offset; + memcpy(buffer + offset, fw_data, fw_size); + + return buffer; } =20 struct psp_device *aiem_psp_create(struct drm_device *ddev, struct psp_con= fig *conf) { struct psp_device *psp; - u64 offset; =20 psp =3D drmm_kzalloc(ddev, sizeof(*psp), GFP_KERNEL); if (!psp) return NULL; =20 psp->ddev =3D ddev; - memcpy(psp->psp_regs, conf->psp_regs, sizeof(psp->psp_regs)); + psp->fw_buffer =3D psp_alloc_fw_buf(psp, conf->fw_buf, conf->fw_size, + PSP_FW_ALIGN, &psp->fw_buf_sz, + &psp->fw_paddr); + if (!psp->fw_buffer) + return NULL; + + if (!conf->certfw_size) { + drm_dbg(ddev, "no cert fw"); + goto done; + } =20 - psp->fw_buf_sz =3D ALIGN(conf->fw_size, PSP_FW_ALIGN); - psp->fw_buffer =3D drmm_kmalloc(ddev, psp->fw_buf_sz + PSP_FW_ALIGN, GFP_= KERNEL); - if (!psp->fw_buffer) { - drm_err(ddev, "no memory for fw buffer"); + /* CERT firmware */ + psp->certfw_buffer =3D psp_alloc_fw_buf(psp, conf->certfw_buf, + conf->certfw_size, PSP_CFW_ALIGN, + &psp->certfw_buf_sz, + &psp->certfw_paddr); + if (!psp->certfw_buffer) { + drm_err(ddev, "no memory for cert fw buffer"); return NULL; } =20 - /* - * AMD Platform Security Processor(PSP) requires host physical - * address to load NPU firmware. - */ - psp->fw_paddr =3D virt_to_phys(psp->fw_buffer); - offset =3D ALIGN(psp->fw_paddr, PSP_FW_ALIGN) - psp->fw_paddr; - psp->fw_paddr +=3D offset; - memcpy(psp->fw_buffer + offset, conf->fw_buf, conf->fw_size); +done: + memcpy(&psp->conf, conf, sizeof(psp->conf)); =20 return psp; } diff --git a/drivers/accel/amdxdna/npu3_regs.c b/drivers/accel/amdxdna/npu3= _regs.c index f6e20f4858db..fb2bd60b8f00 100644 --- a/drivers/accel/amdxdna/npu3_regs.c +++ b/drivers/accel/amdxdna/npu3_regs.c @@ -16,6 +16,15 @@ =20 /* PCIe BAR Index for NPU3 */ #define NPU3_REG_BAR_INDEX 0 +#define NPU3_PSP_BAR_INDEX 4 + +#define MMNPU_APERTURE3_BASE 0x3810000 +#define NPU3_PSP_BAR_BASE MMNPU_APERTURE3_BASE + +#define MPASP_C2PMSG_123_ALT_1 0x3810AEC +#define MPASP_C2PMSG_156_ALT_1 0x3810B70 +#define MPASP_C2PMSG_157_ALT_1 0x3810B74 +#define MPASP_C2PMSG_73_ALT_1 0x3810A24 =20 static const struct amdxdna_fw_feature_tbl npu3_fw_feature_table[] =3D { { .major =3D 5, .min_minor =3D 10 }, @@ -23,14 +32,28 @@ static const struct amdxdna_fw_feature_tbl npu3_fw_feat= ure_table[] =3D { }; =20 static const struct amdxdna_dev_priv npu3_dev_priv =3D { + .npufw_path =3D "npu.dev.sbin", + .certfw_path =3D "cert.dev.sbin", .mbox_bar =3D NPU3_MBOX_BAR, .mbox_rbuf_bar =3D NPU3_MBOX_BUFFER_BAR, .mbox_info_off =3D NPU3_MBOX_INFO_OFF, + .psp_regs_off =3D { + DEFINE_BAR_OFFSET(PSP_CMD_REG, NPU3_PSP, MPASP_C2PMSG_123_ALT_1), + DEFINE_BAR_OFFSET(PSP_ARG0_REG, NPU3_PSP, MPASP_C2PMSG_156_ALT_1), + DEFINE_BAR_OFFSET(PSP_ARG1_REG, NPU3_PSP, MPASP_C2PMSG_157_ALT_1), + DEFINE_BAR_OFFSET(PSP_ARG2_REG, NPU3_PSP, MPASP_C2PMSG_123_ALT_1), + DEFINE_BAR_OFFSET(PSP_INTR_REG, NPU3_PSP, MPASP_C2PMSG_73_ALT_1), + DEFINE_BAR_OFFSET(PSP_STATUS_REG, NPU3_PSP, MPASP_C2PMSG_123_ALT_1), + DEFINE_BAR_OFFSET(PSP_RESP_REG, NPU3_PSP, MPASP_C2PMSG_156_ALT_1), + /* npu3 doesn't use 8th pwaitmode register */ + }, + }; =20 const struct amdxdna_dev_info dev_npu3_pf_info =3D { .mbox_bar =3D NPU3_MBOX_BAR, .sram_bar =3D NPU3_MBOX_BUFFER_BAR, + .psp_bar =3D NPU3_PSP_BAR_INDEX, .vbnv =3D "RyzenAI-npu3-pf", .device_type =3D AMDXDNA_DEV_TYPE_PF, .dev_priv =3D &npu3_dev_priv, --=20 2.34.1 From nobody Wed Apr 1 09:45:44 2026 Received: from MW6PR02CU001.outbound.protection.outlook.com (mail-westus2azon11012018.outbound.protection.outlook.com [52.101.48.18]) (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 0CD5138737F for ; Mon, 30 Mar 2026 16:37:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.48.18 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774888649; cv=fail; b=f64p/71HWQ7/qihAETEBMqRVGuDifMhLpCRzhdgDljxd2uvlJA8pKAgB1Hn9/6czWxZ28uM9iDAocjfHeQez36w9Gz9iJB4bg692phRoHhT+lTxH9qCs5KYWSDY7p6TobqOQ7zVk1tGAGwgqlOslzJyda81LAgJcW8Xaq25YJzo= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774888649; c=relaxed/simple; bh=ublNaOqB1BiMCHvxt+QqC4fekr+3n/dEOAn2VOFvSzU=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=XS8uSnxxzd2xW8fGVc8yXS6j+V4/FLkqinR4YJTGmQvRzgjVZ+xXCYa47NzqSYrzCpdGeqlKlr88/b5+YdtEb/ncAew+j8/tUwg6TdOKpyGCPDD7vCi5kHRZfdOnCxnIWWcScaKrc1ByppDMO8gaQ+Sq8j6GXgyRnr0KVg9vuss= 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=wRPISTed; arc=fail smtp.client-ip=52.101.48.18 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="wRPISTed" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Y4FLYpT2uym4jSd2lV7fmLYuAriIkrvCPZCk7k1rM2SeB7G7pCjWJvRialwwLWBOifGGnFiRI8kLRKqT/a+ZEqjcpDXtBYfWQZ5AN2z0dG1bEb4yW7Jp7xBgFXkZ9uNHJg5BsIABvw56KjMreMxXElGDDYNgzXR9JN3eLe6+/2hgHbQiSBu/+1w8zznwBlJmq1CE8rY9gS9HKPr7t5teCkvarHah51O4QuINjdVWZmDV7T7hAaU+Ez1xN6Ji46mFgRx8Oa6C9wSxyKiBc/9rr40KJildnxYtPVvlNCoy62xbn1DpgAmeFrIQ8kihWn12ZmS27btt1iU54um/iGju+A== 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=cAvxypEaS75UACMOooZFFDs9ezXsxmY0hlODqbX7HZk=; b=WMe38fVLo7hBjhgwZE3K5816qwa/zBgfFKDp9L3ttK9miICnRnUTqYxyVSv4dwvbM7c5osNSRbaFn85MPNcA4rrCyrNsSN9fzXisSYaoj0h/DDX1BOe+TkrNROdsELD5pO7mIq1Lhh4LwqLp7E06VGUMMJ9eZzjaRvy7NQBaP+fdluza4yKIB3faVcK/zT2xZtnzwZa7VDegDUADYvx1IxmIiUU6Bh3SLIMgOxkQJBQ0MuTBwMtn+XnftqH5jNnHVNGoNgvk0rNAnnJhmPLR0S0cHFFNS84le2ZEE9hpxJSKmeKPaqL/dmNNndW+dAmol7NZfVw25xCRVp0ANoKBxQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=kernel.org 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=cAvxypEaS75UACMOooZFFDs9ezXsxmY0hlODqbX7HZk=; b=wRPISTed9wAe0+u1P2wbAzPTiKh7Qt7xkzxEcKTxamIEGmdyT69WAD6LiBWTcAJbynEtEeBikk+JqD51dBYDyOqGyJKx10DUryKhLjeByslIcjHdqWTzzGECuLfQox4yVcKMDOnaIAGbKE+yrkmlg+oithYGNdreHiYgKun0rWo= Received: from SA0PR12CA0016.namprd12.prod.outlook.com (2603:10b6:806:6f::21) by MW3PR12MB4363.namprd12.prod.outlook.com (2603:10b6:303:56::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9769.15; Mon, 30 Mar 2026 16:37:21 +0000 Received: from SN1PEPF0002636B.namprd02.prod.outlook.com (2603:10b6:806:6f:cafe::e4) by SA0PR12CA0016.outlook.office365.com (2603:10b6:806:6f::21) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9745.28 via Frontend Transport; Mon, 30 Mar 2026 16:36:57 +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=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SN1PEPF0002636B.mail.protection.outlook.com (10.167.241.136) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9745.21 via Frontend Transport; Mon, 30 Mar 2026 16:37:21 +0000 Received: from SATLEXMB04.amd.com (10.181.40.145) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.2.2562.17; Mon, 30 Mar 2026 11:37:19 -0500 Received: from satlexmb07.amd.com (10.181.42.216) by SATLEXMB04.amd.com (10.181.40.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.39; Mon, 30 Mar 2026 11:37:19 -0500 Received: from xsjlizhih51.xilinx.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server id 15.2.2562.17 via Frontend Transport; Mon, 30 Mar 2026 11:37:18 -0500 From: Lizhi Hou To: , , , , CC: David Zhang , , , , Hayden Laccabue , Lizhi Hou Subject: [PATCH V1 5/6] accel/amdxdna: Create common SMU interfaces for AIE2 and AIE4 Date: Mon, 30 Mar 2026 09:37:04 -0700 Message-ID: <20260330163705.3153647-6-lizhi.hou@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260330163705.3153647-1-lizhi.hou@amd.com> References: <20260330163705.3153647-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 Received-SPF: None (SATLEXMB04.amd.com: lizhi.hou@amd.com does not designate permitted sender hosts) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SN1PEPF0002636B:EE_|MW3PR12MB4363:EE_ X-MS-Office365-Filtering-Correlation-Id: 4be920e5-e279-45fe-fa04-08de8e7a9d85 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|1800799024|36860700016|376014|56012099003|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: ASBEgBgPaJApOVKUoak6linnqNsxgCQt0E5YN/cfGIWKO+hohmGx2BkUBeBNB9z9P4cROeyv4GSF8RbqrZYeAJhDVFdEX7RWyBPse26ad4uTa0NRIHYC3DeHScWRbQwBW7TF0YJSd690bJbirsGm9fMe3XMQuxE5nNG6CSfWwsa9n9fNq/SpYP9wEdq52IcnAb6IFfyWmpnO7igGtuVIiiYmMH3paThWdv9tiwZ3OOZpTlRqQfzKz6b6sdLdgibb6U05pP0geOG0BbYAwrd93NT3XpW+4IN+tc0zvsL2RBWyrBnN4LGRVEnjW/4HCgp43jR45TtCwMtFRQ7FvEmhtUMbKk1HWkfXF0ko4qn5rjqX2HUZaSl3yWoKDL4ehS03iMfqURl9FvK0VgpiO/fX57wsHd1CB9i1tHQyJJoW/ilvrLY6vohZOZVp+4upSUNKVqU4mHaDZohdNHwcK6NqgptWeo1+2Rs4pvdrnP2mO50JvMSdrvth574mY20dnNJ0j9ggPSXw7t8pZXWyKSEhTVJi3Y+9JmdkG1qip1hjOelsz9jeeTWEK3ozta0OcDMhVwXTFv9gbW8k1pV4EjeWOutDpLTa6JpxuYm7TQcNpjn1x6aTUknmqM1Cb5E4u69Ja+nsAfABq/vkQl/LPHDwFC1NpOP9Vvyy3ziYyHRtECqs87s0vnw5oZlRr7Q0WoCSo/j2vH6M0A9E14nlto7J1NHl/SzuYqlkRuBMXNWMmvqR/Ng6mwvh0nrBpLH1REx4bNO5f0z+DlIA+jsfwRP3tg== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(82310400026)(1800799024)(36860700016)(376014)(56012099003)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 8A1l6fFbH/oQKYB2QjmmCMW4oisfU/KIXLkx1a3kP6CYSl5O4mLcFkUSc+t++xpnCDKUW3iWIFQymQyOI1M4tjn6K+M68UNJ1sV3UGukkWBx/FMikWsiDhOqHXOUgQOLh+ORtKErzLKzaUt4M0WOJFJqn3ikAz0MRNffGJF46ckxYhbwFaLM/p5Sd9FekSgFbvvbervPrfDEjxBTPudsbpcPKo66ONIwh16atOs4wvGSdXouNC3PtYiAde5ASbTML+P6MFYsvb2s2r4d6HQaUDvt5rJ544I2dIWqkkKHZ3JxAkA7QYVjiT52NIrMdGYOqh3gZwXqSGIpH/fxnJcZON5aiXk2RC2qabMCO1EMtwlFko2UwA3XWnTcIopfQJN2uO9VRh95SGc9OJd73NF/KGQD8a3Szq/nWtlO9l/II6Su/3PKLBgv9GcRZe9FjjK7 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Mar 2026 16:37:21.2415 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 4be920e5-e279-45fe-fa04-08de8e7a9d85 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=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SN1PEPF0002636B.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW3PR12MB4363 Content-Type: text/plain; charset="utf-8" From: David Zhang AIE2 and AIE4 use similar interfaces to the SMU (System Management Unit). Move the SMU implementation into aie_smu.c and provide common interfaces for both platforms. This allows AIE2 and AIE4 to share the same implementation and reduces code duplication. Co-developed-by: Hayden Laccabue Signed-off-by: Hayden Laccabue Signed-off-by: David Zhang Signed-off-by: Lizhi Hou Reviewed-by: Mario Limonciello (AMD) --- drivers/accel/amdxdna/Makefile | 2 +- drivers/accel/amdxdna/aie.h | 25 +++++ drivers/accel/amdxdna/aie2_pci.c | 22 ++++- drivers/accel/amdxdna/aie2_pci.h | 20 ---- drivers/accel/amdxdna/aie2_smu.c | 156 ------------------------------ drivers/accel/amdxdna/aie_smu.c | 153 +++++++++++++++++++++++++++++ drivers/accel/amdxdna/npu1_regs.c | 21 ++++ drivers/accel/amdxdna/npu4_regs.c | 26 +++++ 8 files changed, 245 insertions(+), 180 deletions(-) delete mode 100644 drivers/accel/amdxdna/aie2_smu.c create mode 100644 drivers/accel/amdxdna/aie_smu.c diff --git a/drivers/accel/amdxdna/Makefile b/drivers/accel/amdxdna/Makefile index d3c0fe765a8b..79369e497540 100644 --- a/drivers/accel/amdxdna/Makefile +++ b/drivers/accel/amdxdna/Makefile @@ -3,12 +3,12 @@ amdxdna-y :=3D \ aie.o \ aie_psp.o \ + aie_smu.o \ aie2_ctx.o \ aie2_error.o \ aie2_message.o \ aie2_pci.o \ aie2_pm.o \ - aie2_smu.o \ aie2_solver.o \ aie4_message.o \ aie4_pci.o \ diff --git a/drivers/accel/amdxdna/aie.h b/drivers/accel/amdxdna/aie.h index 423ed34af9ee..ba4c9ee21823 100644 --- a/drivers/accel/amdxdna/aie.h +++ b/drivers/accel/amdxdna/aie.h @@ -12,6 +12,7 @@ #define AIE_TIMEOUT 1000000 /* us */ =20 struct psp_device; +struct smu_device; =20 struct aie_device { struct amdxdna_dev *xdna; @@ -24,6 +25,7 @@ struct aie_device { unsigned long feature_mask; =20 struct psp_device *psp_hdl; + struct smu_device *smu_hdl; }; =20 #define DECLARE_AIE_MSG(name, op) \ @@ -33,9 +35,21 @@ struct aie_device { #define PSP_REG_BAR(ndev, idx) ((ndev)->priv->psp_regs_off[(idx)].bar_idx) #define PSP_REG_OFF(ndev, idx) ((ndev)->priv->psp_regs_off[(idx)].offset) =20 +#define SMU_REG_BAR(ndev, idx) ((ndev)->priv->smu_regs_off[(idx)].bar_idx) +#define SMU_REG_OFF(ndev, idx) ((ndev)->priv->smu_regs_off[(idx)].offset) + #define DEFINE_BAR_OFFSET(reg_name, bar, reg_addr) \ [reg_name] =3D {bar##_BAR_INDEX, (reg_addr) - bar##_BAR_BASE} =20 +enum smu_reg_idx { + SMU_CMD_REG =3D 0, + SMU_ARG_REG, + SMU_INTR_REG, + SMU_RESP_REG, + SMU_OUT_REG, + SMU_MAX_REGS /* Keep this at the end */ +}; + enum psp_reg_idx { PSP_CMD_REG =3D 0, PSP_ARG0_REG, @@ -54,6 +68,10 @@ struct aie_bar_off_pair { u32 offset; }; =20 +struct smu_config { + void __iomem *smu_regs[SMU_MAX_REGS]; +}; + struct psp_config { const void *fw_buf; u32 fw_size; @@ -76,4 +94,11 @@ int aie_psp_start(struct psp_device *psp); void aie_psp_stop(struct psp_device *psp); int aie_psp_waitmode_poll(struct psp_device *psp); =20 +/* aie_smu.c */ +struct smu_device *aiem_smu_create(struct drm_device *ddev, struct smu_con= fig *conf); +int aie_smu_init(struct smu_device *smu); +void aie_smu_fini(struct smu_device *smu); +int aie_smu_set_clocks(struct smu_device *smu, u32 *npuclk, u32 *hclk); +int aie_smu_set_dpm(struct smu_device *smu, u32 dpm_level); + #endif /* _AIE_H_ */ diff --git a/drivers/accel/amdxdna/aie2_pci.c b/drivers/accel/amdxdna/aie2_= pci.c index 0489e668cd73..164e188ba501 100644 --- a/drivers/accel/amdxdna/aie2_pci.c +++ b/drivers/accel/amdxdna/aie2_pci.c @@ -282,6 +282,12 @@ static struct xrs_action_ops aie2_xrs_actions =3D { .set_dft_dpm_level =3D aie2_xrs_set_dft_dpm_level, }; =20 +static void aie2_smu_fini(struct amdxdna_dev_hdl *ndev) +{ + ndev->priv->hw_ops.set_dpm(ndev, 0); + aie_smu_fini(ndev->aie.smu_hdl); +} + static void aie2_hw_stop(struct amdxdna_dev *xdna) { struct pci_dev *pdev =3D to_pci_dev(xdna->ddev.dev); @@ -344,7 +350,7 @@ static int aie2_hw_start(struct amdxdna_dev *xdna) goto disable_dev; } =20 - ret =3D aie2_smu_init(ndev); + ret =3D aie_smu_init(ndev->aie.smu_hdl); if (ret) { XDNA_ERR(xdna, "failed to init smu, ret %d", ret); goto free_channel; @@ -464,6 +470,7 @@ static int aie2_init(struct amdxdna_dev *xdna) struct init_config xrs_cfg =3D { 0 }; struct amdxdna_dev_hdl *ndev; struct psp_config psp_conf =3D { 0 }; + struct smu_config smu_conf; const struct firmware *fw; unsigned long bars =3D 0; char *fw_full_path; @@ -508,9 +515,10 @@ static int aie2_init(struct amdxdna_dev *xdna) =20 for (i =3D 0; i < PSP_MAX_REGS; i++) set_bit(PSP_REG_BAR(ndev, i), &bars); + for (i =3D 0; i < SMU_MAX_REGS; i++) + set_bit(SMU_REG_BAR(ndev, i), &bars); =20 set_bit(xdna->dev_info->sram_bar, &bars); - set_bit(xdna->dev_info->smu_bar, &bars); set_bit(xdna->dev_info->mbox_bar, &bars); =20 for (i =3D 0; i < PCI_NUM_RESOURCES; i++) { @@ -525,7 +533,6 @@ static int aie2_init(struct amdxdna_dev *xdna) } =20 ndev->sram_base =3D tbl[xdna->dev_info->sram_bar]; - ndev->smu_base =3D tbl[xdna->dev_info->smu_bar]; ndev->mbox_base =3D tbl[xdna->dev_info->mbox_bar]; =20 ret =3D dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); @@ -559,6 +566,15 @@ static int aie2_init(struct amdxdna_dev *xdna) ret =3D -ENOMEM; goto release_fw; } + + for (i =3D 0; i < SMU_MAX_REGS; i++) + smu_conf.smu_regs[i] =3D tbl[SMU_REG_BAR(ndev, i)] + SMU_REG_OFF(ndev, i= ); + ndev->aie.smu_hdl =3D aiem_smu_create(&xdna->ddev, &smu_conf); + if (!ndev->aie.smu_hdl) { + XDNA_ERR(xdna, "failed to create smu"); + ret =3D -ENOMEM; + goto release_fw; + } xdna->dev_handle =3D ndev; =20 ret =3D aie2_hw_start(xdna); diff --git a/drivers/accel/amdxdna/aie2_pci.h b/drivers/accel/amdxdna/aie2_= pci.h index 4f036b9fa096..7c308672b5fe 100644 --- a/drivers/accel/amdxdna/aie2_pci.h +++ b/drivers/accel/amdxdna/aie2_pci.h @@ -25,11 +25,6 @@ =20 #define SRAM_REG_OFF(ndev, idx) ((ndev)->priv->sram_offs[(idx)].offset) =20 -#define SMU_REG(ndev, idx) \ -({ \ - typeof(ndev) _ndev =3D ndev; \ - ((_ndev)->smu_base + (_ndev)->priv->smu_regs_off[(idx)].offset); \ -}) #define SRAM_GET_ADDR(ndev, idx) \ ({ \ typeof(ndev) _ndev =3D ndev; \ @@ -71,15 +66,6 @@ }) #endif =20 -enum aie2_smu_reg_idx { - SMU_CMD_REG =3D 0, - SMU_ARG_REG, - SMU_INTR_REG, - SMU_RESP_REG, - SMU_OUT_REG, - SMU_MAX_REGS /* Keep this at the end */ -}; - enum aie2_sram_reg_idx { MBOX_CHANN_OFF =3D 0, FW_ALIVE_OFF, @@ -183,7 +169,6 @@ struct amdxdna_dev_hdl { struct aie_device aie; const struct amdxdna_dev_priv *priv; void __iomem *sram_base; - void __iomem *smu_base; void __iomem *mbox_base; =20 u32 total_col; @@ -258,11 +243,6 @@ extern const struct dpm_clk_freq npu4_dpm_clk_table[]; extern const struct rt_config npu1_default_rt_cfg[]; extern const struct rt_config npu4_default_rt_cfg[]; extern const struct amdxdna_fw_feature_tbl npu4_fw_feature_table[]; - -/* aie2_smu.c */ -int aie2_smu_init(struct amdxdna_dev_hdl *ndev); -void aie2_smu_fini(struct amdxdna_dev_hdl *ndev); -int npu1_set_dpm(struct amdxdna_dev_hdl *ndev, u32 dpm_level); int npu4_set_dpm(struct amdxdna_dev_hdl *ndev, u32 dpm_level); =20 /* aie2_pm.c */ diff --git a/drivers/accel/amdxdna/aie2_smu.c b/drivers/accel/amdxdna/aie2_= smu.c deleted file mode 100644 index 1b966bbef2e5..000000000000 --- a/drivers/accel/amdxdna/aie2_smu.c +++ /dev/null @@ -1,156 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Copyright (C) 2022-2024, Advanced Micro Devices, Inc. - */ - -#include -#include -#include -#include -#include - -#include "aie2_pci.h" -#include "amdxdna_pci_drv.h" - -#define SMU_RESULT_OK 1 - -/* SMU commands */ -#define AIE2_SMU_POWER_ON 0x3 -#define AIE2_SMU_POWER_OFF 0x4 -#define AIE2_SMU_SET_MPNPUCLK_FREQ 0x5 -#define AIE2_SMU_SET_HCLK_FREQ 0x6 -#define AIE2_SMU_SET_SOFT_DPMLEVEL 0x7 -#define AIE2_SMU_SET_HARD_DPMLEVEL 0x8 - -#define NPU4_DPM_TOPS(ndev, dpm_level) \ -({ \ - typeof(ndev) _ndev =3D ndev; \ - (4096 * (_ndev)->total_col * \ - (_ndev)->priv->dpm_clk_tbl[dpm_level].hclk / 1000000); \ -}) - -static int aie2_smu_exec(struct amdxdna_dev_hdl *ndev, u32 reg_cmd, - u32 reg_arg, u32 *out) -{ - u32 resp; - int ret; - - writel(0, SMU_REG(ndev, SMU_RESP_REG)); - writel(reg_arg, SMU_REG(ndev, SMU_ARG_REG)); - writel(reg_cmd, SMU_REG(ndev, SMU_CMD_REG)); - - /* Clear and set SMU_INTR_REG to kick off */ - writel(0, SMU_REG(ndev, SMU_INTR_REG)); - writel(1, SMU_REG(ndev, SMU_INTR_REG)); - - ret =3D readx_poll_timeout(readl, SMU_REG(ndev, SMU_RESP_REG), resp, - resp, AIE_INTERVAL, AIE_TIMEOUT); - if (ret) { - XDNA_ERR(ndev->aie.xdna, "smu cmd %d timed out", reg_cmd); - return ret; - } - - if (out) - *out =3D readl(SMU_REG(ndev, SMU_OUT_REG)); - - if (resp !=3D SMU_RESULT_OK) { - XDNA_ERR(ndev->aie.xdna, "smu cmd %d failed, 0x%x", reg_cmd, resp); - return -EINVAL; - } - - return 0; -} - -int npu1_set_dpm(struct amdxdna_dev_hdl *ndev, u32 dpm_level) -{ - u32 freq; - int ret; - - ret =3D aie2_smu_exec(ndev, AIE2_SMU_SET_MPNPUCLK_FREQ, - ndev->priv->dpm_clk_tbl[dpm_level].npuclk, &freq); - if (ret) { - XDNA_ERR(ndev->aie.xdna, "Set npu clock to %d failed, ret %d\n", - ndev->priv->dpm_clk_tbl[dpm_level].npuclk, ret); - return ret; - } - ndev->npuclk_freq =3D freq; - - ret =3D aie2_smu_exec(ndev, AIE2_SMU_SET_HCLK_FREQ, - ndev->priv->dpm_clk_tbl[dpm_level].hclk, &freq); - if (ret) { - XDNA_ERR(ndev->aie.xdna, "Set h clock to %d failed, ret %d\n", - ndev->priv->dpm_clk_tbl[dpm_level].hclk, ret); - return ret; - } - - ndev->hclk_freq =3D freq; - ndev->max_tops =3D 2 * ndev->total_col; - ndev->curr_tops =3D ndev->max_tops * freq / 1028; - - XDNA_DBG(ndev->aie.xdna, "MP-NPU clock %d, H clock %d\n", - ndev->npuclk_freq, ndev->hclk_freq); - - return 0; -} - -int npu4_set_dpm(struct amdxdna_dev_hdl *ndev, u32 dpm_level) -{ - int ret; - - ret =3D aie2_smu_exec(ndev, AIE2_SMU_SET_HARD_DPMLEVEL, dpm_level, NULL); - if (ret) { - XDNA_ERR(ndev->aie.xdna, "Set hard dpm level %d failed, ret %d ", - dpm_level, ret); - return ret; - } - - ret =3D aie2_smu_exec(ndev, AIE2_SMU_SET_SOFT_DPMLEVEL, dpm_level, NULL); - if (ret) { - XDNA_ERR(ndev->aie.xdna, "Set soft dpm level %d failed, ret %d", - dpm_level, ret); - return ret; - } - - ndev->npuclk_freq =3D ndev->priv->dpm_clk_tbl[dpm_level].npuclk; - ndev->hclk_freq =3D ndev->priv->dpm_clk_tbl[dpm_level].hclk; - ndev->max_tops =3D NPU4_DPM_TOPS(ndev, ndev->max_dpm_level); - ndev->curr_tops =3D NPU4_DPM_TOPS(ndev, dpm_level); - - XDNA_DBG(ndev->aie.xdna, "MP-NPU clock %d, H clock %d\n", - ndev->npuclk_freq, ndev->hclk_freq); - - return 0; -} - -int aie2_smu_init(struct amdxdna_dev_hdl *ndev) -{ - int ret; - - /* - * Failing to set power off indicates an unrecoverable hardware or - * firmware error. - */ - ret =3D aie2_smu_exec(ndev, AIE2_SMU_POWER_OFF, 0, NULL); - if (ret) { - XDNA_ERR(ndev->aie.xdna, "Access power failed, ret %d", ret); - return ret; - } - - ret =3D aie2_smu_exec(ndev, AIE2_SMU_POWER_ON, 0, NULL); - if (ret) { - XDNA_ERR(ndev->aie.xdna, "Power on failed, ret %d", ret); - return ret; - } - - return 0; -} - -void aie2_smu_fini(struct amdxdna_dev_hdl *ndev) -{ - int ret; - - ndev->priv->hw_ops.set_dpm(ndev, 0); - ret =3D aie2_smu_exec(ndev, AIE2_SMU_POWER_OFF, 0, NULL); - if (ret) - XDNA_ERR(ndev->aie.xdna, "Power off failed, ret %d", ret); -} diff --git a/drivers/accel/amdxdna/aie_smu.c b/drivers/accel/amdxdna/aie_sm= u.c new file mode 100644 index 000000000000..62aea550aabc --- /dev/null +++ b/drivers/accel/amdxdna/aie_smu.c @@ -0,0 +1,153 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2026, Advanced Micro Devices, Inc. + */ + +#include "drm/amdxdna_accel.h" +#include +#include +#include +#include +#include + +#include "aie.h" + +#define SMU_RESULT_OK 1 + +/* SMU commands */ +#define AIE_SMU_POWER_ON 0x3 +#define AIE_SMU_POWER_OFF 0x4 +#define AIE_SMU_SET_MPNPUCLK_FREQ 0x5 +#define AIE_SMU_SET_HCLK_FREQ 0x6 +#define AIE_SMU_SET_SOFT_DPMLEVEL 0x7 +#define AIE_SMU_SET_HARD_DPMLEVEL 0x8 + +#define SMU_REG(s, reg) ((s)->smu_regs[reg]) + +struct smu_device { + struct drm_device *ddev; + struct smu_config conf; + void __iomem *smu_regs[SMU_MAX_REGS]; +}; + +static int aie_smu_exec(struct smu_device *smu, u32 reg_cmd, u32 reg_arg, = u32 *out) +{ + u32 resp; + int ret; + + writel(0, SMU_REG(smu, SMU_RESP_REG)); + writel(reg_arg, SMU_REG(smu, SMU_ARG_REG)); + writel(reg_cmd, SMU_REG(smu, SMU_CMD_REG)); + + /* Clear and set SMU_INTR_REG to kick off */ + writel(0, SMU_REG(smu, SMU_INTR_REG)); + writel(1, SMU_REG(smu, SMU_INTR_REG)); + + ret =3D readx_poll_timeout(readl, SMU_REG(smu, SMU_RESP_REG), resp, + resp, AIE_INTERVAL, AIE_TIMEOUT); + if (ret) { + drm_err(smu->ddev, "smu cmd %d timed out", reg_cmd); + return ret; + } + + if (out) + *out =3D readl(SMU_REG(smu, SMU_OUT_REG)); + + if (resp !=3D SMU_RESULT_OK) { + drm_err(smu->ddev, "smu cmd %d failed, 0x%x", reg_cmd, resp); + return -EINVAL; + } + + return 0; +} + +int aie_smu_init(struct smu_device *smu) +{ + int ret; + + /* + * Failing to set power off indicates an unrecoverable hardware or + * firmware error. + */ + ret =3D aie_smu_exec(smu, AIE_SMU_POWER_OFF, 0, NULL); + if (ret) { + drm_err(smu->ddev, "Access power failed, ret %d", ret); + return ret; + } + + ret =3D aie_smu_exec(smu, AIE_SMU_POWER_ON, 0, NULL); + if (ret) { + drm_err(smu->ddev, "Power on failed, ret %d", ret); + return ret; + } + + return 0; +} + +void aie_smu_fini(struct smu_device *smu) +{ + int ret; + + ret =3D aie_smu_exec(smu, AIE_SMU_POWER_OFF, 0, NULL); + if (ret) + drm_err(smu->ddev, "Power off failed, ret %d", ret); +} + +int aie_smu_set_clocks(struct smu_device *smu, u32 *npuclk, u32 *hclk) +{ + int ret; + + if (npuclk) { + ret =3D aie_smu_exec(smu, AIE_SMU_SET_MPNPUCLK_FREQ, *npuclk, npuclk); + if (ret) { + drm_err(smu->ddev, "Set mpnpu clock to %d failed, ret %d", *npuclk, ret= ); + return ret; + } + } + + if (hclk) { + ret =3D aie_smu_exec(smu, AIE_SMU_SET_HCLK_FREQ, *hclk, hclk); + if (ret) { + drm_err(smu->ddev, "Set hclock to %d failed, ret %d", + *hclk, ret); + return ret; + } + } + + return 0; +} + +int aie_smu_set_dpm(struct smu_device *smu, u32 dpm_level) +{ + int ret; + + ret =3D aie_smu_exec(smu, AIE_SMU_SET_HARD_DPMLEVEL, dpm_level, NULL); + if (ret) { + drm_err(smu->ddev, "Set hard dpm level %d failed, ret %d", + dpm_level, ret); + return ret; + } + + ret =3D aie_smu_exec(smu, AIE_SMU_SET_SOFT_DPMLEVEL, dpm_level, NULL); + if (ret) { + drm_err(smu->ddev, "Set soft dpm level %d failed, ret %d", + dpm_level, ret); + return ret; + } + + return 0; +} + +struct smu_device *aiem_smu_create(struct drm_device *ddev, struct smu_con= fig *conf) +{ + struct smu_device *smu; + + smu =3D drmm_kzalloc(ddev, sizeof(*smu), GFP_KERNEL); + if (!smu) + return NULL; + + smu->ddev =3D ddev; + memcpy(smu->smu_regs, conf->smu_regs, sizeof(smu->smu_regs)); + + return smu; +} diff --git a/drivers/accel/amdxdna/npu1_regs.c b/drivers/accel/amdxdna/npu1= _regs.c index 2ea7568a2e99..a83e44f378ad 100644 --- a/drivers/accel/amdxdna/npu1_regs.c +++ b/drivers/accel/amdxdna/npu1_regs.c @@ -71,6 +71,27 @@ static const struct amdxdna_fw_feature_tbl npu1_fw_featu= re_table[] =3D { { 0 } }; =20 +static int npu1_set_dpm(struct amdxdna_dev_hdl *ndev, u32 dpm_level) +{ + u32 npuclk, hclk; + int ret; + + npuclk =3D ndev->priv->dpm_clk_tbl[dpm_level].npuclk; + hclk =3D ndev->priv->dpm_clk_tbl[dpm_level].hclk; + ret =3D aie_smu_set_clocks(ndev->aie.smu_hdl, &npuclk, &hclk); + if (ret) + return ret; + + ndev->npuclk_freq =3D npuclk; + ndev->hclk_freq =3D hclk; + ndev->max_tops =3D 2 * ndev->total_col; + ndev->curr_tops =3D ndev->max_tops * hclk / 1028; + + XDNA_DBG(ndev->aie.xdna, "MP-NPU clock %d, H clock %d\n", + ndev->npuclk_freq, ndev->hclk_freq); + return 0; +} + static const struct amdxdna_dev_priv npu1_dev_priv =3D { .fw_path =3D "amdnpu/1502_00/", .rt_config =3D npu1_default_rt_cfg, diff --git a/drivers/accel/amdxdna/npu4_regs.c b/drivers/accel/amdxdna/npu4= _regs.c index 9689c56c83be..5d68171f4ec2 100644 --- a/drivers/accel/amdxdna/npu4_regs.c +++ b/drivers/accel/amdxdna/npu4_regs.c @@ -63,6 +63,13 @@ #define NPU4_SMU_BAR_BASE MMNPU_APERTURE4_BASE #define NPU4_SRAM_BAR_BASE MMNPU_APERTURE1_BASE =20 +#define NPU4_DPM_TOPS(ndev, dpm_level) \ +({ \ + typeof(ndev) _ndev =3D ndev; \ + (4096 * (_ndev)->total_col * \ + (_ndev)->priv->dpm_clk_tbl[dpm_level].hclk / 1000000); \ +}) + const struct rt_config npu4_default_rt_cfg[] =3D { { 5, 1, AIE2_RT_CFG_INIT }, /* PDI APP LOAD MODE */ { 10, 1, AIE2_RT_CFG_INIT }, /* DEBUG BUF */ @@ -98,6 +105,25 @@ const struct amdxdna_fw_feature_tbl npu4_fw_feature_tab= le[] =3D { { 0 } }; =20 +int npu4_set_dpm(struct amdxdna_dev_hdl *ndev, u32 dpm_level) +{ + int ret; + + ret =3D aie_smu_set_dpm(ndev->aie.smu_hdl, dpm_level); + if (ret) + return ret; + + ndev->npuclk_freq =3D ndev->priv->dpm_clk_tbl[dpm_level].npuclk; + ndev->hclk_freq =3D ndev->priv->dpm_clk_tbl[dpm_level].hclk; + ndev->max_tops =3D NPU4_DPM_TOPS(ndev, ndev->max_dpm_level); + ndev->curr_tops =3D NPU4_DPM_TOPS(ndev, dpm_level); + + XDNA_DBG(ndev->aie.xdna, "MP-NPU clock %d, H clock %d\n", + ndev->npuclk_freq, ndev->hclk_freq); + + return 0; +} + static const struct amdxdna_dev_priv npu4_dev_priv =3D { .fw_path =3D "amdnpu/17f0_10/", .rt_config =3D npu4_default_rt_cfg, --=20 2.34.1 From nobody Wed Apr 1 09:45:44 2026 Received: from SJ2PR03CU001.outbound.protection.outlook.com (mail-westusazon11012030.outbound.protection.outlook.com [52.101.43.30]) (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 942BE3859FA for ; Mon, 30 Mar 2026 16:37:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.43.30 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774888651; cv=fail; b=BYwC/jwTWcVhgBxdKxEQFDya5E8hCTE0tYusTgkaEnH/sZ+oyUC4gKUGycuTJCIeS5tA3tZv9E/W5EhowzXVIeTxFmxn0wneLky5lF8/ZuwY+nWffSdD0fU3U36yGDW/dKq0JhB/3tFFMqXujalGqN+j7oiWsv/7HayxFlcSMyE= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774888651; c=relaxed/simple; bh=CZjOrKVa84ouS0piZY5OCf9zhCUjeJlREWWPJ1Afqgc=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=KObcJyZpttbdHG2HQPnATglZRGLUkbI1fuWewFuC/IhJMpYZJd7lyMDRqcCEaVJRXT5vw83Vxv7n3QxRfVLzSml30aPE/lRTeZJ0DpIJjB9W5/FjgClSQCqWZedJ+gPTxOCqsXcMDeg2nfhksjo2e8MELH2e5mqIfNyxmTyQUNc= 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=f+IAJJ0w; arc=fail smtp.client-ip=52.101.43.30 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="f+IAJJ0w" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=pNaFhioOWTH0P4kMBsTpoTVtE1orjUzkQgOPkRmhk/bBciXf5rtALstynzRt7N5FfLuS5sMOq6s1H7lNmfROdoegkgFsYjkWGKYwSY8BiohqiK9BbLtFwcg7eIdHogN4gS1SVlLvTd6Cae0j0ZPRILtgZ+43MyfC+iD9CkibqCytzYSeuQMuw+nJgQ8AsNv6iEmDCuh1nfAPPHNdEYEdFkFpwVR7NU/DOReIsnEM7en63IbalHSN0b2PQhjqWMerMJw8QG9zoN/Rsbgkw944NhoniX2M0FCrjKfat43KclZ8pFx4tfX6cTEYSTd6aFRVfz0BcfQwiFDTKYD9xQS6ng== 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=r/Dye76UQhgvD46wJTtZxiA9F2lY7l0tKZtthZW1rPA=; b=xXRNj3ff6K06/UB+Z9x3OMzUo9O5MV21fptj9A6Jqjh6iUV1QHkSSs6NxxvGg3hbxAbC3IMtMttVBK9TD25IdeMl57zl/dqjCfIs4i00gr+3D/BN2NFYLbV1acvXFLgnAw/bFC3yTdPwsuwtycuZ7tWXOIdO/FBd1KX4K2YM8Y6XXXCPuluUYCJaQLdtbcoKAu8RrW4E4qrwC+qOXkwhGsevgyH9Cd9Pdy2cNcEGB+Xp8GTkcqNGOAQTQZRWSpkkwuf7JS4CcGrdeodOny6g23Q1Pat1spyVQn0QEVNkRIigGQLtToUVbJJ3M7Os2PUOqyoheU6YYnX0uIFnm7lFfQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=kernel.org 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=r/Dye76UQhgvD46wJTtZxiA9F2lY7l0tKZtthZW1rPA=; b=f+IAJJ0wTi3yr32JAlEf4f6EumVvFC/bad3w+NduAUkyIOY9HO+8jGL5ovLQcupH5IqL6UbZPGRf4Z1MjrPwMDWi0lNP96/xTeMfae3hipevR47rT0VsaVw4EQtiHhcXmNNRtiDzvXw86WLOcjyv85dsaaCEOe00h3PdUv/BqwU= Received: from SA0PR12CA0021.namprd12.prod.outlook.com (2603:10b6:806:6f::26) by IA1PR12MB6186.namprd12.prod.outlook.com (2603:10b6:208:3e6::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9769.15; Mon, 30 Mar 2026 16:37:22 +0000 Received: from SN1PEPF0002636B.namprd02.prod.outlook.com (2603:10b6:806:6f:cafe::8) by SA0PR12CA0021.outlook.office365.com (2603:10b6:806:6f::26) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9745.28 via Frontend Transport; Mon, 30 Mar 2026 16:37:17 +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=satlexmb07.amd.com; pr=C Received: from satlexmb07.amd.com (165.204.84.17) by SN1PEPF0002636B.mail.protection.outlook.com (10.167.241.136) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9745.21 via Frontend Transport; Mon, 30 Mar 2026 16:37:21 +0000 Received: from Satlexmb09.amd.com (10.181.42.218) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Mon, 30 Mar 2026 11:37:20 -0500 Received: from satlexmb07.amd.com (10.181.42.216) by satlexmb09.amd.com (10.181.42.218) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Mon, 30 Mar 2026 09:37:20 -0700 Received: from xsjlizhih51.xilinx.com (10.180.168.240) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server id 15.2.2562.17 via Frontend Transport; Mon, 30 Mar 2026 11:37:19 -0500 From: Lizhi Hou To: , , , , CC: David Zhang , , , , Hayden Laccabue , Lizhi Hou Subject: [PATCH V1 6/6] accel/amdxdna: Add AIE4 power on and off support Date: Mon, 30 Mar 2026 09:37:05 -0700 Message-ID: <20260330163705.3153647-7-lizhi.hou@amd.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260330163705.3153647-1-lizhi.hou@amd.com> References: <20260330163705.3153647-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: SN1PEPF0002636B:EE_|IA1PR12MB6186:EE_ X-MS-Office365-Filtering-Correlation-Id: 84876440-5c28-4a7e-52ef-08de8e7a9dd6 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700016|376014|82310400026|1800799024|22082099003|18002099003|56012099003; X-Microsoft-Antispam-Message-Info: ZeVnZ5SxfxdcbOet0VqnOfhSYWk16/fi/NvyblL8R5GTuZb7dEFwKTpYtLtYw7JVhgKEYE/pAiEe+6jqB5qv/5EAMDlmoK+68+Xn8Qh+qgVGd9dXfCMEJnVKC0py9x/XLPWpe6qvQwgpJnG3LTRd6084ZbtHzyW2mcqK61D2uPDe620Vyk8axXPjnjj4Ufl+3iOw/wswlUGxJzUzW56QxVvMJhwB3Ui+C2ONsYvNU+zaeDTLWWJYOEWEqYMUgZftawwAZ+jxC8LASMIXxtPxQwpFI/hJxRhkyJtfEjBAdctKJSmcLa39iyZngocjzzCwcME12HdKUNRXM2VyXEFFrWkxzPXr9FDo4gkUE8rJHKmlWX4cgqtNjNmz9L28jITiOGQTsBap9SD37bgKMchlF+r8bdfpiI16ovOIdRpkClmO+i/zlCJ5EE2hGT2sowXOVfgGqTDyLet/mjOhgWS+8HVwkAffGQZTPZ5lXvHwN/7IxJmp7FRJQN5FGxwchbAhdPsFDnd5Alkb1IfifwU8Petcoakaxuh84HQqqwxUZl2vYrTuVzBiBZ+2EdyV9p++7BGCTKFG57YQFh3TyNvt8uxU/R5VxSmoVTClpPt484+jzM3T00qTUHATN6gZaXQmXFnadq/sn4OHudgJL2/2Gqc7oZSp+v+Pv9IrwmuiWeCWKD6c2gVF67NWC6YnI0GyICHP5VU17o8NwyqIVGPyp731Eaj5GhuXPbFQ2lmW6pjQneKjfNjxj2NQNUdUP8CzEF16MAIzYk/i08EYPAMEiQ== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(36860700016)(376014)(82310400026)(1800799024)(22082099003)(18002099003)(56012099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 9EijVfL+dAR/UfEiIzIJzcdw0v81rxPHj/7zMAQeoW40uZRjofJbLvPuZaKuh8p5DfXBss3ZjdYQnR8KQHJuQQnpu5iT7xhh3ciW3y2sFCbpDH1NhVRpNa5He0qd0tWLzO/GzHT8K1w8BFTZq8vP3ScKxtN8nW05YXT15SLVvVy63WHoVJVNJBQR7cHjUzG6PaxPkGXdP4nGOSxZD6fH/T2i0y6jttUVT3giHadk72dOVuUMGcJSrIO+dYrayS+l1iOy1C8gW0rYdRwQKjk9iS6LC38g46hfRB1OWUFiKDgJ1Gcrflhpgid+Pjem5BDc9EPIUGX4hB1dVknkwRTqa29BUmsXRZxoQwRwmA4r7cADIudnHxgneINUxGgC/y41rj64JlE00rvx1hLLHM0BQAYZ1IYcg8Qp3KWRAvTaqwkDkhGlE6ZbQXsIN+CB93Cw X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Mar 2026 16:37:21.7681 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 84876440-5c28-4a7e-52ef-08de8e7a9dd6 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=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: SN1PEPF0002636B.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA1PR12MB6186 Content-Type: text/plain; charset="utf-8" From: David Zhang Implement AIE4 power on and off control using the common SMU interfaces. Co-developed-by: Hayden Laccabue Signed-off-by: Hayden Laccabue Signed-off-by: David Zhang Signed-off-by: Lizhi Hou Reviewed-by: Mario Limonciello (AMD) --- drivers/accel/amdxdna/aie4_pci.c | 28 +++++++++++++++++++++++++++- drivers/accel/amdxdna/aie4_pci.h | 1 + drivers/accel/amdxdna/npu3_regs.c | 17 ++++++++++++++++- 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/drivers/accel/amdxdna/aie4_pci.c b/drivers/accel/amdxdna/aie4_= pci.c index e7993b315996..2249b2c9398d 100644 --- a/drivers/accel/amdxdna/aie4_pci.c +++ b/drivers/accel/amdxdna/aie4_pci.c @@ -212,11 +212,26 @@ static int aie4_mailbox_init(struct amdxdna_dev *xdna) static void aie4_fw_unload(struct amdxdna_dev_hdl *ndev) { aie_psp_stop(ndev->aie.psp_hdl); + aie_smu_fini(ndev->aie.smu_hdl); } =20 static int aie4_fw_load(struct amdxdna_dev_hdl *ndev) { - return aie_psp_start(ndev->aie.psp_hdl); + int ret; + + ret =3D aie_smu_init(ndev->aie.smu_hdl); + if (ret) { + XDNA_ERR(ndev->aie.xdna, "failed to init smu, ret %d", ret); + return ret; + } + + ret =3D aie_psp_start(ndev->aie.psp_hdl); + if (ret) { + XDNA_ERR(ndev->aie.xdna, "failed to start psp, ret %d", ret); + aie_smu_fini(ndev->aie.smu_hdl); + } + + return ret; } =20 static int aie4_hw_start(struct amdxdna_dev *xdna) @@ -331,6 +346,7 @@ static int aie4_prepare_firmware(struct amdxdna_dev_hdl= *ndev, { struct amdxdna_dev *xdna =3D ndev->aie.xdna; struct psp_config psp_conf; + struct smu_config smu_conf; int i; =20 psp_conf.fw_size =3D npufw->size; @@ -347,6 +363,14 @@ static int aie4_prepare_firmware(struct amdxdna_dev_hd= l *ndev, return -ENOMEM; } =20 + for (i =3D 0; i < SMU_MAX_REGS; i++) + smu_conf.smu_regs[i] =3D tbl[SMU_REG_BAR(ndev, i)] + SMU_REG_OFF(ndev, i= ); + ndev->aie.smu_hdl =3D aiem_smu_create(&xdna->ddev, &smu_conf); + if (!ndev->aie.smu_hdl) { + XDNA_ERR(xdna, "failed to create smu"); + return -ENOMEM; + } + return 0; } =20 @@ -374,6 +398,8 @@ static int aie4_pcidev_init(struct amdxdna_dev_hdl *nde= v) =20 for (i =3D 0; i < PSP_MAX_REGS; i++) set_bit(PSP_REG_BAR(ndev, i), &bars); + for (i =3D 0; i < SMU_MAX_REGS; i++) + set_bit(SMU_REG_BAR(ndev, i), &bars); set_bit(xdna->dev_info->mbox_bar, &bars); set_bit(xdna->dev_info->sram_bar, &bars); =20 diff --git a/drivers/accel/amdxdna/aie4_pci.h b/drivers/accel/amdxdna/aie4_= pci.h index ee388ccf7196..aa1495c3370b 100644 --- a/drivers/accel/amdxdna/aie4_pci.h +++ b/drivers/accel/amdxdna/aie4_pci.h @@ -21,6 +21,7 @@ struct amdxdna_dev_priv { u64 mbox_info_off; =20 struct aie_bar_off_pair psp_regs_off[PSP_MAX_REGS]; + struct aie_bar_off_pair smu_regs_off[SMU_MAX_REGS]; }; =20 struct amdxdna_dev_hdl { diff --git a/drivers/accel/amdxdna/npu3_regs.c b/drivers/accel/amdxdna/npu3= _regs.c index fb2bd60b8f00..5a0bbc916094 100644 --- a/drivers/accel/amdxdna/npu3_regs.c +++ b/drivers/accel/amdxdna/npu3_regs.c @@ -17,15 +17,23 @@ /* PCIe BAR Index for NPU3 */ #define NPU3_REG_BAR_INDEX 0 #define NPU3_PSP_BAR_INDEX 4 +#define NPU3_SMU_BAR_INDEX 5 =20 #define MMNPU_APERTURE3_BASE 0x3810000 +#define MMNPU_APERTURE4_BASE 0x3B10000 + #define NPU3_PSP_BAR_BASE MMNPU_APERTURE3_BASE +#define NPU3_SMU_BAR_BASE MMNPU_APERTURE4_BASE =20 #define MPASP_C2PMSG_123_ALT_1 0x3810AEC #define MPASP_C2PMSG_156_ALT_1 0x3810B70 #define MPASP_C2PMSG_157_ALT_1 0x3810B74 #define MPASP_C2PMSG_73_ALT_1 0x3810A24 =20 +#define MP1_C2PMSG_59_ALT_1 0x3B109EC +#define MP1_C2PMSG_61_ALT_1 0x3B109F4 +#define MP1_C2PMSG_60_ALT_1 0x3B109F0 + static const struct amdxdna_fw_feature_tbl npu3_fw_feature_table[] =3D { { .major =3D 5, .min_minor =3D 10 }, { 0 } @@ -47,13 +55,20 @@ static const struct amdxdna_dev_priv npu3_dev_priv =3D { DEFINE_BAR_OFFSET(PSP_RESP_REG, NPU3_PSP, MPASP_C2PMSG_156_ALT_1), /* npu3 doesn't use 8th pwaitmode register */ }, - + .smu_regs_off =3D { + DEFINE_BAR_OFFSET(SMU_CMD_REG, NPU3_SMU, MP1_C2PMSG_59_ALT_1), + DEFINE_BAR_OFFSET(SMU_ARG_REG, NPU3_SMU, MP1_C2PMSG_61_ALT_1), + DEFINE_BAR_OFFSET(SMU_INTR_REG, NPU3_SMU, MMNPU_APERTURE4_BASE), + DEFINE_BAR_OFFSET(SMU_RESP_REG, NPU3_SMU, MP1_C2PMSG_60_ALT_1), + DEFINE_BAR_OFFSET(SMU_OUT_REG, NPU3_SMU, MP1_C2PMSG_61_ALT_1), + }, }; =20 const struct amdxdna_dev_info dev_npu3_pf_info =3D { .mbox_bar =3D NPU3_MBOX_BAR, .sram_bar =3D NPU3_MBOX_BUFFER_BAR, .psp_bar =3D NPU3_PSP_BAR_INDEX, + .smu_bar =3D NPU3_SMU_BAR_INDEX, .vbnv =3D "RyzenAI-npu3-pf", .device_type =3D AMDXDNA_DEV_TYPE_PF, .dev_priv =3D &npu3_dev_priv, --=20 2.34.1