From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754159AbbJ0H2v (ORCPT ); Tue, 27 Oct 2015 03:28:51 -0400 Received: from mga11.intel.com ([192.55.52.93]:33078 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753990AbbJ0H2u (ORCPT ); Tue, 27 Oct 2015 03:28:50 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.20,203,1444719600"; d="scan'208";a="672497434" Subject: Re: [PATCH 02/10] staging: fsl-mc: Added generic MSI support for FSL-MC devices To: "J. German Rivera" , gregkh@linuxfoundation.org, arnd@arndb.de, devel@driverdev.osuosl.org, linux-kernel@vger.kernel.org References: <1445874561-14761-1-git-send-email-German.Rivera@freescale.com> <1445874561-14761-3-git-send-email-German.Rivera@freescale.com> Cc: stuart.yoder@freescale.com, itai.katz@freescale.com, lijun.pan@freescale.com, leoli@freescale.com, scottwood@freescale.com, agraf@suse.de, bhamciu1@freescale.com, R89243@freescale.com, bhupesh.sharma@freescale.com, nir.erez@freescale.com, richard.schmitt@freescale.com, dan.carpenter@oracle.com, marc.zyngier@arm.com From: Jiang Liu Organization: Intel Message-ID: <562F27AB.1010307@linux.intel.com> Date: Tue, 27 Oct 2015 15:28:43 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.3.0 MIME-Version: 1.0 In-Reply-To: <1445874561-14761-3-git-send-email-German.Rivera@freescale.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2015/10/26 23:49, 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 > --- > drivers/staging/fsl-mc/bus/Kconfig | 1 + > drivers/staging/fsl-mc/bus/Makefile | 1 + > drivers/staging/fsl-mc/bus/mc-msi.c | 278 ++++++++++++++++++++++++++++ > drivers/staging/fsl-mc/include/mc-private.h | 17 ++ > drivers/staging/fsl-mc/include/mc.h | 17 ++ > 5 files changed, 314 insertions(+) > create mode 100644 drivers/staging/fsl-mc/bus/mc-msi.c > > + > +static void fsl_mc_msi_free_descs(struct device *dev) > +{ > + struct msi_desc *desc, *tmp; > + > + list_for_each_entry_safe(desc, tmp, dev_to_msi_list(dev), list) { > + list_del(&desc->list); > + free_msi_entry(desc); > + } > +} > + > +static int fsl_mc_msi_alloc_descs(struct device *dev, unsigned int irq_count) > + > +{ > + unsigned int i; > + int error; > + struct msi_desc *msi_desc; > + > + for (i = 0; i < irq_count; i++) { > + msi_desc = alloc_msi_entry(dev); > + if (!msi_desc) { > + dev_err(dev, "Failed to allocate msi entry\n"); > + error = -ENOMEM; > + goto cleanup_msi_descs; > + } > + > + msi_desc->msi_attrib.is_msix = 1; > + msi_desc->msi_attrib.is_64 = 1; > + msi_desc->msi_attrib.entry_nr = i; Hi Rivera, Field msi_desc->msi_attrib is for PCI MSI only, it would be better to introduce a dedicated structure for FSL-MC, just like struct platform_msi_desc. Thanks, Gerry > + msi_desc->nvec_used = 1; > + INIT_LIST_HEAD(&msi_desc->list); > + list_add_tail(&msi_desc->list, dev_to_msi_list(dev)); > + } > + > + return 0; > + > +cleanup_msi_descs: > + fsl_mc_msi_free_descs(dev); > + return error; > +} > + > +int fsl_mc_msi_domain_alloc_irqs(struct device *dev, > + unsigned int irq_count) > +{ > + struct irq_domain *msi_domain; > + int error; > + > + if (WARN_ON(!list_empty(dev_to_msi_list(dev)))) > + return -EINVAL; > + > + error = fsl_mc_msi_alloc_descs(dev, irq_count); > + if (error < 0) > + return error; > + > + msi_domain = dev_get_msi_domain(dev); > + if (WARN_ON(!msi_domain)) { > + error = -EINVAL; > + goto cleanup_msi_descs; > + } > + > + /* > + * NOTE: Calling this function will trigger the invocation of the > + * its_fsl_mc_msi_prepare() callback > + */ > + error = msi_domain_alloc_irqs(msi_domain, dev, irq_count); > + > + if (error) { > + dev_err(dev, "Failed to allocate IRQs\n"); > + goto cleanup_msi_descs; > + } > + > + return 0; > + > +cleanup_msi_descs: > + fsl_mc_msi_free_descs(dev); > + return error; > +} > +