From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751999AbbJZQEz (ORCPT ); Mon, 26 Oct 2015 12:04:55 -0400 Received: from mail-bn1on0148.outbound.protection.outlook.com ([157.56.110.148]:22884 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751475AbbJZQEv (ORCPT ); Mon, 26 Oct 2015 12:04:51 -0400 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=freescale.com; freescale.mail.onmicrosoft.com; dkim=none (message not signed) header.d=none;freescale.mail.onmicrosoft.com; dmarc=none action=none header.from=freescale.com; From: "J. German Rivera" To: , , , CC: , , , , , , , , , , , , , , "J. German Rivera" Subject: [PATCH 03/10] staging: fsl-mc: Added GICv3-ITS support for FSL-MC MSIs Date: Mon, 26 Oct 2015 10:49:14 -0500 Message-ID: <1445874561-14761-4-git-send-email-German.Rivera@freescale.com> X-Mailer: git-send-email 2.3.3 In-Reply-To: <1445874561-14761-1-git-send-email-German.Rivera@freescale.com> References: <1445874561-14761-1-git-send-email-German.Rivera@freescale.com> X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1;BN1BFFO11FD017;1:dl5DVYXquEcXDxf0Q+GoeL9x8Omsu0PVgomVtUrrGIFcR9TXfvRfmhe+37QFEBlH33jbWLomiirtPpgtk8k0MJSJB7pwjrJHD+Zoi6Ik6tUqVykEPcfBy0BKUGjgdjqM1seyFCZ63yvGq/LtBDIpM0ArjZb9r3ipDTMdmGaWqTaUud5QMw0nswo96M8cAEdQ9dFf5D4e7wTCA4lkgW6VQDtkSb8twUHtimVG2KcLn3LNIDdPIxtdc7lfyLQ8UpVvRkGDbIZgiTIzQ7/PLqBRwUxlcnvtECrZp6d1nJ0FZxjLd+NiYBsSHaM3Xp/wU2KrIx5V2oufAJn5OWBu/3fnCtyi29oeqVCFCWKLDGhHZY3bXwOOOmMUNIgE2jhyNEJQSnPo0VCwQ5EMNvXKwygrtw== X-Forefront-Antispam-Report: CIP:192.88.168.50;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10019020)(6009001)(2980300002)(1110001)(1109001)(339900001)(199003)(189002)(77096005)(92566002)(11100500001)(105606002)(189998001)(2950100001)(5003940100001)(106466001)(5007970100001)(97736004)(50226001)(36756003)(5001770100001)(229853001)(81156007)(2201001)(48376002)(50466002)(4001430100002)(85426001)(19580395003)(86362001)(19580405001)(87936001)(107886002)(104016004)(6806005)(5008740100001)(50986999)(76176999)(47776003)(5001960100002);DIR:OUT;SFP:1102;SCL:1;SRVR:SN1PR0301MB1648;H:tx30smr01.am.freescale.net;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;A:1;MX:1;LANG:en; MIME-Version: 1.0 Content-Type: text/plain X-Microsoft-Exchange-Diagnostics: 1;SN1PR0301MB1648;2:4Te0PvqXNOJn59WHjehAEhSm7j4mLB2liEpvnpLJk31iWV8ZsXjTEsxiSy9dMCZ6OzJ/a71NksGQ50F6i0NRQD61+sNXRDxllC2dvrexotyde1Kd450ZLL7R5PcnK/Ijbz6RWCNlVMTEpvJh93zDXSLkl0nN9zTObqtRLABXaVY=;3:R+II0HOErrdsudf6kabPvA9229cy7ddzFiUpEYdh7ojgOy75uJcy/amVsN2xmdRZ1xwrniIqfmo1fPdGabFPMNAmZRb9HhJ33PRoOMytc5dV/OS1LyNuf57g436AwII4i5d6fHB0fSS/dBlnbOlSyYyEeXNG3w0bWjNjzp3+qhnFO2BioHQ5XfTImMXkIGd/UIWNWMCQRHNmK174TJ+p2PRWqtQNHQQC+jOQJffU9XI=;25:CjFijXCXSSu7tp64RbOB0sbIbKSko1XdmsxHh7PsjV/TqclyIjLgPzZ/76WG5bq5tWKPedkQKa1URp73sKGJKOrpGvfYxnITAqp86sbAwl39Ym+LmLiwzgXfPCuotHKzav3rVLIBuHUYrT7PRvzNm9TTpG/on0oi5cNk1l7KRph3y/10kcYKIp5vW8hfnvZubVlir+AwG18no8ylAYWOvzZ8v6xhwXFGJFlYRa8wRDd7rhggctPEWlti5oHKs0UQzSyQzbXkVGHQFlSTfIbBlA== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:SN1PR0301MB1648; X-Microsoft-Exchange-Diagnostics: 1;SN1PR0301MB1648;20:tnxuww3NaV8m3yAE+7PGt+zyIwiX7zGMTuFPhlziTl+RWrDDHWJP2VY9qSp6knFswzX+p9LMRNmrsBLaql6RZoLZrG8fewlwXK9kKKM7KBSapZTKwIeZ22TzhLscKNFWYHW4xT/AV/gU0iuqJ0d7/GkZkunhIRQ7wcDSrOkiwfamU4hGH4YLNuAGLBmGCN7sT0zZquoWMgp+W/iTmAgCnUwY94khpgb/C5feotsnBc4Ca3bO72OfNeFZB5rNSSs+9ZswTPhe/1c4vq1zJJZ6jkdcjAClxakWjzV3kJNe/2vBDyLKQ5GSXkuLSy0eRKtQfV0IKyCwXsZcGtcWSIYrsQtIdxHnURcq1YAnEP4y0ME=;4:2wECn5Y2ZLA8eNf7vWSVDyR1FwzDxW0KtI8sKItU4ruNnLLEAkBpH6alLJ7ZVM+qoVLGzu4xCrJ/PCMQwyDu//cAxdHMsIiiyBgXh1q7RfLLuSqo33gmwiREc9IdswaGoqD8BwD4yU/4EMvoe9+Jq5flp3EdVC1FmIZYHFNmYkt2uVIfALS46Q2Kr7HubI4+qq4U3+WylMtv6PPMW3IQmhj9VX5tgSqJc7FnuLZlAuNnMlua+lk0oPJ8lS+eAZTwlXepIVcF+YgaRJExZGCPCJTMV2S8o/EfblN1pUYv2HKH5IMQ2IqEWs/I6mQl3ySyfXeOxUkgmSE/ksEWdwOVmfYVSaYo5OuBwEjNmX8DxRzpz5MWBuJ9TRrZG1cVPCqm X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(101931422205132); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(520078)(5005006)(8121501046)(3002001)(102215026);SRVR:SN1PR0301MB1648;BCL:0;PCL:0;RULEID:;SRVR:SN1PR0301MB1648; X-Forefront-PRVS: 0741C77572 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;SN1PR0301MB1648;23:hX+tN3oaP1iT/Uk6/bldb/oh1ppjLOTvDGM+mUV?= =?us-ascii?Q?xE/npHhaT9rcW4hcsDf1cH0rJe6NX2oWe+udYpkukry1DKptlUI/5CnFRJWL?= =?us-ascii?Q?6n5bRDQzqJGTUpNh8Q3DeTddj9ZybBuWM8WM0dCdJ77+hhx2Wi+5i8ybA5ei?= =?us-ascii?Q?Cgrp0IHvDbzzpdaIpDUSlsaJgtGeEcptZePVOtz/4bl8EAOoI4QnyQm/XSTz?= =?us-ascii?Q?Tbp+AMI81aaqDI4yj4/si0j0iFyxZcORZU5fkEZuQ2RRI5pRzwRJLd5xnPh1?= =?us-ascii?Q?7NS06Wov2aGsK7QrgK/eIk1rpI/elQK3mASXNB/iDTzG/9Waqg4JtRsy1hR3?= =?us-ascii?Q?+9arTfmp309+BdhHIjEUzHiFlxo31AEuxrrVNceGhFNtEo6N9EHtDpHQ32cR?= =?us-ascii?Q?JYMVUrrslCMalL0NFAvg3uMTF+KIfZx9DeCTbJutwr3so5Cvj4shaaknMxgO?= =?us-ascii?Q?MT7LJNJqqy/2l/3JzOXBTiXTLzZSK8+j9m8/syZXSv11b2vPGsLTdiia7BKJ?= =?us-ascii?Q?QbQygE8HjdqUessDEnmOnxFQTH+BR790XkXzxAWGrisoO/U53KjJKX46G/KP?= =?us-ascii?Q?T1yAtOLAZsuB2QSbFQIz+mnCQsXncUb07T//cGgxRknto8RxMt1B4c7Ne8Il?= =?us-ascii?Q?lMSYWrfmIJJETeydnFsSbQYcWHg71TXs5+HLfgCIkMzdb2STOt4q57Ute/Hh?= =?us-ascii?Q?iLghekNX1U+Q32irbQqQmB1qsHDeFQocbbUSUk/fP4iOpYTlXzY4Oeia5mtk?= =?us-ascii?Q?RRoYRfWkaGy2npppIJEHlmZ0e+kIF+vK/omo6dx29QG40brk4h70jVJ5W7na?= =?us-ascii?Q?dnxZvIZ2xZ4jVEpL4HE/TWeqwIvW1TiQn2r7Xpj/VrnTo43nts5AnoMsMp7i?= =?us-ascii?Q?fGwx40mVU+jXJ9hCXrQFMbLfU0SwQ6thNBn0sYEyxwMAVXNdJlo3sbUKg9mG?= =?us-ascii?Q?eUqE+4ch95WBHpaMeEOQb9OZN99BpwN2AQ86RzRnxIkyobx/iIn89EGRiLDO?= =?us-ascii?Q?UyyFfsGtP3/ysHIw0vhVNcVG/iAX4ROmWJKX0rWDz5IKZavy2yCxi04UmSt5?= =?us-ascii?Q?YS5vArlDWzMA8NU0A7uJBr2xB9bmT?= X-Microsoft-Exchange-Diagnostics: 1;SN1PR0301MB1648;5:kY59IZzkvU1qKK/lyiea1Xu05F96YtZC5rTf7SWgcmXFHB/gtlZO1oEasN6vmLlndU5I2CNXCT8C3V7700H774VpMWDoiWdmONqQcg/kj4ydELeBqG0N/3iGc+AZWEh+feIklt/YhhskfDCQseIu+w==;24:dj7CpI3iGcRAsv7PeaAeKZJc36un0A41g+2RDlR7SgYyC4guLYCjm5eKHtLLwpB7u2IzX/MmJQuzqytuaRcJPfXBJjvq1uoR6JKBmx/P20M=;20:owJMgD1sxYIY1Y3BtqPNx9687diwqTCj05IvkOapHrMBFjU9oGYElePAy1fcKLMNOjPpw7P03U7zkfA0WNINng== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Oct 2015 16:04:47.8463 (UTC) X-MS-Exchange-CrossTenant-Id: 710a03f5-10f6-4d38-9ff4-a80b81da590d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=710a03f5-10f6-4d38-9ff4-a80b81da590d;Ip=[192.88.168.50];Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN1PR0301MB1648 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Added platform-specific MSI support layer for FSL-MC devices. Signed-off-by: J. German Rivera --- drivers/staging/fsl-mc/bus/Makefile | 1 + .../staging/fsl-mc/bus/irq-gic-v3-its-fsl-mc-msi.c | 127 +++++++++++++++++++++ drivers/staging/fsl-mc/include/mc-private.h | 4 + 3 files changed, 132 insertions(+) create mode 100644 drivers/staging/fsl-mc/bus/irq-gic-v3-its-fsl-mc-msi.c diff --git a/drivers/staging/fsl-mc/bus/Makefile b/drivers/staging/fsl-mc/bus/Makefile index a5f2ba4..e731517 100644 --- a/drivers/staging/fsl-mc/bus/Makefile +++ b/drivers/staging/fsl-mc/bus/Makefile @@ -14,5 +14,6 @@ mc-bus-driver-objs := mc-bus.o \ dprc-driver.o \ mc-allocator.o \ mc-msi.o \ + irq-gic-v3-its-fsl-mc-msi.o \ dpmcp.o \ dpbp.o diff --git a/drivers/staging/fsl-mc/bus/irq-gic-v3-its-fsl-mc-msi.c b/drivers/staging/fsl-mc/bus/irq-gic-v3-its-fsl-mc-msi.c new file mode 100644 index 0000000..5319afa --- /dev/null +++ b/drivers/staging/fsl-mc/bus/irq-gic-v3-its-fsl-mc-msi.c @@ -0,0 +1,127 @@ +/* + * Freescale Management Complex (MC) bus driver MSI support + * + * Copyright (C) 2015 Freescale Semiconductor, Inc. + * Author: German Rivera + * + * This file is licensed under the terms of the GNU General Public + * License version 2. This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ + +#include "../include/mc-private.h" +#include +#include +#include +#include +#include +#include +#include +#include "../include/mc-sys.h" +#include "dprc-cmd.h" + +static struct irq_chip its_msi_irq_chip = { + .name = "fsl-mc-bus-msi", + .irq_mask = irq_chip_mask_parent, + .irq_unmask = irq_chip_unmask_parent, + .irq_eoi = irq_chip_eoi_parent, + .irq_set_affinity = msi_domain_set_affinity +}; + +static int its_fsl_mc_msi_prepare(struct irq_domain *msi_domain, + struct device *dev, + int nvec, msi_alloc_info_t *info) +{ + u32 its_dev_id; + struct fsl_mc_device *mc_bus_dev = to_fsl_mc_device(dev); + struct msi_domain_info *msi_info; + + if (WARN_ON(dev->bus != &fsl_mc_bus_type)) + return -EINVAL; + + if (WARN_ON(!(mc_bus_dev->flags & FSL_MC_IS_DPRC))) + return -EINVAL; + + /* + * Set the device Id to be passed to the GIC-ITS: + * + * NOTE: This device id corresponds to the IOMMU stream ID + * associated with the DPRC object (ICID). + */ + its_dev_id = mc_bus_dev->icid; + info->scratchpad[0].ul = its_dev_id; + msi_info = msi_get_domain_info(msi_domain->parent); + return msi_info->ops->msi_prepare(msi_domain->parent, dev, nvec, info); +} + +static struct msi_domain_ops its_fsl_mc_msi_ops = { + .msi_prepare = its_fsl_mc_msi_prepare, +}; + +static struct msi_domain_info its_fsl_mc_msi_domain_info = { + .flags = (MSI_FLAG_USE_DEF_DOM_OPS | MSI_FLAG_USE_DEF_CHIP_OPS), + .ops = &its_fsl_mc_msi_ops, + .chip = &its_msi_irq_chip, +}; + +static const struct of_device_id its_device_id[] = { + { .compatible = "arm,gic-v3-its", }, + {}, +}; + +int __init its_fsl_mc_msi_init(void) +{ + struct device_node *np; + struct irq_domain *parent; + struct irq_domain *mc_msi_domain; + + for (np = of_find_matching_node(NULL, its_device_id); np; + np = of_find_matching_node(np, its_device_id)) { + if (!of_property_read_bool(np, "msi-controller")) + continue; + + parent = irq_find_matching_host(np, DOMAIN_BUS_NEXUS); + if (!parent || !msi_get_domain_info(parent)) { + pr_err("%s: unable to locate ITS domain\n", + np->full_name); + continue; + } + + mc_msi_domain = + fsl_mc_msi_create_irq_domain(of_node_to_fwnode(np), + &its_fsl_mc_msi_domain_info, + parent); + if (!mc_msi_domain) { + pr_err("%s: unable to create fsl-mc domain\n", + np->full_name); + continue; + } + + WARN_ON(mc_msi_domain->host_data != + &its_fsl_mc_msi_domain_info); + + pr_info("fsl-mc MSI: %s domain created\n", np->full_name); + } + + return 0; +} + +void its_fsl_mc_msi_cleanup(void) +{ + struct device_node *np; + + for (np = of_find_matching_node(NULL, its_device_id); np; + np = of_find_matching_node(np, its_device_id)) { + struct irq_domain *mc_msi_domain = + irq_find_matching_host(np, DOMAIN_BUS_FSL_MC_MSI); + + if (!of_property_read_bool(np, "msi-controller")) + continue; + + mc_msi_domain = + irq_find_matching_host(np, DOMAIN_BUS_FSL_MC_MSI); + if (mc_msi_domain && + mc_msi_domain->host_data == &its_fsl_mc_msi_domain_info) + irq_domain_remove(mc_msi_domain); + } +} diff --git a/drivers/staging/fsl-mc/include/mc-private.h b/drivers/staging/fsl-mc/include/mc-private.h index 3dabd003..f2504bc 100644 --- a/drivers/staging/fsl-mc/include/mc-private.h +++ b/drivers/staging/fsl-mc/include/mc-private.h @@ -133,4 +133,8 @@ int fsl_mc_msi_domain_alloc_irqs(struct device *dev, void fsl_mc_msi_domain_free_irqs(struct device *dev); +int __init its_fsl_mc_msi_init(void); + +void its_fsl_mc_msi_cleanup(void); + #endif /* _FSL_MC_PRIVATE_H_ */ -- 2.3.3