{"id":2196679,"url":"http://patchwork.ozlabs.org/api/1.0/patches/2196679/?format=json","project":{"id":28,"url":"http://patchwork.ozlabs.org/api/1.0/projects/28/?format=json","name":"Linux PCI development","link_name":"linux-pci","list_id":"linux-pci.vger.kernel.org","list_email":"linux-pci@vger.kernel.org","web_url":null,"scm_url":null,"webscm_url":null},"msgid":"<SI2PR01MB43934E720AED2013EF55B423DC6CA@SI2PR01MB4393.apcprd01.prod.exchangelabs.com>","date":"2026-02-16T02:26:40","name":"[v5,4/6] PCI: Refactor disable_acs_redir and config_acs param handling","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"5675e5f95cadf21c75af466cd8db5ba3e847ae9d","submitter":{"id":92382,"url":"http://patchwork.ozlabs.org/api/1.0/people/92382/?format=json","name":"Wei Wang","email":"wei.w.wang@hotmail.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/linux-pci/patch/SI2PR01MB43934E720AED2013EF55B423DC6CA@SI2PR01MB4393.apcprd01.prod.exchangelabs.com/mbox/","series":[{"id":492242,"url":"http://patchwork.ozlabs.org/api/1.0/series/492242/?format=json","date":"2026-02-16T02:26:36","name":"PCI: Add support for ACS Enhanced Capability","version":5,"mbox":"http://patchwork.ozlabs.org/series/492242/mbox/"}],"check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2196679/checks/","tags":{},"headers":{"Return-Path":"\n <linux-pci+bounces-47327-incoming=patchwork.ozlabs.org@vger.kernel.org>","X-Original-To":["incoming@patchwork.ozlabs.org","linux-pci@vger.kernel.org"],"Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=hotmail.com header.i=@hotmail.com header.a=rsa-sha256\n header.s=selector1 header.b=Q/EWBt+Y;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=2600:3c04:e001:36c::12fc:5321; helo=tor.lore.kernel.org;\n envelope-from=linux-pci+bounces-47327-incoming=patchwork.ozlabs.org@vger.kernel.org;\n receiver=patchwork.ozlabs.org)","smtp.subspace.kernel.org;\n\tdkim=pass (2048-bit key) header.d=hotmail.com header.i=@hotmail.com\n header.b=\"Q/EWBt+Y\"","smtp.subspace.kernel.org;\n arc=fail smtp.client-ip=52.103.66.62","smtp.subspace.kernel.org;\n dmarc=pass (p=none dis=none) header.from=hotmail.com","smtp.subspace.kernel.org;\n spf=pass smtp.mailfrom=hotmail.com"],"Received":["from tor.lore.kernel.org (tor.lore.kernel.org\n [IPv6:2600:3c04:e001:36c::12fc:5321])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fDmsy6029z1xtN\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 16 Feb 2026 13:28:38 +1100 (AEDT)","from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby tor.lore.kernel.org (Postfix) with ESMTP id 8965630263DA\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 16 Feb 2026 02:27:41 +0000 (UTC)","from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id A51E52D0602;\n\tMon, 16 Feb 2026 02:27:27 +0000 (UTC)","from OS8PR02CU002.outbound.protection.outlook.com\n (mail-japanwestazolkn19012062.outbound.protection.outlook.com [52.103.66.62])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby smtp.subspace.kernel.org (Postfix) with ESMTPS id 1C9762BE031;\n\tMon, 16 Feb 2026 02:27:25 +0000 (UTC)","from SI2PR01MB4393.apcprd01.prod.exchangelabs.com\n (2603:1096:4:1b0::7) by SEYPR01MB5340.apcprd01.prod.exchangelabs.com\n (2603:1096:101:d2::14) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9611.16; Mon, 16 Feb\n 2026 02:27:21 +0000","from SI2PR01MB4393.apcprd01.prod.exchangelabs.com\n ([fe80::c735:fab8:6e3d:6d1c]) by SI2PR01MB4393.apcprd01.prod.exchangelabs.com\n ([fe80::c735:fab8:6e3d:6d1c%4]) with mapi id 15.20.9611.012; Mon, 16 Feb 2026\n 02:27:21 +0000"],"ARC-Seal":["i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1771208847; cv=fail;\n b=cAOAPnzic4GfYYYBSC+PbK5wsx8Y7bpUD3nK+xv74aKZtLCHaB1wzdKlpHV1B5IyCphSYv6xHU6KTgoDSocVPU9s9Y5lLrTCtcHC+3HfMehY5bZzybiyqCMJ+X5zsleBmBrlK7aYfvygxEeMnN0UQw+gWRECWWShgptXv8TEOT4=","i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;\n b=Em5dxMdJwwVu/ZKAr1IWmXyH8okN52GGH/dPk+0MB//OAXnGUwM0JrnzHELqrJ8tLKAHkRufUegCTG6yMv9QFYZ/h0woOSf9XU36ELBePmff2wm00NHhZiCc9f4eY/WL7FgJfkqqX8G06U7CcOOhFoHkckJcvi4rHppBwJ6uatFhIt4xvDMMjZK/KhA4tSURmLvb0q1YZA15KWJnGElVJkwN9R0n1nf8UzHQXSl6JU4hWKlNvZVi8IsGKbGp+n1HFHKzBjVpCChPz46txSAm0+tHLBk2vgBKsZSbKDFqVt1MUyyiCMyOF7mGqnd25SxCA4KnjC+WrOKcxe0vCG2U5Q=="],"ARC-Message-Signature":["i=2; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1771208847; c=relaxed/simple;\n\tbh=t/1H7w8Z7pw99PEf+rK39GtO5uNurvp6jvbx1TodJV0=;\n\th=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:\n\t Content-Type:MIME-Version;\n b=kBN8Ux5nb57I5e4DoCGUDdU4HLD82kJs8mNRmbLkcVRX9fedIS15xOi/Ex1aa3j3jvAXhegAO9flRuOIxD8zSaO3NVQJQJnggW9L24ILUv8EDVVVPAdTfXrFFzVr6UL4sX3ImkR9bajk5DRbqbhxUZ3NGu1BY5ttn2kSUMPpRZk=","i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector10001;\n 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;\n bh=RQgQDje11x4CY1m8FzCEvKIFyyYvnuH1+VQ9TXCRuT8=;\n b=K7i1wcMUBQ+IJLUB/j3WQOfh4QyMq0wlLd8DDA17F5J7VmUJrG2xYYidHoXCMPtcmDcSIKVarEzrTKm0YJkT1X2D3+TaDWDiu65moBPPbMsU+qoWGqDNRlfIFDOnWe/JlM+2fiBXizhSW68yKvEm7qv76w8HmJ8cIQlzGFsgo1tnbrwyT8ofhoctmFfASl23sssFEgqrAMYvPIqT6qTNKjxjNKqAihMH3p+fqklhZnfoKmbhFzwrxiN3RdamljzwOlRW4tTs9JEUKLcuLchfDGNhHLfFAafcyLIol4TWZMqBmFi7rI2Mn9WdpDt8tHBNw9AJ4BzBr0S6JhuHVhRaDw=="],"ARC-Authentication-Results":["i=2; smtp.subspace.kernel.org;\n dmarc=pass (p=none dis=none) header.from=hotmail.com;\n spf=pass smtp.mailfrom=hotmail.com;\n dkim=pass (2048-bit key) header.d=hotmail.com header.i=@hotmail.com\n header.b=Q/EWBt+Y; arc=fail smtp.client-ip=52.103.66.62","i=1; mx.microsoft.com 1; spf=none; dmarc=none;\n dkim=none; arc=none"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=hotmail.com;\n s=selector1;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=RQgQDje11x4CY1m8FzCEvKIFyyYvnuH1+VQ9TXCRuT8=;\n b=Q/EWBt+YUsXcy71lPIRApppvtvPqmFajqad54WEBG+EU5IqNJvRdz5RbNYZLIrjyyDvtSwsW/UlISeE+Wk3oXc2zUH22fiGAbmDuijHwJsnDKUgZvAQncH4V2jJXBm4m3BFNLQZBZal33fROlJ7JgekxQ6Z/y48ykXytelrZmfBrCqKGWaMkvaOT4ZDiVIUjvp6qD1cNhTsAgdnyB+5S490OICa5voCuREBIOIi9uvkBWaFH5/ay+mp2TDn3hJCsGy0adyg8mmZ3pvKXzGR/QSTrmY+bWu7ZvwL4DuohbI1XbKnjLjCUiLtGPiL+BrgcXH2Aj364UT8cN0iqn4EECw==","From":"Wei Wang <wei.w.wang@hotmail.com>","To":"bhelgaas@google.com,\n\tjgg@nvidia.com,\n\tjonathan.cameron@huawei.com,\n\takpm@linux-foundation.org,\n\tbp@alien8.de,\n\trdunlap@infradead.org,\n\talex@shazbot.org,\n\tkevin.tian@intel.com","Cc":"linux-kernel@vger.kernel.org,\n\tlinux-pci@vger.kernel.org,\n\twei.w.wang@hotmail.com","Subject":"[PATCH v5 4/6] PCI: Refactor disable_acs_redir and config_acs param\n handling","Date":"Mon, 16 Feb 2026 10:26:40 +0800","Message-ID":"\n <SI2PR01MB43934E720AED2013EF55B423DC6CA@SI2PR01MB4393.apcprd01.prod.exchangelabs.com>","X-Mailer":"git-send-email 2.51.0","In-Reply-To":"\n <SI2PR01MB439326AF08A79D1C5661C29BDC6CA@SI2PR01MB4393.apcprd01.prod.exchangelabs.com>","References":"\n <SI2PR01MB439326AF08A79D1C5661C29BDC6CA@SI2PR01MB4393.apcprd01.prod.exchangelabs.com>","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","X-ClientProxiedBy":"TY4P301CA0029.JPNP301.PROD.OUTLOOK.COM\n (2603:1096:405:2be::12) To SI2PR01MB4393.apcprd01.prod.exchangelabs.com\n (2603:1096:4:1b0::7)","X-Microsoft-Original-Message-ID":"\n <20260216022642.112923-5-wei.w.wang@hotmail.com>","Precedence":"bulk","X-Mailing-List":"linux-pci@vger.kernel.org","List-Id":"<linux-pci.vger.kernel.org>","List-Subscribe":"<mailto:linux-pci+subscribe@vger.kernel.org>","List-Unsubscribe":"<mailto:linux-pci+unsubscribe@vger.kernel.org>","MIME-Version":"1.0","X-MS-Exchange-MessageSentRepresentingType":"1","X-MS-PublicTrafficType":"Email","X-MS-TrafficTypeDiagnostic":"SI2PR01MB4393:EE_|SEYPR01MB5340:EE_","X-MS-Office365-Filtering-Correlation-Id":"94614ee3-64e4-446e-c5cd-08de6d02e9e3","X-Microsoft-Antispam":"\n\tBCL:0;ARA:14566002|51005399006|6090799003|5072599009|461199028|41001999006|8060799015|19110799012|37102599003|15080799012|23021999003|12121999013|3412199025|440099028|40105399003|1710799026;","X-Microsoft-Antispam-Message-Info":"=?utf-8?q?lwsvNgb+mNF2NUVONyLLaJChdOKa7f4?=\n\t=?utf-8?q?aS+v22M8CSvo43luDsTgtqfGUFQVsR8GQU8+/8E1mGCElg7aWDpOLOvG8BRLMtEho?=\n\t=?utf-8?q?xanGBmKHntYvV1O3r+15ZAxCIN6RDVtOA4GcODqwnnjABOrkkQJsW/TyQmpanJgY1?=\n\t=?utf-8?q?p5sMThwwA6mxSx5DNuNIaHXg8emUEKHKdae6rE5Ri5W9RTfDllSM+Em5fQUFoi6Cb?=\n\t=?utf-8?q?2X5YSDMi0hH9LzkmR0b7+w3jaJFGWjTIk8MR6ZUJZ2iuQUOXhDQRYSWGd6GgQWhKw?=\n\t=?utf-8?q?Kxo4eiQu+AilPYPZ2YjpaZRQhmXU/JkQDVzgvPY0XvApxXiLBrCRhtpLn+3HkYMzv?=\n\t=?utf-8?q?Ib7tI36ckggQqLcsrGFActIYtlr6V5iPUBR2MUs5Sm0k6uiGWc2RCeO/T9io1pK+Q?=\n\t=?utf-8?q?QCrdCkpKi4jFkKgEEcccpGdPSv1zOFOlkY6CHMvwhwthd/V3eRrs1Qt2/LwAH0P+E?=\n\t=?utf-8?q?rDWJUgvAzJ+3D9MIgjSUqTb3FVNUSL38qz81OvuVf9lXCLCBSPNsFxnvMtlipJN9I?=\n\t=?utf-8?q?tdXp6DB6oqOmL1A44OYxkjhjyEcJuCmGiUHEYTbR7AZYP+4NBJ/VgAk4tQ6xur18e?=\n\t=?utf-8?q?LewT1puJFANm+HhxY82/u9LTulrFP50YfzJN/akRPptaPEjkCbd2my9lFsnmWh5rr?=\n\t=?utf-8?q?fmCOwgObje4wFmTTrqsA12zkk6exAFgKrRw5AYA2xEoPygb3LKGR51Ef+1ZciLCWr?=\n\t=?utf-8?q?Asj5s16YBvp+YsEk0UhsSTbmRG86BdldneCrRuSbjY5hzvwMuTtIlSJSie5mT8Tz8?=\n\t=?utf-8?q?ofMzLOqRj4L/8N/ma+1sDPkruKkhfJNjFdnULDFYS7pUUyvE5tLdzgZp4poQ9yLwy?=\n\t=?utf-8?q?cvKamgx+PSYFwRnXfpKv+2EdqwnQ+34/+sHjPFipUAsnS5F24ZkTyN9HCwPvUOeXn?=\n\t=?utf-8?q?3QfMkoj/gaYSyOQMd4aYsNJMU2tUNhwn+oA8mpUOOl9YnlBmJvb0VN9iWZBFAJb4N?=\n\t=?utf-8?q?N9mJdXgqOAfW28TF9jsaHvOpbcSIuz8XvlU1Q/+xX0Ge2p9mFoMpPOwBN6Qjgmn9Z?=\n\t=?utf-8?q?PKM8G0XQCX4rpux+fz1fA1nk/mYWEkw7liAvejjprsn8mcBrgGW55mjRLo8UZ5+9U?=\n\t=?utf-8?q?OiATFZ9c1c9G1PS26oZYz9cfLiWBRwUI7zZ9vxii582STRY/yXMR3z62maT4TM6/t?=\n\t=?utf-8?q?qLnwvOjKCXK0EnZsAsXsBgmilkTjJTCmGg3vtJATG7fqZJQCkOI6uVr9mlCbhirNk?=\n\t=?utf-8?q?9ix7kwFZNh+tFLi7CDstHAajNk1MVclh+eVb3H0WS3Rv7Lznw4a8yrR979OrD4zTK?=\n\t=?utf-8?q?UWU3v993ducLdBXjNAwscnHz18Sk120qrqg=3D=3D?=","X-MS-Exchange-AntiSpam-MessageData-ChunkCount":"1","X-MS-Exchange-AntiSpam-MessageData-0":"=?utf-8?q?CQgyTMbMEDinq1AZOmeBb6tNGRuB?=\n\t=?utf-8?q?ROh7jqkvymnzl29k5uR+5nh4INX4p/XkmPi2i5T9qlVoZ/xRAc9BVS7HsRf5eRYgi?=\n\t=?utf-8?q?1bJV08WtzZgyuyo1f7vDrCKOPAsxk6FfasrJQZZR1Fh5xopL8Ih1LX2IKjRlj75p3?=\n\t=?utf-8?q?dp7ZhmDhDtRm1SUL16rxc7uhtjKQdWPAB+4dKk0Jbz9NoqGhqTWNIwU51j8AA5Zhh?=\n\t=?utf-8?q?x46woEvbk+O5Z00Sq9b2ZXVtgGHSwXC+EKvPc7wEsb4pEfwUJcJQ9k8Hwx3QLbM5K?=\n\t=?utf-8?q?fwYgZbRJC+8cItE3MyfHFUanvqsyavCnGsLajKpikALNkwFmjRvLRQ+WdPdZs3TNI?=\n\t=?utf-8?q?ns9wJmT9Q2WS5Lb3y8a8K6Ygb+B01zLDn0EQUicLn9CWy5lWJU/QnFZ0IKSdL3mAB?=\n\t=?utf-8?q?Cj0nsA4FMeY5bYWGGKd76O5+bLvqK5uCziNbU90w59/fs8GGPRLA2sadJU15ReQfE?=\n\t=?utf-8?q?2BEbfBJ3KWEhyXu9iM0/BN3D3tC5mQbVpu8dqAnxPubE+fWgoRMxWjWNxqliIlX5j?=\n\t=?utf-8?q?G0fBflKlsRKKNzPZdC/bBdbkm9Tz/oEf9MWW2FDWKJD5awVR3nFMhXFAPbfv1X0s3?=\n\t=?utf-8?q?fNbeXEYeoal1vjKTXFalob2knrAh88U0/hxAHaybrPi2rYPEyeY3O8lwMBoRvoiWV?=\n\t=?utf-8?q?gmlh2TpyGxde4bl8URMfXRlPY3znnA+YXJVFpM8tjMQG0COHMlm6IiDpXmSw+EOp5?=\n\t=?utf-8?q?TRWRlHKlsj3GwFjtNN2GHK2uREe6heexNHoI9iWrFaZScN3pGEDnxrXUuojTQL1zi?=\n\t=?utf-8?q?+60pljxG9TbXDeoj0GuxropLOU45aWgvqGyT5VTI/MYZv1G3hlz0up7+iN7qMsXM3?=\n\t=?utf-8?q?gNO1q7hzgwPSiL5NKXmRBRc+hF+1dB1Z44ouwQVgKnsv6j2muFtG44/PLsqrbsWPo?=\n\t=?utf-8?q?lnHoL4ezg5PUjQCE9yOebo10qPZyLMRXFiaoId8qFL5FN8x28uOJMzBkdFpzzHGko?=\n\t=?utf-8?q?PZ2kDxkQcn1qqhjba0dB5HpVztQ8a+Ps5NerE1iy3VEafPRhQNQbM9HPWt4sOUc/6?=\n\t=?utf-8?q?wPjdv+ckBjLcAPm5Nu3WePUS1hhmfv/oHUW4yEM1y59lxhONqckmKFYJIDs8Z0g/b?=\n\t=?utf-8?q?98i6CuVeelp6cT9KhnQiD3Ol4x6OCwFOenaUWrgGC6/mG9qFaX9QzqKC30BSFrsDy?=\n\t=?utf-8?q?/XmiTpkkZDIeXuhJwt2bvjN+O5Y6yIC2RRzuujxw18YFdQ5pd/CFa3aoTdaoJxAXa?=\n\t=?utf-8?q?DLia29RNCRJAhzdk7xuSbcnr7Ie5vgCLQXW2raqbMoxYmTC+jrvqr9GpF7qwOAhz8?=\n\t=?utf-8?q?OajR36xr7ZUaFjyZuT9snSmCzuklRcmwKc5k2Gz1XqbSC1OdbndnoTDstuDtS50fG?=\n\t=?utf-8?q?9qfdKY2/NHNZCJy?=","X-OriginatorOrg":"sct-15-20-9412-4-msonline-outlook-5f51e.templateTenant","X-MS-Exchange-CrossTenant-Network-Message-Id":"\n 94614ee3-64e4-446e-c5cd-08de6d02e9e3","X-MS-Exchange-CrossTenant-AuthSource":"\n SI2PR01MB4393.apcprd01.prod.exchangelabs.com","X-MS-Exchange-CrossTenant-AuthAs":"Internal","X-MS-Exchange-CrossTenant-OriginalArrivalTime":"16 Feb 2026 02:27:21.8268\n (UTC)","X-MS-Exchange-CrossTenant-FromEntityHeader":"Hosted","X-MS-Exchange-CrossTenant-Id":"84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa","X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg":"\n\t00000000-0000-0000-0000-000000000000","X-MS-Exchange-Transport-CrossTenantHeadersStamped":"SEYPR01MB5340"},"content":"The current implementation mixes disable_acs_redir and config_acs param\nprocessing inside __pci_config_acs(), using acs_mask==0 as an implicit\nsignal to switch into config_acs_param mode. The intertwined logic is\nhard to follow and easy to break:\n\n  - The acs_mask==0 special case is non-obvious and obscures which code\n    paths apply to which parameter.\n  - The interleaved logic is fragile; changes intended for one parameter\n    can unintentionally affect the other. For example,\n    pci_dev_specific_disable_acs_redir() is invoked on the common path\n    even though it should apply only to disable_acs_redir.\n\nSplit the two behaviors into dedicated functions,\npci_param_disable_acs_redir() and pci_param_config_acs(), making the\ncontrol flow explicit and easier to maintain.\n\nThe new pci_param_config_acs() implementation also improves on the\noriginal logic:\n\n  - It searches for the matching device first and parses ACS flags only\n    for the matched device, avoiding unnecessary work.\n  - A switch statement replaces multiple if/else blocks, improving\n    readability.\n  - Bounds checking (max_shift) prevents overrunning the device’s ACS\n    capability bits.\n  - Variable names (enabled_bits, disabled_bits) more clearly express\n    their roles compared to the previous mask/flags pair.\n  - Error messages are simplified to reduce dmesg noise.\n\nThis refactor separates concerns, improves robustness, and makes future\nextensions to ACS parameter handling safer and easier to review.\n\nSigned-off-by: Wei Wang <wei.w.wang@hotmail.com>\n---\n drivers/pci/pci.c | 168 +++++++++++++++++++++++++++-------------------\n 1 file changed, 98 insertions(+), 70 deletions(-)","diff":"diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c\nindex 0f0b384e782f..4b32fbbcacb6 100644\n--- a/drivers/pci/pci.c\n+++ b/drivers/pci/pci.c\n@@ -907,87 +907,117 @@ struct pci_acs {\n \tu16 fw_ctrl;\n };\n \n-static void __pci_config_acs(struct pci_dev *dev, struct pci_acs *caps,\n-\t\t\t     const char *p, const u16 acs_mask, const u16 acs_flags)\n+static bool pci_dev_match_disable_acs_redir(struct pci_dev *dev, const char *p)\n {\n-\tu16 flags = acs_flags;\n-\tu16 mask = acs_mask;\n-\tchar *delimit;\n \tint ret = 0;\n \n-\tif (!p)\n-\t\treturn;\n-\n \twhile (*p) {\n-\t\tif (!acs_mask) {\n-\t\t\t/* Check for ACS flags */\n-\t\t\tdelimit = strstr(p, \"@\");\n-\t\t\tif (delimit) {\n-\t\t\t\tint end;\n-\t\t\t\tu32 shift = 0;\n-\n-\t\t\t\tend = delimit - p - 1;\n-\t\t\t\tmask = 0;\n-\t\t\t\tflags = 0;\n-\n-\t\t\t\twhile (end > -1) {\n-\t\t\t\t\tif (*(p + end) == '0') {\n-\t\t\t\t\t\tmask |= 1 << shift;\n-\t\t\t\t\t\tshift++;\n-\t\t\t\t\t\tend--;\n-\t\t\t\t\t} else if (*(p + end) == '1') {\n-\t\t\t\t\t\tmask |= 1 << shift;\n-\t\t\t\t\t\tflags |= 1 << shift;\n-\t\t\t\t\t\tshift++;\n-\t\t\t\t\t\tend--;\n-\t\t\t\t\t} else if ((*(p + end) == 'x') || (*(p + end) == 'X')) {\n-\t\t\t\t\t\tshift++;\n-\t\t\t\t\t\tend--;\n-\t\t\t\t\t} else {\n-\t\t\t\t\t\tpci_err(dev, \"Invalid ACS flags... Ignoring\\n\");\n-\t\t\t\t\t\treturn;\n-\t\t\t\t\t}\n-\t\t\t\t}\n-\t\t\t\tp = delimit + 1;\n-\t\t\t} else {\n-\t\t\t\tpci_err(dev, \"ACS Flags missing\\n\");\n-\t\t\t\treturn;\n-\t\t\t}\n-\t\t}\n-\n \t\tret = pci_dev_str_match(dev, p, &p);\n-\t\tif (ret < 0) {\n+\t\tif (ret == 1)\n+\t\t\treturn true;\n+\t\telse if (ret < 0)\n \t\t\tbreak;\n-\t\t} else if (ret == 1) {\n-\t\t\t/* Found a match */\n-\t\t\tbreak;\n-\t\t}\n \t}\n \n-\tif (ret != 1)\n+\treturn false;\n+}\n+\n+static void pci_param_disable_acs_redir(struct pci_dev *dev,\n+\t\t\t\t\tstruct pci_acs *caps)\n+{\n+\tu16 acs_redir_mask = PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_EC;\n+\n+\tif (!disable_acs_redir_param ||\n+\t    !pci_dev_match_disable_acs_redir(dev, disable_acs_redir_param) ||\n+\t    !pci_dev_specific_disable_acs_redir(dev))\n \t\treturn;\n \n-\tif (!pci_dev_specific_disable_acs_redir(dev))\n-\t\treturn;\n+\tcaps->ctrl = caps->fw_ctrl & ~acs_redir_mask;\n+}\n \n-\tif (flags & ~dev->acs_capabilities) {\n-\t\tpci_err(dev, \"Invalid ACS enable flags specified: %#06x\\n\",\n-\t\t\t(u16)(flags & ~dev->acs_capabilities));\n-\t\treturn;\n-\t}\n-\n-\tpci_dbg(dev, \"ACS mask  = %#06x\\n\", mask);\n-\tpci_dbg(dev, \"ACS flags = %#06x\\n\", flags);\n-\tpci_dbg(dev, \"ACS control = %#06x\\n\", caps->ctrl);\n-\tpci_dbg(dev, \"ACS fw_ctrl = %#06x\\n\", caps->fw_ctrl);\n+static const char *pci_dev_match_config_acs(struct pci_dev *dev, const char *p)\n+{\n+\tconst char *seg;\n+\tint ret;\n \n \t/*\n-\t * For mask bits that are 0, copy them from the firmware setting\n-\t * and apply flags for all the mask bits that are 1.\n+\t * Example: 11101010x@0000:01:00.0;101x@0000:02:00.0;1@0000:03:00.0\n+\t * Three segments delimited via ';'. @seg always points to the start\n+\t * of a segment and p advances to the start of the device id (BDF)\n+\t * after '@'. Upon match, return the start of the matching segment.\n \t */\n-\tcaps->ctrl = (caps->fw_ctrl & ~mask) | (flags & mask);\n+\twhile (*p) {\n+\t\tseg = p;\n+\t\tp = strchr(seg, '@');\n+\t\t/* If malformed string, stop parsing. */\n+\t\tif (!p || p == seg)\n+\t\t\tbreak;\n \n-\tpci_info(dev, \"Configured ACS to %#06x\\n\", caps->ctrl);\n+\t\tp++;\n+\t\t/* pci_dev_str_match() updates p to the next segment. */\n+\t\tret = pci_dev_str_match(dev, p, &p);\n+\t\tif (ret == 1)\n+\t\t\treturn seg;\n+\t\telse if (ret < 0)\n+\t\t\tbreak;\n+\t}\n+\n+\treturn NULL;\n+}\n+\n+static void pci_param_config_acs(struct pci_dev *dev, struct pci_acs *caps)\n+{\n+\tu16 shift = 0, max_shift = fls(dev->acs_capabilities) - 1;\n+\tu16 enabled_bits = 0, disabled_bits = 0;\n+\tconst char *p, *seg;\n+\n+\tif (!config_acs_param)\n+\t\treturn;\n+\n+\tseg = pci_dev_match_config_acs(dev, config_acs_param);\n+\tif (!seg)\n+\t\treturn;\n+\n+\tp = strchr(seg, '@');\n+\t/* Parse bitstring backwards from '@' */\n+\twhile (p > seg) {\n+\t\tif (shift > max_shift) {\n+\t\t\tpci_err(dev, \"ACS flag bit %d exceed range %d\\n\",\n+\t\t\t\tshift, max_shift);\n+\t\t\treturn;\n+\t\t}\n+\n+\t\tswitch (*--p) {\n+\t\tcase '1':\n+\t\t\tenabled_bits |= BIT(shift);\n+\t\t\tbreak;\n+\t\tcase '0':\n+\t\t\tdisabled_bits |= BIT(shift);\n+\t\t\tbreak;\n+\t\tcase 'x':\n+\t\tcase 'X':\n+\t\t\t/* Skip this bit */\n+\t\t\tbreak;\n+\t\tdefault:\n+\t\t\tpci_err(dev, \"Invalid ACS flag character '%c'\\n\", *p);\n+\t\t\treturn;\n+\t\t}\n+\t\tshift++;\n+\t}\n+\n+\tif (enabled_bits & ~dev->acs_capabilities) {\n+\t\tpci_err(dev, \"Invalid ACS enable flags specified: %#06x\\n\",\n+\t\t\t(u16)(enabled_bits & ~dev->acs_capabilities));\n+\t\treturn;\n+\t}\n+\n+\tpci_dbg(dev, \"ACS enabled: %#06x, disabled: %#06x\\n\",\n+\t\tenabled_bits, disabled_bits);\n+\n+\tcaps->ctrl = (caps->fw_ctrl | enabled_bits) & ~disabled_bits;\n+\n+\tpci_info(dev, \"Configured ACS to %#06x (FW default: %#06x)\\n\",\n+\t\t caps->ctrl, caps->fw_ctrl);\n }\n \n /**\n@@ -1044,10 +1074,8 @@ void pci_enable_acs(struct pci_dev *dev)\n \t * Always apply caps from the command line, even if there is no iommu.\n \t * Trust that the admin has a reason to change the ACS settings.\n \t */\n-\t__pci_config_acs(dev, &caps, disable_acs_redir_param,\n-\t\t\t PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_EC,\n-\t\t\t ~(PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_EC));\n-\t__pci_config_acs(dev, &caps, config_acs_param, 0, 0);\n+\tpci_param_disable_acs_redir(dev, &caps);\n+\tpci_param_config_acs(dev, &caps);\n \n \tpci_write_config_word(dev, pos + PCI_ACS_CTRL, caps.ctrl);\n }\n","prefixes":["v5","4/6"]}