Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757726AbbKFXUu (ORCPT ); Fri, 6 Nov 2015 18:20:50 -0500 Received: from mail-by2on0113.outbound.protection.outlook.com ([207.46.100.113]:29664 "EHLO na01-by2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753242AbbKFXUs convert rfc822-to-8bit (ORCPT ); Fri, 6 Nov 2015 18:20:48 -0500 From: Jose Rivera To: Marc Zyngier , "gregkh@linuxfoundation.org" , "arnd@arndb.de" , "devel@driverdev.osuosl.org" , "linux-kernel@vger.kernel.org" CC: Stuart Yoder , Katz Itai , Lijun Pan , Li Leo , Scott Wood , "agraf@suse.de" , Hamciuc Bogdan , Marginean Alexandru , Sharma Bhupesh , "Erez Nir" , Richard Schmitt , "dan.carpenter@oracle.com" , "jiang.liu@linux.intel.com" Subject: RE: [PATCH v2 03/11] staging: fsl-mc: Added generic MSI support for FSL-MC devices Thread-Topic: [PATCH v2 03/11] staging: fsl-mc: Added generic MSI support for FSL-MC devices Thread-Index: AQHRE01zz38hZKye70Cn4id08aSw9p6PUL6AgABMp6A= Date: Fri, 6 Nov 2015 23:20:44 +0000 Message-ID: References: <1446234217-25512-1-git-send-email-German.Rivera@freescale.com> <1446234217-25512-4-git-send-email-German.Rivera@freescale.com> <563CE87B.9040107@arm.com> In-Reply-To: <563CE87B.9040107@arm.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: spf=none (sender IP is ) smtp.mailfrom=German.Rivera@freescale.com; x-originating-ip: [192.88.168.50] x-microsoft-exchange-diagnostics: 1;DM2PR0301MB0656;5:oVp217KUANxBorl1vxotTPraVCAQKe4uNPi6OshOsFj2tO1fwGiIdFVeMmtgBzZ+DcIKyORQc4QvOp+B/C4XIEJKiq/7anzQyxQ3T8mpLzY4hNjNp8B5ym79MEkCVCEPB11CKF8opF3Wnhyrf3HfCQ==;24:7sWflSvceKWeYbJqu+JBiJ6dKCNW7qRh9pUPU88MZESoZeyM9PbW4BACIf6iWYrjbgnW08nciNAgsEOzXGv9Bm03ix+rJZpjTmkm6VIVaRY=;20:kdjmBBlokv3sBLDAEaO9T1HiwcuP/JIZCHKcGREG/VaqM8vdsFTitjqJbGLyd5NANd0uoFPI52IzZvm9TShkUg== x-microsoft-antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:DM2PR0301MB0656; x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:(101931422205132)(146099531331640)(228905959029699); x-exchange-antispam-report-cfa-test: BCL:0;PCL:0;RULEID:(601004)(2401047)(520078)(5005006)(8121501046)(10201501046)(3002001);SRVR:DM2PR0301MB0656;BCL:0;PCL:0;RULEID:;SRVR:DM2PR0301MB0656; x-forefront-prvs: 07521929C1 x-forefront-antispam-report: SFV:NSPM;SFS:(10019020)(6009001)(13464003)(199003)(164054003)(24454002)(189002)(479174004)(377454003)(87936001)(102836002)(189998001)(81156007)(19580395003)(2950100001)(76576001)(5003600100002)(33656002)(2900100001)(97736004)(19580405001)(5001960100002)(40100003)(74316001)(122556002)(101416001)(99286002)(54356999)(2501003)(76176999)(10400500002)(92566002)(50986999)(5002640100001)(2201001)(5008740100001)(5007970100001)(106116001)(66066001)(77096005)(106356001)(11100500001)(5001770100001)(5004730100002)(105586002)(86362001)(41533002);DIR:OUT;SFP:1102;SCL:1;SRVR:DM2PR0301MB0656;H:DM2PR0301MB1309.namprd03.prod.outlook.com;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 8BIT MIME-Version: 1.0 X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-originalarrivaltime: 06 Nov 2015 23:20:44.4716 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 710a03f5-10f6-4d38-9ff4-a80b81da590d X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM2PR0301MB0656 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 8067 Lines: 227 > -----Original Message----- > From: Marc Zyngier [mailto:marc.zyngier@arm.com] > Sent: Friday, November 06, 2015 11:51 AM > To: Rivera Jose-B46482; gregkh@linuxfoundation.org; arnd@arndb.de; > devel@driverdev.osuosl.org; linux-kernel@vger.kernel.org > Cc: Yoder Stuart-B08248; katz Itai-RM05202; Pan Lijun-B44306; Li Yang- > Leo-R58472; Wood Scott-B07421; agraf@suse.de; Hamciuc Bogdan-BHAMCIU1; > Marginean Alexandru-R89243; Sharma Bhupesh-B45370; Erez Nir-RM30794; > Schmitt Richard-B43082; dan.carpenter@oracle.com; > jiang.liu@linux.intel.com > Subject: Re: [PATCH v2 03/11] staging: fsl-mc: Added generic MSI support > for FSL-MC devices > > On 30/10/15 19:43, J. German Rivera wrote: > > Created an MSI domain for the fsl-mc bus-- including functions to > > create a domain, find a domain, alloc/free domain irqs, and bus > > specific overrides for domain and irq_chip ops. > > > > Signed-off-by: J. German Rivera > > --- > > Changes in v2: none > > > > drivers/staging/fsl-mc/bus/Kconfig | 1 + > > drivers/staging/fsl-mc/bus/Makefile | 1 + > > drivers/staging/fsl-mc/bus/mc-msi.c | 276 > ++++++++++++++++++++++++++++ > > drivers/staging/fsl-mc/include/mc-private.h | 17 ++ > > drivers/staging/fsl-mc/include/mc.h | 17 ++ > > 5 files changed, 312 insertions(+) > > create mode 100644 drivers/staging/fsl-mc/bus/mc-msi.c > > > > diff --git a/drivers/staging/fsl-mc/bus/Kconfig > > b/drivers/staging/fsl-mc/bus/Kconfig > > index 0d779d9..c498ac6 100644 > > --- a/drivers/staging/fsl-mc/bus/Kconfig > > +++ b/drivers/staging/fsl-mc/bus/Kconfig > > @@ -9,6 +9,7 @@ > > config FSL_MC_BUS > > tristate "Freescale Management Complex (MC) bus driver" > > depends on OF && ARM64 > > + select GENERIC_MSI_IRQ_DOMAIN > > help > > Driver to enable the bus infrastructure for the Freescale > > QorIQ Management Complex (fsl-mc). The fsl-mc is a hardware > > diff --git a/drivers/staging/fsl-mc/bus/Makefile > > b/drivers/staging/fsl-mc/bus/Makefile > > index 25433a9..a5f2ba4 100644 > > --- a/drivers/staging/fsl-mc/bus/Makefile > > +++ b/drivers/staging/fsl-mc/bus/Makefile > > @@ -13,5 +13,6 @@ mc-bus-driver-objs := mc-bus.o \ > > dpmng.o \ > > dprc-driver.o \ > > mc-allocator.o \ > > + mc-msi.o \ > > dpmcp.o \ > > dpbp.o > > diff --git a/drivers/staging/fsl-mc/bus/mc-msi.c > > b/drivers/staging/fsl-mc/bus/mc-msi.c > > new file mode 100644 > > index 0000000..81b53e3 > > --- /dev/null > > +++ b/drivers/staging/fsl-mc/bus/mc-msi.c > > @@ -0,0 +1,276 @@ > > +/* > > + * 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/mc-sys.h" > > +#include "dprc-cmd.h" > > + > > +static void fsl_mc_msi_set_desc(msi_alloc_info_t *arg, > > + struct msi_desc *desc) > > +{ > > + arg->desc = desc; > > + arg->hwirq = (irq_hw_number_t)desc->fsl_mc.msi_index; > > +} > > + > > +static void fsl_mc_msi_update_dom_ops(struct msi_domain_info *info) { > > + struct msi_domain_ops *ops = info->ops; > > + > > + if (WARN_ON(!ops)) > > + return; > > + > > + if (!ops->set_desc) > > + ops->set_desc = fsl_mc_msi_set_desc; > > When would that be overridden by the MSI controller? > It should not be set by the MSI controller. As you suggested in another, I will add A WARN_ON if set_desc is not NULL. > > +} > > + > > +static void __fsl_mc_msi_write_msg(struct fsl_mc_device *mc_bus_dev, > > + struct fsl_mc_device_irq *mc_dev_irq) { > > + int error; > > + struct fsl_mc_device *owner_mc_dev = mc_dev_irq->mc_dev; > > + struct msi_desc *msi_desc = mc_dev_irq->msi_desc; > > + struct dprc_irq_cfg irq_cfg; > > + > > + /* > > + * msi_desc->msg.address is 0x0 when this function is invoked in > > + * the free_irq() code path. In this case, for the MC, we don't > > + * really need to "unprogram" the MSI, so we just return. > > + */ > > + if (msi_desc->msg.address_lo == 0x0 && msi_desc->msg.address_hi == > 0x0) > > + return; > > + > > + if (WARN_ON(!owner_mc_dev)) > > + return; > > + > > + irq_cfg.paddr = ((u64)msi_desc->msg.address_hi << 32) | > > + msi_desc->msg.address_lo; > > This should really be a phys_addr_t. > I'll change the type of paddr in the dprc_irq_cfg struct to be phys_addr_t instead of u64. > > + irq_cfg.val = msi_desc->msg.data; > > + irq_cfg.user_irq_id = msi_desc->irq; > > + > > + /* > > + * DPRCs and other objects use different commands to set up IRQs, > > + * so we have to differentiate them here. > > + */ > > + if (owner_mc_dev == mc_bus_dev) { > > + /* > > + * IRQ is for the mc_bus_dev's DPRC itself > > + */ > > + error = dprc_set_irq(mc_bus_dev->mc_io, > > + MC_CMD_FLAG_INTR_DIS | MC_CMD_FLAG_PRI, > > + mc_bus_dev->mc_handle, > > + mc_dev_irq->dev_irq_index, > > + &irq_cfg); > > + if (error < 0) { > > + dev_err(&owner_mc_dev->dev, > > + "dprc_set_irq() failed: %d\n", error); > > + } > > + } else { > > + error = dprc_set_obj_irq(mc_bus_dev->mc_io, > > + MC_CMD_FLAG_INTR_DIS | MC_CMD_FLAG_PRI, > > + mc_bus_dev->mc_handle, > > + owner_mc_dev->obj_desc.type, > > + owner_mc_dev->obj_desc.id, > > + mc_dev_irq->dev_irq_index, > > + &irq_cfg); > > + if (error < 0) { > > + dev_err(&owner_mc_dev->dev, > > + "dprc_obj_set_irq() failed: %d\n", error); > > + } > > + } > > It feels a bit odd that you have all of this under a single MSI umbrella, > and yet have to differentiate between them. Do they have a different > programming interface? Or is that because these dprc_set_*_irq functions > do some other stuff behind the scene (I'm too lazy to check...)? > Due to MC firmware API limitations, dprc_set_obj_irq can only be used to set IRQs for the DPRC's children not for the DPRC itself. > > +} > > + > > +/* > > + * NOTE: This function is invoked with interrupts disabled */ static > > +void fsl_mc_msi_write_msg(struct irq_data *irq_data, > > + struct msi_msg *msg) > > +{ > > + struct msi_desc *msi_desc = irq_data_get_msi_desc(irq_data); > > + struct fsl_mc_device *mc_bus_dev = to_fsl_mc_device(msi_desc->dev); > > + struct fsl_mc_bus *mc_bus = to_fsl_mc_bus(mc_bus_dev); > > + struct fsl_mc_device_irq *mc_dev_irq = > > + &mc_bus->irq_resources[msi_desc->fsl_mc.msi_index]; > > + > > + WARN_ON(mc_dev_irq->msi_desc != msi_desc); > > + msi_desc->msg = *msg; > > I wonder why we don't do that in core code... > > > + > > + /* > > + * Program the MSI (paddr, value) pair in the device: > > + */ > > + __fsl_mc_msi_write_msg(mc_bus_dev, mc_dev_irq); } > > + > > +static void fsl_mc_msi_update_chip_ops(struct msi_domain_info *info) > > +{ > > + struct irq_chip *chip = info->chip; > > + > > + if (WARN_ON((!chip))) > > + return; > > + > > + if (!chip->irq_write_msi_msg) > > + chip->irq_write_msi_msg = fsl_mc_msi_write_msg; > > Same as above. Do you foresee any circumstances where you you wouldn't > use this function? My hunch is that you should warn if > chip->irq_write_msi_msg is provided by the caller. > I agree with you. The caller should not set the irq_write_msi_msg function. I'll add a WARN_ON to catch that. > > +} > > [...] > > Thanks, > > M. > -- > Jazz is not dead. It just smells funny... -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/