Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp610739pxb; Wed, 3 Feb 2021 13:05:18 -0800 (PST) X-Google-Smtp-Source: ABdhPJxoxdgujshpHD2M28cZVD1xCf6lm/QE6q3m7826zmOCe650jc1lb0YH6L3TQ/Fz3erNXwfU X-Received: by 2002:a17:906:2b59:: with SMTP id b25mr5173910ejg.401.1612386317914; Wed, 03 Feb 2021 13:05:17 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1612386317; cv=none; d=google.com; s=arc-20160816; b=WnpEMtWNIqJlH+kIjsBKH8O6IOuF/83D4x00QXe1H/tNT3wZD1zm3IqPvkhHs5lCqz +W9Bvp7mMMchPB4zXWGDtLNPPR1WGlT+XwjOVnWgoDJpSiJpoBXBJpvykW5S2KTLCiHM Ry1dVJt5PRwT3GjzfUDOVibhxzDxO6rcNGwtCTtZK1Qlh0q/OIRd2D0a4LeVIG89XpIS 81dbSmDMvXpLjcpRCSCpeSkyqPu0HnELGpQtw9DjsU3pIippGiuguuWFy5qHRCVtJYRb CtzSAcX5P5Q26Ma+z0I2Q5jqNrR9HvBLSNP2C4TAYXUbZu1f0NLGHLs69zNXeRTJ5ecc MPVQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from:ironport-sdr:ironport-sdr; bh=z3XLA4lXwlj5hMKvNZvaS5Zc/9Qomc8xRXN+DWgfoWw=; b=TbZ40dKeCDLeGBWI07Qa0PJ3sUnqJPi86qX5UOuEPuyy8Uvy128RZiuUIRRLNC0gDH ijcBBEFUAq8cNlnWsmzTjvIw1Bnti1Lt2/vypi/Uy0mimFPHjC+2qRgPv+ALErZfTP3k 9tKTZhUGoAtUaOInh/EDeFzK9Uc3kd9aeth4kOsBsbwVJQzHvKPgJ5Ulf+/TOVm4pPyP H6HhvD7UbZTWexONWwqU6a+muzbzMZ19Qg4P9rQDJdXV5tfVaVLoJWD11yBIJygGMMgm ytw4D216Tj9FqrInhWyf3vzg9bwYbl6uxP7lup4NpG8NRyJBtHWJdAWe/DvDAjnhZvBi Th1Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id t21si1977073edq.451.2021.02.03.13.04.52; Wed, 03 Feb 2021 13:05:17 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232942AbhBCVCg (ORCPT + 99 others); Wed, 3 Feb 2021 16:02:36 -0500 Received: from mga07.intel.com ([134.134.136.100]:45277 "EHLO mga07.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232827AbhBCU6b (ORCPT ); Wed, 3 Feb 2021 15:58:31 -0500 IronPort-SDR: d9tGYLYcFJeWmWZ1FWwK4UNFtoKcTPVYbp0VLiCvVQHyBY7OBPCG3zoMJVfXWaDMtVzB/Ri+ai sjxbhKI5QGgA== X-IronPort-AV: E=McAfee;i="6000,8403,9884"; a="245191304" X-IronPort-AV: E=Sophos;i="5.79,399,1602572400"; d="scan'208";a="245191304" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Feb 2021 12:57:30 -0800 IronPort-SDR: lDo9vV/MuzOHHPofxqRXtGbAdWNRgvbAUKvbBGjO753BaEOXV7JitXKSTe0CQfbNmOqU4s3e7x fwWzf2myIIFg== X-IronPort-AV: E=Sophos;i="5.79,399,1602572400"; d="scan'208";a="372510573" Received: from megha-z97x-ud7-th.sc.intel.com ([143.183.85.154]) by orsmga002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-SHA; 03 Feb 2021 12:57:30 -0800 From: Megha Dey To: tglx@linutronix.de Cc: linux-kernel@vger.kernel.org, dave.jiang@intel.com, ashok.raj@intel.com, kevin.tian@intel.com, dwmw@amazon.co.uk, x86@kernel.org, tony.luck@intel.com, dan.j.williams@intel.com, megha.dey@intel.com, jgg@mellanox.com, kvm@vger.kernel.org, iommu@lists.linux-foundation.org, alex.williamson@redhat.com, bhelgaas@google.com, maz@kernel.org, linux-pci@vger.kernel.org, baolu.lu@linux.intel.com, ravi.v.shankar@intel.com Subject: [PATCH 07/12] irqdomain/msi: Provide msi_alloc/free_store() callbacks Date: Wed, 3 Feb 2021 12:56:40 -0800 Message-Id: <1612385805-3412-8-git-send-email-megha.dey@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1612385805-3412-1-git-send-email-megha.dey@intel.com> References: <1612385805-3412-1-git-send-email-megha.dey@intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Thomas Gleixner For devices which don't have a standard storage for MSI messages like the upcoming IMS (Interrupt Message Store) it's required to allocate storage space before allocating interrupts and after freeing them. This could be achieved with the existing callbacks, but that would be awkward because they operate on msi_alloc_info_t which is not uniform across architectures. Also these callbacks are invoked per interrupt but the allocation might have bulk requirements depending on the device. As such devices can operate on different architectures it is simpler to have separate callbacks which operate on struct device. The resulting storage information has to be stored in struct msi_desc so the underlying irq chip implementation can retrieve it for the relevant operations. Signed-off-by: Thomas Gleixner Signed-off-by: Megha Dey --- include/linux/msi.h | 8 ++++++++ kernel/irq/msi.c | 11 +++++++++++ 2 files changed, 19 insertions(+) diff --git a/include/linux/msi.h b/include/linux/msi.h index fbf2258..a6b419d 100644 --- a/include/linux/msi.h +++ b/include/linux/msi.h @@ -317,6 +317,10 @@ struct msi_domain_info; * function. * @domain_free_irqs: Optional function to override the default free * function. + * @msi_alloc_store: Optional callback to allocate storage in a device + * specific non-standard MSI store + * @msi_alloc_free: Optional callback to free storage in a device + * specific non-standard MSI store * * @get_hwirq, @msi_init and @msi_free are callbacks used by * msi_create_irq_domain() and related interfaces @@ -366,6 +370,10 @@ struct msi_domain_ops { struct device *dev, int nvec); void (*domain_free_irqs)(struct irq_domain *domain, struct device *dev); + int (*msi_alloc_store)(struct irq_domain *domain, + struct device *dev, int nvec); + void (*msi_free_store)(struct irq_domain *domain, + struct device *dev); }; /** diff --git a/kernel/irq/msi.c b/kernel/irq/msi.c index 3697909..d70d92e 100644 --- a/kernel/irq/msi.c +++ b/kernel/irq/msi.c @@ -434,6 +434,12 @@ int __msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev, if (ret) return ret; + if (ops->msi_alloc_store) { + ret = ops->msi_alloc_store(domain, dev, nvec); + if (ret) + return ret; + } + for_each_msi_entry(desc, dev) { ops->set_desc(&arg, desc); @@ -533,6 +539,8 @@ int msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev, void __msi_domain_free_irqs(struct irq_domain *domain, struct device *dev) { + struct msi_domain_info *info = domain->host_data; + struct msi_domain_ops *ops = info->ops; struct msi_desc *desc; for_each_msi_entry(desc, dev) { @@ -546,6 +554,9 @@ void __msi_domain_free_irqs(struct irq_domain *domain, struct device *dev) desc->irq = 0; } } + + if (ops->msi_free_store) + ops->msi_free_store(domain, dev); } /** -- 2.7.4