From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from GVAP278CU002.outbound.protection.outlook.com (mail-switzerlandwestazon11020141.outbound.protection.outlook.com [52.101.188.141]) (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 9C4733E5581 for ; Mon, 2 Mar 2026 13:47:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.188.141 ARC-Seal:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772459275; cv=fail; b=faaD85mRxFa9pe7/QOcMKNfBqGa88qNWQx2Atj+U1fLK6q8b5p6nXnLwZ83BwqpIYdd3hG3t1FMIwpYJ1BALyitJ19JJPg1vZUhrVLask1xhNPzlmwkM8uMWcZdozW1OJjKnemXLbM+aTmA4p2nH1U3ua6UXYxDfr8lfPKsf2Po= ARC-Message-Signature:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772459275; c=relaxed/simple; bh=O1GLgi+y6byJOG1WWL9nH7/9WaWyelYYEiWqHyDg4l0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=UHr5RlXCnAnnYbNNVMxVBPtnA6jFkgeIt3bP3gneOfnZhzUtDfPbJ7120VvfUzNKVTO+y6RshsW878gplrxbleAAp/JoBFrH2czKn81xFTqN1DVf+mmlsY/aV+POg49OvLNl+9a5CRYO4YBCdcgOKFn22e1SuF/puhKM+TxZisc= 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=B4finaDw; arc=fail smtp.client-ip=52.101.188.141 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="B4finaDw" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=OxroJCcvHBbUjfNIwklqfpY436Lm7zN5Vd0ncU7Ndtdd9huvLwxd7MUmSS67Md2EKhCp6FlwE/FOWkpPccvuTgDUxPO0z+nmk7J/OmkAWEFmjWgkM3Qc1SaPwXsxYUL1rmwzMRpeYW4zy9y0acoxuccusqlkDRXqazPNS/iCdj1Qboj8NCwz5x40Vk+5UlIlknmx57YljoacEzJiBfiTQ5HNBt8qU/iWhwPjhsmaVRfG8qbXanlTqH5ZjyYXkvlMWxx67O6tvlynCKDtMfpdf5AAx/B/rvDhMOh3QiucgmbCL5wHp/hWg0LLUEUCap8Stj2cyn2Wr9g4NWLr9rezzA== 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=biryC8k3YxQhCW/d/uJv3xn0y+7e/tGTm/mWfMVWOmw=; b=dliPPL+kw7rAv47GpdsCMZda/NwWCVRu6oD4ulNCJdxnRz4ooB0k/fCKK2KP1ladBAdTHjTJh3af/g8+cdeNYn2irp2DwE4nsMFAICEZ+h3qYcGgZfKs23XUlLixbCEORFxs7VkrWPbw4tk/tw3DZ6hl251AgfNBSqCsDXxbCNscxoWRIxuKmZqjZtnYHYs9XGNjkhpVrhU3629/DgN6X0y3lcxRKsuetd2jcB4HtsIBzJ/icZeXqp4/vQB0BatwmFvb9Z6hIAhI96pEBUep9LFDwzG8F4erNCtwKR2fGAKWdmb1Y2Td1XH4Qi4tEcJwKKQlmtA9+Ax8m9T+W5Shmg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 40.93.86.6) 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=biryC8k3YxQhCW/d/uJv3xn0y+7e/tGTm/mWfMVWOmw=; b=B4finaDwaXee0p/Z0f3bApuNFUtfEptUwMHCe2rzH/+UKqxLuK8t5r/6haAye3PIL+SOOdhd7z5wgSqGX+DNLKGtM+fMIibg7dK22k4kkVzuV30N02ndz8fggYyH3rWTbyxSXcdSebmNopjUi3Wg1YpdyYwY51oKO51AssEtJIo= Received: from AS4P195CA0038.EURP195.PROD.OUTLOOK.COM (2603:10a6:20b:65a::21) by ZR1PPF689FDCEED.CHEP278.PROD.OUTLOOK.COM (2603:10a6:918::292) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9654.20; Mon, 2 Mar 2026 13:47:48 +0000 Received: from AMS0EPF00000198.eurprd05.prod.outlook.com (2603:10a6:20b:65a:cafe::34) by AS4P195CA0038.outlook.office365.com (2603:10a6:20b:65a::21) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9654.20 via Frontend Transport; Mon, 2 Mar 2026 13:47:45 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 40.93.86.6) 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.86.6 as permitted sender) receiver=protection.outlook.com; client-ip=40.93.86.6; helo=GVAP278CU002.outbound.protection.outlook.com; pr=C Received: from hz-deliver02.de.seppmail.cloud (162.55.72.218) by AMS0EPF00000198.mail.protection.outlook.com (10.167.16.244) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9654.16 via Frontend Transport; Mon, 2 Mar 2026 13:47:47 +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 4fPgH75VRdz118g; Mon, 2 Mar 2026 14:47:47 +0100 (CET) Received: from hz-glue04.de.seppmail.cloud (unknown [172.18.0.7]) by hz-glue04.de.seppmail.cloud (Postfix) with ESMTP id 4fPgH75HJXz27nC; Mon, 2 Mar 2026 14:47:47 +0100 (CET) X-SEPP-Suspect: a1460275aab1472898c03d0291a27475 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-glue04.de.seppmail.cloud (Postfix) with ESMTPS id 4fPgH74sQQz27mX; Mon, 2 Mar 2026 14:47:47 +0100 (CET) Received: from hz-scan06 (localhost [127.0.0.1]) by hz-scan06.de.seppmail.cloud (Postfix) with SMTP id 4fPgH74Qhyz1l4v; Mon, 02 Mar 2026 14:47:47 +0100 (CET) Received: from hz-m365gate02.de.seppmail.cloud (unknown [10.11.0.28]) (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; Mon, 02 Mar 2026 14:47:45 +0100 (CET) Received: from GVAP278CU002.outbound.protection.outlook.com (mail-switzerlandwestazlp17010006.outbound.protection.outlook.com [40.93.86.6]) (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-m365gate02.de.seppmail.cloud (Postfix) with ESMTPS id 4fPgH52MMNz2x6F; Mon, 2 Mar 2026 14:47:45 +0100 (CET) Received: from ZR0P278MB1218.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:80::5) by ZRAP278MB0740.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:4c::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9654.21; Mon, 2 Mar 2026 13:47:39 +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.9654.020; Mon, 2 Mar 2026 13:47:38 +0000 From: Filip Jensen To: morbidrsa@gmail.com Cc: linux-kernel@vger.kernel.org, Filip Jensen , Jose Javier Rodriguez Barbarin Subject: [PATCH v2 2/2] mcb: refactor the bus operations out of the common code Date: Mon, 2 Mar 2026 14:47:03 +0100 Message-Id: <20260302134703.29913-3-dev-Felipe.Jensen@duagon.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260302134703.29913-1-dev-Felipe.Jensen@duagon.com> References: <20260302134703.29913-1-dev-Felipe.Jensen@duagon.com> Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: MA2P292CA0029.ESPP292.PROD.OUTLOOK.COM (2603:10a6:250::19) 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_|ZRAP278MB0740:EE_|AMS0EPF00000198:EE_|ZR1PPF689FDCEED:EE_ X-MS-Office365-Filtering-Correlation-Id: bf2ed518-d3ae-44ea-7870-08de78624a38 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0;ARA:13230040|1800799024|366016|52116014|376014|38350700014; X-Microsoft-Antispam-Message-Info-Original: 2IMI3TQkB7P6Q5FiJW1I7E9XNjiAehMK2Kq4MWl5uCMt1u8d+ziyuFSt0aNzj78AQFYyVublFzsF1ZlQ/O7eE0U3a7ORvi/8LyO2NoXm1kq+zEetm5+RfOfoxnZNDzvFl6gubTZckclvfj5vY+kC1LSN6aQwT5Bd8Kc4RL9Pc8GmVzRGI6yxu3DXJheOYTbMC8/WdfDQiIaHsr6Rd64Hm7PRb5iOp3sG6hfZDZpbiOE4YneGLwOepjl+S0CkbXmg8dcQQUKbK208FsmPY0t59K0gFAgi5hobHZCSW2khj0/CnG9WaIHOHl3HVdKqpgMeDPeh1NHS6fOuLiDSynQPsD495bVPL+6PU0beGtP3H6Ii8C74rIMcqMztikBv8DSvHv5MMpYtruf9x6ZdDgI+bmMk+ktUQhrvAZnV50U/hU+Yxk196kb1n9bwKBNxgxGmTo6Cd0LfPfkD74O+wqcTDrDLQwYh3bbRcMPBYV0tP6MaXZBwM+X9SsM6DQ+RpcP42N4Dwcq9sMuZ3JM+2KC3cmoKEq7YU8zEvEJMGcrv/f1mZ/s2+8ZMmrK+II4RKeYHRWujJiy1HyL5wUDC5M3eRRfMOXVkBhIy52MVWMWqaBcyylsgH95+xlSiFkkqTThOMys3m3QhB4VlmenL2aXXd4sW7S3MyQjyE2a0McfVE7aXlhYSSFZn4cUKVGkvAfT8xXdjD6kWOceIq/q8BZPhJWctEfvB0OnsQVbfTTGOixxmgANs5QkPoVObKQw/2GeHltOFrwacPMiQVbAB3b632k8rsevMfHSgpgqwrWuDFzo= 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)(1800799024)(366016)(52116014)(376014)(38350700014);DIR:OUT;SFP:1102; X-MS-Exchange-Transport-CrossTenantHeadersStamped: ZRAP278MB0740 X-SEPP-CCCVersion: 2025-12-11T08:12:51+01:00 9ed91da2 X-EOPAttributedMessage: 0 X-MS-Exchange-SkipListedInternetSender: ip=[40.93.86.6];domain=GVAP278CU002.outbound.protection.outlook.com X-MS-Exchange-ExternalOriginalInternetSender: ip=[40.93.86.6];domain=GVAP278CU002.outbound.protection.outlook.com X-MS-Exchange-Transport-CrossTenantHeadersStripped: AMS0EPF00000198.eurprd05.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 0f070679-e96d-4463-982d-08de78624498 X-SM-ruleversion: 2.1.0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700013|1800799024|14060799003|156008|35042699022|82310400026|376014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?01usDqdJqbbhiSYIbbKis8Ves6a5nnFUVSCFIcaXEmyispbYowdJGlQUMqDC?= =?us-ascii?Q?4qyFAS/gM28LAeIL37zSB2/OZ6fcrpVz2JTafbkxxuNGQK6ZSLPofoCCinJD?= =?us-ascii?Q?SkhXMwoGUDf3TVsp+GMaefx+Q6e4qbP18GoJGcVhcqeE4bWCAK47gfcSWgFh?= =?us-ascii?Q?AvTpj3WR/z2AP7EOn4XsadaZ5CqXD15LtV76iR2p+a7jPH7b3pZf3zUNjG/z?= =?us-ascii?Q?0Zn44n1zDI6MTgHHD2w6/IkllNp0B8AzkSEc7ZvZqsjcN3woi6YYZYD5I5CI?= =?us-ascii?Q?qDtVidDPEd6UWGdnlOr/lNPMqnrUHJxft+EfFlr8Q2Pi8+QN7QwcENsJBRyb?= =?us-ascii?Q?bDX4zRSzvgATeTvI0qzVDM2k0Xc+LO7EQUNTq2dRO9Nk6jX+zhxovxOKv9PQ?= =?us-ascii?Q?fzAkZXg17w1icMm5XDDud5vHWZ8g/dt51BotW0/m9e9oE5dk8UeyZ4uRBB3I?= =?us-ascii?Q?sHJyu4/SEXwNPXovXg2IB/8DquvbFKitkmaIJeh3DGg1tb6Z/1YSEUVXXx2X?= =?us-ascii?Q?ydI3T6KiwM7AJvCRj8SM2dudd7KpzeVRCJBIeSequWiPkw228/ws1tJm6a+t?= =?us-ascii?Q?NbpWu94sr0Nl9GiX7GwTKUG1smTCO8qUXxK033RWL0AAShpJaXpWt30p11c6?= =?us-ascii?Q?Nt91jPLcjy5U4mHnDK27J/n/QTwEXH7ozTlDKuPhJDgSYkkZsDrK/peWGBsw?= =?us-ascii?Q?6aW+U0iRFF+LGSzBK0Pg7iRh/Ras/Q+0nB1sHT9yqtfR+MI33/xULbKGj5dP?= =?us-ascii?Q?dJH54Bv8W1mU3aIBpJKukUlRIiNKqyRY2plUepcBkmvmyRqY91Nhx7S/amV+?= =?us-ascii?Q?ge0GXFvYg8YLkEW9gJF+uqI8ZRZowLg8Bly4kb8J5qmydy4TJNI1ledw+yuj?= =?us-ascii?Q?xBmjqy/MM/iW7DbR5lgWFSJtTpswGGqnCF7YuTvHzdE61m6cGxfayUgcU1T5?= =?us-ascii?Q?pPTs11hH115Um3aeLlr0Yj5Vs7WYM6NRbOku7uQ9eU3agjzfuo0AHB5PuvME?= =?us-ascii?Q?5h9zriGUEJxWeEpQi1DAE3N8z6vTn2s0JrVZ+ovhf7/5ZBW2nqA7LyINKban?= =?us-ascii?Q?6f+dLBRDlslq8zBhNlJLxZwiMSfFEcrBwaNTeOXzSy26PAY6gccCILRC86Gg?= =?us-ascii?Q?7Q15NADBv2WG?= X-Forefront-Antispam-Report: CIP:162.55.72.218;CTRY:CH;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:GVAP278CU002.outbound.protection.outlook.com;PTR:mail-switzerlandwestazlp17010006.outbound.protection.outlook.com;CAT:NONE;SFS:(13230040)(36860700013)(1800799024)(14060799003)(156008)(35042699022)(82310400026)(376014);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: LGCzcseWTjYqDRYE7LQQtSyuVJQvDwy0PTlVLiTG3rMzM0XxyPBC6h6SKiqjvI0/8RAX8BqtURqZ+U7eVYZQX/TPApP8l/1gsvZrVeHXwIx3X1ID1fQWdoUn7Fjj1X1avPib1IIDx4ZnnwubA/w3pYKiucQMIRqgWxTQD3O51SpsuEbuSCDrEDNzmZpy2OZZLwFBwoIaYiSx0l4RhPc4Ipj6ouwffIFV7yaRQF7wiFzLEb+oPTvz4rX8Zj6AFKRbz9nvniR70pRorj87qAuipnbBYThqmFnGYT2OyuFtXPGuWeDdc7kHEkIHdBGFIfueYPZZVDd7CuNnl1lfRRn5mWRHlFJl3zafIv9Ro+OcrbKxMSQnHEDWAG90oT3hSqvdm1bwoMUv15I/fvFVJC0FORq5/sec5VNVOSyykY1KHsCQPPhveQ15j9tE4atlFHdC X-OriginatorOrg: duagon.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Mar 2026 13:47:47.9832 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: bf2ed518-d3ae-44ea-7870-08de78624a38 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: AMS0EPF00000198.eurprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: ZR1PPF689FDCEED 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 --- 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 V1: https://lore.kernel.org/lkml/20260226151339.48800-3-dev-Felipe.Jensen@duagon.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(__le32)) -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); +}; +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; }; +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 = *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 = readl(*base); + + bar_count = BAR_CNT(reg); + if (bar_count <= 0 || bar_count > CHAMELEON_BAR_MAX) + return -ENODEV; + + c = kzalloc_objs(struct chameleon_bar, bar_count); + if (!c) + return -ENOMEM; + + /* skip reg1 */ + p += sizeof(__le32); + + for (i = 0; i < bar_count; i++) { + c[i].addr = readl(p); + c[i].size = readl(p + 4); + + p += sizeof(struct chameleon_bar); + } + *base += BAR_DESC_SIZE(bar_count); + *cb = 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 = { + .is_bar_iomapped = mcb_is_lpc_bar_iomapped, + .get_bars = 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); - ret = chameleon_parse_cells(priv->bus, priv->base); + ret = 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 806be67b960d..f5e86b6e2e4f 100644 --- a/drivers/mcb/mcb-parse.c +++ b/drivers/mcb/mcb-parse.c @@ -6,7 +6,6 @@ #include #include -#include #include "mcb-internal.h" #define for_each_chameleon_cell(dtype, p) \ @@ -29,9 +28,9 @@ static int chameleon_parse_bdd(struct mcb_bus *bus, return 0; } -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 = (struct chameleon_gdd __iomem *) base; @@ -77,7 +76,7 @@ static int chameleon_parse_gdd(struct mcb_bus *bus, goto err; } - 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 = 0; @@ -107,71 +106,8 @@ static int chameleon_parse_gdd(struct mcb_bus *bus, return ret; } -static void chameleon_parse_bar(void __iomem *base, - struct chameleon_bar *cb, int bar_count) -{ - char __iomem *p = base; - int i; - - /* skip reg1 */ - p += sizeof(__le32); - - for (i = 0; i < bar_count; i++) { - cb[i].addr = readl(p); - cb[i].size = readl(p + 4); - - p += sizeof(struct chameleon_bar); - } -} - -static int chameleon_get_bar(void __iomem **base, struct chameleon_bar **cb, - struct device *dev) -{ - struct chameleon_bar *c; - int bar_count; - __le32 reg; - u32 dtype; - struct pci_dev *pdev; - - /* - * 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 = get_next_dtype(*base); - if (dtype == CHAMELEON_DTYPE_BAR) { - reg = readl(*base); - - bar_count = BAR_CNT(reg); - if (bar_count <= 0 || bar_count > CHAMELEON_BAR_MAX) - return -ENODEV; - - c = kzalloc_objs(struct chameleon_bar, bar_count); - if (!c) - return -ENOMEM; - - chameleon_parse_bar(*base, c, bar_count); - *base += BAR_DESC_SIZE(bar_count); - } else { - pdev = to_pci_dev(dev); - bar_count = PCI_STD_NUM_BARS; - c = kzalloc_objs(struct chameleon_bar, bar_count); - if (!c) - return -ENOMEM; - for (int i = 0; i < bar_count; ++i) { - c[i].addr = pci_resource_start(pdev, i); - c[i].size = pci_resource_len(pdev, i); - } - } - - *cb = 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 __iomem *base) memcpy(bus->name, header->filename, CHAMELEON_FILENAME_LEN); bus->name[CHAMELEON_FILENAME_LEN] = '\0'; - bar_count = chameleon_get_bar(&p, &cb, bus->carrier); + bar_count = cham_bus_ops->get_bars(&p, &cb, bus->carrier); if (bar_count < 0) { ret = bar_count; goto free_header; @@ -216,7 +152,8 @@ int chameleon_parse_cells(struct mcb_bus *bus, void __iomem *base) for_each_chameleon_cell(dtype, p) { switch (dtype) { case CHAMELEON_DTYPE_GENERAL: - ret = chameleon_parse_gdd(bus, cb, p, bar_count); + ret = chameleon_parse_gdd(bus, cb, p, bar_count, + cham_bus_ops); if (ret < 0) goto free_bar; p += 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; }; +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 = to_pci_dev(dev); + bar_count = PCI_STD_NUM_BARS; + c = kzalloc_objs(struct chameleon_bar, bar_count); + if (!c) + return -ENOMEM; + for (int i = 0; i < bar_count; ++i) { + c[i].addr = pci_resource_start(pdev, i); + c[i].size = pci_resource_len(pdev, i); + } + + *cb = c; + + return bar_count; +} + +static bool is_pci_bar_iomapped(struct device *dev, struct chameleon_bar *cb, + int bar) +{ + struct pci_dev *pdev; + + pdev = to_pci_dev(dev); + if (pci_resource_flags(pdev, bar) & IORESOURCE_IO) + return true; + return false; +} + +static struct chameleon_parse_ops cham_pci_ops = { + .is_bar_iomapped = is_pci_bar_iomapped, + .get_bars = pci_get_bars, +}; + static int mcb_pci_get_irq(struct mcb_device *mdev) { struct mcb_bus *mbus = mdev->bus; @@ -86,7 +124,7 @@ static int mcb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) priv->bus->get_irq = mcb_pci_get_irq; - ret = chameleon_parse_cells(priv->bus, priv->base); + ret = chameleon_parse_cells(priv->bus, priv->base, &cham_pci_ops); if (ret < 0) goto out_mcb_bus; -- 2.34.1