From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from BN8PR05CU002.outbound.protection.outlook.com (mail-eastus2azon11011037.outbound.protection.outlook.com [52.101.57.37]) (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 297523F39D3 for ; Wed, 8 Jul 2026 21:23:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.57.37 ARC-Seal:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783545814; cv=fail; b=NBTbY7xo75drLDRPIhE39fsZ+tW99JDiaZlVFPBf+InDW903CURRRoJhS/2kKLjPnWwWXU7GoGtevnxmM8i+I2x/9qtXQbJMQrYeoHXQHptwb9dqHFCVzX9Aw2c3j0IDyGucenWwvgsgi9iPtA0vIfmfersJE+2kQ8Ktc69yEJM= ARC-Message-Signature:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783545814; c=relaxed/simple; bh=fiElphPEWIUkOObSBqk+eToDsgQ0Wqsx3ex5++5tags=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=A3vs/Nb/txtMGC7Ftia/iCQRhVDJPlY4twmD6KJVSL0PHWD9DvrI/mDKmjcE7adRju+hrNzjJzI3o66KesFvGk/r2A87fUZ2A2gzuhgCXMH2WLUOxmD1rz2H7GnQba6qCaF7fds5xuj+SSAfyaaeMp3E1A12YWRHSGXvB5tyMlQ= 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=UWPjELGE; arc=fail smtp.client-ip=52.101.57.37 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="UWPjELGE" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=E9mvQhleCF/RxZFgvVK+FK84bDt8VTAG2p5PQ+ojrSpi7b1PwkwA4kyfzYiV/fRelYEfyboPazIl64DQf/E7YXG3/MzM7kcQ5S+EQWFNPKxYEpvFNBiAf6YVW5f3MaFoqHW8FczPgUXK0nzSDGug4bkKeK1AyM6z7MRlJU83adVPpof9DDoFsbNl53WZ/eyGozoKl6ijVm9DBd1xvylf3s+tSZ6c9dyYXwJLG5Z2St+7v6s/PdvLbIpimWP/w9XTVnHUikLXGNy2Lhjpt+C2NAHbwWt32XZTGgPZtsFTi4B3kB9x5wmiGCBVf4kgggzu2n+G86bBihcB6Mwi5vDu5w== 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=FbAVlhhXjxS4eOKQ1OFL3B/Rfj5kpwkiCQUqO8tZPd0=; b=Ioqs+dvdaKfJqZVmiXGtPIyg3IbSNFqa+JhkhR7B5Uhq9lWwyOAcQl6Eg2+qi7ecamy7Uv+FWfMET//7ns2rf1ojoAAyzQmZ5ou2/u/PPy++6ugyXjVuhkM3lOLOqnL0uWne7mrM8cvdCL/MpygCf6LC14MRZz3IPdpTvzy1OKJqUDCQYlZlzaT3WqoQRKRxS+HY4ECQy4KzZItD5SUNICTSnFDqfau3nFGPgHlpPfIMQ0TFRI2vFuW3MobKrXW+3HieUQ0wPkeAwu9ezF1eaxr0sNJUgY9UTuxYzL0bvpfcrd3yr/fC81wZZl+0JAZnnWD9Kddi0GGvqHR0J3FpGg== 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=FbAVlhhXjxS4eOKQ1OFL3B/Rfj5kpwkiCQUqO8tZPd0=; b=UWPjELGEKL5IyH52x/+Ut38mmeOVQrBaAJ5SeVm3ZErVgcSD+QLaaYdBg8m5f44LrpnIcjd2Ft5iUC0l2tmgCryVCmOv1CJticVrK7+CMyR40rFPSN+N46qFA2BrjIHiN8j3AbP0zvWkPGX3j17oMYEegNoqIqr0hw3FHqOpQtY= Received: from CH0PR03CA0017.namprd03.prod.outlook.com (2603:10b6:610:b0::22) by SN7PR12MB6885.namprd12.prod.outlook.com (2603:10b6:806:263::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.181.11; Wed, 8 Jul 2026 21:23:23 +0000 Received: from CH2PEPF00000140.namprd02.prod.outlook.com (2603:10b6:610:b0:cafe::2) by CH0PR03CA0017.outlook.office365.com (2603:10b6:610:b0::22) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.202.10 via Frontend Transport; Wed, 8 Jul 2026 21:23:22 +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 CH2PEPF00000140.mail.protection.outlook.com (10.167.244.72) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.181.6 via Frontend Transport; Wed, 8 Jul 2026 21:23:22 +0000 Received: from amd.rund-run.pensando.io (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; Wed, 8 Jul 2026 16:23:20 -0500 From: "Nikhil P. Rao" To: CC: , , , , , , , Subject: [PATCH 4/6] pds_core: add PLDM component info display Date: Wed, 8 Jul 2026 21:22:20 +0000 Message-ID: <20260708212222.296202-5-nikhil.rao@amd.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260708212222.296202-1-nikhil.rao@amd.com> References: <20260708212222.296202-1-nikhil.rao@amd.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: satlexmb07.amd.com (10.181.42.216) To satlexmb07.amd.com (10.181.42.216) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CH2PEPF00000140:EE_|SN7PR12MB6885:EE_ X-MS-Office365-Filtering-Correlation-Id: 61d3f132-5d42-4767-4d09-08dedd3723f7 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|36860700016|82310400026|23010399003|18002099003|22082099003|11063799006|3023799007|56012099006; X-Microsoft-Antispam-Message-Info: FWYQR8aTwscCc8mGT6VBTMsRsP9VkZZXVGAEZBGkmugpoEhmWZSzi2dkS8IZbLimlKyiLfOCVKldv2oYzWmzwAKn4qZDNO4u00xUlIOx2gLfvVntlQX4qn8eax+g+Aad1z6tiCTrcylbcUZoI9Uk6lcwNp/GY+YcDYmo60R64xHgM0utnqg6+Z+IN1pMuwca4mopJaNtjVjHdSNUHOr7hOnIV24fpdRLoRhEqgGJs90UGGklImrmxwwbC6Y5Z2RR94Tb9Wbi9VxkSTmHd3w2w1w3HpZedcV4tb2Ve6T6weVEM0ki9cOIPGg0+C1q06dvoMYMcCgvD/3c6kXr43I/E9tbPsje87wDiVqG7lbzqx67A08ylIFaHkl1UJN8r7aIczg4unTJbH7CwPK/25e3pR0PKlFfKLn/l/O5wN01ertfjnmWb/jEAUrbdSNdVjP7l0y6O1ic5gbFRrn/eyqeztssxLuoGTUSlw57/rDr3bpzKrdkpBilZ82aH3tsLVY5HPTyfw2dqbb1H7DBOPMGYfsQmxlGRM2dbBrxwFeWCFqvQtQROZB2/93DMCFjW0EvcAU5FvwoPRsqBZT5uMA9pjdFU6jZuWUweYwxhB2nG6Hm9N31p0iSVSh7L5QuECsR7+oowoSVoqlIZyypCDbOKTi1hQqLFvkmnB+fv7sD3MeA+lk5Gw5GXxhEhpkUuzmo6ILRFDR8xglMSqGbRhZEJg== 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)(1800799024)(376014)(36860700016)(82310400026)(23010399003)(18002099003)(22082099003)(11063799006)(3023799007)(56012099006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: RQp1q5Gh2PZsQUQElW3fucpWE0zR5536xK1mH9vCBSyknmM+F5F9/hUYcYMf92hvDVyhWQNJJezHSEPbkxQ3PuqxiIsIgTjHobPOYHaRP0H3yKPqiS3dKuBcRbQ59ZAzNZTyBvYSzDSFbqRbON2+KOy26sEEJ7VLw/UVeosArHsEGHomzTxxXp/tYVkwbY87RW9EGFvcp+sWA8H2flriT+QY9+mnbkxnftk9IPbR5Asq6tKKmPpa7KXla4QAQFUwZrJ+w1sg4GHt1kVo6p2QPoE+erCG8+0+vZIm7QzKc8rHNUpE/HRNnlln2o5MCDrXXfkYTpOY3QYM6l7d3YOPyenF1xJIKU50M8zJeLpflOCdk7iW+b7YYXjLwnfl7xlnB5Z4xiEP4M/Q5xS4Ud6O5ONhKg8acJufLWkbGAfgMPrWnq81Z5xlrSg67JZyhpk1 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Jul 2026 21:23:22.8994 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 61d3f132-5d42-4767-4d09-08dedd3723f7 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: CH2PEPF00000140.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN7PR12MB6885 From: Brett Creeley Add detailed component information display via devlink info. This allows users to see individual firmware components and their versions. Components are reported as fixed, running, or stored based on their firmware-provided flags. Example output: $ devlink dev info pci/0000:00:05.0 versions: fixed: asic.id 0x0 asic.rev 0x0 running: fw.bootloader 1.2.3 fw.uboot 1.60.0-73 fw 1.60.0-73 fw.cpld 3.18 stored: fw.bootloader 1.2.3 fw.uboot 1.60.0-73 fw.uboot.gold 1.50.0-22 fw.gold 1.50.0-22 fw 1.60.0-73 fw.cpld 3.18 Signed-off-by: Brett Creeley --- drivers/net/ethernet/amd/pds_core/core.c | 2 + drivers/net/ethernet/amd/pds_core/core.h | 1 + drivers/net/ethernet/amd/pds_core/devlink.c | 145 +++++++++++++++++++- drivers/net/ethernet/amd/pds_core/fw.c | 12 +- 4 files changed, 153 insertions(+), 7 deletions(-) diff --git a/drivers/net/ethernet/amd/pds_core/core.c b/drivers/net/ethernet/amd/pds_core/core.c index 6c62ff7a32f0..a7a0bcf98ed3 100644 --- a/drivers/net/ethernet/amd/pds_core/core.c +++ b/drivers/net/ethernet/amd/pds_core/core.c @@ -589,6 +589,8 @@ void pdsc_fw_up(struct pdsc *pdsc) return; } + pdsc_fw_components_invalidate(pdsc); + err = pdsc_setup(pdsc, PDSC_SETUP_RECOVERY); if (err) goto err_out; diff --git a/drivers/net/ethernet/amd/pds_core/core.h b/drivers/net/ethernet/amd/pds_core/core.h index c686f0bbbaeb..73356c74bb9f 100644 --- a/drivers/net/ethernet/amd/pds_core/core.h +++ b/drivers/net/ethernet/amd/pds_core/core.h @@ -340,6 +340,7 @@ int pdsc_firmware_update(struct pdsc *pdsc, struct netlink_ext_ack *extack); int pdsc_get_component_info(struct pdsc *pdsc); const char *pdsc_fw_type_to_name(u8 type); +void pdsc_fw_components_invalidate(struct pdsc *pdsc); void pdsc_fw_down(struct pdsc *pdsc); void pdsc_fw_up(struct pdsc *pdsc); diff --git a/drivers/net/ethernet/amd/pds_core/devlink.c b/drivers/net/ethernet/amd/pds_core/devlink.c index 3b763ee1715e..63fe45e91f71 100644 --- a/drivers/net/ethernet/amd/pds_core/devlink.c +++ b/drivers/net/ethernet/amd/pds_core/devlink.c @@ -93,14 +93,120 @@ int pdsc_dl_flash_update(struct devlink *dl, return pdsc_firmware_update(pdsc, params, extack); } +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 = le16_to_cpu(info->flags); + char *ver = info->version; + const char *name; + char buf[32]; + + /* Main firmware is reported as generic "fw" */ + if (info->component_type == PDS_CORE_FW_TYPE_MAIN) { + if (info->slot_id == PDS_CORE_FW_SLOT_GOLD) + snprintf(buf, sizeof(buf), "fw.gold"); + else + snprintf(buf, sizeof(buf), "fw"); + } else { + name = pdsc_fw_type_to_name(info->component_type); + if (!name) + return 0; + + if (info->slot_id == PDS_CORE_FW_SLOT_GOLD) + snprintf(buf, sizeof(buf), "fw.%s.gold", name); + else + snprintf(buf, sizeof(buf), "fw.%s", name); + } + + ver_type = DEVLINK_INFO_VERSION_TYPE_NONE; + if (flags & PDS_CORE_FW_COMPONENT_INFO_F_UPDATE_BY_NAME) + ver_type = DEVLINK_INFO_VERSION_TYPE_COMPONENT; + + if (flags & PDS_CORE_FW_COMPONENT_INFO_F_FIXED) { + int err; + + err = devlink_info_version_fixed_put(req, buf, ver); + if (err) + return err; + } + + if (flags & PDS_CORE_FW_COMPONENT_INFO_F_RUNNING) { + int err; + + err = devlink_info_version_running_put_ext(req, buf, + ver, ver_type); + if (err) + return err; + } + + if (flags & PDS_CORE_FW_COMPONENT_INFO_F_STARTUP) { + int err; + + err = devlink_info_version_stored_put_ext(req, buf, + ver, ver_type); + if (err) + return err; + } + + return 0; +} + +static int pdsc_dl_report_fw_ver(struct devlink_info_req *req, char *fw_ver) +{ + return devlink_info_version_running_put(req, + DEVLINK_INFO_VERSION_GENERIC_FW, + fw_ver); +} + +static int pdsc_dl_component_info_get(struct devlink *dl, + struct devlink_info_req *req, + struct netlink_ext_ack *extack) +{ + struct pdsc *pdsc = devlink_priv(dl); + u8 num_components; + int err; + int i; + + /* Pairs with WRITE_ONCE in pdsc_fw_components_invalidate(). + * Use READ_ONCE to get a consistent snapshot of num_components. + * pdsc_fw_components_invalidate() can zero it concurrently during + * firmware recovery; using the local copy avoids iterating zero + * times when we already decided the cache was valid. + */ + num_components = READ_ONCE(pdsc->fw_components.num_components); + if (!num_components) { + err = pdsc_get_component_info(pdsc); + if (err) + return pdsc_dl_report_fw_ver(req, + pdsc->dev_info.fw_version); + num_components = READ_ONCE(pdsc->fw_components.num_components); + if (!num_components) + return pdsc_dl_report_fw_ver(req, + pdsc->dev_info.fw_version); + } + + num_components = min_t(u16, num_components, + le16_to_cpu(pdsc->dev_ident.max_fw_slots)); + for (i = 0; i < num_components; i++) { + err = pdsc_dl_report_component(req, + &pdsc->fw_components.info[i]); + if (err) + return err; + } + + return 0; +} + static char *fw_slotnames[] = { "fw.goldfw", "fw.mainfwa", "fw.mainfwb", }; -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 = { .fw_control.opcode = PDS_CORE_CMD_FW_CONTROL, @@ -134,12 +240,41 @@ int pdsc_dl_info_get(struct devlink *dl, struct devlink_info_req *req, return err; } - err = devlink_info_version_running_put(req, - DEVLINK_INFO_VERSION_GENERIC_FW, - pdsc->dev_info.fw_version); + return 0; +} + +static int pdsc_dl_info_get_v1(struct devlink *dl, + struct devlink_info_req *req, + struct netlink_ext_ack *extack) +{ + struct pdsc *pdsc = devlink_priv(dl); + int err; + + err = pdsc_dl_fw_list_info_get(dl, req, extack); if (err) return err; + /* Version 1: report fw from dev_info (running only) */ + return pdsc_dl_report_fw_ver(req, pdsc->dev_info.fw_version); +} + +int pdsc_dl_info_get(struct devlink *dl, struct devlink_info_req *req, + struct netlink_ext_ack *extack) +{ + struct pdsc *pdsc = devlink_priv(dl); + char buf[32]; + int err; + + if (pdsc->dev_ident.version >= PDS_CORE_IDENTITY_VERSION_2) { + err = pdsc_dl_component_info_get(dl, req, extack); + if (err) + return err; + } else { + err = pdsc_dl_info_get_v1(dl, req, extack); + if (err) + return err; + } + snprintf(buf, sizeof(buf), "0x%x", pdsc->dev_info.asic_type); err = devlink_info_version_fixed_put(req, DEVLINK_INFO_VERSION_GENERIC_ASIC_ID, diff --git a/drivers/net/ethernet/amd/pds_core/fw.c b/drivers/net/ethernet/amd/pds_core/fw.c index dc793005ec70..ae39f684c3b8 100644 --- a/drivers/net/ethernet/amd/pds_core/fw.c +++ b/drivers/net/ethernet/amd/pds_core/fw.c @@ -42,6 +42,12 @@ const char *pdsc_fw_type_to_name(u8 type) return NULL; } +void pdsc_fw_components_invalidate(struct pdsc *pdsc) +{ + /* Pairs with READ_ONCE in pdsc_dl_component_info_get() */ + WRITE_ONCE(pdsc->fw_components.num_components, 0); +} + static u8 pdsc_name_to_fw_type(const char *name) { size_t prefix_len; @@ -765,7 +771,9 @@ static int pdsc_flash_component(struct pldmfw *context, if (component_type) { const char *type_name = pdsc_fw_type_to_name(component_type); - if (type_name) { + if (component_type == PDS_CORE_FW_TYPE_MAIN) { + component_name = "fw"; + } else if (type_name) { snprintf(component_name_buf, sizeof(component_name_buf), "%s%s", PDSC_FW_COMPONENT_PREFIX, type_name); component_name = component_name_buf; @@ -966,7 +974,7 @@ int pdsc_firmware_update(struct pdsc *pdsc, err = pdsc_legacy_firmware_update(pdsc, params, extack); /* Invalidate cached component info so next info_get refreshes */ - pdsc->fw_components.num_components = 0; + pdsc_fw_components_invalidate(pdsc); return err; } -- 2.43.0