From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752796AbcAFWZB (ORCPT ); Wed, 6 Jan 2016 17:25:01 -0500 Received: from mail-bn1bon0140.outbound.protection.outlook.com ([157.56.111.140]:7495 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752090AbcAFWWD (ORCPT ); Wed, 6 Jan 2016 17:22:03 -0500 Authentication-Results: spf=permerror (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 RESEND v4 04/11] staging: fsl-mc: Added GICv3-ITS support for FSL-MC MSIs Date: Wed, 6 Jan 2016 16:03:22 -0600 Message-ID: <1452117809-1870-5-git-send-email-German.Rivera@freescale.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1452117809-1870-1-git-send-email-German.Rivera@freescale.com> References: <1452117809-1870-1-git-send-email-German.Rivera@freescale.com> X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1;BN1AFFO11FD020;1:Ko9f9F9WDU0tadUYkE0eh0TRMhCyzSA5bA3f2oyI3wVBEbDL+CAi44Mgq2F81ARWpPpqLWNC+Ih1+42xL8eblPs7UmAGayTXAC714t8hYqdZ4UpvSzgNwX6L5r1ljbrVUWUH30gE27mCfZDJ2r6G3skxZQH4zxInk91b4JBUq9nF61QVj1EyrJ1sWi7Xf8Kv2nSxZLlgdR/nFF4hnf7xFrJ0jt6b9uvbR6r0Ax2nViwzctvc2kB3CI5+xnUxVbL3MX6aBIeEhBLkSe05OkAbf+Em6EnVy/I2ZcfMOAUA+ObPI+JZFPfrxlQKd8XkpXFAVAokTa2zhkEYHaK3QxLX61iGTricdc0aX06w+aEJVGuRgXbNOFw9s0Mzw1vLBy2Mn/ukaV8WVdgzNb05vQBKd1AVVvJJsoJRj9g0IU5K9szbAMDpQGe3PLf0bcD9w6g4 X-Forefront-Antispam-Report: CIP:192.88.168.50;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10019020)(6009001)(2980300002)(448002)(3190300001)(199003)(189002)(11100500001)(77096005)(2201001)(50226001)(87936001)(92566002)(36756003)(189998001)(86362001)(5001960100002)(97736004)(48376002)(107886002)(19580395003)(5003940100001)(2950100001)(19580405001)(1096002)(104016004)(81156007)(106466001)(229853001)(6806005)(5001770100001)(4001430100002)(47776003)(76176999)(5008740100001)(85326001)(1220700001)(50466002)(4326007)(586003)(50986999)(2906002)(217873001);DIR:OUT;SFP:1102;SCL:1;SRVR:CY1PR03MB1454;H:tx30smr01.am.freescale.net;FPR:;SPF:PermError;PTR:InfoDomainNonexistent;A:1;MX:1;LANG:en; MIME-Version: 1.0 Content-Type: text/plain X-Microsoft-Exchange-Diagnostics: 1;CY1PR03MB1454;2:979uFdD9rEnB3yX9gwSIQplHDJuEgGcl8lcq5bMDb7ZdrkBjTHZuiXpLMPsDSqXJctFpAbJwhM5k+n1I6whKtrnDTtllw8C0aqE6eIe7JmpjW/aOCSgYKB9fav9loCKjsrmfyzqri1O6AtOIg0o5zA==;3:36INQ4cG9/nODi8NlrRX84J6sE6O8BERNgYpfkWjF0ZHcfC+YA9Oep2B0GI5VLeuqfLjo9DnbQk3bqs7zcmt4nUMLns0b1Z6hoWoYeIDvQICbEJ0IyQfqxiNoao1q2fWHctjD8cf4/Ocr14sywfNz2Q/nCDFrzBZ2+N54p815b3d9xqRyBi5eP4A0h29Jq46UTTnCVEIPo/Kk9XMHCdUTNZIToUXfw0H8gyrRvfLhyM=;25:2tp/tE7xQdI/ITKLw+F9acyc5E1Ppw13vXIg+Kp+Eh2Sz+Q6UjQnblnZLgwc+xkvLnSZQGoAjq2Vv3iVchHcz3qjYYMaklVBUF/9cONGAbt8FIYNevMQZo8Xd4NqaxAIVwB4UOUXuey0c30/6gd7dsZTtmx6NI+kDFSLzAp1I88EXr1MFJ1FPS86QpHgoCUx1pO+risAzqZGH28V8mgU8g== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR03MB1454; X-Microsoft-Exchange-Diagnostics: 1;CY1PR03MB1454;20:+4Evnr4ONtjCqZZBwAjYZYM1eyVqZEZhSyWLfdr4Tww7brYmL7kCowUE+cWfIJ1feBKkLO2pkfnVd0svR1Y3/ow3FLcHgSCaSvplHptRESbMuFmwZ0r1TSYfFOGWychJbgcLriPGxzRQ8WqjxutRYopZEoK66BrVgGAik4LgSStLX1+3mX8DF2SV/fx9975OIrsKxcZH3MdlguASK+V3tL4ilqXwN3TK3pAkLZpdDb1o6xPeZDfijGSSf1lj/ApcC9acpzNkLw1XE3Cb5A1YoxQCBVrZ07QYtLQB8AfilTTr9jAnk2cJaXnyvU/JQPQSX3+iCrmghHqqVOI43BRpNTrDatYXfHxvSkilz3OOq2o=;4:xGwJDCoQqaJgis3FruYdXJsAxtS4dFUZYV5ymbMM49NY2tjFmegYD/2ivsj5e1LQ2dh/NlNvfbxr7Ij+QwCNKu71k3YaUivm1h3dylZj5WnsPyqjwePUvnbksmQiMqnhL4eScjey1yGLmsPc6ISPeWdJLLOc3Px0YwYrwTmS7nSAv+YgzWYcnFxoe9iq+F7lr+t3o8/BHVomY5hjVRM3NZ6N2DHWBymak6WTAdUyIM4W6cK1ha3H+UeNyAyl5I7BTanVOxZZWydHGUdBsH/t9DrwMbHkFFhsyPqpOPuEkuIsLaKmZsQRQs5x7IITVyf1T3A/ZCDu4ZHOn7nPLFNjQYTZAUgFSDC6oj3p6ryFDy96KtZ4Iz8zfMwP0vQulqYB6WLr5vUPLWOZSIR0QKEAU+5IRTHCfPb5/pIDKRqflsEwNQQc+kPfMvyCdgcOvgQZ X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(101931422205132); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(5005006)(8121501046)(520078)(3002001)(10201501046);SRVR:CY1PR03MB1454;BCL:0;PCL:0;RULEID:;SRVR:CY1PR03MB1454; X-Forefront-PRVS: 0813C68E65 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;CY1PR03MB1454;23:wA2enYJVLn1rWl2ZQOlKgP24HExtNETMDAOfHUs6w?= =?us-ascii?Q?8JxK/dELlZUEk7C6QNCNIKm7CSNr2xbBFyI+5mdjs9Em0blCfWjSeJRTd+dI?= =?us-ascii?Q?pxhYelT5hQ1Q+G8RFTNGj19xvd8rkd0q4gprZHKn9oIItLsyr0zVNzax188m?= =?us-ascii?Q?wJ1l0bsbnVyhIPCZEgkcdXQm0lDaOPZBjxC9wzMbTjj9uJbbDQZtOcQ7UhLl?= =?us-ascii?Q?lDL7ajgtzrDezj8FUIKKlTWYM11WJpC8G4l/yuu09OyqXaQEmZauyxX2K3pv?= =?us-ascii?Q?MPJimH+9QFVs397BOkrM9/U4nWD5FJqcTy591KBQeuzeI+tBh7FwSTE1foOb?= =?us-ascii?Q?wrjg8KHV+y/VSq/Ce+qRT82su4s5DjZUlgXLeYt3XhhfBhC4t/gP9COPNl93?= =?us-ascii?Q?/W0vvJUI789pcplc6oNjSPvWtWIfR4fScQWpG5U8lp/Uuj+REKzPFUJVr/YN?= =?us-ascii?Q?4kLEM8FtKn9TcYtaioJ3mFdPeeqs86wF3kxoC5ojFydjJ2UwpwTOIGHtQB+K?= =?us-ascii?Q?bQUJsWFjX3jVr1WBE43hHG2Yqj4s6IaWuDXXBQitmr5G8Ugk6Cp809s51b5l?= =?us-ascii?Q?iTvcHiapyGMknHp1KcV13ABrjvatpeFVqnbUUUTvfInrkHqjbHxkdMci3uXT?= =?us-ascii?Q?bl2Djx94yj2YgBSAN+SCLGhezJzYTopQQbaNH/zOk24XPabMM7rpANJglt2q?= =?us-ascii?Q?dPRaWzInR91EtSAuNckkHV73zRpSQMLBXcBVO4JSgD9Yik2LlDTULv48uO4D?= =?us-ascii?Q?bAwWJtHBFycXYLVINs7ToXUpcB5zQUsEDo78rwOB9HKvjY1O/FhOZp41V0Je?= =?us-ascii?Q?HN25sPXHHlbOElky3T14+ZSWiPCjCvKMDqTHH2GrD/qoL7nPz0rXziLxhFkG?= =?us-ascii?Q?6EzCmEKnhN9LnWNtAAH2364yaoV531uJAKTFYxohTwWAmzoJPAewEsC7EvjC?= =?us-ascii?Q?LJHAz0beQiFI5jE2g84Z/TJBuwPRX+3HTYiMnTnL6X87pKdzjQYKxQNJq3Ah?= =?us-ascii?Q?uwrY8gyzRfccYhfYZ+vcVA+/pzo5OHu2H8BayPtWYKIghQyCaeiOsRz9nYpW?= =?us-ascii?Q?+hjG1o1Xsen315/x988yb4G7tqzSqEzDc7Ch3kdU69juTzZDZK07BBhJDr4w?= =?us-ascii?Q?lvzZSQ2sCc=3D?= X-Microsoft-Exchange-Diagnostics: 1;CY1PR03MB1454;5:9UCu0PlfHULMVLIjCjxEUnFk6zfUBfp1JG9A11rcgly4BuwsCGgMLUjoLMcCyk6h1Lqf7vfevZ3hLiZ6QJJsT5VyzRxvpMxcA4XuJejJRi1bLcDGBz0jgpgBS4ROxR+FvA5JPaVq1hoiyL2GDWSduA==;24:2VKWj/zYzsDqm1L4VfOXwlLHTUtQtpXN4c7wOF3x6VvfFVR+icpg7nUIKDG2ocSTQUnx3MhnavkZsM6SS3z/jnQ9/LwpuonFr2Nvr7IjBSI= X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Jan 2016 22:21:55.3032 (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: CY1PR03MB1454 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: "J. German Rivera" Added platform-specific MSI support layer for FSL-MC devices. Signed-off-by: J. German Rivera --- CHANGE HISTORY Changes in v4: - Addressed comments from Marc Zyngier: * Moved bus type check earlier in its_fsl_mc_msi_prepare() * Removed its_dev_id variable * Changed some assignments to keep both sides on the same line Changes in v3: none Changes in v2: none 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..4e8e822 --- /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) +{ + struct fsl_mc_device *mc_bus_dev; + struct msi_domain_info *msi_info; + + if (WARN_ON(dev->bus != &fsl_mc_bus_type)) + return -EINVAL; + + mc_bus_dev = to_fsl_mc_device(dev); + 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). + */ + info->scratchpad[0].ul = mc_bus_dev->icid; + 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 36b418c..28c8d32 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