Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp610281pxb; Wed, 3 Feb 2021 13:04:39 -0800 (PST) X-Google-Smtp-Source: ABdhPJxC3GFCWi6b/tbiD3eHkahRG9fcV09QMEoxvfvnylYuXPI/4rp58fCNI5uuK98EOYKvFIGP X-Received: by 2002:a17:906:653:: with SMTP id t19mr5088933ejb.44.1612386279595; Wed, 03 Feb 2021 13:04:39 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1612386279; cv=none; d=google.com; s=arc-20160816; b=J10OwFfgx4i7ua1DMEd4JYQ5VAeEyOAwoeClhId0TbWjLgjHU8wcqClDZZAO+19FK5 7lqeHIPO+7sTwLSBixv9YIIJENCwXyiGlZIQ9XJ2OtX1jAaJmoVk1lojR9IzUvToiYMU h9vyXyrkM+NwzfX0kO3PAUX9ck75d+TU8aXbJW7JZGBTVObchZfYeAoSZag9l5QteDNR li61ZXMS7t58JBIGYMIh/DdTNfYEaMOrnBevzbC/QnfXO1VdWC8O8Ba2GzsQOFgbUo8o f3PNYoIxCT3FnqxcMNJ1G9SpWfm9mkNv5E5DDgr/BpdI6XgJEwbfGitoG2rGm4x9wO4A 46Cg== 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=++i+Z/Wy2le5qGC5cTLClSTcnF2nunxgAuockqELU+8=; b=pBeXxI/B7WiXEoNJ7iL5gEMICJPijZCDYho8VqU8m9kDUmKfxgK5QAlK+4KNGm8v3D WWPsuiZMAVGvvKmFafdJOcVpsCLDwANMYfHd+xDs6BQceSYiqillLR3E7YDJM1U3IOkW bYVcYYvmDn6eHFYMWeV86Jp+pU2knZ+iChef/jDQ5IWpbwWEJa9SC/+6+NUGR4Gy+H6E pNbC7QsP0IpqOVsp7nmxK6ufEFcTVlt3Y8NWdnp+97Djc91lWqatJ74Kypfivyd+djEr Ed293bYP/FYaL0hofjwPsRhjf9VoDNVGQ8pbFxKmNh7a/KBGbEFc3D5WwVzoCzko/Uw+ ulBw== 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 bc16si2057814edb.335.2021.02.03.13.04.15; Wed, 03 Feb 2021 13:04:39 -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 S232772AbhBCVCY (ORCPT + 99 others); Wed, 3 Feb 2021 16:02:24 -0500 Received: from mga07.intel.com ([134.134.136.100]:45270 "EHLO mga07.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232831AbhBCU6c (ORCPT ); Wed, 3 Feb 2021 15:58:32 -0500 IronPort-SDR: bMzPtbJcVsXP0h/g+lR/99OeqtXolQWog0IUvX0Bdi8a8yoCCVOCXx6sguKOgdOlsWrn/BJ44M eQHwVsT1fTrQ== X-IronPort-AV: E=McAfee;i="6000,8403,9884"; a="245191306" X-IronPort-AV: E=Sophos;i="5.79,399,1602572400"; d="scan'208";a="245191306" 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: z24OHgspgXrmUufwOeutvV6tlHGf9al7sBOIJbNf8aGLHBQtLiLTIBb2vJCFLQOMgpXsLQm86z uHnTQ4xRdMlA== X-IronPort-AV: E=Sophos;i="5.79,399,1602572400"; d="scan'208";a="372510575" 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 08/12] genirq: Set auxiliary data for an interrupt Date: Wed, 3 Feb 2021 12:56:41 -0800 Message-Id: <1612385805-3412-9-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 Introduce a new function pointer in the irq_chip structure(irq_set_auxdata) which is responsible for updating data which is stored in a shared register or data storage. For example, the idxd driver uses the auxiliary data API to enable/set and disable PASID field that is in the IMS entry (introduced in a later patch) and that data are not typically present in MSI entry. Reviewed-by: Tony Luck Signed-off-by: Megha Dey --- include/linux/interrupt.h | 2 ++ include/linux/irq.h | 4 ++++ kernel/irq/manage.c | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+) diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index bb8ff90..d3f419b 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h @@ -496,6 +496,8 @@ extern int irq_get_irqchip_state(unsigned int irq, enum irqchip_irq_state which, extern int irq_set_irqchip_state(unsigned int irq, enum irqchip_irq_state which, bool state); +int irq_set_auxdata(unsigned int irq, unsigned int which, u64 val); + #ifdef CONFIG_IRQ_FORCED_THREADING # ifdef CONFIG_PREEMPT_RT # define force_irqthreads (true) diff --git a/include/linux/irq.h b/include/linux/irq.h index 4aeb1c4..568cdf5 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h @@ -491,6 +491,8 @@ static inline irq_hw_number_t irqd_to_hwirq(struct irq_data *d) * irq_request_resources * @irq_compose_msi_msg: optional to compose message content for MSI * @irq_write_msi_msg: optional to write message content for MSI + * @irq_set_auxdata: Optional function to update auxiliary data e.g. in + * shared registers * @irq_get_irqchip_state: return the internal state of an interrupt * @irq_set_irqchip_state: set the internal state of a interrupt * @irq_set_vcpu_affinity: optional to target a vCPU in a virtual machine @@ -538,6 +540,8 @@ struct irq_chip { void (*irq_compose_msi_msg)(struct irq_data *data, struct msi_msg *msg); void (*irq_write_msi_msg)(struct irq_data *data, struct msi_msg *msg); + int (*irq_set_auxdata)(struct irq_data *data, unsigned int which, u64 auxval); + int (*irq_get_irqchip_state)(struct irq_data *data, enum irqchip_irq_state which, bool *state); int (*irq_set_irqchip_state)(struct irq_data *data, enum irqchip_irq_state which, bool state); diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 85ede4e..68ff559 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -2860,3 +2860,35 @@ bool irq_check_status_bit(unsigned int irq, unsigned int bitmask) return res; } EXPORT_SYMBOL_GPL(irq_check_status_bit); + +/** + * irq_set_auxdata - Set auxiliary data + * @irq: Interrupt to update + * @which: Selector which data to update + * @auxval: Auxiliary data value + * + * Function to update auxiliary data for an interrupt, e.g. to update data + * which is stored in a shared register or data storage (e.g. IMS). + */ +int irq_set_auxdata(unsigned int irq, unsigned int which, u64 val) +{ + struct irq_desc *desc; + struct irq_data *data; + unsigned long flags; + int res = -ENODEV; + + desc = irq_get_desc_buslock(irq, &flags, 0); + if (!desc) + return -EINVAL; + + for (data = &desc->irq_data; data; data = irqd_get_parent_data(data)) { + if (data->chip->irq_set_auxdata) { + res = data->chip->irq_set_auxdata(data, which, val); + break; + } + } + + irq_put_desc_busunlock(desc, flags); + return res; +} +EXPORT_SYMBOL_GPL(irq_set_auxdata); -- 2.7.4