From nobody Mon May 25 07:35:45 2026 Received: from SN4PR0501CU005.outbound.protection.outlook.com (mail-southcentralusazon11011034.outbound.protection.outlook.com [40.93.194.34]) (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 937F529BDB1; Sat, 16 May 2026 02:44:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.194.34 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778899461; cv=fail; b=ZEWK/B0yHfeCGQTbxgxaz07DZ6IlJ6Rr88neyzkj/yi92r5kYXz1vf/l8ujWf0yI2MbHZosuK1bM0a5qvpLPJZ9awgTq0MwlhxV8xP49S3ou1VfB439p5PtS5BGULvTm6ulJwSkFEjM0IV34qPQryLol7owLdzrCNPhDoDChT84= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778899461; c=relaxed/simple; bh=lvjSDfcb2Y1ztc9VPo6EKI1IXVIKeLA2H29VctK8gMg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=i5QCXl8S83UTwMRAeNRcgMud4o8g6q865qnmAtgnT7S/Ob9WXL+6gcbDcZvCJynrA25r1ssmHh2rPgA7uVBagMTrihWt03BC94ILxgP3egddGz0WiO3SCka9G0jwEkU8wFQnH17W9Ynt1x6n6EIIEeB8X/jDO0LqyygZqjFRSPU= 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=vLcMdF/p; arc=fail smtp.client-ip=40.93.194.34 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="vLcMdF/p" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=yEvAZ71AMZ3/7BUgJZ7iIFpI8ClyAT8ict745mSIz9t213FNi6ZJJX1YSuMEheBw6Aqw2d+cydKJIQ3xMws14Sco6HrM4x/O0jJLMMGR1GCfy/aZ1SloHqafcJ9dUm0Vi5h8eG4OQXVGgUzRN7cUU0sHugUKo9FI3EcSfucMTCMG9hahKKOep1xF8dShG8U+Hl+DTKD4LJZomqupq5BeRvgvoPJqINQpQca5AzfBApVAHAAo+AHu8nEZ8sHz8Mw7Rnzt9mv+i+pJcUOpo3ump/ntQiZvLBcEoBfEImSAQh14Ef7kfQYWpUoq7Sv7HtmcPXfiPoWcq7jyYyj2zDa+dQ== 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=kA50v06f2ifm3RKkLEsxz198BeVK6Y+WcbsqFDaU3FA=; b=SEDpm1BL5k8PLp1+J+2qOsN6CXwuoJcGiLqBWWsMH8oPsgAwiCxYmzdFWUvEEsW2Um05xlcUmbXrCBH+Y90vUCE8b6f8wAhC5X3TaM1VD8s9NZUbKt37BYs1VC1J7mRvYQJu37r8jhUkq97X34rtQk4A4esmuPB96VG/fOwjlZrhvVAoVuIBE4pls4pqSvW6OKzuj7IYu+ZG239l9GefQJUCEgl9OpurwKVe/6vJYushsipjjLUkg9iV/qnR7F0UeO16N6y79tlMHC+iy0t1gjUSxyNhpesLZ3NoridM83ClepgjzAE5/PsKGgr0Gy8y7VhXJlQNWPNiN+ExpGF0yw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.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=kA50v06f2ifm3RKkLEsxz198BeVK6Y+WcbsqFDaU3FA=; b=vLcMdF/pe2UvuW9JQ64In8UfaaVKipxjFobUC9NusUwOrqOAljXou/0uIvSvwTYR7RuuxuwwjJ5gNBQUjipBXo159gLlZWIDwv0nEC8JQ5qOfLRRAsZkZdWXJvr+3gYmUI1uq36s79/XmCYQ+pHGg854WMBdtUX+RynFOqCdVcE= Received: from BN9PR03CA0228.namprd03.prod.outlook.com (2603:10b6:408:f8::23) by IA1PR12MB6042.namprd12.prod.outlook.com (2603:10b6:208:3d6::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9913.12; Sat, 16 May 2026 02:44:14 +0000 Received: from BN1PEPF0000468A.namprd05.prod.outlook.com (2603:10b6:408:f8:cafe::85) by BN9PR03CA0228.outlook.office365.com (2603:10b6:408:f8::23) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9913.14 via Frontend Transport; Sat, 16 May 2026 02:44:13 +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 BN1PEPF0000468A.mail.protection.outlook.com (10.167.243.135) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.25.13 via Frontend Transport; Sat, 16 May 2026 02:44:13 +0000 Received: from [127.0.1.1] (10.180.168.240) 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.41; Fri, 15 May 2026 21:44:12 -0500 From: "Nikhil P. Rao" Date: Sat, 16 May 2026 02:42:35 +0000 Subject: [PATCH net-next v2 1/6] pds_core: add support for quiet devcmd failures Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-ID: <20260516-upstream_v2_clean-v2-1-7e0d66bf4020@amd.com> References: <20260516-upstream_v2_clean-v2-0-7e0d66bf4020@amd.com> In-Reply-To: <20260516-upstream_v2_clean-v2-0-7e0d66bf4020@amd.com> To: Brett Creeley , Andrew Lunn , "David S. Miller" , "Eric Dumazet" , Jakub Kicinski , Paolo Abeni CC: , , Eric Joyner , "Nikhil P. Rao" X-Mailer: b4 0.15.2 X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN1PEPF0000468A:EE_|IA1PR12MB6042:EE_ X-MS-Office365-Filtering-Correlation-Id: 9f9d6d80-7fe4-4366-5586-08deb2f503f2 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|1800799024|36860700016|376014|11063799003|56012099003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: LLgQKC1F7h8MhoLopbmDPNZrRcscJJoM272sPj8DLBx98rvCqoBDz35dwAjlJdxQWVtFzm5XvwTs9aLbyz5u83rHLLzoGealviBvwVkf85bzai8+ANe/PxA/iMT92buiyXti6DGlNbru9Lhs/uwt84kkiXtVgyKfilF7LbKuSonkCvR8RR8juIik9SsfKOa+WEriAImQSxOrNPjVYZ9+cLY1dKNIEAdIZOrl5onN8FLh+aqb6oo96AFYA8I100w8GB8z9rBbtbtSTbx/ECCSy+gRetIbJjPextIFLXYHpsxf87dcfE6VmmVy3gYPc3lHeHXOAZ+6fdFRKWNjEinSWVsE6KtPT1N28Gdqt62K5dlcBuje7Y5z63yGgikH7wzDGurIYLQ8FaEYkv+YWkHQsQlnET4WgDO56HI4qV8V01/tnxfUa+VP6g0Qpv8VhDPh4DEfn+r5J6dSl0zZeAaZd+eqBNveDXNBZZ2k6a76woz9XzgdpPZrc2lO9OJ1SLIjgopuJKuOKrs6W0d1NNMqvb2VgxV9fgXJNAl0q7O6MtmEkV3N72Nsy0ncHsgwChy/9q9D0aGpQAoISTqgER1SGcIFIszY161+HvOIEhArIy1KCfJBrYKPZF9Ous0pDA2hM3dCJnXf24V/IBnNVKEHBdtLZFatBSAalL+tv6SSGFxl2eX8TIQ7VNfk4B5lSqm8R+st9gsvd6e+NodxE9kVcFQFZ9uw/ERo6YHvXaIBwrI= 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)(11063799003)(56012099003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: l4ySjogbmeWedLubE5SAw/NsL1aWjPIhob+45N6f2LWBRBndsbvnKM6/QsNHONmjhuvpJeHfQbIJuc747aon/mAL1xA+SA3s3ilP1iVe9OLIRIOblUqJfPK5eDn/vDn7Eh0OGUKYowaP/TnN/SeqV1YGloLNV7iHLbUXQpNJiaIkA7OyX98tKAHY019BZjAlOMNTN4OxbZHrAm3XD12rVUZtmvu7yKrafbqg+mirJw6Ul+uoBA3juvOgnaccOx+lRRtLylaUAY0lsB43vdV0bmXcI+YP3NqFWa4liqbc8S+gj5z+lhG/ux6PKUOt0C1JKANfBXihfFRkwN5yZsgaw7oIgJp8HFIjwOQPDdnE+rh7Y15DVR4jUIYmgjGcpN6tpUzDUQX++JsIZITVgyxpxUfBbAHRvLr84mRpDYCTh2ecBlxcXhiXejOIDd86yzMW X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 May 2026 02:44:13.5706 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 9f9d6d80-7fe4-4366-5586-08deb2f503f2 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: BN1PEPF0000468A.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA1PR12MB6042 From: Brett Creeley Currently there aren't any use-cases that require special handling on whether or not to print devcmd failures. Specifically non-generic failures, i.e. not supported failures. Add support to allow these messages to be suppressed. This will be used when adding support to negotiate PDS_CORE_IDENTITY_VERSION_2. Signed-off-by: Brett Creeley --- drivers/net/ethernet/amd/pds_core/dev.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/drivers/net/ethernet/amd/pds_core/dev.c b/drivers/net/ethernet= /amd/pds_core/dev.c index 2e1d0d01d03a..5b86d6cd0ac3 100644 --- a/drivers/net/ethernet/amd/pds_core/dev.c +++ b/drivers/net/ethernet/amd/pds_core/dev.c @@ -126,7 +126,8 @@ static const char *pdsc_devcmd_str(int opcode) } } =20 -static int pdsc_devcmd_wait(struct pdsc *pdsc, u8 opcode, int max_seconds) +static int __pdsc_devcmd_wait(struct pdsc *pdsc, u8 opcode, int max_second= s, + const bool do_msg) { struct device *dev =3D pdsc->dev; unsigned long start_time; @@ -172,7 +173,7 @@ static int pdsc_devcmd_wait(struct pdsc *pdsc, u8 opcod= e, int max_seconds) =20 status =3D pdsc_devcmd_status(pdsc); err =3D pdsc_err_to_errno(status); - if (err && err !=3D -EAGAIN) + if (do_msg && err && err !=3D -EAGAIN) dev_err(dev, "DEVCMD %d %s failed, status=3D%d err %d %pe\n", opcode, pdsc_devcmd_str(opcode), status, err, ERR_PTR(err)); @@ -180,8 +181,9 @@ static int pdsc_devcmd_wait(struct pdsc *pdsc, u8 opcod= e, int max_seconds) return err; } =20 -int pdsc_devcmd_locked(struct pdsc *pdsc, union pds_core_dev_cmd *cmd, - union pds_core_dev_comp *comp, int max_seconds) +static int __pdsc_devcmd_locked(struct pdsc *pdsc, union pds_core_dev_cmd = *cmd, + union pds_core_dev_comp *comp, int max_seconds, + const bool do_msg) { int err; =20 @@ -190,7 +192,7 @@ int pdsc_devcmd_locked(struct pdsc *pdsc, union pds_cor= e_dev_cmd *cmd, =20 memcpy_toio(&pdsc->cmd_regs->cmd, cmd, sizeof(*cmd)); pdsc_devcmd_dbell(pdsc); - err =3D pdsc_devcmd_wait(pdsc, cmd->opcode, max_seconds); + err =3D __pdsc_devcmd_wait(pdsc, cmd->opcode, max_seconds, do_msg); =20 if ((err =3D=3D -ENXIO || err =3D=3D -ETIMEDOUT) && pdsc->wq) queue_work(pdsc->wq, &pdsc->health_work); @@ -200,6 +202,12 @@ int pdsc_devcmd_locked(struct pdsc *pdsc, union pds_co= re_dev_cmd *cmd, return err; } =20 +int pdsc_devcmd_locked(struct pdsc *pdsc, union pds_core_dev_cmd *cmd, + union pds_core_dev_comp *comp, int max_seconds) +{ + return __pdsc_devcmd_locked(pdsc, cmd, comp, max_seconds, true); +} + int pdsc_devcmd(struct pdsc *pdsc, union pds_core_dev_cmd *cmd, union pds_core_dev_comp *comp, int max_seconds) { --=20 2.43.0 From nobody Mon May 25 07:35:45 2026 Received: from PH8PR06CU001.outbound.protection.outlook.com (mail-westus3azon11012011.outbound.protection.outlook.com [40.107.209.11]) (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 1DD2125B08F; Sat, 16 May 2026 02:44:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.209.11 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778899461; cv=fail; b=klSXIRteTeccmr0iO2s/EZRzfURnyFCfH6NZIg/mPStG6aR2+HYA7+mFGWSOKorwmyVzDiFlKbNTorMIPHeqrf6VaqzkqgfvZaB35ldezrVsyebuYheh9oJjw3ZCjguuM3dFTZ7098Zquqpnvm6RR/lavjgNzasZloE0neFDkms= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778899461; c=relaxed/simple; bh=+3Tbwb/X6gGrT+4jR9t567b8UGsWhUaDO5baIS2V5AQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=X1xsUO5y+JuyQSimYmT7sHVwoq0tduVQm4DrijW9NV/WISardSU0CFmLv6fLKiuenzRC7jDpvT2XLlj5meKH1xQv2Pl3Y3ILWYSPOD5pp9n9zkJaVTFK8iUINcZBODugY/DRmQT3Ss5kfJTkpTlfby/2XiokfRyys40uoqxL3zI= 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=Ujk+YEF4; arc=fail smtp.client-ip=40.107.209.11 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="Ujk+YEF4" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=FYyD/pZDW3RfuobgvjBz1m6eCShnZ3bC4eg9cXjQ85MW0Wd1Xe7pyM6TmThuWV6vtDy82NS0KTJsI8UG2WDl6JaoXUZTl0j/DQQelnUNJtIhtSynnki96pNnG7y1fymuypOYJ6CQDG1Ywwy4GocuFG0e3kC7AhY4WAmQLyeLciCLFzBzQEJaekRpXkcNwV7IGgBANdpqIr3lSB1r/eTpjrvflZxR74B6Z09l7WLIeTam/SDATUqGp7UE+bivifr12ey3EKJpqQ1Zv7TUkTQ1bQ8cQbOBl96DP77xZjE5nsmtmPbTe5ylILCGAIjgGczEFAczqPyRppwNoXIL94Khgg== 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=ZooS1qxE8RBgDYLhkkmZtnGHEoXFHVjM2TCZ428c8vU=; b=gHb/YAD0/+WgVevBE28bLK+g+QpeSNXXK9LWGv6jppEMnfwcYL3Tgo3a8kE19xc7fknR3gmL0u2KlzqRF9MnAk2mz6GiJSrzsA0JJhY9GDlG5GF2fCOHX8fzlVlRh+wDtynfMUPADeMZ6rGZ6uC+TYUB56jnbmvAzDb0jJZ3+obvIMd4qypwcaEr58gmADKt0KRoVd24Etfm0IBFkkiotoG7zR722KCJD8BDt0iZMHrbwp9rgCj+xrmaRr1XJvwnsils6RZTPCb0yY1NyH/mtsSzor0OYNCXxGfoFSTN3WVuBf8iyszYMFl28Jijzod/4bQKSh+HN51lVfDdnSHfgA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.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=ZooS1qxE8RBgDYLhkkmZtnGHEoXFHVjM2TCZ428c8vU=; b=Ujk+YEF47XvmzMVGB4R3qa7GnYcMeecP0WHl4GSaGYTN3Wg20nXcvROuhivD6DVIDU1sZ6fFVXmcyJPa1EIVuHzPEyT0QThJztYiJZQ8yjxWDLWUXI4v870n1+QPQ73OlHga0wJ8MBKX9XVfTgeQSdjwfKNh6pjeXt25RoM8KDg= Received: from BN9PR03CA0214.namprd03.prod.outlook.com (2603:10b6:408:f8::9) by PH7PR12MB6466.namprd12.prod.outlook.com (2603:10b6:510:1f6::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.25.18; Sat, 16 May 2026 02:44:15 +0000 Received: from BN1PEPF0000468A.namprd05.prod.outlook.com (2603:10b6:408:f8:cafe::4) by BN9PR03CA0214.outlook.office365.com (2603:10b6:408:f8::9) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9913.14 via Frontend Transport; Sat, 16 May 2026 02:44:14 +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 BN1PEPF0000468A.mail.protection.outlook.com (10.167.243.135) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.25.13 via Frontend Transport; Sat, 16 May 2026 02:44:14 +0000 Received: from [127.0.1.1] (10.180.168.240) 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.41; Fri, 15 May 2026 21:44:12 -0500 From: "Nikhil P. Rao" Date: Sat, 16 May 2026 02:42:36 +0000 Subject: [PATCH net-next v2 2/6] pds_core: add support for identity version 2 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-ID: <20260516-upstream_v2_clean-v2-2-7e0d66bf4020@amd.com> References: <20260516-upstream_v2_clean-v2-0-7e0d66bf4020@amd.com> In-Reply-To: <20260516-upstream_v2_clean-v2-0-7e0d66bf4020@amd.com> To: Brett Creeley , Andrew Lunn , "David S. Miller" , "Eric Dumazet" , Jakub Kicinski , Paolo Abeni CC: , , Eric Joyner , "Nikhil P. Rao" X-Mailer: b4 0.15.2 X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN1PEPF0000468A:EE_|PH7PR12MB6466:EE_ X-MS-Office365-Filtering-Correlation-Id: 131380ed-1782-41d2-74e8-08deb2f50493 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|36860700016|1800799024|82310400026|56012099003|22082099003|18002099003|11063799003; X-Microsoft-Antispam-Message-Info: IyjPVNeOD7h4LSrUDk/VzeoD7y3aYB7yIfJXP5wXKk/QK8zZOWjYFmPy68MhmNMCF59p7dQRAY04qtnhYWnxooQPbYnPsdlESlUYQqx2ifergyIXA9CGVfW1Zi+E4MCKJ54Gf/tMKOsBmoIuBNbBLdSAuccj1cQmgN5hAKOjhRJ6avjr/3BP43OaRUjZ8J5LGhio3yLr/+XxzXu+EQd/KNdU1dLOHgb8P/rqVftae+dWihURCqB8GSdvRBpQ0dRgbA4x8I/ZK4Mr5io6kVVjRjoH5SoPqb3rWOptaHJQ1dMAbJqs6F7gQNoM18U/K51BTZhR3AmPJVPjcxTZUoXFH8ChholLVFPiiSZHbx/ezayrtTthWbE58Y774l904hg5CABvxBcixkWpc4iwuGcES/J8jTCNVsIUsCFsJLvAnslNgocX97MQOcGKEWxH4H9FAm8wflXtVpYOr3Ktz2CtZlbRhpCPxGX/j7mUoPyYFp6Ae8y997R+QbdkZhbR2EBr5fnoVEh3wjEwCPnF64A+C4rSZDP2fMzB4ux98QOAQqGQpn8r74IOBngdtJcHkX5EPlN+mTfclChqza3hnPxHb+EhSY802ejesObB9BiAdCsNmH5COhRwzqKB910YUwmc9vgVf5cKi7stWARhr1TeuE2i1hZWcKC8fqUgTzaN7MupOFAn+jLQXKhmJhoImA6m0xmABCXbmM+DROEyllEYvvrR5OittbFnL3HoTa3MTnE= 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)(376014)(36860700016)(1800799024)(82310400026)(56012099003)(22082099003)(18002099003)(11063799003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: kN23ZH6mknXpJwFH7WDbjUciTjdvELRsjEE3dDfai10TbGFpxijQYbBZXQiD0l24jG6Sbz5i2HyY+n2e5k0RoqAzSmJEKOZ4jreZUilMTWzCiltyYEtNsyU7An5GSo4zJETrEi/nl2aYMuYHSYTHQI7IGhaMtAEwZRBrhO11RA7BFQHRBKq/8D2K1AK3rRa/Nx4ZkEyUuQ4fj6q1CqHE8OK5iZsWHY2qYNRF/GbhFnxR7mp9Q6wUpX0Sk8nmCdjq5g9DkKkUpGWgpz6OgRgYitY/WMH6qcg2S44hxfbydb+UiZlIS/Xs79XlkuReS6d5hbhEgkAt1vyk2jgLklGHWBUTGi+aAOfLFliZgremnzRIVIANMYSVv1G3qJHXcFtV+gU3UhRNkI8/uQchFzg+Het9cEds9pOq2SzVPUPy3wMkJRcZpOAC8kuO5SsKM5hG X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 May 2026 02:44:14.6260 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 131380ed-1782-41d2-74e8-08deb2f50493 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: BN1PEPF0000468A.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB6466 From: Brett Creeley Add a new capabilities field in struct pds_core_dev_identity, which requires bumping the identity version to 2, i.e. PDS_CORE_IDENTITY_VERSION_2. If version 2 negotiation fails, then quietly fall back to version 1. If version 1 negotiation fails, then driver load will fail. Another patch in the series will make use of the capabilities field. Signed-off-by: Brett Creeley --- drivers/net/ethernet/amd/pds_core/dev.c | 36 ++++++++++++++++++++++++++---= ---- include/linux/pds/pds_core_if.h | 4 ++++ 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/drivers/net/ethernet/amd/pds_core/dev.c b/drivers/net/ethernet= /amd/pds_core/dev.c index 5b86d6cd0ac3..c9abea9b2eb1 100644 --- a/drivers/net/ethernet/amd/pds_core/dev.c +++ b/drivers/net/ethernet/amd/pds_core/dev.c @@ -243,15 +243,17 @@ int pdsc_devcmd_reset(struct pdsc *pdsc) return pdsc_devcmd(pdsc, &cmd, &comp, pdsc->devcmd_timeout); } =20 -static int pdsc_devcmd_identify_locked(struct pdsc *pdsc) +static int pdsc_devcmd_identify_locked(struct pdsc *pdsc, u8 drv_ident_ver, + bool do_msg) { union pds_core_dev_comp comp =3D {}; union pds_core_dev_cmd cmd =3D { .identify.opcode =3D PDS_CORE_CMD_IDENTIFY, - .identify.ver =3D PDS_CORE_IDENTITY_VERSION_1, + .identify.ver =3D drv_ident_ver, }; =20 - return pdsc_devcmd_locked(pdsc, &cmd, &comp, pdsc->devcmd_timeout); + return __pdsc_devcmd_locked(pdsc, &cmd, &comp, pdsc->devcmd_timeout, + do_msg); } =20 static void pdsc_init_devinfo(struct pdsc *pdsc) @@ -274,8 +276,9 @@ static void pdsc_init_devinfo(struct pdsc *pdsc) dev_dbg(pdsc->dev, "fw_version %s\n", pdsc->dev_info.fw_version); } =20 -static int pdsc_identify(struct pdsc *pdsc) +static int pdsc_identify_ver(struct pdsc *pdsc, u8 drv_ident_ver) { + bool do_msg =3D drv_ident_ver =3D=3D PDS_CORE_IDENTITY_VERSION_1; struct pds_core_drv_identity drv =3D {}; size_t sz; int err; @@ -295,10 +298,13 @@ static int pdsc_identify(struct pdsc *pdsc) */ mutex_lock(&pdsc->devcmd_lock); =20 + /* Zero data region so fields not set by older firmware read as zero */ + memset_io(&pdsc->cmd_regs->data, 0, sizeof(pdsc->cmd_regs->data)); + sz =3D min_t(size_t, sizeof(drv), sizeof(pdsc->cmd_regs->data)); memcpy_toio(&pdsc->cmd_regs->data, &drv, sz); =20 - err =3D pdsc_devcmd_identify_locked(pdsc); + err =3D pdsc_devcmd_identify_locked(pdsc, drv_ident_ver, do_msg); if (!err) { sz =3D min_t(size_t, sizeof(pdsc->dev_ident), sizeof(pdsc->cmd_regs->data)); @@ -307,8 +313,9 @@ static int pdsc_identify(struct pdsc *pdsc) mutex_unlock(&pdsc->devcmd_lock); =20 if (err) { - dev_err(pdsc->dev, "Cannot identify device: %pe\n", - ERR_PTR(err)); + if (do_msg) + dev_err(pdsc->dev, "Cannot identify device: %pe\n", + ERR_PTR(err)); return err; } =20 @@ -327,6 +334,21 @@ static int pdsc_identify(struct pdsc *pdsc) return 0; } =20 +static int pdsc_identify(struct pdsc *pdsc) +{ + int err; + + /* Older firmware rejects anything but PDS_CORE_IDENTIFY_VERSION_1 + * instead of returning the max supported identify version, so retry if + * firmware doesn't support PDS_CORE_IDENTIFY_VERSION_2 + */ + err =3D pdsc_identify_ver(pdsc, PDS_CORE_IDENTITY_VERSION_2); + if (err) + err =3D pdsc_identify_ver(pdsc, PDS_CORE_IDENTITY_VERSION_1); + + return err; +} + void pdsc_dev_uninit(struct pdsc *pdsc) { if (pdsc->intr_info) { diff --git a/include/linux/pds/pds_core_if.h b/include/linux/pds/pds_core_i= f.h index 17a87c1a55d7..619186f26b5b 100644 --- a/include/linux/pds/pds_core_if.h +++ b/include/linux/pds/pds_core_if.h @@ -119,6 +119,8 @@ struct pds_core_drv_identity { * value in usecs to device units using: * device units =3D usecs * mult / div * @vif_types: How many of each VIF device type is supported + * @capabilities: Device capabilities + * only supported on version >=3D PDS_CORE_IDENTITY_VERSION_2 */ struct pds_core_dev_identity { u8 version; @@ -131,9 +133,11 @@ struct pds_core_dev_identity { __le32 intr_coal_mult; __le32 intr_coal_div; __le16 vif_types[PDS_DEV_TYPE_MAX]; + __le64 capabilities; }; =20 #define PDS_CORE_IDENTITY_VERSION_1 1 +#define PDS_CORE_IDENTITY_VERSION_2 2 =20 /** * struct pds_core_dev_identify_cmd - Driver/device identify command --=20 2.43.0 From nobody Mon May 25 07:35:45 2026 Received: from SN4PR2101CU001.outbound.protection.outlook.com (mail-southcentralusazon11012051.outbound.protection.outlook.com [40.93.195.51]) (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 B0B8B405C4F; Sat, 16 May 2026 02:44:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.195.51 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778899470; cv=fail; b=O6TFSfQQgisu1JH2bGImgItKweeOoBpobfmuxIRyXe1Rj/qeTEeew6bNkN1FZyrk5fVTYOOMzm/pSc8sg7RtG/Y90vie/4KUAdfMZz8h7PEEo8RhP9GsnPGFtjgeSQVTOqH4MgfDbSmFFtB5FjXVQWJ8RnAhGv7YgNLLIXwVob8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778899470; c=relaxed/simple; bh=OnTSwt+5vw1MudooUzOkqEnQKQRc5/k7KxNLlAnpPvs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=orSKk3iZBvpD+W8QmK07K1YfZIQEcqhCMXDPrb44IRyMhLzq9RgI20fFY+tD30mj1QpgJ6FP6qkqPKonVC5yaHFXRq2PZre6u5G76fP+43Bw44H2PpoIBhmJjKTxx03DjdYUpHxj9y2jBiuQJHWkV/QvU7BzDBVcclwaHEbsMqg= 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=1FcGygvI; arc=fail smtp.client-ip=40.93.195.51 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="1FcGygvI" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=B0Y9mb/vWGkBbwmwF+DA5AKUVqmJwsA3xljsVmYJLqa+X5t6C9JOqCO+LLIcx6HonhrjcBnu6TS6H89ZVhCQTI9ELQOY9QefVEsbb2VqMR8XnE11mrcptFeClfTpD8zf0gZHDs0QrUULOV4Gr/C0FxV6QXIEoKDgkuAlTULqGyDFNuDoyPFdZLIHatoAajia97nxHKbRmiLTnOTYX+wmhEfa+zm2Aqrs4pKGfT/ZgkVNhR6vT5bcd4mCvAkKWcWqOQMMkeDKI2GblT/tvCjASUbv89XxvuvJVkAvElRk3yrv+hgkiYoufc0Y4EGuaZ7lXVvyQ4G8b3Iun7FK/77HJg== 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=egwBuiTM08UEXr5JDY+40aWMB5zrXLJYdFVro2g3vKE=; b=KGyZFRUpQsQKTMwXB4ME6kQjQjsHemqgnkak28dLpoWzpsJS/OtLAhEWMYPMshBntBuBKCaIYGaQQLm0GOwYszI/3wiDyc8nNc/pe1V4vpod2N+Wn3NQjT+TZBYoDxbwwMopzXbh+qQQAGpcjetIjEt7wTCQTAubC8t1BAUAoErM1WFmA2WSlrvI8rEo3/mKfh0dYqwEIFf2GdXxsG7GnfVc+zIS8hVGK4bXyqh8U7PJf9wiovGw36eiCB+R6E8IFHhZKbJW3pzHUCRUJWUyxTptYtQt6yZPD7uBR2q6Ln6eysKU/eEIBjiYhkqDsyc79LfaB3wh1vq083MMVUyjMQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.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=egwBuiTM08UEXr5JDY+40aWMB5zrXLJYdFVro2g3vKE=; b=1FcGygvIqmDAU+nYgJYj+FEUmWDEragNPMPHQH0Ep991AalLz8HeEM17Udx7CoAoSpreMo9TuvaLuJLv26e3gPV1hFfWuYb+lTFTmh7cagLr5C3U5p1+C1JJYiE6zJiw3jMl1X5PH/BYF/mMr9IMLeu3wk65qjPS6/EQiPHsBH4= Received: from BN9PR03CA0216.namprd03.prod.outlook.com (2603:10b6:408:f8::11) by PH0PR12MB7009.namprd12.prod.outlook.com (2603:10b6:510:21c::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.25.19; Sat, 16 May 2026 02:44:15 +0000 Received: from BN1PEPF0000468A.namprd05.prod.outlook.com (2603:10b6:408:f8:cafe::aa) by BN9PR03CA0216.outlook.office365.com (2603:10b6:408:f8::11) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9913.14 via Frontend Transport; Sat, 16 May 2026 02:44:15 +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 BN1PEPF0000468A.mail.protection.outlook.com (10.167.243.135) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.25.13 via Frontend Transport; Sat, 16 May 2026 02:44:15 +0000 Received: from [127.0.1.1] (10.180.168.240) 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.41; Fri, 15 May 2026 21:44:13 -0500 From: "Nikhil P. Rao" Date: Sat, 16 May 2026 02:42:37 +0000 Subject: [PATCH net-next v2 3/6] pds_core: add PLDM firmware update support via devlink flash Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-ID: <20260516-upstream_v2_clean-v2-3-7e0d66bf4020@amd.com> References: <20260516-upstream_v2_clean-v2-0-7e0d66bf4020@amd.com> In-Reply-To: <20260516-upstream_v2_clean-v2-0-7e0d66bf4020@amd.com> To: Brett Creeley , Andrew Lunn , "David S. Miller" , "Eric Dumazet" , Jakub Kicinski , Paolo Abeni CC: , , Eric Joyner , "Nikhil P. Rao" X-Mailer: b4 0.15.2 X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN1PEPF0000468A:EE_|PH0PR12MB7009:EE_ X-MS-Office365-Filtering-Correlation-Id: 9e03c8ee-37b9-4f0c-bee1-08deb2f50510 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700016|1800799024|82310400026|376014|3023799003|56012099003|18002099003|22082099003|11063799003; X-Microsoft-Antispam-Message-Info: KE9HtUwxPFvsciNxYltfjKHxgPD9r0lo8j1Cnqm1d0XPQRGZf/ZUZkGEv9lg8L9BkRTp/7rS/8d6TXQPjzJ0fjLWfRVB9ZqRgnHxDvLEm+TboStwXxigW+QPskx6qzCvqamNDW1Ym9z9QjhgKgEcdbitB3VGsX+R241f2FynQLUVszjCr57V8Qm1TxHsqb7w1EGaLA6Sfb46CzuSRmNrZt+mh+wiJFWYRiXQw0tDWJ0ufCwV7rKX+9fY2E8Pd0YoC9EBoBYrHd+0/OscMR0k69LS1VBVOZEx3n0w7rTi1SUWeGyvQnXTR+JF2GnvlSLP8H04fVhgOgYYyeryrrzxw84kny6yn3WzFAk0BH67ouNyNRkTMq11aFoDncZ153zzphKVftQASDaL34VyRkzBMt1HcwDyLYgWNr3BbGFBHET+K7+kzKuS1Qz0feNJqnIbaD8BcEK8gjeq3Dn/PpJsiC3KU24omlpXyEy3jUqRvYSxYk/jvAwTK4vJ8CWG6JDBOkKWJana0ZPv/AN4lHkDUEkuDfoxHpDClAFWTGm+fO8V/DgbRDnMaC8ouCVPn2VWcDPXKwj4bEdO4LP0MJqUC7FwjI/tChb5Nzuxbz+9W96Hiw2osj/AF7+0spB4vf3UYQWKUA9lU4thkyNhzMjMVdrdZ0YExgCusKtUXXsP5w9V6zTMVCsQkA6djoz/dTe1uhJa8JQzG4Cc8YIqp21Bvs7P4JBaVhvb/eZU3Pn1f28= 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)(1800799024)(82310400026)(376014)(3023799003)(56012099003)(18002099003)(22082099003)(11063799003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: gRXzO5t53yfeHBzZItDgnS+R5QLc5SAZrvfSPwtv5zmilEjUGo4xU+v9F6jRruJwo8uUeAK6BF0oLwJzcco4XCEqiuH5pq8gFzTvTTef2MT9Wvmmn2AQchwt630tsxAm9wwDNEFcG5CMvKzXlpgIWF5pu4tBIGWvYRNQUaFj9B6yS4V0OU6gRe5uT58vHUQKCpOyJFym6QqbacOfP5oH22mD+vRYh+bxQ1puUVtgvMqy9M22zL69bHTowPC71TWr+6alYo+6z0ZbsD54xaEl3fjdcytCHvD75kATF/o45FFIXb7AywO4dScHcCtYGcETdIw4SMtq/6pxgpRcb9C60j4Y26G4zOJEC0k0l/vxdkaENdUOeA+N5imTcxbLTS9Qj4N9/vZGOHiTWK02lX4c4d0cVkI8ZSj36rvHM56rAZ6Cv3BvmSbk4GJaGsX+Mdgk X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 May 2026 02:44:15.4472 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 9e03c8ee-37b9-4f0c-bee1-08deb2f50510 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: BN1PEPF0000468A.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR12MB7009 From: Brett Creeley Implement PLDM FW Update in the pds_core driver using the upstream pldmfw API. This allows an entire PLDM FW package to be updated and/or specific components if they aren't fixed. Flash the entire image: devlink dev flash pci/0000:b5:00.0 file firmware.pldmfw Flash individual components from the PLDM FW package: devlink dev flash pci/0000:b5:00.0 \ file firmware.pldmfw component fw.mainfwa devlink dev flash pci/0000:b5:00.0 \ file firmware.pldmfw component fw.mainfwb devlink dev flash pci/0000:b5:00.0 \ file firmware.pldmfw component fw.goldfw Assisted-by: Claude:claude-opus-4.6 Signed-off-by: Brett Creeley Signed-off-by: Nikhil P. Rao --- drivers/net/ethernet/amd/Kconfig | 1 + drivers/net/ethernet/amd/pds_core/core.h | 14 +- drivers/net/ethernet/amd/pds_core/dev.c | 40 ++ drivers/net/ethernet/amd/pds_core/devlink.c | 2 +- drivers/net/ethernet/amd/pds_core/fw.c | 727 ++++++++++++++++++++++++= +++- include/linux/pds/pds_core_if.h | 373 ++++++++++++++ 6 files changed, 1152 insertions(+), 5 deletions(-) diff --git a/drivers/net/ethernet/amd/Kconfig b/drivers/net/ethernet/amd/Kc= onfig index e35991141a1a..743e3d4b6b94 100644 --- a/drivers/net/ethernet/amd/Kconfig +++ b/drivers/net/ethernet/amd/Kconfig @@ -171,6 +171,7 @@ config PDS_CORE depends on 64BIT && PCI select AUXILIARY_BUS select NET_DEVLINK + select PLDMFW help This enables the support for the AMD/Pensando Core device family of adapters. More specific information on this driver can be diff --git a/drivers/net/ethernet/amd/pds_core/core.h b/drivers/net/etherne= t/amd/pds_core/core.h index 4a6b35c84dab..c9ba63878927 100644 --- a/drivers/net/ethernet/amd/pds_core/core.h +++ b/drivers/net/ethernet/amd/pds_core/core.h @@ -199,6 +199,8 @@ struct pdsc { u64 last_eid; struct pdsc_viftype *viftype_status; struct work_struct pci_reset_work; + + struct pds_core_component_list_info fw_components; }; =20 /** enum pds_core_dbell_bits - bitwise composition of dbell values. @@ -281,8 +283,16 @@ bool pdsc_is_fw_running(struct pdsc *pdsc); bool pdsc_is_fw_good(struct pdsc *pdsc); int pdsc_devcmd(struct pdsc *pdsc, union pds_core_dev_cmd *cmd, union pds_core_dev_comp *comp, int max_seconds); +int pdsc_devcmd_with_data(struct pdsc *pdsc, union pds_core_dev_cmd *cmd, + const void *data, size_t data_len, + union pds_core_dev_comp *comp, int max_seconds); +int pdsc_devcmd_with_data_nomsg(struct pdsc *pdsc, union pds_core_dev_cmd = *cmd, + const void *data, size_t data_len, + union pds_core_dev_comp *comp, int max_seconds); int pdsc_devcmd_locked(struct pdsc *pdsc, union pds_core_dev_cmd *cmd, union pds_core_dev_comp *comp, int max_seconds); +int pdsc_devcmd_locked_nomsg(struct pdsc *pdsc, union pds_core_dev_cmd *cm= d, + union pds_core_dev_comp *comp, int max_seconds); int pdsc_devcmd_init(struct pdsc *pdsc); int pdsc_devcmd_reset(struct pdsc *pdsc); int pdsc_dev_init(struct pdsc *pdsc); @@ -315,8 +325,10 @@ void pdsc_process_adminq(struct pdsc_qcq *qcq); void pdsc_work_thread(struct work_struct *work); irqreturn_t pdsc_adminq_isr(int irq, void *data); =20 -int pdsc_firmware_update(struct pdsc *pdsc, const struct firmware *fw, +int pdsc_firmware_update(struct pdsc *pdsc, + struct devlink_flash_update_params *params, struct netlink_ext_ack *extack); +int pdsc_get_component_info(struct pdsc *pdsc); =20 void pdsc_fw_down(struct pdsc *pdsc); void pdsc_fw_up(struct pdsc *pdsc); diff --git a/drivers/net/ethernet/amd/pds_core/dev.c b/drivers/net/ethernet= /amd/pds_core/dev.c index c9abea9b2eb1..bb8c01a131ee 100644 --- a/drivers/net/ethernet/amd/pds_core/dev.c +++ b/drivers/net/ethernet/amd/pds_core/dev.c @@ -208,6 +208,12 @@ int pdsc_devcmd_locked(struct pdsc *pdsc, union pds_co= re_dev_cmd *cmd, return __pdsc_devcmd_locked(pdsc, cmd, comp, max_seconds, true); } =20 +int pdsc_devcmd_locked_nomsg(struct pdsc *pdsc, union pds_core_dev_cmd *cm= d, + union pds_core_dev_comp *comp, int max_seconds) +{ + return __pdsc_devcmd_locked(pdsc, cmd, comp, max_seconds, false); +} + int pdsc_devcmd(struct pdsc *pdsc, union pds_core_dev_cmd *cmd, union pds_core_dev_comp *comp, int max_seconds) { @@ -220,6 +226,40 @@ int pdsc_devcmd(struct pdsc *pdsc, union pds_core_dev_= cmd *cmd, return err; } =20 +int pdsc_devcmd_with_data(struct pdsc *pdsc, union pds_core_dev_cmd *cmd, + const void *data, size_t data_len, + union pds_core_dev_comp *comp, int max_seconds) +{ + int err; + + if (data_len > sizeof(pdsc->cmd_regs->data)) + return -ENOSPC; + + mutex_lock(&pdsc->devcmd_lock); + memcpy_toio(&pdsc->cmd_regs->data, data, data_len); + err =3D pdsc_devcmd_locked(pdsc, cmd, comp, max_seconds); + mutex_unlock(&pdsc->devcmd_lock); + + return err; +} + +int pdsc_devcmd_with_data_nomsg(struct pdsc *pdsc, union pds_core_dev_cmd = *cmd, + const void *data, size_t data_len, + union pds_core_dev_comp *comp, int max_seconds) +{ + int err; + + if (data_len > sizeof(pdsc->cmd_regs->data)) + return -ENOSPC; + + mutex_lock(&pdsc->devcmd_lock); + memcpy_toio(&pdsc->cmd_regs->data, data, data_len); + err =3D pdsc_devcmd_locked_nomsg(pdsc, cmd, comp, max_seconds); + mutex_unlock(&pdsc->devcmd_lock); + + return err; +} + int pdsc_devcmd_init(struct pdsc *pdsc) { union pds_core_dev_comp comp =3D {}; diff --git a/drivers/net/ethernet/amd/pds_core/devlink.c b/drivers/net/ethe= rnet/amd/pds_core/devlink.c index b576be626a29..7f44e1a8d4fd 100644 --- a/drivers/net/ethernet/amd/pds_core/devlink.c +++ b/drivers/net/ethernet/amd/pds_core/devlink.c @@ -90,7 +90,7 @@ int pdsc_dl_flash_update(struct devlink *dl, { struct pdsc *pdsc =3D devlink_priv(dl); =20 - return pdsc_firmware_update(pdsc, params->fw, extack); + return pdsc_firmware_update(pdsc, params, extack); } =20 static char *fw_slotnames[] =3D { diff --git a/drivers/net/ethernet/amd/pds_core/fw.c b/drivers/net/ethernet/= amd/pds_core/fw.c index fa626719e68d..f091a753bce9 100644 --- a/drivers/net/ethernet/amd/pds_core/fw.c +++ b/drivers/net/ethernet/amd/pds_core/fw.c @@ -1,6 +1,9 @@ // SPDX-License-Identifier: GPL-2.0 /* Copyright(c) 2023 Advanced Micro Devices, Inc */ =20 +#include +#include + #include "core.h" =20 /* The worst case wait for the install activity is about 25 minutes when @@ -14,6 +17,10 @@ /* Number of periodic log updates during fw file download */ #define PDSC_FW_INTERVAL_FRACTION 32 =20 +#define PDSC_FW_COMPONENT_PREFIX "fw." +#define PDSC_FW_COMPONENT_FULL_NAME_BUFLEN \ + (sizeof(PDSC_FW_COMPONENT_PREFIX) + PDS_CORE_FW_COMPONENT_NAME_BUFLEN) + static int pdsc_devcmd_fw_download_locked(struct pdsc *pdsc, u64 addr, u32 offset, u32 length) { @@ -23,7 +30,7 @@ static int pdsc_devcmd_fw_download_locked(struct pdsc *pd= sc, u64 addr, .fw_download.addr =3D cpu_to_le64(addr), .fw_download.length =3D cpu_to_le32(length), }; - union pds_core_dev_comp comp; + union pds_core_dev_comp comp =3D {}; =20 return pdsc_devcmd_locked(pdsc, &cmd, &comp, pdsc->devcmd_timeout); } @@ -95,8 +102,9 @@ static int pdsc_fw_status_long_wait(struct pdsc *pdsc, return err; } =20 -int pdsc_firmware_update(struct pdsc *pdsc, const struct firmware *fw, - struct netlink_ext_ack *extack) +static int pdsc_legacy_firmware_update(struct pdsc *pdsc, + const struct firmware *fw, + struct netlink_ext_ack *extack) { u32 buf_sz, copy_sz, offset; struct devlink *dl; @@ -195,3 +203,716 @@ int pdsc_firmware_update(struct pdsc *pdsc, const str= uct firmware *fw, NULL, 0, 0); return err; } + +struct pdsc_component_priv { + char component_name[PDSC_FW_COMPONENT_FULL_NAME_BUFLEN]; + u16 component_id; + bool skip; + struct list_head list_entry; +}; + +struct pds_core_fwu_priv { + struct pldmfw context; + struct devlink_flash_update_params *params; + struct netlink_ext_ack *extack; + struct pdsc *pdsc; + struct list_head components; +}; + +static void pdsc_free_fwu_priv(struct pds_core_fwu_priv *priv) +{ + struct pdsc_component_priv *component_priv, *tmp; + + list_for_each_entry_safe(component_priv, tmp, &priv->components, + list_entry) { + list_del(&component_priv->list_entry); + kfree(component_priv); + } +} + +static int pdsc_devcmd_match_record_desc(struct pdsc *pdsc, u16 desc_type, + u16 desc_size, const u8 *desc_data, + u8 *match) +{ + union pds_core_dev_cmd cmd =3D { + .match_record_desc.opcode =3D PDS_CORE_CMD_MATCH_RECORD_DESC, + .match_record_desc.ver =3D 1, + .match_record_desc.type =3D cpu_to_le16(desc_type), + .match_record_desc.size =3D cpu_to_le16(desc_size), + }; + union pds_core_dev_comp comp =3D {}; + int err; + + err =3D pdsc_devcmd_with_data(pdsc, &cmd, desc_data, desc_size, + &comp, pdsc->devcmd_timeout); + *match =3D comp.match_record_desc.match; + + return err; +} + +static bool pdsc_match_record_descs(struct pldmfw *context, + struct pldmfw_record *record) +{ + struct pds_core_fwu_priv *priv =3D + container_of(context, struct pds_core_fwu_priv, context); + struct pdsc *pdsc =3D priv->pdsc; + struct pldmfw_desc_tlv *desc; + + if (!pldmfw_op_pci_match_record(context, record)) + return false; + + list_for_each_entry(desc, &record->descs, entry) { + u8 match; + int err; + + switch (desc->type) { + /* skip types checked in pldmfw_op_pci_match_record */ + case PLDM_DESC_ID_PCI_VENDOR_ID: + case PLDM_DESC_ID_PCI_DEVICE_ID: + case PLDM_DESC_ID_PCI_SUBVENDOR_ID: + case PLDM_DESC_ID_PCI_SUBDEV_ID: + continue; + } + + if (!desc->size) + return false; + + err =3D pdsc_devcmd_match_record_desc(pdsc, desc->type, + desc->size, desc->data, + &match); + if (err) { + dev_err(pdsc->dev, + "match_record_desc failed type: 0x%04x size: %u, err %d\n", + desc->type, desc->size, err); + return false; + } + /* all record descriptors must match */ + if (!match) + return false; + } + + return true; +} + +static int pdsc_devcmd_send_package_data(struct pdsc *pdsc, u64 addr, + u16 length, u16 offset, u16 total_len) +{ + union pds_core_dev_cmd cmd =3D { + .send_pkg_data.opcode =3D PDS_CORE_CMD_SEND_PKG_DATA, + .send_pkg_data.ver =3D 1, + .send_pkg_data.data_pa =3D cpu_to_le64(addr), + .send_pkg_data.data_len =3D cpu_to_le16(length), + .send_pkg_data.offset =3D cpu_to_le16(offset), + .send_pkg_data.total_len =3D cpu_to_le16(total_len), + }; + union pds_core_dev_comp comp =3D {}; + + return pdsc_devcmd(pdsc, &cmd, &comp, pdsc->devcmd_timeout); +} + +static int pdsc_send_package_data(struct pldmfw *context, const u8 *data, + u16 length) +{ + struct pds_core_fwu_priv *priv =3D + container_of(context, struct pds_core_fwu_priv, context); + struct device *dev =3D context->dev; + struct pdsc *pdsc =3D priv->pdsc; + u8 *package_data; + u32 offset; + int err; + + if (!length) + return 0; + + package_data =3D kmemdup(data, length, GFP_KERNEL); + if (!package_data) + return -ENOMEM; + + offset =3D 0; + while (offset < length) { + dma_addr_t dma_addr; + u32 copy_sz; + + copy_sz =3D min_t(unsigned int, PDS_PAGE_SIZE, length - offset); + dma_addr =3D dma_map_single(dev, package_data + offset, copy_sz, + DMA_TO_DEVICE); + if (dma_mapping_error(dev, dma_addr)) { + dev_err(dev, + "Failed to dma_map package_data at offset 0x%x copy_sz 0x%x\n", + offset, copy_sz); + err =3D -ENOMEM; + goto out; + } + + err =3D pdsc_devcmd_send_package_data(pdsc, dma_addr, copy_sz, + offset, length); + if (err) + dev_err(dev, + "send_package_data failed offset 0x%x addr 0x%llx len 0x%x: %pe\n", + offset, dma_addr, copy_sz, ERR_PTR(err)); + + dma_unmap_single(dev, dma_addr, copy_sz, DMA_TO_DEVICE); + if (err) + goto out; + + offset +=3D copy_sz; + } + +out: + kfree(package_data); + return err; +} + +static void pdsc_set_component_name(struct pdsc *pdsc, u16 component_id, + u8 slot_id, char *component_name) +{ + int i; + + for (i =3D 0; i < pdsc->fw_components.num_components; i++) { + struct pds_core_fw_component_info *info =3D + &pdsc->fw_components.info[i]; + + if (component_id =3D=3D info->identifier && + slot_id =3D=3D info->slot_id) { + snprintf(component_name, + PDSC_FW_COMPONENT_FULL_NAME_BUFLEN, + "fw.%s", info->name); + return; + } + } +} + +static const char *pdsc_get_component_priv_name(struct pds_core_fwu_priv *= priv, + u16 component_id) +{ + struct pdsc_component_priv *component_priv; + + list_for_each_entry(component_priv, &priv->components, list_entry) { + if (component_priv->component_id !=3D component_id) + continue; + + return component_priv->component_name; + } + + return NULL; +} + +static struct pds_core_fw_component_info * +pdsc_find_component_by_name(struct pdsc *pdsc, const char *component_name) +{ + struct pds_core_fw_component_info *info; + size_t prefix_len; + int i; + + prefix_len =3D str_has_prefix(component_name, PDSC_FW_COMPONENT_PREFIX); + if (!prefix_len) + return NULL; + + component_name +=3D prefix_len; /* Skip "fw." prefix */ + + for (i =3D 0; i < pdsc->fw_components.num_components; i++) { + info =3D &pdsc->fw_components.info[i]; + + if (!strncmp(component_name, info->name, + PDS_CORE_FW_COMPONENT_NAME_BUFLEN)) + return info; + } + + return NULL; +} + +static u8 pdsc_get_slot_id(struct pdsc *pdsc, const char *component_name) +{ + struct pds_core_fw_component_info *info; + + info =3D pdsc_find_component_by_name(pdsc, component_name); + return info ? info->slot_id : PDS_CORE_FW_SLOT_MAX; +} + +static bool pdsc_skip_component(struct pds_core_fwu_priv *priv, + u16 component_id, const char *component_name) +{ + struct pdsc_component_priv *component_priv; + + list_for_each_entry(component_priv, &priv->components, list_entry) { + if (component_priv->component_id !=3D component_id) + continue; + + if (component_priv->skip) + return true; + + if (component_name && + strncmp(component_priv->component_name, component_name, + PDSC_FW_COMPONENT_FULL_NAME_BUFLEN)) + return true; + } + + return false; +} + +static bool pdsc_match_component_name_to_ids(struct pdsc *pdsc, + const char *component_name, + u8 component_id, + u8 slot_id) +{ + struct pds_core_fw_component_info *info; + + info =3D pdsc_find_component_by_name(pdsc, component_name); + if (!info) + return false; + + return slot_id =3D=3D info->slot_id && component_id =3D=3D info->identifi= er; +} + +static int pdsc_send_component_table(struct pldmfw *context, + struct pldmfw_component *component, + u8 transfer_flag) +{ + struct pds_core_fwu_priv *priv =3D + container_of(context, struct pds_core_fwu_priv, context); + struct pds_core_component_tbl *component_tbl; + struct pdsc_component_priv *component_priv; + struct device *dev =3D context->dev; + union pds_core_dev_comp comp =3D {}; + union pds_core_dev_cmd cmd =3D {}; + struct pdsc *pdsc =3D priv->pdsc; + bool skip_component =3D false; + u16 buf_sz, tbl_sz; + int err =3D 0; + u8 slot_id; + + dev_dbg(dev, + "component name %s classification %u id %u activation_method %u ver_len = %d ver_str %.*s index %u size %u transfer_flag 0x%02x\n", + priv->params->component, component->classification, + component->identifier, component->activation_method, + component->version_len, component->version_len, + component->version_string, component->index, + component->component_size, transfer_flag); + + component_priv =3D kzalloc_obj(*component_priv, GFP_KERNEL); + if (!component_priv) + return -ENOMEM; + + if (priv->params->component) { + slot_id =3D pdsc_get_slot_id(pdsc, priv->params->component); + if (slot_id =3D=3D PDS_CORE_FW_SLOT_MAX) { + err =3D -ENOENT; + goto free_component_priv; + } + + if (component->identifier > U8_MAX || + !pdsc_match_component_name_to_ids(pdsc, + priv->params->component, + component->identifier, + slot_id)) { + skip_component =3D true; + goto add_component_priv; + } + } else { + slot_id =3D PDS_CORE_FW_SLOT_INVALID; + } + + buf_sz =3D sizeof(pdsc->cmd_regs->data); + tbl_sz =3D struct_size(component_tbl, version_str, + component->version_len); + if (tbl_sz > buf_sz) { + dev_err(dev, "component_tbl size %d too big, max size: %d\n", + tbl_sz, buf_sz); + err =3D -ENOSPC; + goto free_component_priv; + } + component_tbl =3D kzalloc(tbl_sz, GFP_KERNEL); + if (!component_tbl) { + err =3D -ENOMEM; + goto free_component_priv; + } + + component_tbl->comparison_stamp =3D + cpu_to_le32(component->comparison_stamp); + component_tbl->classification =3D cpu_to_le16(component->classification); + component_tbl->identifier =3D cpu_to_le16(component->identifier); + component_tbl->transfer_flag =3D transfer_flag; + component_tbl->version_str_type =3D component->version_type; + component_tbl->version_str_len =3D component->version_len; + memcpy(component_tbl->version_str, component->version_string, + component->version_len); + + cmd.send_component_tbl.opcode =3D PDS_CORE_CMD_SEND_COMPONENT_TBL; + cmd.send_component_tbl.ver =3D 1; + cmd.send_component_tbl.slot_id =3D slot_id; + + err =3D pdsc_devcmd_with_data(pdsc, &cmd, component_tbl, tbl_sz, + &comp, pdsc->devcmd_timeout); + if (err) + dev_err(dev, "Failed sending component table: %pe\n", + ERR_PTR(err)); + kfree(component_tbl); + if (err) + goto free_component_priv; + + if (comp.send_component_tbl.response =3D=3D 1 && + comp.send_component_tbl.response_code =3D=3D + PDS_CORE_COMPONENT_PREREQS_NOT_MET) + skip_component =3D true; + else + pdsc_set_component_name(pdsc, component->identifier, + comp.send_component_tbl.slot_id, + component_priv->component_name); + +add_component_priv: + component_priv->skip =3D skip_component; + component_priv->component_id =3D component->identifier; + list_add(&component_priv->list_entry, &priv->components); + + return 0; + +free_component_priv: + kfree(component_priv); + return err; +} + +int pdsc_get_component_info(struct pdsc *pdsc) +{ + union pds_core_dev_cmd cmd =3D { + .get_component_info.opcode =3D PDS_CORE_CMD_GET_COMPONENT_INFO, + .get_component_info.ver =3D 1, + }; + struct pds_core_component_list_info *list_info; + union pds_core_dev_comp comp =3D {}; + dma_addr_t dma_addr; + u8 num_components; + int err, i; + + list_info =3D kzalloc(PDS_PAGE_SIZE, GFP_KERNEL); + if (!list_info) + return -ENOMEM; + + dma_addr =3D dma_map_single(pdsc->dev, list_info, PDS_PAGE_SIZE, + DMA_FROM_DEVICE); + if (dma_mapping_error(pdsc->dev, dma_addr)) { + dev_err(pdsc->dev, + "Failed to dma_map component_list_info length %d\n", + PDS_PAGE_SIZE); + err =3D -ENOMEM; + goto out; + } + + cmd.get_component_info.data_len =3D cpu_to_le16(PDS_PAGE_SIZE); + cmd.get_component_info.data_pa =3D cpu_to_le64(dma_addr); + + err =3D pdsc_devcmd(pdsc, &cmd, &comp, pdsc->devcmd_timeout * 2); + dma_unmap_single(pdsc->dev, dma_addr, PDS_PAGE_SIZE, DMA_FROM_DEVICE); + if (err) + goto out; + + if (comp.get_component_info.ver =3D=3D 0) { + /* Don't support backward compatibility as version 0 has + * alignment issues, so give a hint to users to update + * their firmware + */ + dev_warn(pdsc->dev, + "Incompatible get_component_info version %u reported by firmware\n", + comp.get_component_info.ver); + err =3D 0; + goto out; + } + + num_components =3D list_info->num_components; + if (num_components > PDS_CORE_FW_COMPONENT_LIST_LEN) { + err =3D -ENOMEM; + goto out; + } + + pdsc->fw_components.num_components =3D num_components; + for (i =3D 0; i < num_components; i++) { + struct pds_core_fw_component_info *info =3D + &pdsc->fw_components.info[i]; + + memcpy(info, &list_info->info[i], sizeof(*info)); + info->version[PDS_CORE_FW_COMPONENT_VER_BUFLEN - 1] =3D 0; + info->name[PDS_CORE_FW_COMPONENT_NAME_BUFLEN - 1] =3D 0; + } + +out: + kfree(list_info); + return err; +} + +static int pdsc_devcmd_send_component(struct pdsc *pdsc, + struct pds_core_flash_component *info, + u16 info_sz, dma_addr_t addr, u32 length, + u32 offset, u16 slot_id, + union pds_core_dev_comp *comp) +{ + union pds_core_dev_cmd cmd =3D { + .send_component.opcode =3D PDS_CORE_CMD_SEND_COMPONENT, + .send_component.ver =3D 1, + .send_component.operation =3D PDS_CORE_SEND_COMPONENT_START, + .send_component.data_pa =3D cpu_to_le64(addr), + .send_component.data_len =3D cpu_to_le32(length), + .send_component.offset =3D cpu_to_le32(offset), + .send_component.slot_id =3D slot_id, + }; + unsigned long timeout =3D 300 * HZ; + unsigned long start_time; + unsigned long end_time; + int err; + + start_time =3D jiffies; + end_time =3D start_time + timeout; + do { + /* prevent noisy/benign devcmd failures */ + err =3D pdsc_devcmd_with_data_nomsg(pdsc, &cmd, info, info_sz, + comp, 60); + if (err !=3D -EAGAIN) + break; + + /* if required, subsequent commands check status of + * PDS_CORE_CMD_SEND_COMPONENT command, which returns + * EAGAIN while the command is still running, + * else we get the final command status. + */ + cmd.send_component.operation =3D PDS_CORE_SEND_COMPONENT_STATUS; + msleep(20); + } while (time_before(jiffies, end_time)); + + if (err =3D=3D -EAGAIN || err =3D=3D -ETIMEDOUT) + dev_err(pdsc->dev, "PDS_CORE_CMD_SEND_COMPONENT timed out\n"); + + return err; +} + +static int pdsc_flash_component(struct pldmfw *context, + struct pldmfw_component *component) +{ + struct pds_core_fwu_priv *priv =3D + container_of(context, struct pds_core_fwu_priv, context); + const char *component_name =3D priv->params->component; + struct pds_core_flash_component *component_info; + struct device *dev =3D context->dev; + struct pdsc *pdsc =3D priv->pdsc; + u16 buf_sz, info_sz; + struct devlink *dl; + u32 total_len; + u32 offset; + u8 slot_id; + int err; + + if (pdsc_skip_component(priv, component->identifier, component_name)) + return 0; + + if (component_name) { + slot_id =3D pdsc_get_slot_id(pdsc, component_name); + if (slot_id =3D=3D PDS_CORE_FW_SLOT_MAX) + return 0; + } else { + u16 id =3D component->identifier; + + component_name =3D pdsc_get_component_priv_name(priv, id); + slot_id =3D PDS_CORE_FW_SLOT_INVALID; + } + + total_len =3D component->component_size; + dev_dbg(dev, + "component name %s class %u id %u act_meth %u ver_str %.*s index %u size= %u\n", + component_name, component->classification, + component->identifier, component->activation_method, + component->version_len, component->version_string, + component->index, component->component_size); + + buf_sz =3D sizeof(pdsc->cmd_regs->data); + info_sz =3D struct_size(component_info, version_str, + component->version_len); + if (info_sz > buf_sz) { + dev_err(dev, "component_info size %d too big, max size: %d\n", + info_sz, buf_sz); + return -ENOSPC; + } + component_info =3D vzalloc(info_sz); + if (!component_info) + return -ENOMEM; + + component_info->comparison_stamp =3D + cpu_to_le32(component->comparison_stamp); + component_info->image_size =3D cpu_to_le32(total_len); + component_info->classification =3D cpu_to_le16(component->classification); + component_info->identifier =3D cpu_to_le16(component->identifier); + component_info->options =3D cpu_to_le16(component->options); + component_info->version_str_type =3D component->version_type; + component_info->version_str_len =3D component->version_len; + memcpy(component_info->version_str, component->version_string, + component->version_len); + + dl =3D priv_to_devlink(pdsc); + + offset =3D 0; + while (offset < total_len) { + union pds_core_dev_comp comp =3D {}; + dma_addr_t dma_addr; + u8 *component_data; + u16 copy_sz; + + copy_sz =3D min_t(unsigned int, PDS_PAGE_SIZE, + total_len - offset); + component_data =3D kmemdup(component->component_data + offset, + copy_sz, GFP_KERNEL); + if (!component_data) { + err =3D -ENOMEM; + goto err_out; + } + + dma_addr =3D dma_map_single(dev, component_data, copy_sz, + DMA_TO_DEVICE); + if (dma_mapping_error(pdsc->dev, dma_addr)) { + dev_err(dev, + "Failed to dma_map component_data at offset 0x%x copy_sz 0x%x\n", + offset, copy_sz); + err =3D -ENOMEM; + kfree(component_data); + goto err_out; + } + + err =3D pdsc_devcmd_send_component(pdsc, component_info, info_sz, + dma_addr, copy_sz, offset, + slot_id, &comp); + dma_unmap_single(dev, dma_addr, copy_sz, DMA_TO_DEVICE); + kfree(component_data); + if (err && err !=3D -EAGAIN && err !=3D -ETIMEDOUT && + comp.send_component.compat_response && + (comp.send_component.compat_response_code =3D=3D + PDS_CORE_COMPONENT_STAMP_IDENTICAL || + comp.send_component.compat_response_code =3D=3D + PDS_CORE_COMPONENT_STAMP_LOWER)) { + err =3D 0; + devlink_flash_update_status_notify(dl, "Skipped", + component_name, + 0, 0); + goto skip_component; + } + + if (err) { + dev_err(dev, + "send_component failed offset 0x%x addr 0x%llx len 0x%x: %pe\n", + offset, dma_addr, copy_sz, ERR_PTR(err)); + goto err_out; + } + + offset +=3D copy_sz; + devlink_flash_update_status_notify(dl, + "Erasing/Flashing", + component_name, offset, + total_len); + } + + vfree(component_info); + return 0; + +err_out: + devlink_flash_update_status_notify(dl, + "Erasing/Flashing Component Failed", + component_name, 0, 0); +skip_component: + vfree(component_info); + return err; +} + +static int pdsc_devcmd_finalize_update(struct pdsc *pdsc) +{ + union pds_core_dev_cmd cmd =3D { + .finalize_update.opcode =3D PDS_CORE_CMD_FINALIZE_UPDATE, + .finalize_update.ver =3D 1, + }; + union pds_core_dev_comp comp =3D {}; + + return pdsc_devcmd(pdsc, &cmd, &comp, pdsc->devcmd_timeout); +} + +static int pdsc_finalize_update(struct pldmfw *context) +{ + struct pds_core_fwu_priv *priv =3D + container_of(context, struct pds_core_fwu_priv, context); + const char *component_name =3D priv->params->component; + unsigned long start_time, end_time; + struct device *dev =3D context->dev; + struct pdsc *pdsc =3D priv->pdsc; + struct devlink *dl; + int err; + + dl =3D priv_to_devlink(pdsc); + + start_time =3D jiffies; + end_time =3D start_time + (PDSC_FW_INSTALL_TIMEOUT * HZ); + do { + err =3D pdsc_devcmd_finalize_update(pdsc); + if (!err || err !=3D -EAGAIN) + break; + + dev_dbg(dev, "retrying finalize_update: %pe\n", ERR_PTR(err)); + msleep(20); + } while (time_before(jiffies, end_time) && err =3D=3D -EAGAIN); + + if (err) { + devlink_flash_update_status_notify(dl, "Finalize Update Failed", + component_name, 0, 0); + dev_err(dev, "finalize_update failed: %pe\n", ERR_PTR(err)); + return err; + } + + devlink_flash_update_status_notify(dl, "Finalized Update", + component_name, 0, 0); + return 0; +} + +static const struct pldmfw_ops pdsc_pldmfw_ops =3D { + .match_record =3D pdsc_match_record_descs, + .send_package_data =3D pdsc_send_package_data, + .send_component_table =3D pdsc_send_component_table, + .flash_component =3D pdsc_flash_component, + .finalize_update =3D pdsc_finalize_update +}; + +static int pdsc_pldm_firmware_update(struct pdsc *pdsc, + struct devlink_flash_update_params *params, + struct netlink_ext_ack *extack, + const struct firmware *fw) +{ + struct pds_core_fwu_priv priv =3D {}; + int err; + + if (!pdsc->fw_components.num_components) { + err =3D pdsc_get_component_info(pdsc); + if (err) { + dev_err(pdsc->dev, + "Failed to get component info: %pe\n", + ERR_PTR(err)); + return err; + } + } + + INIT_LIST_HEAD(&priv.components); + priv.context.ops =3D &pdsc_pldmfw_ops; + priv.context.dev =3D pdsc->dev; + priv.params =3D params; + priv.pdsc =3D pdsc; + + err =3D pldmfw_flash_image(&priv.context, fw); + pdsc_free_fwu_priv(&priv); + + /* Invalidate cached component info so next info_get refreshes */ + pdsc->fw_components.num_components =3D 0; + + return err; +} + +int pdsc_firmware_update(struct pdsc *pdsc, + struct devlink_flash_update_params *params, + struct netlink_ext_ack *extack) +{ + if (pdsc->dev_ident.version >=3D PDS_CORE_IDENTITY_VERSION_2 && + pdsc->dev_ident.capabilities & + cpu_to_le64(PDS_CORE_DEV_CAP_PLDM_FW_UPDATE)) + return pdsc_pldm_firmware_update(pdsc, params, extack, + params->fw); + + return pdsc_legacy_firmware_update(pdsc, params->fw, extack); +} diff --git a/include/linux/pds/pds_core_if.h b/include/linux/pds/pds_core_i= f.h index 619186f26b5b..d15ddd1c8ef1 100644 --- a/include/linux/pds/pds_core_if.h +++ b/include/linux/pds/pds_core_if.h @@ -40,6 +40,13 @@ enum pds_core_cmd_opcode { PDS_CORE_CMD_FW_DOWNLOAD =3D 4, PDS_CORE_CMD_FW_CONTROL =3D 5, =20 + PDS_CORE_CMD_GET_COMPONENT_INFO =3D 6, + PDS_CORE_CMD_SEND_PKG_DATA =3D 7, + PDS_CORE_CMD_SEND_COMPONENT_TBL =3D 8, + PDS_CORE_CMD_SEND_COMPONENT =3D 9, + PDS_CORE_CMD_FINALIZE_UPDATE =3D 10, + PDS_CORE_CMD_MATCH_RECORD_DESC =3D 11, + /* SR/IOV commands */ PDS_CORE_CMD_VF_GETATTR =3D 60, PDS_CORE_CMD_VF_SETATTR =3D 61, @@ -100,6 +107,14 @@ struct pds_core_drv_identity { char driver_ver_str[32]; }; =20 +/** + * enum pds_core_dev_capability - Device capabilities + * @PDS_CORE_DEV_CAP_PLDM_FW_UPDATE: Device only supports FW update via PL= DM + */ +enum pds_core_dev_capability { + PDS_CORE_DEV_CAP_PLDM_FW_UPDATE =3D BIT(0), +}; + #define PDS_DEV_TYPE_MAX 16 /** * struct pds_core_dev_identity - Device identity information @@ -119,6 +134,8 @@ struct pds_core_drv_identity { * value in usecs to device units using: * device units =3D usecs * mult / div * @vif_types: How many of each VIF device type is supported + * @max_fw_slots: Maximum number of fw slots/components + * only supported on version >=3D PDS_CORE_IDENTITY_VERSION_2 * @capabilities: Device capabilities * only supported on version >=3D PDS_CORE_IDENTITY_VERSION_2 */ @@ -133,6 +150,7 @@ struct pds_core_dev_identity { __le32 intr_coal_mult; __le32 intr_coal_div; __le16 vif_types[PDS_DEV_TYPE_MAX]; + __le16 max_fw_slots; __le64 capabilities; }; =20 @@ -284,6 +302,7 @@ enum pds_core_fw_slot { PDS_CORE_FW_SLOT_A =3D 1, PDS_CORE_FW_SLOT_B =3D 2, PDS_CORE_FW_SLOT_GOLD =3D 3, + PDS_CORE_FW_SLOT_MAX =3D 0xff, }; =20 /** @@ -450,6 +469,346 @@ struct pds_core_vf_ctrl_comp { u8 status; }; =20 +/** + * struct pds_core_send_pkg_data_cmd - Send package data command + * @opcode: Opcode PDS_CORE_CMD_SEND_PKG_DATA + * @ver: Driver's max support version of this command + * @total_len: Total length of the package data + * @offset: Offset in the package data, non-zero if multiple commands are + * needed for sending the package data + * @data_len: Length of data stored at data_pa + * @data_pa: Data physical address for DMA to device + * + * The package data may be too large to store in a single buffer, so multi= ple + * PDS_CORE_CMD_SEND_PKG_DATA devcmds may be needed. + */ +struct pds_core_send_pkg_data_cmd { + u8 opcode; + u8 ver; + __le16 total_len; + __le16 offset; + __le16 data_len; + __le64 data_pa; +}; + +/** + * struct pds_core_send_pkg_data_comp - Send package data completion + * @status: Status of the command (enum pds_core_status_code) + * @ver: Device's max supported version of this command + * @rsvd: Word boundary padding + */ +struct pds_core_send_pkg_data_comp { + u8 status; + u8 ver; + u8 rsvd[2]; +}; + +/** + * struct pds_core_component_tbl - Component table details + * @comparison_stamp: Comparison stamp used for component version checks + * @classification: Vendor specific classification info + * @identifier: Component's ID + * @transfer_flag: Part of the component table this request represents + * @version_str_type: The types of strings used + * @version_str_len: Length of @version_str + * @version_str: Component version information + */ +struct pds_core_component_tbl { + __le32 comparison_stamp; + __le16 classification; + __le16 identifier; + u8 transfer_flag; + u8 version_str_type; + u8 version_str_len; + u8 version_str[]; +}; + +/** + * struct pds_core_send_component_tbl_cmd - Send component table command + * @opcode: Opcode PDS_CORE_CMD_SEND_COMPONENT_TBL + * @ver: Driver's max support version of this command + * @slot_id: enum pds_core_fw_slot + * @rsvd: Word boundary padding + * + * Expects to find component table info (struct pds_core_component_tbl) + * in cmd_regs->data. Driver should keep the devcmd interface locked + * while preparing the component table info. + */ +struct pds_core_send_component_tbl_cmd { + u8 opcode; + u8 ver; + u8 slot_id; + u8 rsvd; +}; + +enum pds_core_component_resp_code { + PDS_CORE_COMPONENT_VALID =3D 0x0, + PDS_CORE_COMPONENT_STAMP_IDENTICAL =3D 0x1, + PDS_CORE_COMPONENT_STAMP_LOWER =3D 0x2, + PDS_CORE_COMPONENT_STAMP_OR_VERSION_INVALID =3D 0x3, + PDS_CORE_COMPONENT_CONFLICT =3D 0x4, + PDS_CORE_COMPONENT_PREREQS_NOT_MET =3D 0x5, + PDS_CORE_COMPONENT_NOT_SUPPORTED =3D 0x6, + PDS_CORE_COMPONENT_FW_TYPE_INVALID =3D 0xd0, +}; + +/** + * struct pds_core_send_component_tbl_comp - Send component table completi= on + * @status: Status of the command (enum pds_core_status_code) + * @ver: Device's max supported version of this command + * @completion_code: Component completion code + * @response: Component response + * @response_code: Component response code + * @slot_id: Actual slot_id of the component (enum pds_core_fw_slot) + * + * When alternate firmware is requested via PDS_CORE_FW_SLOT_INVALID, the + * completion's slot_id will match the actual slot_id that will be flashed + * on success. When specific components are flashed, then the completion's + * slot_id will match the command's slot_id. + * + * On failure the slot_id will be set to PDS_CORE_FW_SLOT_MAX. + * On success the slot_id will be PDS_CORE_FW_SLOT_A, PDS_CORE_FW_SLOT_B, = or + * PDS_CORE_FW_SLOT_GOLD. + * + * @rsvd: Word boundary padding + */ +struct pds_core_send_component_tbl_comp { + u8 status; + u8 ver; + u8 completion_code; + u8 response; + u8 response_code; + u8 slot_id; + u8 rsvd[2]; +}; + +/** + * enum pds_core_send_component_op - PDS_CORE_CMD_SEND_COMPONENT operation + * @PDS_CORE_SEND_COMPONENT_START: Initial operation to start transfer + * @PDS_CORE_SEND_COMPONENT_STATUS: Subsequent calls to check on status + * PDS_CORE_CMD_SEND_COMPONENT + */ +enum pds_core_send_component_op { + PDS_CORE_SEND_COMPONENT_START =3D 0, + PDS_CORE_SEND_COMPONENT_STATUS =3D 1, +}; + +#define PDS_CORE_FW_COMPONENT_ID_INVALID 0xFFFF +/** + * struct pds_core_flash_component - Component details + * @comparison_stamp: Comparison stamp used for component version checks + * @image_size: Component image size + * @classification: Vendor specific classification info + * @identifier: Component's ID + * @options: Component options + * @rsvd: Word boundary padding + * @version_str_type: The types of strings used + * @version_str_len: Length of @version_str + * @version_str: Component version information + */ +struct pds_core_flash_component { + __le32 comparison_stamp; + __le32 image_size; + __le16 classification; + __le16 identifier; + __le16 options; + u8 rsvd[3]; + u8 version_str_type; + u8 version_str_len; + u8 version_str[]; +}; + +/** + * struct pds_core_send_component_cmd - Send component command + * @opcode: Opcode PDS_CORE_CMD_SEND_COMPONENT + * @ver: Driver's max supported version of this command + * @slot_id: enum pds_core_fw_slot + * @operation: enum pds_core_send_component_op + * @offset: Offset into the component, non-zero if multiple commands + * are needed for a single component + * @data_len: Length of this part of the component stored at @data_pa + * @rsvd: Word boundary padding + * @data_pa: DMA address of the component + * + * A component may be too large to store in a single buffer, so multiple + * PDS_CORE_CMD_SEND_COMPONENT devcmds may be needed. + * + * Expects to find flash component info (struct pds_core_flash_component) + * in cmd_regs->data. Driver should keep the devcmd interface locked + * while preparing and sending the flash component info. + */ +struct pds_core_send_component_cmd { + u8 opcode; + u8 ver; + u8 slot_id; + u8 operation; + __le32 offset; + __le32 data_len; + u8 rsvd[4]; + __le64 data_pa; +}; + +/** + * struct pds_core_send_component_comp - Send component completion + * @status: Status of the command (enum pds_core_status_code) + * @ver: Device's max supported version of this command + * @completion_code: Completion code + * @compat_response: Compatibility response (0 =3D Component can be update= d) + * @compat_response_code: Compatibility response code + * @rsvd: Word boundary padding + */ +struct pds_core_send_component_comp { + u8 status; + u8 ver; + u8 completion_code; + u8 compat_response; + u8 compat_response_code; + u8 rsvd[3]; +}; + +/** + * enum pds_core_component_info_flags - Component info flags + * @PDS_CORE_FW_COMPONENT_INFO_F_RUNNING: Component is currently running + * @PDS_CORE_FW_COMPONENT_INFO_F_STARTUP: Component version on next FW boot + * @PDS_CORE_FW_COMPONENT_INFO_F_FIXED: Component is fixed and cannot be u= pdated + * @PDS_CORE_FW_COMPONENT_INFO_F_UPDATE_BY_NAME: Component can be updated + * by name + */ +enum pds_core_component_info_flags { + PDS_CORE_FW_COMPONENT_INFO_F_RUNNING =3D BIT(0), + PDS_CORE_FW_COMPONENT_INFO_F_STARTUP =3D BIT(1), + PDS_CORE_FW_COMPONENT_INFO_F_FIXED =3D BIT(2), + PDS_CORE_FW_COMPONENT_INFO_F_UPDATE_BY_NAME =3D BIT(3), +}; + +/** + * struct pds_core_fw_component_info - GET_COMPONENT_INFO entry + * @name: Component's name + * @rsvd: Word boundary padding + * @flags: enum pds_core_component_info_flags + * @identifier: Component's identifier + * @slot_id: Component's slot identifier + * @version: Component's version + */ +struct pds_core_fw_component_info { +#define PDS_CORE_FW_COMPONENT_NAME_BUFLEN 24 + char name[PDS_CORE_FW_COMPONENT_NAME_BUFLEN]; + u8 rsvd[4]; + __le16 flags; + u8 identifier; + u8 slot_id; +#define PDS_CORE_FW_COMPONENT_VER_BUFLEN 32 + char version[PDS_CORE_FW_COMPONENT_VER_BUFLEN]; +}; + +#define PDS_CORE_FW_COMPONENT_LIST_LEN ((PDS_PAGE_SIZE - 8) / \ + sizeof(struct pds_core_fw_component_info)) + +/** + * struct pds_core_component_list_info - GET_COMPONENT_INFO completion data + * @num_components: Number of valid components + * @rsvd: Word boundary padding + * @info: List of valid components + */ +struct pds_core_component_list_info { + u8 num_components; + u8 rsvd[7]; + struct pds_core_fw_component_info info[PDS_CORE_FW_COMPONENT_LIST_LEN]; +}; + +/** + * struct pds_core_get_component_info_cmd - GET_COMPONENT_INFO command + * @opcode: PDS_CORE_CMD_GET_COMPONENT_INFO + * @ver: Driver's max supported version of this command + * @data_len: Length of data at data_pa + * @rsvd: Word boundary padding + * @data_pa: DMA address of data + * + * FW populates struct pds_core_component_list_info pointed to by @data_pa + */ +struct pds_core_get_component_info_cmd { + u8 opcode; + u8 ver; + __le16 data_len; + u8 rsvd[4]; + __le64 data_pa; +}; + +/** + * struct pds_core_get_component_info_comp - GET_COMPONENT_INFO completion + * @status: enum pds_core_status_code + * @ver: Device's max supported version of this command + * @rsvd: Word boundary padding + */ +struct pds_core_get_component_info_comp { + u8 status; + u8 ver; + u8 rsvd[2]; +}; + +/** + * struct pds_core_finalize_update_cmd - FINALIZE_UPDATE command + * @opcode: PDS_CORE_CMD_FINALIZE_UPDATE + * @ver: Driver's max support version of this command + * @rsvd: Word boundary padding + * + * Driver sends at the end of updating all components to finalize the upda= te + */ +struct pds_core_finalize_update_cmd { + u8 opcode; + u8 ver; + u8 rsvd[2]; +}; + +/** + * struct pds_core_finalize_update_comp - FINALIZE_UPDATE completion + * @status: enum pds_core_status_code + * @ver: Device's max supported version of this command + * @rsvd: Word boundary padding + */ +struct pds_core_finalize_update_comp { + u8 status; + u8 ver; + u8 rsvd[2]; +}; + +/** + * struct pds_core_match_record_desc_cmd - MATCH_RECORD_DESC command + * @opcode: PDS_CORE_CMD_MATCH_RECORD_DESC + * @ver: Driver's max supported version of this command + * @type: PLDM Descriptor Identifier Type + * @size: Length of the Descriptor Identifier Value + * @rsvd: Word boundary padding + * + * Expects to find the Descriptor Identifier Data in cmd_regs->data. Driver + * should keep the devcmd interface locked while preparing and sending this + * command. + */ +struct pds_core_match_record_desc_cmd { + u8 opcode; + u8 ver; + __le16 type; + __le16 size; + u8 rsvd[2]; +}; + +/** + * struct pds_core_match_record_desc_comp - MATCH_RECORD_DESC completion + * @status: enum pds_core_status_code + * @ver: Device's max supported version of this command + * @match: Whether or not the Record Descriptor matches the device + * @rsvd: Word boundary padding + * + * When status is PDS_RC_SUCCESS, then @match is valid, otherwise it's + * undefined. + */ +struct pds_core_match_record_desc_comp { + u8 status; + u8 ver; + u8 match; + u8 rsvd; +}; + /* * union pds_core_dev_cmd - Overlay of core device command structures */ @@ -466,6 +825,13 @@ union pds_core_dev_cmd { struct pds_core_vf_setattr_cmd vf_setattr; struct pds_core_vf_getattr_cmd vf_getattr; struct pds_core_vf_ctrl_cmd vf_ctrl; + + struct pds_core_get_component_info_cmd get_component_info; + struct pds_core_send_pkg_data_cmd send_pkg_data; + struct pds_core_send_component_tbl_cmd send_component_tbl; + struct pds_core_send_component_cmd send_component; + struct pds_core_finalize_update_cmd finalize_update; + struct pds_core_match_record_desc_cmd match_record_desc; }; =20 /* @@ -484,6 +850,13 @@ union pds_core_dev_comp { struct pds_core_vf_setattr_comp vf_setattr; struct pds_core_vf_getattr_comp vf_getattr; struct pds_core_vf_ctrl_comp vf_ctrl; + + struct pds_core_get_component_info_comp get_component_info; + struct pds_core_send_pkg_data_comp send_pkg_data; + struct pds_core_send_component_tbl_comp send_component_tbl; + struct pds_core_send_component_comp send_component; + struct pds_core_finalize_update_comp finalize_update; + struct pds_core_match_record_desc_comp match_record_desc; }; =20 /** --=20 2.43.0 From nobody Mon May 25 07:35:45 2026 Received: from CY7PR03CU001.outbound.protection.outlook.com (mail-westcentralusazon11010030.outbound.protection.outlook.com [40.93.198.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 C025025B087; Sat, 16 May 2026 02:44:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.198.30 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778899466; cv=fail; b=IJNM04feVFZHNHTw16yOeaAJK91jvBiNKuFICefaKQQKSgFvRQgiOMeRpVIMdBcNGwKx1V+9l92IRt75zv5/KEdE6XGt9MzqGNVdeOIEC9xf7vQdqUQPEk2EJjkeMfE2+oPcfzHTNgBKjrBn2w09Ya8+iOpXju9JYDjdzgTmpTc= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778899466; c=relaxed/simple; bh=m8yARpr220UPTklXFkOB3JiSX//yTssgVV+v/MkVxXE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=rdU5atW+ldNwfZMgus01qNuK43cIe0fn/NahqJjBAMRRMeOKHo2u7kkK6hnoHpJRvV61R+OhU/X2AoE61nLdpTnSZbr0Fmiw2m541Zvp74vqiaQiQE8jdwUyvFDDegxFJSAwrsL02+N8WPG5w8pjVvCO8Xmlox7+e/zBJH8kOkg= 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=fS+l+4gj; arc=fail smtp.client-ip=40.93.198.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="fS+l+4gj" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=EOBXwOSvRJachRKh1QSmy59rPTIASTqoScPwPGr9TP+n0E4OqrD+2w3Jxq1D6qWQH5KrJgQOBYl3DQsNnTjekrdIueDCujO+zU2N3ZGQp22fplPa/trH+6joREplvsrIUwT+Q+zdWzbC+FuGpNjrksK97jU6MMJlQF88QyUw3HaY9UH8+H4IINy0XzdHrv7T4MpvRxBvmJUngIjO/IGiumQEes5TXQVRnrDnBkwe5BGzrv6oHMtAyKyqDzD9L0+FhC98d+iI4V8dBo00I+8JYUkneUt5WZkIO4kVAjmBXc/IQRowQapBx5VVGIrB25Xmnxx2ptZ16FU8nS0WYGyNhw== 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=ixbu52fe5Bc+2VPDdboXn7L11/N6YPzWXlqWfGR5tQw=; b=C5qsFlw/bKtdxZkw3wuJ+YWa8OGX/gnS6rSqJlTbzWr6TjvtifZ0vSojN4useDCSFbJkdI+m7/5EDyxmEDe8XegzMZja8slVDK+fHVCdF9gBeLNWWiCLcR0tKwmxZ+JtXbx+LMKhFBvCXfv99AEfh05yFFms+BIqkXi4T7MK0q1HK4rKKn552gdPRlL8Fr5EO4idfu3ATDHhBDQMCBAN8UWAlbr5p74YQ2MuKzjW2Kv3uZ7v4uid+HMlVFWvyZroEGqclgB7FE7jGbq9MdCwjmlyZKlptQnrnBP+Tza4aXiSc+rVGTwHFHdm36+nZ4cS+LdXt0fhQC8GUvNeT+5NJg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.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=ixbu52fe5Bc+2VPDdboXn7L11/N6YPzWXlqWfGR5tQw=; b=fS+l+4gjqNl+d8OCNOliMrvkFDqL5xrHuhA/oRsWEkfBEAtuGabDufDeZrs0yFDFQntwivezBYvcrnI4E34Ar/7J2J2lE4Qbr0xfnXDci/Y0L1tOMDM4lLPxEbfMA2FTtI3QnObXkrk2xpAqiJJj/xNulYodvBBqnSQfxjPLBZ0= Received: from BN9PR03CA0231.namprd03.prod.outlook.com (2603:10b6:408:f8::26) by CH2PR12MB4231.namprd12.prod.outlook.com (2603:10b6:610:7d::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9913.12; Sat, 16 May 2026 02:44:16 +0000 Received: from BN1PEPF0000468A.namprd05.prod.outlook.com (2603:10b6:408:f8:cafe::77) by BN9PR03CA0231.outlook.office365.com (2603:10b6:408:f8::26) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9913.14 via Frontend Transport; Sat, 16 May 2026 02:44: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 BN1PEPF0000468A.mail.protection.outlook.com (10.167.243.135) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.25.13 via Frontend Transport; Sat, 16 May 2026 02:44:16 +0000 Received: from [127.0.1.1] (10.180.168.240) 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.41; Fri, 15 May 2026 21:44:14 -0500 From: "Nikhil P. Rao" Date: Sat, 16 May 2026 02:42:38 +0000 Subject: [PATCH net-next v2 4/6] pds_core: add PLDM component info display Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-ID: <20260516-upstream_v2_clean-v2-4-7e0d66bf4020@amd.com> References: <20260516-upstream_v2_clean-v2-0-7e0d66bf4020@amd.com> In-Reply-To: <20260516-upstream_v2_clean-v2-0-7e0d66bf4020@amd.com> To: Brett Creeley , Andrew Lunn , "David S. Miller" , "Eric Dumazet" , Jakub Kicinski , Paolo Abeni CC: , , Eric Joyner , "Nikhil P. Rao" X-Mailer: b4 0.15.2 X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN1PEPF0000468A:EE_|CH2PR12MB4231:EE_ X-MS-Office365-Filtering-Correlation-Id: f93720e3-3823-46f8-4651-08deb2f5058d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|1800799024|36860700016|376014|11063799003|56012099003|22082099003|18002099003|3023799003; X-Microsoft-Antispam-Message-Info: pimmGyrhqL1V9QaPG4UTTh8beM5WELyvLtqJrqJdu4tSt19zQBjxo9UdXDjj3VMdxGYkhh+5asIHgCJ+qepANP0N3y48Rko7jxV14ssuc2aZMoxvayLh4zmGoGQ33qxngS2ZIJUT4bxG1cFunBCpFYUCvhgjjpxeCl5Zzjn2SImfox4N4JsncAmbd9Kgo6tFuAis4p9L/BNkGErh82bFD5Pa20VmmOnaEJ5CH8+vxIU+8iRXgm/ooOAjd/ho+21fXbg8MQzc4/qbSOcqBXQf5oxL54ulb3BndHeD01n9HK0fc6+1nPODiZvp4hiRU/bwafm0OxjB961Ue3GktzweV7fdaGPnIGKjpnxOVL0X6KZZ4ktuNJaTdbYsBCNAJKQDlZMlflLVlrxlhYSnqUyAlt0Hyc7UuzuGgEU7GKjgZ3qnonpggkdZLpCUvKs0PsMF3ZUv9B0hEp7zLtS6miLiLwI0eaxio7rEhsF/Ku8kJC2k9TbG1AATKIIsFoA2aNPEOGLXMJlJXNUPR5LMR17725g67yZao0WjrnFQBxgijJAN1rySwiyyYzl1b50zbVKP1hVCqIK9IReCSBon9DvJ6uF/wElzmgU1jCHKPeIq/22NdxM6SAFXP4k8Xjaj91UtZMGnbnjUkUE2Rda7SPpyYY9YB2ftN2HL+h0bK53lCQ7aQXhXU4qg36w5TQLgDEfGPTrfyxoj1dUdCr2cX+3NgVK/bz17agEBdspxeHGCfgI= 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)(11063799003)(56012099003)(22082099003)(18002099003)(3023799003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: ZvKftYMg+A874HUZUGNRog8+uMYgBbnFxcxkMqGMZ5i4/GGX4V17FylUHIieGSSCefmoZqNizae/s4HB1UzoYAU0YpVsXLLdroeHWSCPPI9POEAx5NOk0I8jxmveqWGiLsbQfwH2HYtI5CsBQ8BHpToUKJoOaRmQQGetHHKqiqbOaYqaPZTbIL2JAOXFtmP0wJ72ytQorhxKBuc/hyZMliigWPYOEOuO8uYWYxtNXeY0A1h5LlxFeEfVqIDB/CIFNzzId65Io5hPzyzMp6SKdXmJ+Mg+e9cluvQdC/SqvjChzGkxuIMI5WrT2BfPua2V5k8kTbUdTgvQ9hEFeDiOKnAiRCYbfTNE2iwDAAoZjrKyL13MVm5VBF9lSeWICscW1v2N20zurEbgGTXvOPPh+ESWbP5rQ8f4q4wAaAv2NQj/V7SF4j7emBYRHjOSt9qE X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 May 2026 02:44:16.2635 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: f93720e3-3823-46f8-4651-08deb2f5058d 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: BN1PEPF0000468A.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH2PR12MB4231 From: Brett Creeley Add detailed component information display. This allows users to see individual firmware components, their versions, and update status via devlink info. Components are marked as fixed, running, or stored based on their flags. Example output: $ devlink dev info pci/0000:b5:00.0 ... versions: running: fw.goldfw 1.2.3 fw.mainfwa 1.2.4 fw.mainfwb 1.2.3 Signed-off-by: Brett Creeley --- drivers/net/ethernet/amd/pds_core/devlink.c | 88 +++++++++++++++++++++++++= +++- 1 file changed, 86 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/amd/pds_core/devlink.c b/drivers/net/ethe= rnet/amd/pds_core/devlink.c index 7f44e1a8d4fd..95c3d2531ef1 100644 --- a/drivers/net/ethernet/amd/pds_core/devlink.c +++ b/drivers/net/ethernet/amd/pds_core/devlink.c @@ -93,14 +93,78 @@ int pdsc_dl_flash_update(struct devlink *dl, return pdsc_firmware_update(pdsc, params, extack); } =20 +static int pdsc_dl_report_component(struct devlink_info_req *req, + struct pds_core_fw_component_info *info) +{ + enum devlink_info_version_type ver_type; + u16 flags =3D le16_to_cpu(info->flags); + char *ver =3D info->version; + char buf[32]; + + ver_type =3D DEVLINK_INFO_VERSION_TYPE_NONE; + snprintf(buf, sizeof(buf), "fw.%s", info->name); + if (flags & PDS_CORE_FW_COMPONENT_INFO_F_UPDATE_BY_NAME) + ver_type =3D DEVLINK_INFO_VERSION_TYPE_COMPONENT; + + if (flags & PDS_CORE_FW_COMPONENT_INFO_F_FIXED) + return devlink_info_version_fixed_put(req, buf, ver); + + if (flags & PDS_CORE_FW_COMPONENT_INFO_F_RUNNING) { + int err; + + err =3D devlink_info_version_running_put_ext(req, buf, + ver, ver_type); + if (err) + return err; + } + + if (flags & PDS_CORE_FW_COMPONENT_INFO_F_STARTUP) + return devlink_info_version_stored_put_ext(req, buf, + ver, ver_type); + + return 0; +} + +static int pdsc_dl_component_info_get(struct devlink *dl, + struct devlink_info_req *req, + struct netlink_ext_ack *extack) +{ + struct pds_core_component_list_info *list_info; + struct pdsc *pdsc =3D devlink_priv(dl); + u8 num_components; + int err; + int i; + + if (!pdsc->fw_components.num_components) { + err =3D pdsc_get_component_info(pdsc); + if (err) { + dev_err(pdsc->dev, "Failed to get component_info %pe\n", + ERR_PTR(err)); + return err; + } + } + + list_info =3D &pdsc->fw_components; + num_components =3D min_t(u8, list_info->num_components, + le16_to_cpu(pdsc->dev_ident.max_fw_slots)); + for (i =3D 0; i < num_components; i++) { + err =3D pdsc_dl_report_component(req, &list_info->info[i]); + if (err) + return err; + } + + return 0; +} + static char *fw_slotnames[] =3D { "fw.goldfw", "fw.mainfwa", "fw.mainfwb", }; =20 -int pdsc_dl_info_get(struct devlink *dl, struct devlink_info_req *req, - struct netlink_ext_ack *extack) +static int pdsc_dl_fw_list_info_get(struct devlink *dl, + struct devlink_info_req *req, + struct netlink_ext_ack *extack) { union pds_core_dev_cmd cmd =3D { .fw_control.opcode =3D PDS_CORE_CMD_FW_CONTROL, @@ -132,6 +196,26 @@ int pdsc_dl_info_get(struct devlink *dl, struct devlin= k_info_req *req, return err; } =20 + return 0; +} + +int pdsc_dl_info_get(struct devlink *dl, struct devlink_info_req *req, + struct netlink_ext_ack *extack) +{ + struct pdsc *pdsc =3D devlink_priv(dl); + char buf[32]; + int err; + + if (pdsc->dev_ident.version >=3D PDS_CORE_IDENTITY_VERSION_2) + err =3D pdsc_dl_component_info_get(dl, req, extack); + else + err =3D pdsc_dl_fw_list_info_get(dl, req, extack); + if (err) { + dev_err(pdsc->dev, "Failed to get devlink info for identity version %u: = %pe\n", + pdsc->dev_ident.version, ERR_PTR(err)); + return err; + } + err =3D devlink_info_version_running_put(req, DEVLINK_INFO_VERSION_GENERIC_FW, pdsc->dev_info.fw_version); --=20 2.43.0 From nobody Mon May 25 07:35:45 2026 Received: from CO1PR03CU002.outbound.protection.outlook.com (mail-westus2azon11010039.outbound.protection.outlook.com [52.101.46.39]) (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 B5B9B259C9C; Sat, 16 May 2026 02:44:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.46.39 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778899466; cv=fail; b=Xmv1Ay4tqDQj7xxaObufa5penuC2EzwJnzOIjn7kcdrFPOkZDlD5gijIeA1vALPfkowebSPmRmsVhTSEXvX28KZgTckJwdemr6dcbEubncWV3tyiSQhHt+sMJ8v69qLPKyxJCX42IntpJXVKQnmDBqfJmVHJPzzuv3AUeOi9kio= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778899466; c=relaxed/simple; bh=h5wZemUnZ4EKLEPx5yroNfEYleWRB5GMzKFyrv6M8HI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=FuAJS00pZUEvbWvgj4QFsvtbiWkO+KAOHLHATghK9r0vsbXleYuK1jp0n0hx85wfQG3glEjN6zt6BXKRzYtqIQ44PWBg/7hwM8v7iqPKOJKoZjrZIIxq8S7yJ+fdCwpiEuFuahBsqQurhyNkZNnanjEOrww4bnNCUHbZLMT5s0s= 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=Q6ksVsI6; arc=fail smtp.client-ip=52.101.46.39 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="Q6ksVsI6" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=QjmC/r1ynNT7Pha/OAalunJMOuiZSCoS/MDOABCdoTr2PVQpkmwIPeDpPwVIQoanrV3O/dPKj227B45C/SHcj0ahAdoYb95siPWEVpmVewRhMTBMUwEKjyIQkFoP9HSbcHeIYCP4jrIPZC7oS4mxnAoBrqbkddJv2urtcyerIhD5dUv3sHTxYTmSKrUcjNIR2aUBhLJWeJgy7kjCjwuX2u1zditcTTAoaQVxhmrXi0yC9MbO7hI1D181DdL8T/dzOmUF1KCMLIkTmsz7c1qxuIi5JX4eG8/2y2n+yHcO8us2gOOCkgNb+/kJfQ8EKBSb9DE5Wcn8CK5L/fR2LK40GA== 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=tvX03U3rJodslScLHaMHGkVEebVkiZ050QHt5Gjn5lU=; b=HPpfZM9A185vPh8aonkHQjW69ju1KisQfKWqoXVUf9Z60FGUPaiWzSJA3t7C/3GJsvGMjs9cV6TXG1j0M2Rx5c1m9LgxGSy27hN/tT4RwLnZDp7VQfhHv0UQen0+xBdRLxxZO98ttB8XOiAm1oUBXzeRQSI03BVV/R21nuhWy1klM1UB7OoZT2EXxir4MeZ+0Wi34yUMrQ0o7A5LFjkPvAfwK7cafxeGLD3XpteNbF1aOxjh/YMAaNJWvyURxWx3oC3OtELe9zS1j5aY2Qk58j1R6TmrI8sCuXxNFqE0HTnTETRCNSf3slzvoGZz99shOh5VGZg0QvkdHMrd2B9lsg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.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=tvX03U3rJodslScLHaMHGkVEebVkiZ050QHt5Gjn5lU=; b=Q6ksVsI6iBmIR3uzap2EfzzNjQrtIWDVREnKt3LWGF9yFvG5B09LAm7yD9upllOXwZTtSBDHmvUimlXdLYDgVO3tLIrQpcSbEVHRVMDxjKGZDnt+Utz/3fgXyeTEjhdG4ahqHZGN7iUluMtR0dCwk1swuFwVz0XJdWqKdv+Cv3w= Received: from BN9PR03CA0214.namprd03.prod.outlook.com (2603:10b6:408:f8::9) by PH7PR12MB5997.namprd12.prod.outlook.com (2603:10b6:510:1d9::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.25.19; Sat, 16 May 2026 02:44:17 +0000 Received: from BN1PEPF0000468A.namprd05.prod.outlook.com (2603:10b6:408:f8:cafe::f5) by BN9PR03CA0214.outlook.office365.com (2603:10b6:408:f8::9) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9913.14 via Frontend Transport; Sat, 16 May 2026 02:44: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 BN1PEPF0000468A.mail.protection.outlook.com (10.167.243.135) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.25.13 via Frontend Transport; Sat, 16 May 2026 02:44:16 +0000 Received: from [127.0.1.1] (10.180.168.240) 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.41; Fri, 15 May 2026 21:44:15 -0500 From: "Nikhil P. Rao" Date: Sat, 16 May 2026 02:42:39 +0000 Subject: [PATCH net-next v2 5/6] pds_core: add host backed memory support for firmware Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-ID: <20260516-upstream_v2_clean-v2-5-7e0d66bf4020@amd.com> References: <20260516-upstream_v2_clean-v2-0-7e0d66bf4020@amd.com> In-Reply-To: <20260516-upstream_v2_clean-v2-0-7e0d66bf4020@amd.com> To: Brett Creeley , Andrew Lunn , "David S. Miller" , "Eric Dumazet" , Jakub Kicinski , Paolo Abeni CC: , , Eric Joyner , "Nikhil P. Rao" , Vamsi Atluri X-Mailer: b4 0.15.2 X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN1PEPF0000468A:EE_|PH7PR12MB5997:EE_ X-MS-Office365-Filtering-Correlation-Id: 4140f6f9-91fc-4895-b6dd-08deb2f505d7 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700016|376014|1800799024|82310400026|22082099003|56012099003|3023799003|18002099003|11063799003; X-Microsoft-Antispam-Message-Info: uOBmRSGBtO0LTbIxiDhV0A8sYUrs3bnWFsAPPsGzYVQugZP64l4bfznmqdBhg27OQokRpLYduKn924yCXl1Sn+yP7MVseLIwS4snO1bTgue4v9yE0B1pVJ9g5XRsmaI3tfnTr7utxLgOxyoOwoprUOXV8xPncaTDUawOhyj2SlYUae21UCT3vN82Ybfw28SyKRhsvVTq/Wu5Yo796itmkQuInopuKqcJx6hM4QFksGbzpK9GN7cFal0BxNupztwY2o2PfnjKcCxaGV6yMknNh8dEwwYKnKHp69E1L1zUN9AWYKDG2D6o3tcuOpb9BZds1n9tWQ3SeRHMgE9YGnIzc2rLxepZBZQx51mzim1Ln+lwtWN1yvDVhHUbVxgig/Btrf1dvGycyygEWmf297GiVtK7pD2lkuhh4DOqJuG7qR+/qybG4Z0IQLLLUNReZv2A/IepZzgS4qCqDITtSSee6Sv5I+hXmN4eKi7HLCPT41kgPifKHY66w6/7uDGJQYFT+tkxnD3ok+ELounABuK2Q7BjvV24w8rMwEnLROF8WxQ38IJ/3iR5tZ8oC2vrP2kjTlStk4wowPN6DlY7QPllCyQJYoA6Na7n0u0qoBjWbQo= 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)(1800799024)(82310400026)(22082099003)(56012099003)(3023799003)(18002099003)(11063799003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: mt06M53mOunXAMypvtCsRYnOMAMJKgHEn1Ty3wlCvPXKChQnKkFF86nNY2EAeZTSnzMIQcaZ4NLdSOQKsjeRppjfYi1W+e6Z1RdcEm7ePNr0OOv5xrU1CY30hhg88xqhHmYFjyzh7IXOp7M7sFl7l/U1nKfufUVcv6X+QjX8uu7fqi0n03yJZPiHVLKiIyfPnxwFS3V1wuwc90yepchrUxm9gjv6pzqn2iluFedhPA8n9RvL+gffz+lNCHHhu06jnNkRtnGO07wtDaeNr9snb2z390bxvaMO4116UTsKPuIzY1jpPIamomT99snkkMhGSJsLBeR5F++2C0oxW9VRUV6Zi7mOjUaAFsLqB8WqpXNFZtO3P0AFZUPG5Xy4Y/vny4H8Y17rDflKm4RXMkb4HhvBhVv69KlIQIqyMKi0t9wmRH6LlXSPSNBsp5ydi+Gf X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 May 2026 02:44:16.7507 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 4140f6f9-91fc-4895-b6dd-08deb2f505d7 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: BN1PEPF0000468A.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB5997 From: Vamsi Atluri Some newer AMD/Pensando cards have minimal memory and there are cases where components, specifically in the control plane, need more memory. This series adds support for host backed DMA memory that can be used by the firmware for the previously mentioned cases. Assisted-by: Claude:claude-opus-4.6 Signed-off-by: Vamsi Atluri Signed-off-by: Nikhil P. Rao --- drivers/net/ethernet/amd/pds_core/core.c | 167 +++++++++++++++++++++++++++= ++++ drivers/net/ethernet/amd/pds_core/core.h | 19 ++++ drivers/net/ethernet/amd/pds_core/main.c | 5 +- include/linux/pds/pds_adminq.h | 132 ++++++++++++++++++++++++ include/linux/pds/pds_core_if.h | 2 + 5 files changed, 324 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/amd/pds_core/core.c b/drivers/net/etherne= t/amd/pds_core/core.c index 705cab7b0727..215242430b10 100644 --- a/drivers/net/ethernet/amd/pds_core/core.c +++ b/drivers/net/ethernet/amd/pds_core/core.c @@ -487,6 +487,7 @@ void pdsc_teardown(struct pdsc *pdsc, bool removing) pdsc->viftype_status =3D NULL; } =20 + pdsc_host_mem_free(pdsc); pdsc_dev_uninit(pdsc); =20 set_bit(PDSC_S_FW_DEAD, &pdsc->state); @@ -496,6 +497,7 @@ int pdsc_start(struct pdsc *pdsc) { pds_core_intr_mask(&pdsc->intr_ctrl[pdsc->adminqcq.intx], PDS_CORE_INTR_MASK_CLEAR); + pdsc_host_mem_add(pdsc); =20 return 0; } @@ -658,3 +660,168 @@ void pdsc_health_thread(struct work_struct *work) out_unlock: mutex_unlock(&pdsc->config_lock); } + +static void pdsc_host_mem_del_one(struct pdsc *pdsc, u16 tag, u8 reason) +{ + union pds_core_adminq_comp comp =3D {}; + union pds_core_adminq_cmd cmd =3D { + .mem_del.opcode =3D PDS_AQ_CMD_MEM_DEL, + .mem_del.tag =3D cpu_to_le16(tag), + .mem_del.reason =3D reason, + }; + + dev_dbg(pdsc->dev, "Sending aq cmd for mem del tag %d\n", tag); + pdsc_adminq_post(pdsc, &cmd, &comp, false); +} + +static int pdsc_host_mem_add_one(struct pdsc *pdsc, int index) +{ + struct pdsc_host_mem *hm =3D &pdsc->host_mem_reqs[index]; + union pds_core_adminq_comp comp =3D {}; + union pds_core_adminq_cmd cmd =3D {}; + int err; + + memset(hm, 0, sizeof(*hm)); + cmd.mem_query.opcode =3D PDS_AQ_CMD_MEM_QUERY; + cmd.mem_query.index =3D cpu_to_le16(index); + dev_dbg(pdsc->dev, "Sending aq cmd for mem query index %d\n", index); + err =3D pdsc_adminq_post(pdsc, &cmd, &comp, false); + if (err || comp.status !=3D PDS_RC_SUCCESS) { + dev_err(pdsc->dev, "mem query failed err %d status %d\n", + err, comp.status); + return err ? err : -EIO; + } + hm->size =3D le32_to_cpu(comp.mem_query.size); + hm->tag =3D le16_to_cpu(comp.mem_query.tag); + dev_dbg(pdsc->dev, "mem query returned size %d tag %d\n", + hm->size, hm->tag); + + if (!hm->size || hm->size > PDSC_HOST_MEM_MAX_CONTIG) { + dev_err(pdsc->dev, "invalid size %d for tag %d\n", + hm->size, hm->tag); + err =3D -EINVAL; + goto err_del; + } + + hm->order =3D get_order(hm->size); + hm->pg =3D alloc_pages(GFP_KERNEL | __GFP_ZERO, hm->order); + if (!hm->pg) { + dev_err(pdsc->dev, "alloc order %d failed for tag %d\n", + hm->order, hm->tag); + err =3D -ENOMEM; + goto err_del; + } + + hm->pa =3D dma_map_page(pdsc->dev, hm->pg, 0, hm->size, + DMA_BIDIRECTIONAL); + if (dma_mapping_error(pdsc->dev, hm->pa)) { + dev_err(pdsc->dev, "dma map failed for tag %d size %d\n", + hm->tag, hm->size); + __free_pages(hm->pg, hm->order); + hm->pg =3D NULL; + err =3D -EIO; + goto err_del; + } + + /* Track this allocation so pdsc_host_mem_free() can clean it up */ + pdsc->num_host_mem_reqs++; + + memset(&cmd, 0, sizeof(cmd)); + memset(&comp, 0, sizeof(comp)); + cmd.mem_add.opcode =3D PDS_AQ_CMD_MEM_ADD; + cmd.mem_add.tag =3D cpu_to_le16(hm->tag); + cmd.mem_add.size =3D cpu_to_le32(hm->size); + cmd.mem_add.buf_pa =3D cpu_to_le64(hm->pa); + + dev_dbg(pdsc->dev, "Sending aq cmd for mem add tag %d size %d pa %pad\n", + hm->tag, hm->size, &hm->pa); + err =3D pdsc_adminq_post(pdsc, &cmd, &comp, false); + if (err || comp.status !=3D PDS_RC_SUCCESS) { + dev_err(pdsc->dev, "mem add failed err %d status %d for tag %d\n", + err, comp.status, hm->tag); + err =3D err ? err : -EIO; + goto err_del; + } + dev_dbg(pdsc->dev, "mem add completed for tag %d\n", hm->tag); + + return 0; + +err_del: + /* After MEM_QUERY succeeds, firmware expects MEM_ADD or MEM_DEL */ + pdsc_host_mem_del_one(pdsc, hm->tag, PDS_RC_ENOMEM); + return err; +} + +void pdsc_host_mem_add(struct pdsc *pdsc) +{ + union pds_core_adminq_comp comp =3D {}; + union pds_core_adminq_cmd cmd =3D {}; + u16 count; + int err; + int i; + + if (!(pdsc->dev_ident.capabilities & + cpu_to_le64(PDS_CORE_DEV_CAP_HOST_MEM))) + return; + + cmd.mem_get_count.opcode =3D PDS_AQ_CMD_MEM_GET_COUNT; + cmd.mem_get_count.max_contig =3D cpu_to_le32(PDSC_HOST_MEM_MAX_CONTIG); + dev_dbg(pdsc->dev, "Sending aq cmd for mem get count max_contig %lu\n", + PDSC_HOST_MEM_MAX_CONTIG); + err =3D pdsc_adminq_post(pdsc, &cmd, &comp, false); + if (err || comp.status !=3D PDS_RC_SUCCESS) { + dev_err(pdsc->dev, "mem get count failed err %d status %d\n", + err, comp.status); + return; + } + + count =3D le16_to_cpu(comp.mem_get_count.count); + dev_dbg(pdsc->dev, "mem get count returned count %d\n", count); + if (count =3D=3D 0) + return; + + pdsc->host_mem_reqs =3D kzalloc_objs(*pdsc->host_mem_reqs, count, + GFP_KERNEL); + if (!pdsc->host_mem_reqs) { + dev_err(pdsc->dev, "failed to alloc host_mem_reqs array\n"); + return; + } + + for (i =3D 0; i < count; i++) { + err =3D pdsc_host_mem_add_one(pdsc, i); + if (err) + break; + } +} + +void pdsc_host_mem_del(struct pdsc *pdsc) +{ + int i; + + if (!pdsc->host_mem_reqs) + return; + + for (i =3D 0; i < pdsc->num_host_mem_reqs; i++) + pdsc_host_mem_del_one(pdsc, pdsc->host_mem_reqs[i].tag, + PDS_RC_SUCCESS); +} + +void pdsc_host_mem_free(struct pdsc *pdsc) +{ + int i; + + if (!pdsc->host_mem_reqs) + return; + + for (i =3D 0; i < pdsc->num_host_mem_reqs; i++) { + dma_unmap_page(pdsc->dev, pdsc->host_mem_reqs[i].pa, + pdsc->host_mem_reqs[i].size, + DMA_BIDIRECTIONAL); + __free_pages(pdsc->host_mem_reqs[i].pg, + pdsc->host_mem_reqs[i].order); + } + + kfree(pdsc->host_mem_reqs); + pdsc->host_mem_reqs =3D NULL; + pdsc->num_host_mem_reqs =3D 0; +} diff --git a/drivers/net/ethernet/amd/pds_core/core.h b/drivers/net/etherne= t/amd/pds_core/core.h index c9ba63878927..e53edf72a5d5 100644 --- a/drivers/net/ethernet/amd/pds_core/core.h +++ b/drivers/net/ethernet/amd/pds_core/core.h @@ -5,6 +5,7 @@ #define _PDSC_H_ =20 #include +#include #include =20 #include @@ -23,6 +24,8 @@ #define PDSC_SETUP_RECOVERY false #define PDSC_SETUP_INIT true =20 +#define PDSC_HOST_MEM_MAX_CONTIG ((PAGE_SIZE) << (MAX_PAGE_ORDER)) + struct pdsc_dev_bar { void __iomem *vaddr; phys_addr_t bus_addr; @@ -141,6 +144,14 @@ struct pdsc_viftype { struct pds_auxiliary_dev *padev; }; =20 +struct pdsc_host_mem { + u32 size; + u16 tag; + u8 order; + struct page *pg; + dma_addr_t pa; +}; + /* No state flags set means we are in a steady running state */ enum pdsc_state_flags { PDSC_S_FW_DEAD, /* stopped, wait on startup or recovery */ @@ -200,6 +211,9 @@ struct pdsc { struct pdsc_viftype *viftype_status; struct work_struct pci_reset_work; =20 + struct pdsc_host_mem *host_mem_reqs; + u16 num_host_mem_reqs; + struct pds_core_component_list_info fw_components; }; =20 @@ -277,6 +291,7 @@ void pdsc_debugfs_add_viftype(struct pdsc *pdsc); void pdsc_debugfs_add_irqs(struct pdsc *pdsc); void pdsc_debugfs_add_qcq(struct pdsc *pdsc, struct pdsc_qcq *qcq); void pdsc_debugfs_del_qcq(struct pdsc_qcq *qcq); +void pdsc_debugfs_add_host_mem(struct pdsc *pdsc); =20 int pdsc_err_to_errno(enum pds_core_status_code code); bool pdsc_is_fw_running(struct pdsc *pdsc); @@ -334,4 +349,8 @@ void pdsc_fw_down(struct pdsc *pdsc); void pdsc_fw_up(struct pdsc *pdsc); void pdsc_pci_reset_thread(struct work_struct *work); =20 +void pdsc_host_mem_add(struct pdsc *pdsc); +void pdsc_host_mem_del(struct pdsc *pdsc); +void pdsc_host_mem_free(struct pdsc *pdsc); + #endif /* _PDSC_H_ */ diff --git a/drivers/net/ethernet/amd/pds_core/main.c b/drivers/net/etherne= t/amd/pds_core/main.c index 22db78343eb0..58b4d77f6eca 100644 --- a/drivers/net/ethernet/amd/pds_core/main.c +++ b/drivers/net/ethernet/amd/pds_core/main.c @@ -21,6 +21,8 @@ static const struct pci_device_id pdsc_id_table[] =3D { }; MODULE_DEVICE_TABLE(pci, pdsc_id_table); =20 +static void pdsc_stop_health_thread(struct pdsc *pdsc); + static void pdsc_wdtimer_cb(struct timer_list *t) { struct pdsc *pdsc =3D timer_container_of(pdsc, t, wdtimer); @@ -434,7 +436,8 @@ static void pdsc_remove(struct pci_dev *pdev) pdsc_sriov_configure(pdev, 0); pdsc_auxbus_dev_del(pdsc, pdsc, &pdsc->padev); =20 - timer_shutdown_sync(&pdsc->wdtimer); + pdsc_stop_health_thread(pdsc); + pdsc_host_mem_del(pdsc); if (pdsc->wq) destroy_workqueue(pdsc->wq); =20 diff --git a/include/linux/pds/pds_adminq.h b/include/linux/pds/pds_adminq.h index 40ff0ec2b879..ef46415ab9fd 100644 --- a/include/linux/pds/pds_adminq.h +++ b/include/linux/pds/pds_adminq.h @@ -34,6 +34,12 @@ enum pds_core_adminq_opcode { PDS_AQ_CMD_RX_FILTER_ADD =3D 31, PDS_AQ_CMD_RX_FILTER_DEL =3D 32, =20 + /* MEM commands */ + PDS_AQ_CMD_MEM_GET_COUNT =3D 10, + PDS_AQ_CMD_MEM_QUERY =3D 11, + PDS_AQ_CMD_MEM_ADD =3D 12, + PDS_AQ_CMD_MEM_DEL =3D 13, + /* Queue commands */ PDS_AQ_CMD_Q_IDENTIFY =3D 39, PDS_AQ_CMD_Q_INIT =3D 40, @@ -207,6 +213,122 @@ struct pds_core_client_request_cmd { u8 client_cmd[60]; }; =20 +/** + * struct pds_core_mem_get_count_cmd - MEM_GET_COUNT command + * @opcode: opcode PDS_AQ_CMD_MEM_GET_COUNT + * @rsvd: Word boundary padding + * @max_contig: Maximum contiguous memory size in bytes + * + * Query the number of host memory requests needed by firmware. + */ +struct pds_core_mem_get_count_cmd { + u8 opcode; + u8 rsvd[3]; + __le32 max_contig; +} __packed; + +/** + * struct pds_core_mem_get_count_comp - MEM_GET_COUNT completion + * @status: Status of the command (enum pds_core_status_code) + * @rsvd: Word boundary padding + * @comp_index: Index in the descriptor ring for which this is the complet= ion + * @count: Number of host memory requests + * @rsvd2: Word boundary padding + * @color: Color bit + */ +struct pds_core_mem_get_count_comp { + u8 status; + u8 rsvd; + __le16 comp_index; + __le16 count; + u8 rsvd2[9]; + u8 color; +} __packed; + +/** + * struct pds_core_mem_query_cmd - MEM_QUERY command + * @opcode: opcode PDS_AQ_CMD_MEM_QUERY + * @rsvd: Word boundary padding + * @index: Memory request index + */ +struct pds_core_mem_query_cmd { + u8 opcode; + u8 rsvd; + __le16 index; +} __packed; + +/** + * struct pds_core_mem_query_comp - MEM_QUERY completion + * @status: Status of the command (enum pds_core_status_code) + * @rsvd: Word boundary padding + * @comp_index: Index in the descriptor ring for which this is the complet= ion + * @size: Size of memory request in bytes + * @tag: Tag for this memory request + */ +struct pds_core_mem_query_comp { + u8 status; + u8 rsvd; + __le16 comp_index; + __le32 size; + __le16 tag; +} __packed; + +/** + * struct pds_core_mem_add_cmd - MEM_ADD command + * @opcode: opcode PDS_AQ_CMD_MEM_ADD + * @rsvd: Word boundary padding + * @tag: Tag for this memory request + * @size: Size of memory in bytes + * @buf_pa: DMA address of memory + */ +struct pds_core_mem_add_cmd { + u8 opcode; + u8 rsvd; + __le16 tag; + __le32 size; + __le64 buf_pa; +} __packed; + +/** + * struct pds_core_mem_add_comp - MEM_ADD command completion + * @status: Status of the command (enum pds_core_status_code) + * @rsvd: padding for natural alignment + * @comp_index: Index in the desc ring for which this is the completion + */ +struct pds_core_mem_add_comp { + u8 status; + u8 rsvd; + __le16 comp_index; +} __packed; + +/** + * struct pds_core_mem_del_cmd - MEM_DEL command + * @opcode: opcode PDS_AQ_CMD_MEM_DEL + * @rsvd: Word boundary padding + * @tag: Tag for this memory request + * @reason: Reason for deletion + */ +struct pds_core_mem_del_cmd { + u8 opcode; + u8 rsvd; + __le16 tag; + u8 reason; +} __packed; + +/** + * struct pds_core_mem_del_comp - MEM_DEL command completion + * @status: Status of the command (enum pds_core_status_code) + * @rsvd: Word boundary padding + * @comp_index: Index in the desc ring for which this is the completion + * @tag: Tag for the memory request + */ +struct pds_core_mem_del_comp { + u8 status; + u8 rsvd; + __le16 comp_index; + __le16 tag; +} __packed; + #define PDS_CORE_MAX_FRAGS 16 =20 #define PDS_CORE_QCQ_F_INITED BIT(0) @@ -1454,6 +1576,11 @@ union pds_core_adminq_cmd { struct pds_core_client_unreg_cmd client_unreg; struct pds_core_client_request_cmd client_request; =20 + struct pds_core_mem_get_count_cmd mem_get_count; + struct pds_core_mem_query_cmd mem_query; + struct pds_core_mem_add_cmd mem_add; + struct pds_core_mem_del_cmd mem_del; + struct pds_core_lif_identify_cmd lif_ident; struct pds_core_lif_init_cmd lif_init; struct pds_core_lif_reset_cmd lif_reset; @@ -1502,6 +1629,11 @@ union pds_core_adminq_comp { =20 struct pds_core_client_reg_comp client_reg; =20 + struct pds_core_mem_get_count_comp mem_get_count; + struct pds_core_mem_query_comp mem_query; + struct pds_core_mem_add_comp mem_add; + struct pds_core_mem_del_comp mem_del; + struct pds_core_lif_identify_comp lif_ident; struct pds_core_lif_init_comp lif_init; struct pds_core_lif_setattr_comp lif_setattr; diff --git a/include/linux/pds/pds_core_if.h b/include/linux/pds/pds_core_i= f.h index d15ddd1c8ef1..e8d1b299bbbb 100644 --- a/include/linux/pds/pds_core_if.h +++ b/include/linux/pds/pds_core_if.h @@ -110,9 +110,11 @@ struct pds_core_drv_identity { /** * enum pds_core_dev_capability - Device capabilities * @PDS_CORE_DEV_CAP_PLDM_FW_UPDATE: Device only supports FW update via PL= DM + * @PDS_CORE_DEV_CAP_HOST_MEM: Device supports host memory for fw use */ enum pds_core_dev_capability { PDS_CORE_DEV_CAP_PLDM_FW_UPDATE =3D BIT(0), + PDS_CORE_DEV_CAP_HOST_MEM =3D BIT(1), }; =20 #define PDS_DEV_TYPE_MAX 16 --=20 2.43.0 From nobody Mon May 25 07:35:45 2026 Received: from SA9PR02CU001.outbound.protection.outlook.com (mail-southcentralusazon11013067.outbound.protection.outlook.com [40.93.196.67]) (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 A45E129898B; Sat, 16 May 2026 02:44:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.196.67 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778899471; cv=fail; b=SB39ZOfx0NL1E9GvomhYO/JSljLAC4h096rHqi5EgmFaOEj4w+URhFrzcSH5tR/76aw3gt3EuRa3043a9FC6DmRZ+/oTuh7QOwdXU+nSGH7otmx1aWMpLb1aFeFgMuMnNCzlvukm4ve+zK4GrVHEMJy92U2zivsnxZmDOkY5VrQ= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778899471; c=relaxed/simple; bh=WG1zdlA3s8xLJwiRovbsWehXKIBAlS/DRtALdCp/Ofg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=TWu+iGC5SIvAfKDxITOOkqnbBVWmMfBDIrPklRjoxJG1IoMDNEGoZ3m4/hKf7tpID3An07Bx26kT0wHGd9TJvDrmMybxkRRQjV+lvw6SfUZpAqxE06D8we4UQyZHMFqtZJ5d6tEH0cni+oEgB6F51OZqmqOmXVRwT5vhhnKeTdY= 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=d9+62y7k; arc=fail smtp.client-ip=40.93.196.67 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="d9+62y7k" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=QzyuHmhjoXgjP0wq5XWqPhqy6ZWWy7CDh0FqjUTvjIWcb9ZGON5QM8sZm3/J6LBNBe1H9gH/gJ48ADiLFF4BnEZpjsYTzI9lhvzNu5fDRHaEoIShwkTAZXeRrEHSAn4Hc4kogpSN+f+CrB/rE2HKCok19I4OxdpSbTrw2gBYlc44Mpm2X4ZfH8O7PyI59mmMVQ8QnhqpBxjb6NDpPvukJkQ0QjXs5O8mlw/nDVViuxpAHD4CcQlFljDlUQSsnYr0aqZTUHrVOQixBVAIWfNqPOWDScX4FacE8zAlSD7TDgQPw6j57e0cirAnMhkL8XbyWLNTdTG8cywmyhYzOQGjOg== 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=XiTsp7yPIz+LnTFiL9fToEQG8KEKg8MEpnPMJ3LUIm4=; b=iYMGxyLuwordlAJ5JodFGTmUiPa8ungO2UbD7BiHOHRUEl83PXKTw9gmIEHqBW/qK5OynCwoW8nJabBAG0C5nqtLuq2qG9m+saRxDYpeHs6yYHd7TPMz1zmxE8K5JvBnCP0aIfss0P/X/P/PFhX+lw8G6TUQhc5Q4ApG/JCbnmunddG4Ea3xEYP45s/p61RddYslzEUDfdbFD4oNYz/FCOsR5J+ISWKlpcoB5miJEzklIbUeWQu9fi0fzwgbbkHIHeM7yI/kZoTR+Uxief9ixDjCGSpy29AigFgSGj+77AI6becAUrVSd+v5adL9tTlDfz9sQI85tuUyqw/IfMFfAw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=vger.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=XiTsp7yPIz+LnTFiL9fToEQG8KEKg8MEpnPMJ3LUIm4=; b=d9+62y7kDrO5y7eqS7gxmdevbr1rjJWlOVp7t+ifN4Ge2vcQrqp3h6wnbI1HOyVMIseQUHTW0DAmF0CE2dFHT1w5N5Xzh7cX9WVnorqiNbpVOq/o1ReIsxTwu2rZezvL8vZ16bofPiXz/daYqtLULyFxxPR9yQu0oZo62yNyqio= Received: from BN9PR03CA0227.namprd03.prod.outlook.com (2603:10b6:408:f8::22) by SN7PR12MB7812.namprd12.prod.outlook.com (2603:10b6:806:329::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.25.18; Sat, 16 May 2026 02:44:17 +0000 Received: from BN1PEPF0000468A.namprd05.prod.outlook.com (2603:10b6:408:f8:cafe::b5) by BN9PR03CA0227.outlook.office365.com (2603:10b6:408:f8::22) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9913.14 via Frontend Transport; Sat, 16 May 2026 02:44: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 BN1PEPF0000468A.mail.protection.outlook.com (10.167.243.135) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.25.13 via Frontend Transport; Sat, 16 May 2026 02:44:17 +0000 Received: from [127.0.1.1] (10.180.168.240) 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.41; Fri, 15 May 2026 21:44:16 -0500 From: "Nikhil P. Rao" Date: Sat, 16 May 2026 02:42:40 +0000 Subject: [PATCH net-next v2 6/6] pds_core: add debugfs support for host backed memory Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-ID: <20260516-upstream_v2_clean-v2-6-7e0d66bf4020@amd.com> References: <20260516-upstream_v2_clean-v2-0-7e0d66bf4020@amd.com> In-Reply-To: <20260516-upstream_v2_clean-v2-0-7e0d66bf4020@amd.com> To: Brett Creeley , Andrew Lunn , "David S. Miller" , "Eric Dumazet" , Jakub Kicinski , Paolo Abeni CC: , , Eric Joyner , "Nikhil P. Rao" , Vamsi Atluri X-Mailer: b4 0.15.2 X-ClientProxiedBy: satlexmb08.amd.com (10.181.42.217) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN1PEPF0000468A:EE_|SN7PR12MB7812:EE_ X-MS-Office365-Filtering-Correlation-Id: 2b24e2ce-68b8-4b00-6a5c-08deb2f50649 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|376014|1800799024|36860700016|56012099003|22082099003|18002099003|11063799003; X-Microsoft-Antispam-Message-Info: clvJptVaskTEpVU6jl8KVXpksNRNmRaVQlhr8yqfZFo3rieFLpO+fY+P8NlCEPd0OHBtt9cckSqSJgSzMgEWL0/9wNnuEop6+mL9oj84FpzePCnaH1dELAhJw4mCSy1K9BsdQaY0BQi3XZ0ddrB9z6+Bs8qowqwRl/zpiNhAzf9sajsaF+UnuhRaRu2WOfuDH7w0qm/Ny/YKpVn2/YjB4OSRvTLzX08/esMWeGXZvtWGtrdf69YGD7KcYXIgjRBbG7aB6Ez++u2EIF8M9suTMiz2AUnoOSoz7doCITyxxiehw5m706gnFUgWfOtFyxrBcG8ilMrhW17vyWJBqtJsHLiMOU8ZtflRdT8qpbKZvv0GO8KvmCXEK7PB1FCEUQYKGojdVLD89+ggDPKcmzitpxbqfNfsmOeRMVIxKAtNgSe2iBc9vCoCSGCG59pH3jaeKXIRZca/TiF5w48pMGp8TxX6LxUjyFnsT42RV9mLa9yWNQDo0vyxK4uJu4/pZ2m8CyvQ9zEuiJ5TqiM/t34iZ1oDGPDXU37WNQHspEx3Bq0P1FLO3miO5g72JmDH6u2HLfuK2oHmrWR5G0ei1bwDbAZV+fBK4b4/dXUVxsC/jLCAu35lAzr9Tz8q9beDoFobbIUpFZXVmBGay5yjcBEoMN/GUDEaj3Cgjen5Mh0dGRdpFvekr0YRCCAfiZ4xsvm4CRm9QmXBrn/nFtLdMR6FjCwfHM3jCk8/YqZaJ13Zs8A= 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)(1800799024)(36860700016)(56012099003)(22082099003)(18002099003)(11063799003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: LPDezWPS9L5ulk2GJXU0H7CF4aFmfW5q+x+nAUD1lecXPxg1vk/gSqKVIpf+HZZS3ctTuybpX1VbnE+auaOTeeV1ciP/WKQD99lKK37SoZxtdVIAMh4oyXemL3jcc8kslwl0/DLpriPgu58OHlBKYjrYfePMx3JfmV9ghPe/tpjvQ2v8kJnfYLRHZTSuPWoCHQtp8lT3QLfAR4vf8Vcv6wbdPmTGq/Zk/Xc4NsCTsveAaPq9t4kd7YIzzxKkHIK21mOcB5AsP1GWSqkmQ1wU9Nc+N6MU2dv6lAVNYdIm+Tsr4WJPzHlW7t26fzSxXsmAhA4UQ6AvAnfSQLRtcoPPO91/JAuK0Htgb+Gfb3mrcMm95fxt3RWshdjAdLBfriw8F3ONnq5E+zCVmJPsRipK0XAY/QMkFYpkDF1w7flRDfrD3d/ifM8aqg7C1jQSt6JK X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 May 2026 02:44:17.4990 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 2b24e2ce-68b8-4b00-6a5c-08deb2f50649 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: BN1PEPF0000468A.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN7PR12MB7812 From: Vamsi Atluri Add debugfs file to display host memory allocations including tag, size, order, and physical address for each memory request. Signed-off-by: Vamsi Atluri --- drivers/net/ethernet/amd/pds_core/debugfs.c | 50 +++++++++++++++++++++++++= ++++ drivers/net/ethernet/amd/pds_core/main.c | 2 ++ 2 files changed, 52 insertions(+) diff --git a/drivers/net/ethernet/amd/pds_core/debugfs.c b/drivers/net/ethe= rnet/amd/pds_core/debugfs.c index 04c5e3abd8d7..058071f6f17e 100644 --- a/drivers/net/ethernet/amd/pds_core/debugfs.c +++ b/drivers/net/ethernet/amd/pds_core/debugfs.c @@ -173,3 +173,53 @@ void pdsc_debugfs_del_qcq(struct pdsc_qcq *qcq) debugfs_remove_recursive(qcq->dentry); qcq->dentry =3D NULL; } + +static int host_mem_show(struct seq_file *seq, void *v) +{ + struct pdsc *pdsc =3D seq->private; + struct pdsc_host_mem *hm; + int i; + + if (!pdsc->host_mem_reqs || pdsc->num_host_mem_reqs =3D=3D 0) { + seq_puts(seq, "No host memory allocated\n"); + return 0; + } + + seq_printf(seq, "Host memory requests: %d\n\n", + pdsc->num_host_mem_reqs); + seq_puts(seq, "Tag Size Order PA\n"); + seq_puts(seq, "--- ---- ----- --\n"); + + for (i =3D 0; i < pdsc->num_host_mem_reqs; i++) { + hm =3D &pdsc->host_mem_reqs[i]; + + if (!hm->pg) + continue; + + seq_printf(seq, "%-6d %-12u %-6d 0x%llx\n", + hm->tag, hm->size, hm->order, + (unsigned long long)hm->pa); + } + + return 0; +} +DEFINE_SHOW_ATTRIBUTE(host_mem); + +void pdsc_debugfs_add_host_mem(struct pdsc *pdsc) +{ + struct dentry *dentry; + + if (!(pdsc->dev_ident.capabilities & + cpu_to_le64(PDS_CORE_DEV_CAP_HOST_MEM))) + return; + + /* Check if file already exists (e.g., during reset recovery) */ + dentry =3D debugfs_lookup("host_mem", pdsc->dentry); + if (!IS_ERR_OR_NULL(dentry)) { + dput(dentry); + return; + } + + debugfs_create_file("host_mem", 0400, pdsc->dentry, + pdsc, &host_mem_fops); +} diff --git a/drivers/net/ethernet/amd/pds_core/main.c b/drivers/net/etherne= t/amd/pds_core/main.c index 58b4d77f6eca..aa7b5ce6f623 100644 --- a/drivers/net/ethernet/amd/pds_core/main.c +++ b/drivers/net/ethernet/amd/pds_core/main.c @@ -266,6 +266,8 @@ static int pdsc_init_pf(struct pdsc *pdsc) =20 mutex_unlock(&pdsc->config_lock); =20 + pdsc_debugfs_add_host_mem(pdsc); + err =3D pdsc_auxbus_dev_add(pdsc, pdsc, PDS_DEV_TYPE_FWCTL, &pdsc->padev); if (err) goto err_out_stop; --=20 2.43.0