Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754881AbdLFKDp (ORCPT ); Wed, 6 Dec 2017 05:03:45 -0500 Received: from mail-bn3nam01on0059.outbound.protection.outlook.com ([104.47.33.59]:55468 "EHLO NAM01-BN3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754707AbdLFKDJ (ORCPT ); Wed, 6 Dec 2017 05:03:09 -0500 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed) header.d=none;nxp.com; dmarc=fail action=none header.from=nxp.com; From: Nipun Gupta To: , , , , , , CC: , , Nipun Gupta Subject: [PATCH 1/2] staging: fsl-mc: Allocate IRQ's before scanning DPRC objects Date: Wed, 6 Dec 2017 21:48:06 +0530 Message-ID: <1512577087-5345-1-git-send-email-nipun.gupta@nxp.com> X-Mailer: git-send-email 1.9.1 X-EOPAttributedMessage: 0 X-Matching-Connectors: 131570281871326813;(91ab9b29-cfa4-454e-5278-08d120cd25b8);() X-Forefront-Antispam-Report: CIP:192.88.168.50;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(336005)(376002)(346002)(39380400002)(39860400002)(2980300002)(1109001)(1110001)(339900001)(189003)(199004)(48376002)(86362001)(498600001)(110136005)(85426001)(2906002)(33646002)(5660300001)(54906003)(50466002)(16586007)(316002)(8936002)(36756003)(2201001)(104016004)(51416003)(50226002)(4326008)(77096006)(39060400002)(53936002)(105606002)(97736004)(47776003)(106466001)(81156014)(81166006)(7416002)(68736007)(8656006)(356003)(305945005)(8676002);DIR:OUT;SFP:1101;SCL:1;SRVR:SN2PR03MB2368;H:tx30smr01.am.freescale.net;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BL2FFO11FD038;1:VEIQl+nmIk5K0RXApM9PEtcVtgAoyzbWfc4dmQPRL0Ktlc8H6CyXUrtMuLBF7GrOLRrfBub7jgkzgz12eKNIG7lvOYa6CvzzKW2oJ1I1uj6d+7773MwOWlUzwQwx8m+Z MIME-Version: 1.0 Content-Type: text/plain X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 0aec8d4f-94f2-44f4-dcfd-08d53c908c64 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(5600026)(4604075)(4534020)(4628075)(201703131517081)(2017052603286);SRVR:SN2PR03MB2368; X-Microsoft-Exchange-Diagnostics: 1;SN2PR03MB2368;3:QBxfzlrK14JEvzFl86WTAWo/01MfHl3Oui/ZfW22Yekrl2uiCadkLlfauk926zdng/soLZ8mZ1MHq/JyJhE1jp9VM2b/jH8b26RoV0MOTzbAAvg1007HUAYqWBejvnps130fuiP43TvHMDMBGWY4wOlLgtAvKZPhKnxae8HYFF9vlvXwkSQJzlbT9fvDlEKvqKdNnSW0THktvjt7zsE23XIP1uSc2F/Az+fIFVmOAxFuzIU20qTFDFq80LPLkr0p3JFP8eqhwv4bFZxydOEqgA8T4Vu5E4IHGsbH3NxH+jCKRZ5IS1y4HvWrVUEgidUVfzfZUsy21VKm1CvOCPQlXiqh9SkIUb8v4QxJMCPcsAQ=;25:1CFVzmVMfXYJLNMzXsc8yEYzApPUxWGlJHda/usxZFNhd+fNOU4TvLIXnHBu9Wnwo9yTN35rKbXq6+yCApuo9fuYvBrn1UVQuPyrIpeX7s34ytwtQhI1z/KYuLMamHF6O9TjrmauvI9taIr2UIQ2ZzQyzexdqpmW2JU6jptAeiRvgxSMBIEHtcQeyRIv1idVlmcWN17TQBas4w2/5phjum/ZSWqQkngpCtDE0+nKY2Ua2w3lIsscyxfl0ra0wgQApIWSoU1fdaOFPN9wuwBnXBESaM7MfLeCz7wxnnmdHPtZn/hjwzOnrDj0yUh4GqWIIh8uLadmeiSIJF/iB8Wgdw== X-MS-TrafficTypeDiagnostic: SN2PR03MB2368: X-Microsoft-Exchange-Diagnostics: 1;SN2PR03MB2368;31:FsZh29okTMt9aVqcZGP5Lo4lAzFM97ONIf4aQ4QVegjZ0ybESWDgZ1G3UP1qRSWp7RwQV6yrRHWmZL8k2uYhGhiO3Vxq4TwJ5H1LIz5lT4GOzo7/tg/A7raiynoRNucXa2W1It8UCQ4ApOhm/zAnuWH1S+7SFf/qUZN5JvEGIEbLEGdi8gGVaO1XxRIL0PTXnaF05xQMLVrjgIhxOwwomd6qnN0WTzO/nOvP4OSWPqQ=;4:C8TY9RDu3kgZvAoba4wepmzHIPPCGa+gWgWVAxQx6inNw5ylOdZy9i+aG/rhWHD53RvB030Tgg51Nt2P8rsPtG7QwsBstcbjfUgbKTuImdE5wDGXxPzMvtv0nW+0lSOnGGULrOWy+4F//a8M33IdsRPPgegefgsQX6yQYfYd9cjiDZIhXxTfLrnNA/nBInN7fDUNiFO10qcois+sfLRpSE1f4vojzYiPEIKNonTjhfhhH0PNK8ZyU3r4q2zD6IvNplJyHT9Efey7lPRpjGlXE8CxfpuafBltx1A//tNcxq/jL4/odT8YBbtU5tvhMcgP X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6095135)(2401047)(8121501046)(5005006)(3002001)(93006095)(93001095)(3231022)(10201501046)(6055026)(6096035)(20161123563025)(201703131430075)(201703131433075)(201703131448075)(201703161259150)(201703151042153)(20161123565025)(20161123556025)(20161123561025)(20161123559100)(201708071742011);SRVR:SN2PR03MB2368;BCL:0;PCL:0;RULEID:(100000803101)(100110400095)(400006);SRVR:SN2PR03MB2368; X-Forefront-PRVS: 05134F8B4F X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;SN2PR03MB2368;23:SIyKTBeHAtosVJyF4rEQb7Y5dK0g5ipDZZ+8tHH3X?= =?us-ascii?Q?nMwEZSacjqwmqManvv01fy5RBqzUcRroyEcJfYnHYMeNSXXHqxrN1QJL2GP6?= =?us-ascii?Q?s0OiKfHu21GpvIRAiQtp5tqMXRanxBfTGRKr1ANPGwC8fqiH9RGBAxq0yvlh?= =?us-ascii?Q?Rel4WbKXCgetGNRhSK1CKJUfVVbV8mFxmpwt0qwltObFeSUA7LD6i5MPsJXE?= =?us-ascii?Q?iz9R6EAVswX8mFNoVbPdwHZmTo9CSLpWNYlKbZkMmcdqRxjPgQZKVPlQHK4n?= =?us-ascii?Q?ON6mfGXnfM404Yt3uzDO4bBhg7GoBHeEiUsJSSYmF0ZV0QgpZzeE/g+sSilv?= =?us-ascii?Q?R7eyDpwgkVdhR+KF4qLzLt3ZluVfYaM/24qJ48Tvmq1ooeaQi4t8ye8bOkjH?= =?us-ascii?Q?hQr2fo44Bm6D1TO+WzLmPpH76OyBPlkQKMnILOWegoDo8BjVgMBXqzyMiOzR?= =?us-ascii?Q?f2CFMTPtZ5SJH5MRFYqZ/vmiWg5s44ZO85UkI46Hx/Uis6scv2W0ziklUXKA?= =?us-ascii?Q?TcMcpNixRPbBoZZlSGe81L4PafqhxMNjflUulMC3z7z8ObhWLKbFoxLHhvo4?= =?us-ascii?Q?sNMwbxnBFwjZsV+emnKLQ7BhUKTQUk/SOkNWvs+H1Ly5u7wk/F9L7Pxvd3bn?= =?us-ascii?Q?UVtwXigOP/hpngVfBYERPCXC9KcrHzhQGzHlh2Z7bptycvZQx9zodVLGBe/B?= =?us-ascii?Q?YbQL032/fn715qtEbqJe356RXjpPYdsXG2/mqtVf52fss3qAisjl+NNRxbr8?= =?us-ascii?Q?l4NCFf6HvEbQLhWm/gJOQZil0loq3xltwfvyXqisLXDHUO0A+uVpEGbnoJos?= =?us-ascii?Q?uSSTSGFtUtHUhAi0h3dLdFpRiMFLBFLv5BOTzdcsK5XfmVY57NezwT/S+LG0?= =?us-ascii?Q?W9Ho8cGyiGneiZbY50KWsYu5UylkZ94sAnjiDvARp4BlqAPJBcVm1Mq3S4yx?= =?us-ascii?Q?8SiaOgduos3cBG1FvQ0WWjdXMIHzdS2fea+roBeX51Xv7mv1E8n+bUVC+NSg?= =?us-ascii?Q?JIenZMgXwnnrhN+jdGTE6tmhfrTNMjGsyc02+GGdzIdazvNRUHH1DFGTLsVl?= =?us-ascii?Q?IZYDmuD6hZp20L7zQViLigKPYnI?= X-Microsoft-Exchange-Diagnostics: 1;SN2PR03MB2368;6:rvlIXEVoykEC5BORz/yhgy4PItKIat9osVtpNS38WiXsVtk25bKLAKCR+X6KYPu40cfyX3qVTDcKqom2yI1SLSWOn7zE5P915mevAJ7y1wOo/RGI7TSCdzGsNs7VHl2F69RjqpoW9mT5SFX3XO1OGCqMEv0P1Cqxzx8kdZj0xZo0A4OlEjIkc3FP2jWs+Lt60CAaFbYXtABkPu8Vs91twwyfAQ9NOMw/iG7OqRm6Gm+RVkPaaUAmJ6lCQoy7sHqeOYsKyaTJwqKdhflaQblbdXOPF5ZHE0dfiw+wWxGur2AwDDF8dENINwyQoyHPMx+Uqt2BjXPeWw4shJEMExUriqfPJTPIJjEACKDnhwxlKYI=;5:QhRhb4xpDOl48cR0T6p2zYfQqjmqzfh+baBIq3lwbl3v4eO5Ehz/R5PiK32VAEMoLBU4+Qyv3vuDvjbBxmXat1mHtimiWbCq20GeKm5Akfm/oNOv4z/v9vMpu1/m6QJsF1placzGs4nJMyHZE6OG9ThC+ZPtwKcnYjqSrIPFh+w=;24:LGXvc4nkfLAXQpG64LHa/XOMSYIVrxG1RL+TTFu4TBJ0myEc16tWJH/GXOummZe3mNzU2uyOAcm1Mz8SpxTN7k7bln34G/bpD+V/Qqxhh4A=;7:Zipcqlj/XY0I5DdxD/SEbVq97/g5rnnMNovgKqLuE66mKH+RsRv+KAURRlCzm7l4nmppaNy1wJbQBGVdTSnc4XUFPTROIXhLIsXqIwsHc+HJxi2d21XTF4yfABQ7aLsVA6vqxlXTs3Spw+NeiIoASoOwh4sdNigcjfNjIqi26+QIBc/r8laNSdxK6VTE7ObkOcSdHLXh3j+H1hy3c4TVIBfmkBwDF8VVHOq4ONzSah+ac+g7l9hh1RrK33xBV5+Q SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Dec 2017 10:03:06.9454 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 0aec8d4f-94f2-44f4-dcfd-08d53c908c64 X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e;Ip=[192.88.168.50];Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN2PR03MB2368 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3694 Lines: 106 When DPRC probing is deferred (such as where IOMMU is not probed before the fsl-mc bus), all the devices in the DPRC containers gets initialized one after another. As IRQ's were allocated only once the DPRC scanning is completed, the devices like DPIO which uses these IRQ's at initalization fails. This patch allocates the IRQ resources before scanning all the objects in the DPRC container. Signed-off-by: Nipun Gupta --- drivers/staging/fsl-mc/bus/dprc-driver.c | 49 ++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/drivers/staging/fsl-mc/bus/dprc-driver.c b/drivers/staging/fsl-mc/bus/dprc-driver.c index 06df528..7265431 100644 --- a/drivers/staging/fsl-mc/bus/dprc-driver.c +++ b/drivers/staging/fsl-mc/bus/dprc-driver.c @@ -206,7 +206,8 @@ static void dprc_add_new_devices(struct fsl_mc_device *mc_bus_dev, * dprc_scan_objects - Discover objects in a DPRC * * @mc_bus_dev: pointer to the fsl-mc device that represents a DPRC object - * @total_irq_count: total number of IRQs needed by objects in the DPRC. + * @total_irq_count: If argument is provided the function populates the + * total number of IRQs created by objects in the DPRC. * * Detects objects added and removed from a DPRC and synchronizes the * state of the Linux bus driver, MC by adding and removing @@ -228,6 +229,7 @@ static int dprc_scan_objects(struct fsl_mc_device *mc_bus_dev, int error; unsigned int irq_count = mc_bus_dev->obj_desc.irq_count; struct fsl_mc_obj_desc *child_obj_desc_array = NULL; + struct fsl_mc_bus *mc_bus = to_fsl_mc_bus(mc_bus_dev); error = dprc_get_obj_count(mc_bus_dev->mc_io, 0, @@ -297,7 +299,26 @@ static int dprc_scan_objects(struct fsl_mc_device *mc_bus_dev, } } - *total_irq_count = irq_count; + /* + * Allocate IRQ's before scanning objects in DPRC as some devices like + * DPIO needs them on being probed. + */ + if (dev_get_msi_domain(&mc_bus_dev->dev) && !mc_bus->irq_resources) { + if (irq_count > FSL_MC_IRQ_POOL_MAX_TOTAL_IRQS) { + dev_warn(&mc_bus_dev->dev, + "IRQs needed (%u) exceed IRQs preallocated (%u)\n", + irq_count, FSL_MC_IRQ_POOL_MAX_TOTAL_IRQS); + } + + error = fsl_mc_populate_irq_pool(mc_bus, + FSL_MC_IRQ_POOL_MAX_TOTAL_IRQS); + if (error < 0) + return error; + } + + if (total_irq_count) + *total_irq_count = irq_count; + dprc_remove_devices(mc_bus_dev, child_obj_desc_array, num_child_objects); @@ -322,7 +343,6 @@ static int dprc_scan_objects(struct fsl_mc_device *mc_bus_dev, static int dprc_scan_container(struct fsl_mc_device *mc_bus_dev) { int error; - unsigned int irq_count; struct fsl_mc_bus *mc_bus = to_fsl_mc_bus(mc_bus_dev); fsl_mc_init_all_resource_pools(mc_bus_dev); @@ -331,29 +351,14 @@ static int dprc_scan_container(struct fsl_mc_device *mc_bus_dev) * Discover objects in the DPRC: */ mutex_lock(&mc_bus->scan_mutex); - error = dprc_scan_objects(mc_bus_dev, &irq_count); + error = dprc_scan_objects(mc_bus_dev, NULL); mutex_unlock(&mc_bus->scan_mutex); - if (error < 0) - goto error; - - if (dev_get_msi_domain(&mc_bus_dev->dev) && !mc_bus->irq_resources) { - if (irq_count > FSL_MC_IRQ_POOL_MAX_TOTAL_IRQS) { - dev_warn(&mc_bus_dev->dev, - "IRQs needed (%u) exceed IRQs preallocated (%u)\n", - irq_count, FSL_MC_IRQ_POOL_MAX_TOTAL_IRQS); - } - - error = fsl_mc_populate_irq_pool( - mc_bus, - FSL_MC_IRQ_POOL_MAX_TOTAL_IRQS); - if (error < 0) - goto error; + if (error < 0) { + fsl_mc_cleanup_all_resource_pools(mc_bus_dev); + return error; } return 0; -error: - fsl_mc_cleanup_all_resource_pools(mc_bus_dev); - return error; } /** -- 1.9.1