From nobody Fri Apr 17 10:44:04 2026 Received: from ZRZP278CU001.outbound.protection.outlook.com (mail-switzerlandnorthazon11021127.outbound.protection.outlook.com [40.107.167.127]) (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 465AD36A027 for ; Wed, 4 Mar 2026 13:27:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.167.127 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772630855; cv=fail; b=LGoQlcGodks1+EVttJjriIX/UNFA5EfPVzu3RxMMsGcX+YChbzOX/x0l7YqOfGKESq6Y/NjuEax6DsReDMNXYsv+YNlZov+2g9tPuc6Q4Y014LpdmDM3RlxKJY7gmc9UayhnZM7bRPvR6NxdoqXYu8xKEYdkbSWj6Tyr7i5DZpY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772630855; c=relaxed/simple; bh=LNCJrtr1okBeUif5jWzKYMKfFOIRnHzd0CUV8ZEAZsY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=RwPYCCJZefVEeprUH/P/N5d5X0QxQeBUPT+VXVIP2MlSq4EezJXiyNplc6YLPmJ1a3hk0JDEGPhhPGr+j25unyfPhtIuAzU9dMxdTv656co//jeD97v5T3+m6b3adp4H/myb9NblpEqtXxu60gPTB5G/PnXRDFV1ygJKbB+g6jo= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=duagon.com; spf=pass smtp.mailfrom=duagon.com; dkim=pass (1024-bit key) header.d=duagon.com header.i=@duagon.com header.b=DWgoVy/Y; arc=fail smtp.client-ip=40.107.167.127 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=duagon.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=duagon.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=duagon.com header.i=@duagon.com header.b="DWgoVy/Y" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ABltzx7zNAnYyERh1b7qayFuIRodbZTvYDFyLFhgbt/8u0DkvVPhntRWtQL3+5yMPcYMqlyc9fELvOVlUJWj4JTbGfa8der3rKkXyNUZ2RxhI6/+qZc0fC2CMS/nCW+3PiVy1qjQYQePsZtdnCdXJSV8ZzWWKCbMXmnh5U3kx1fYpQu6VVSEvJxPLXgTwFvj6cXjis7G83CqVlxMbAiHAyTbgJHQR3AldsXCxC+EsJ1b/Ax5K4LE8Lln674yXr+ai21Wa//tXMvCwuVrzqAdIHxJksH6VU+X+zrN4rt0d7fshfRfd1ax9z+u/9uevpKx1ibRK6yCb2cJnmyvyEkTkg== 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=QCr5S6DpQIaXn25kUnYONmBWArSDB2ATyBfqPSEBf2c=; b=W//tJ+4PAuArWECuq5x9R/SH0QvO4Pdm04DjxyWAAdmfMLyv5Qp9YNUxUH/Q816gmfMWkIxQVPyDJWvZfPeZC4XsjqMbIx0GsHYkF1k89P/w1H5cBNVJGlaCq04bcSHb+kfVD9sxggewX+ACw7YycRUiXE58TgRrAGbyHJVhLbZt3YIKEmRANIExn0xui9GHkGuoFZTbWFPF4uApDfMlfuWrHyeLBFOhGLSSwizstRVREU2+7dsrbuXl39i/e9RdObqcuBZ9RYiwsPs3MXN/FTFXigelC/vaxO/qWlkwLxQMI+0P1oJqxVnz3VpwkY0JI/Ye/sgXYGToIapuXPZK+g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 40.93.85.30) smtp.rcpttodomain=gmail.com smtp.mailfrom=duagon.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=duagon.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=duagon.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=QCr5S6DpQIaXn25kUnYONmBWArSDB2ATyBfqPSEBf2c=; b=DWgoVy/Y3XgceQ1qY58TDhM9FYD8GWFc59fD/t4+au0NqJWwJW/kdGGGkThGEKUAvmcRDMSUiCBZOdfLBv35qlSVASxvNrO3yf64JqcMoVkoR23ljYd+cNAFnpcIGt/t8mGrErJrKAGbYV0mQgmFayOvWJ8HqjPt0Evl27OPkXU= Received: from DUZPR01CA0203.eurprd01.prod.exchangelabs.com (2603:10a6:10:4b6::16) by ZR1P278MB1660.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:a6::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9678.17; Wed, 4 Mar 2026 13:27:26 +0000 Received: from DB3PEPF0000885E.eurprd02.prod.outlook.com (2603:10a6:10:4b6:cafe::6e) by DUZPR01CA0203.outlook.office365.com (2603:10a6:10:4b6::16) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9654.22 via Frontend Transport; Wed, 4 Mar 2026 13:27:22 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 40.93.85.30) smtp.mailfrom=duagon.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=duagon.com; Received-SPF: Pass (protection.outlook.com: domain of duagon.com designates 40.93.85.30 as permitted sender) receiver=protection.outlook.com; client-ip=40.93.85.30; helo=ZRZP278CU001.outbound.protection.outlook.com; pr=C Received: from hz-deliver02.de.seppmail.cloud (162.55.72.218) by DB3PEPF0000885E.mail.protection.outlook.com (10.167.242.9) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9678.18 via Frontend Transport; Wed, 4 Mar 2026 13:27:26 +0000 Received: from hz-glue04.de.seppmail.cloud (unknown [10.11.0.13]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by hz-deliver02.de.seppmail.cloud (Postfix) with ESMTPS id 4fQtkk0ZsWz1144; Wed, 4 Mar 2026 14:27:26 +0100 (CET) Received: from hz-glue04.de.seppmail.cloud (unknown [172.18.0.7]) by hz-glue04.de.seppmail.cloud (Postfix) with ESMTP id 4fQtkk0PRGz231P; Wed, 4 Mar 2026 14:27:26 +0100 (CET) X-SEPP-Suspect: 56a1e56d7d1c49f38541f2b351b4e932 Received: from hz-scan06.de.seppmail.cloud (unknown [10.11.0.39]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by hz-glue06.de.seppmail.cloud (Postfix) with ESMTPS id 4fQtkj72DVz20Nh; Wed, 4 Mar 2026 14:27:25 +0100 (CET) Received: from hz-scan06 (localhost [127.0.0.1]) by hz-scan06.de.seppmail.cloud (Postfix) with SMTP id 4fQtkj6bWtz1l7G; Wed, 04 Mar 2026 14:27:25 +0100 (CET) Received: from hz-m365gate04.de.seppmail.cloud (unknown [10.11.0.37]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by hz-scan06.de.seppmail.cloud (Postfix) with ESMTPS; Wed, 04 Mar 2026 14:27:25 +0100 (CET) Received: from ZRZP278CU001.outbound.protection.outlook.com (mail-switzerlandnorthazlp17011030.outbound.protection.outlook.com [40.93.85.30]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (secp384r1) server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "mail.protection.outlook.com", Issuer "DigiCert Cloud Services CA-1" (not verified)) by hz-m365gate04.de.seppmail.cloud (Postfix) with ESMTPS id 4fQtkh4Dxyz1w9x; Wed, 4 Mar 2026 14:27:24 +0100 (CET) Received: from ZR0P278MB1218.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:80::5) by ZR4P278MB1904.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:b5::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9678.17; Wed, 4 Mar 2026 13:27:21 +0000 Received: from ZR0P278MB1218.CHEP278.PROD.OUTLOOK.COM ([fe80::311:4b5c:48da:9514]) by ZR0P278MB1218.CHEP278.PROD.OUTLOOK.COM ([fe80::311:4b5c:48da:9514%5]) with mapi id 15.20.9678.016; Wed, 4 Mar 2026 13:27:21 +0000 From: Filip Jensen To: morbidrsa@gmail.com Cc: linux-kernel@vger.kernel.org, Filip Jensen , Jose Javier Rodriguez Barbarin Subject: [PATCH v3 2/2] mcb: refactor bus operations out of common code Date: Wed, 4 Mar 2026 14:26:50 +0100 Message-Id: <20260304132650.140680-3-dev-Felipe.Jensen@duagon.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260304132650.140680-1-dev-Felipe.Jensen@duagon.com> References: <20260304132650.140680-1-dev-Felipe.Jensen@duagon.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: MA4P292CA0010.ESPP292.PROD.OUTLOOK.COM (2603:10a6:250:2d::13) To ZR0P278MB1218.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:80::5) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-TrafficTypeDiagnostic: ZR0P278MB1218:EE_|ZR4P278MB1904:EE_|DB3PEPF0000885E:EE_|ZR1P278MB1660:EE_ X-MS-Office365-Filtering-Correlation-Id: 113129a3-ce6d-4a8b-22b5-08de79f1c6f8 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0;ARA:13230040|52116014|376014|1800799024|366016|38350700014; X-Microsoft-Antispam-Message-Info-Original: kmTIXh50vhfzxp/Cs4ruRH3jvDdxSd57W1GCev1EKeSSO/+1EmPVO0qsWnnrbeOCRLQJ/p9O+Gt2TRRvu4bY8jMV9rk+M2/zA/65Aw8XpNei3CBqFtxmiGUcjUYJUSCQs3qkUbje9/pUgARP4AJ/cSBuRcHTf5X+IfbtQ7bNv1Kbdugh0tkW3bQZlSxRnaV8VgObu7IMhM/mqfJn9W10oldnbNxY9FZYvhs1dB9MlnbSLSLc2W80ZEZNSsnA2nvsNwVA+Z6ZFJpOPjI1QQ44Pf88drXeJBS79Ao/4xYE8s2pbZu2gzldFxzFUt4WwWmubTyi/jwJXzXEqmzI77T/zjdpIbyTyH//tokAq/+FYKIfpJgGhG0MvAHTNXaEBgBM7nbDWFh9lSj2y18efUuz7IigagAIWtUfzGlJURzPLhCG2wOhkxr4VQKwAIlsKRtrsdKB5PPnODaOveuuZzSQalSXCjSzP9UCoOs9DVXfLTHmCi0TnIqSUHFSIpaG4mn2Hgdkcb1N6PBDyh+kcKyvuH4686LHDeyhS24SZ8eUBrg3W2SGzY8MMEsCHiR9ZpZcVlTXP7qhvtUrjweq1z7MSlJ/BlAciG076tY8jL5sdYFxBw9z1K5ndr/mR8z/dK+ptMRKI7gf5iqTJOORiEmX1llyqFq+dk6G0qGsj0mtz3Qr7MT5wYdMTBDiHdQlYEnJ/HoLSsUpbJCy4T9GpkUSvtkAcMVmlWuTRCkIcFzr76FVwGWmDSgt5KtD/CBQaqvSdsfHH+4sxEB3BOp24ZCTqmdzOXi3GIjvM1AymEBxmug= X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:ZR0P278MB1218.CHEP278.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(52116014)(376014)(1800799024)(366016)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-Transport-CrossTenantHeadersStamped: ZR4P278MB1904 X-SEPP-CCCVersion: 2025-12-11T08:12:51+01:00 9ed91da2 X-EOPAttributedMessage: 0 X-MS-Exchange-SkipListedInternetSender: ip=[40.93.85.30];domain=ZRZP278CU001.outbound.protection.outlook.com X-MS-Exchange-ExternalOriginalInternetSender: ip=[40.93.85.30];domain=ZRZP278CU001.outbound.protection.outlook.com X-MS-Exchange-Transport-CrossTenantHeadersStripped: DB3PEPF0000885E.eurprd02.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: fc77e0d5-e15a-4645-f343-08de79f1c3ba X-SM-ruleversion: 2.1.0 X-Microsoft-Antispam: BCL:0;ARA:13230040|14060799003|156008|82310400026|36860700016|376014|35042699022|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?KrQZV1LqCaDgSGZXt25hIzHtwUmdZA5G72uSGraQJzLqyKzBU4tIsJfuaK59?= =?us-ascii?Q?uyPyBXvwtkGP+D0amS4TePq/0uAbWQVhL42E0CbEeneTWq94gaDWu5e93mnt?= =?us-ascii?Q?XCCvFKcupgMWMvPbmOOFjbrj8p5x8znEuPM8HCXM6j4fjUDGBX2iLnj6f2qJ?= =?us-ascii?Q?5IkPbmoCPNNgXsKkVnmZFmlVtxkPymlZ8m4ivEpXM0x1VZ8+k1MrtZutQsql?= =?us-ascii?Q?9pyyjl0lK3nQKyZpr737FtUYZQkCs3XoYADHwxub5QoHfCRoxwCNoGDkRBOw?= =?us-ascii?Q?L+Penjw1nAoY7O/bnYT6bEG2adCTg3L22nbobmJs5iCf3PIWRr5Hj4cNVUZQ?= =?us-ascii?Q?FJoQzF9Yfq20VPLrVHn9ZfOLerij1n+0tW7hVwsV9rtZJ9ujvc5Bch/iyYTz?= =?us-ascii?Q?3BW+oz1JXwxLlQe8Mz+7gtXZyrpLwoQnUcP/cndNJ+hn+cGFUyN8xRtVnExQ?= =?us-ascii?Q?ODwsXc78k8C3kXSWfRHGeSkEScp2yVWaQkQntk3xhEIuGE0wLuZWPqCnVWO3?= =?us-ascii?Q?XAhZyuHlDDU3aDVYz6gz/YV5pWXhRKONwbzzfRPjVsV3NV8OL8deN2XbWGxR?= =?us-ascii?Q?TySWcHPfek4bK14wbNWccklIvNBJgVY58XuQ/YbHEXQzAw8hYPgl/KgeJT+U?= =?us-ascii?Q?fXjPCQyV4zJoJGmcQxSGpUl22TCUvQrFaffPEChk7cGOqOpQH4ROsOnEdWIv?= =?us-ascii?Q?9R13f7gCRJLdqsSlBFgIllq2qmX/67STq6v+jGbFaaOfPcGSVtDCF3Ag1jYN?= =?us-ascii?Q?CywrnhPw9b1yd1IgvRPNh5O+OdaA14tV2DIOvkaOBKkR2EEU84HNkWfInYqd?= =?us-ascii?Q?y0tU55CGOfoySxUPesGIYWnojIpjRRYwjc+PV+qgmqukmNtpSWMJbdaNDSBA?= =?us-ascii?Q?muMiIpeAV9ElabFAtQisS+7lwvpXPKCzEcAVr3i1HLKP5h4ybgmtH8FNdTWO?= =?us-ascii?Q?6TbcZH/nnMgfDH9IJJ6/Q56V1mDADhiDjjIc0dyQZUEyBHwJd8xYhFTpX71l?= =?us-ascii?Q?hEfnBrA9zKvnMF5e9DLgjg62t+CmmY0GbSErMK7IWa9E1IPkIgYtEfV0GWxg?= =?us-ascii?Q?TkkC3UDp30xQOCgWhZMP50VP8cKcKQ=3D=3D?= X-Forefront-Antispam-Report: CIP:162.55.72.218;CTRY:CH;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:ZRZP278CU001.outbound.protection.outlook.com;PTR:mail-switzerlandnorthazlp17011030.outbound.protection.outlook.com;CAT:NONE;SFS:(13230040)(14060799003)(156008)(82310400026)(36860700016)(376014)(35042699022)(1800799024);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: iQ+3IlN8ceIjZ5Zrvjw1i02l6PMTLpl6vFDyS2moorkHTdLm1N08nEZWrupIAc/8/y549ncdQuvSvwgJ5vq/kBfXivDR5/xGMYoAfIG0lwmo2MH3Lsksed1+hnLryEO89+QL7gnvDsrbWY55HeAf9zosggF+W3+MTkWMoHNKtCJkApF5vi7TwoUVqpxzmPYUPghTg8KYMhM/ntueJvp8R1MnDQKXYuGV9/RJKissD2XUtYpI7BMfZfFNPl6VZqSei3O1zI9VMJV+hzjrAzKYgq1meCl69JFWXiQIVcz61X7MIMt9UdUIXYXPZZfbVHQszlVCKtXwzR2GgaxWer23n7zJ45h3eArpGpEdNWAuY7CmHd3kQRfjN7JadIkLU/wuUF9MLo9PbPetPLSuWsxGAazI9Mb7AAhSq0xh6HAdq0DmRHuhtXw1jU/5iVr0i/6i X-OriginatorOrg: duagon.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Mar 2026 13:27:26.4420 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 113129a3-ce6d-4a8b-22b5-08de79f1c6f8 X-MS-Exchange-CrossTenant-Id: e5e7e96e-8a28-45d6-9093-a40dd5b51a57 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=e5e7e96e-8a28-45d6-9093-a40dd5b51a57;Ip=[162.55.72.218];Helo=[hz-deliver02.de.seppmail.cloud] X-MS-Exchange-CrossTenant-AuthSource: DB3PEPF0000885E.eurprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: ZR1P278MB1660 Content-Type: text/plain; charset="utf-8" Two operations can be identified that are bus dependent and are needed in both modules mcb-pci and mcb-lpc. In order to avoid having info of both buses in common code, two callbacks operations (is_bar_iomapped and get_bars) are defined and passed as parameters to the mcb-parser. Reviewed-by: Jose Javier Rodriguez Barbarin Signed-off-by: Filip Jensen --- V2 -> V3: Adapt to line moved in patch V3 1/2 V1 -> V2: Patch V1 2/3 is removed as its changes were removed in V1 3/3. V2 has the refactor of the previous V1 3/3 V2: https://lore.kernel.org/lkml/20260302134703.29913-3-dev-Felipe.Jensen@d= uagon.com/ V1: https://lore.kernel.org/lkml/20260226151339.48800-3-dev-Felipe.Jensen@d= uagon.com/ drivers/mcb/mcb-internal.h | 9 ++++- drivers/mcb/mcb-lpc.c | 56 +++++++++++++++++++++++++- drivers/mcb/mcb-parse.c | 81 +++++--------------------------------- drivers/mcb/mcb-pci.c | 40 ++++++++++++++++++- 4 files changed, 111 insertions(+), 75 deletions(-) diff --git a/drivers/mcb/mcb-internal.h b/drivers/mcb/mcb-internal.h index 180ba97cfc08..3152cb4bd1b5 100644 --- a/drivers/mcb/mcb-internal.h +++ b/drivers/mcb/mcb-internal.h @@ -122,6 +122,13 @@ struct chameleon_bar { #define CHAMELEON_BAR_MAX 6 #define BAR_DESC_SIZE(x) ((x) * sizeof(struct chameleon_bar) + sizeof(__le= 32)) =20 -int chameleon_parse_cells(struct mcb_bus *bus, void __iomem *base); +struct chameleon_parse_ops { + bool (*is_bar_iomapped)(struct device *dev, struct chameleon_bar *cb, + int bar); + int (*get_bars)(void __iomem **base, struct chameleon_bar **cb, + struct device *dev); +}; =20 +int chameleon_parse_cells(struct mcb_bus *bus, void __iomem *base, + struct chameleon_parse_ops *cham_bus_ops); #endif diff --git a/drivers/mcb/mcb-lpc.c b/drivers/mcb/mcb-lpc.c index d3f48e1ea08b..9dbf9604e5a9 100644 --- a/drivers/mcb/mcb-lpc.c +++ b/drivers/mcb/mcb-lpc.c @@ -19,6 +19,60 @@ struct priv { void __iomem *base; }; =20 +static int mcb_lpc_get_bars(void __iomem **base, struct chameleon_bar **cb, + struct device *pdev) +{ + struct chameleon_bar *c; + int bar_count; + __le32 reg; + char __iomem *p =3D *base; + int i; + + /* + * For those devices which are not connected + * to the PCI Bus (e.g. LPC) there is a bar + * descriptor located directly after the + * chameleon header. This header is comparable + * to a PCI header. + */ + reg =3D readl(*base); + + bar_count =3D BAR_CNT(reg); + if (bar_count <=3D 0 || bar_count > CHAMELEON_BAR_MAX) + return -ENODEV; + + c =3D kzalloc_objs(struct chameleon_bar, bar_count); + if (!c) + return -ENOMEM; + + /* skip reg1 */ + p +=3D sizeof(__le32); + + for (i =3D 0; i < bar_count; i++) { + c[i].addr =3D readl(p); + c[i].size =3D readl(p + 4); + + p +=3D sizeof(struct chameleon_bar); + } + *base +=3D BAR_DESC_SIZE(bar_count); + *cb =3D c; + + return bar_count; +} + +static bool mcb_is_lpc_bar_iomapped(struct device *dev, + struct chameleon_bar *cb, int bar) +{ + if (cb[bar].addr & 0x01) + return true; + return false; +} + +static struct chameleon_parse_ops lpc_parse_ops =3D { + .is_bar_iomapped =3D mcb_is_lpc_bar_iomapped, + .get_bars =3D mcb_lpc_get_bars, +}; + static int mcb_lpc_probe(struct platform_device *pdev) { struct resource *res; @@ -56,7 +110,7 @@ static int mcb_lpc_probe(struct platform_device *pdev) if (IS_ERR(priv->bus)) return PTR_ERR(priv->bus); =20 - ret =3D chameleon_parse_cells(priv->bus, priv->base); + ret =3D chameleon_parse_cells(priv->bus, priv->base, &lpc_parse_ops); if (ret < 0) { goto out_mcb_bus; } diff --git a/drivers/mcb/mcb-parse.c b/drivers/mcb/mcb-parse.c index 529ac7fe2ca8..f5e86b6e2e4f 100644 --- a/drivers/mcb/mcb-parse.c +++ b/drivers/mcb/mcb-parse.c @@ -6,7 +6,6 @@ #include #include =20 -#include #include "mcb-internal.h" =20 #define for_each_chameleon_cell(dtype, p) \ @@ -29,9 +28,9 @@ static int chameleon_parse_bdd(struct mcb_bus *bus, return 0; } =20 -static int chameleon_parse_gdd(struct mcb_bus *bus, - struct chameleon_bar *cb, - void __iomem *base, int bar_count) +static int chameleon_parse_gdd(struct mcb_bus *bus, struct chameleon_bar *= cb, + void __iomem *base, int bar_count, + struct chameleon_parse_ops *cham_ops) { struct chameleon_gdd __iomem *gdd =3D (struct chameleon_gdd __iomem *) base; @@ -77,7 +76,7 @@ static int chameleon_parse_gdd(struct mcb_bus *bus, goto err; } =20 - if (dev_mapbase & 0x01) { + if (cham_ops->is_bar_iomapped(bus->carrier, cb, mdev->bar)) { pr_info("IO mapped Device (16z%03d) not yet supported\n", mdev->id); ret =3D 0; @@ -107,71 +106,8 @@ static int chameleon_parse_gdd(struct mcb_bus *bus, return ret; } =20 -static void chameleon_parse_bar(void __iomem *base, - struct chameleon_bar *cb, int bar_count) -{ - char __iomem *p =3D base; - int i; - - /* skip reg1 */ - p +=3D sizeof(__le32); - - for (i =3D 0; i < bar_count; i++) { - cb[i].addr =3D readl(p); - cb[i].size =3D readl(p + 4); - - p +=3D sizeof(struct chameleon_bar); - } -} - -static int chameleon_get_bar(void __iomem **base, struct chameleon_bar **c= b, - struct device *dev) -{ - struct chameleon_bar *c; - int bar_count; - __le32 reg; - u32 dtype; - - /* - * For those devices which are not connected - * to the PCI Bus (e.g. LPC) there is a bar - * descriptor located directly after the - * chameleon header. This header is comparable - * to a PCI header. - */ - dtype =3D get_next_dtype(*base); - if (dtype =3D=3D CHAMELEON_DTYPE_BAR) { - reg =3D readl(*base); - - bar_count =3D BAR_CNT(reg); - if (bar_count <=3D 0 || bar_count > CHAMELEON_BAR_MAX) - return -ENODEV; - - c =3D kzalloc_objs(struct chameleon_bar, bar_count); - if (!c) - return -ENOMEM; - - chameleon_parse_bar(*base, c, bar_count); - *base +=3D BAR_DESC_SIZE(bar_count); - } else { - struct pci_dev *pdev =3D to_pci_dev(dev); - - bar_count =3D PCI_STD_NUM_BARS; - c =3D kzalloc_objs(struct chameleon_bar, bar_count); - if (!c) - return -ENOMEM; - for (int i =3D 0; i < bar_count; ++i) { - c[i].addr =3D pci_resource_start(pdev, i); - c[i].size =3D pci_resource_len(pdev, i); - } - } - - *cb =3D c; - - return bar_count; -} - -int chameleon_parse_cells(struct mcb_bus *bus, void __iomem *base) +int chameleon_parse_cells(struct mcb_bus *bus, void __iomem *base, + struct chameleon_parse_ops *cham_bus_ops) { struct chameleon_fpga_header *header; struct chameleon_bar *cb; @@ -207,7 +143,7 @@ int chameleon_parse_cells(struct mcb_bus *bus, void __i= omem *base) memcpy(bus->name, header->filename, CHAMELEON_FILENAME_LEN); bus->name[CHAMELEON_FILENAME_LEN] =3D '\0'; =20 - bar_count =3D chameleon_get_bar(&p, &cb, bus->carrier); + bar_count =3D cham_bus_ops->get_bars(&p, &cb, bus->carrier); if (bar_count < 0) { ret =3D bar_count; goto free_header; @@ -216,7 +152,8 @@ int chameleon_parse_cells(struct mcb_bus *bus, void __i= omem *base) for_each_chameleon_cell(dtype, p) { switch (dtype) { case CHAMELEON_DTYPE_GENERAL: - ret =3D chameleon_parse_gdd(bus, cb, p, bar_count); + ret =3D chameleon_parse_gdd(bus, cb, p, bar_count, + cham_bus_ops); if (ret < 0) goto free_bar; p +=3D sizeof(struct chameleon_gdd); diff --git a/drivers/mcb/mcb-pci.c b/drivers/mcb/mcb-pci.c index 2401c19a8830..6245714646a7 100644 --- a/drivers/mcb/mcb-pci.c +++ b/drivers/mcb/mcb-pci.c @@ -18,6 +18,44 @@ struct priv { void __iomem *base; }; =20 +static int pci_get_bars(void __iomem **base, struct chameleon_bar **cb, + struct device *dev) +{ + struct pci_dev *pdev; + struct chameleon_bar *c; + int bar_count; + + pdev =3D to_pci_dev(dev); + bar_count =3D PCI_STD_NUM_BARS; + c =3D kzalloc_objs(struct chameleon_bar, bar_count); + if (!c) + return -ENOMEM; + for (int i =3D 0; i < bar_count; ++i) { + c[i].addr =3D pci_resource_start(pdev, i); + c[i].size =3D pci_resource_len(pdev, i); + } + + *cb =3D c; + + return bar_count; +} + +static bool is_pci_bar_iomapped(struct device *dev, struct chameleon_bar *= cb, + int bar) +{ + struct pci_dev *pdev; + + pdev =3D to_pci_dev(dev); + if (pci_resource_flags(pdev, bar) & IORESOURCE_IO) + return true; + return false; +} + +static struct chameleon_parse_ops cham_pci_ops =3D { + .is_bar_iomapped =3D is_pci_bar_iomapped, + .get_bars =3D pci_get_bars, +}; + static int mcb_pci_get_irq(struct mcb_device *mdev) { struct mcb_bus *mbus =3D mdev->bus; @@ -86,7 +124,7 @@ static int mcb_pci_probe(struct pci_dev *pdev, const str= uct pci_device_id *id) =20 priv->bus->get_irq =3D mcb_pci_get_irq; =20 - ret =3D chameleon_parse_cells(priv->bus, priv->base); + ret =3D chameleon_parse_cells(priv->bus, priv->base, &cham_pci_ops); if (ret < 0) goto out_mcb_bus; =20 --=20 2.34.1