Received: by 2002:a25:824b:0:0:0:0:0 with SMTP id d11csp1935221ybn; Thu, 26 Sep 2019 04:34:25 -0700 (PDT) X-Google-Smtp-Source: APXvYqzunUgB4L+cQBuBR4stBU5iHQJ7GC6LDkwX0MnZk9VK5ptEcKQu+qm+D857JJZ61DwUQvDC X-Received: by 2002:aa7:c759:: with SMTP id c25mr2980596eds.15.1569497665017; Thu, 26 Sep 2019 04:34:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1569497665; cv=none; d=google.com; s=arc-20160816; b=WrmD65/qB7GNhQTQuTBHamSemsVktv8700KXTTJQ9T0+Il6BNRjSUmcPwv9mHN29kc 7qr2YzLuVVLpFYW82l0JVuI+LN0+i9ZOGxiUmuEBSTTfKGt3h9yADlm9HqVUR7yn7+oO ERv0R4DyTfqO9LwRzBSQjZ2Se35vlaBUd5XlV+fLiwK5HdWRMx1+awrQzpkibFMHv1fW 35z3azpLEe7fFEqpCww4o187sDAmSYiFO/GMkmht31tXd9TZMzjmzsidY5tmFKVmW7nZ zR0qWa+16sBMGA02nV9TBi4OxG3NplwvPfzE+JR+ua8OsEKZnb/Opb057ygpOPB0F2DS QPhw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature; bh=1e8ivCO58tj7yZejWhSGbZsRTueBDWvOfW2EVwnBC3Q=; b=J6CFWbR45QgfEFb8gnWnA/0mX6JIFCJFz1w/Ln6ARx2j6iWr9JqfcWlonI5Xcq2ZW7 O7HkccF/ZVAKGNCIOK6lriRxcyzpCjmnrNQw5noNCTJ7C21Hhx2kKMBnEIy0avS1qiDF juILpfm+/wHeUvjfq1G86Y4tNbXDMt9iMQPk9TkyLyEh2xiPZfAp0OWXVZRPGWV3gkkQ 1bD6Rh1wzHfRbOqCR4FbOiLB9FlkTMGs6Zta1D8FHDTRKddBDFAf8aJQ3GXN++b6GTgT yR6UXzIqkIyrnsCULqkchBEiwLkJ4i3mHegGFAGmrFjbTr8/Fkw2vZuoUFsEqVluhHAu ZYkg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@ti.com header.s=ti-com-17Q1 header.b=aSr1crur; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=NONE dis=NONE) header.from=ti.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f31si1256486ede.253.2019.09.26.04.34.01; Thu, 26 Sep 2019 04:34:25 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@ti.com header.s=ti-com-17Q1 header.b=aSr1crur; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=NONE dis=NONE) header.from=ti.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726712AbfIZLbj (ORCPT + 99 others); Thu, 26 Sep 2019 07:31:39 -0400 Received: from fllv0015.ext.ti.com ([198.47.19.141]:51098 "EHLO fllv0015.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726626AbfIZLbg (ORCPT ); Thu, 26 Sep 2019 07:31:36 -0400 Received: from fllv0034.itg.ti.com ([10.64.40.246]) by fllv0015.ext.ti.com (8.15.2/8.15.2) with ESMTP id x8QBVSTg042549; Thu, 26 Sep 2019 06:31:28 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=ti-com-17Q1; t=1569497488; bh=1e8ivCO58tj7yZejWhSGbZsRTueBDWvOfW2EVwnBC3Q=; h=From:To:CC:Subject:Date:In-Reply-To:References; b=aSr1crurHpCeKMcKQZ6Nr1XEwhEcc3DrJreug0mfK1CjEbnz7kpLw4Agjb4TpXGFz +XH+MgnEK6uobK9IZjU+ZhcQmMZddX/s45fmhkuRFa90hT7VoMm3wI/g1htT+HBgJy VheE6HftQsOyl0VgN/Vzi2sXNMSwoak4/1cdgwJQ= Received: from DLEE102.ent.ti.com (dlee102.ent.ti.com [157.170.170.32]) by fllv0034.itg.ti.com (8.15.2/8.15.2) with ESMTPS id x8QBVSRa092144 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 26 Sep 2019 06:31:28 -0500 Received: from DLEE106.ent.ti.com (157.170.170.36) by DLEE102.ent.ti.com (157.170.170.32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1713.5; Thu, 26 Sep 2019 06:31:20 -0500 Received: from lelv0327.itg.ti.com (10.180.67.183) by DLEE106.ent.ti.com (157.170.170.36) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1713.5 via Frontend Transport; Thu, 26 Sep 2019 06:31:28 -0500 Received: from a0393678ub.india.ti.com (ileax41-snat.itg.ti.com [10.172.224.153]) by lelv0327.itg.ti.com (8.15.2/8.15.2) with ESMTP id x8QBUTk6069017; Thu, 26 Sep 2019 06:31:24 -0500 From: Kishon Vijay Abraham I To: Bjorn Helgaas , Jonathan Corbet , Rob Herring , Jon Mason , Dave Jiang , Allen Hubbe , Lorenzo Pieralisi CC: Mark Rutland , , , , , , Subject: [RFC PATCH 13/21] PCI: endpoint: Add pci_epc_ops to map MSI irq Date: Thu, 26 Sep 2019 16:59:25 +0530 Message-ID: <20190926112933.8922-14-kishon@ti.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190926112933.8922-1-kishon@ti.com> References: <20190926112933.8922-1-kishon@ti.com> MIME-Version: 1.0 Content-Type: text/plain X-EXCLAIMER-MD-CONFIG: e1e8a2fd-e40a-4ac6-ac9b-f7e9cc9ee180 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add pci_epc_ops to map physical address to MSI address and return MSI data. The physical address is an address in the outbound region. This is required to implement doorbell functionality of NTB (non transparent bridge) wherein EPC on either side of the interface (primary and secondary) can directly write to the physical address (in outbound region) of the other interface to ring doorbell using MSI. Signed-off-by: Kishon Vijay Abraham I --- drivers/pci/endpoint/pci-epc-core.c | 40 +++++++++++++++++++++++++++++ include/linux/pci-epc.h | 7 +++++ 2 files changed, 47 insertions(+) diff --git a/drivers/pci/endpoint/pci-epc-core.c b/drivers/pci/endpoint/pci-epc-core.c index 42085fcc746d..797e5d323998 100644 --- a/drivers/pci/endpoint/pci-epc-core.c +++ b/drivers/pci/endpoint/pci-epc-core.c @@ -363,6 +363,46 @@ int pci_epc_raise_irq(struct pci_epc *epc, u8 func_no, u8 vfunc_no, } EXPORT_SYMBOL_GPL(pci_epc_raise_irq); +/** + * pci_epc_map_msi_irq() - Map physical address to MSI address and return + * MSI data + * @epc: the EPC device which has the MSI capability + * @func_no: the physical endpoint function number in the EPC device + * @vfunc_no: the virtual endpoint function number in the physical function + * @phys_addr: the physical address of the outbound region + * @interrupt_num: the MSI interrupt number + * @entry_size: Size of Outbound address region for each interrupt + * @msi_data: the data that should be written in order to raise MSI interrupt + * with interrupt number as 'interrupt num' + * + * Invoke to map physical address to MSI address and return MSI data. The + * physical address should be an address in the outbound region. This is + * required to implement doorbell functionality of NTB wherein EPC on either + * side of the interface (primary and secondary) can directly write to the + * physical address (in outbound region) of the other interface to ring + * doorbell. + */ +int pci_epc_map_msi_irq(struct pci_epc *epc, u8 func_no, u8 vfunc_no, + phys_addr_t phys_addr, u8 interrupt_num, u32 entry_size, + u32 *msi_data) +{ + int ret; + + if (IS_ERR_OR_NULL(epc)) + return -EINVAL; + + if (!epc->ops->map_msi_irq) + return -EINVAL; + + mutex_lock(&epc->lock); + ret = epc->ops->map_msi_irq(epc, func_no, vfunc_no, phys_addr, + interrupt_num, entry_size, msi_data); + mutex_unlock(&epc->lock); + + return ret; +} +EXPORT_SYMBOL_GPL(pci_epc_map_msi_irq); + /** * pci_epc_get_msi() - get the number of MSI interrupt numbers allocated * @epc: the EPC device to which MSI interrupts was requested diff --git a/include/linux/pci-epc.h b/include/linux/pci-epc.h index 91d5cbaabc8f..0632a4d4714d 100644 --- a/include/linux/pci-epc.h +++ b/include/linux/pci-epc.h @@ -57,6 +57,7 @@ pci_epc_interface_string(enum pci_epc_interface_type type) * @get_msix: ops to get the number of MSI-X interrupts allocated by the RC * from the MSI-X capability register * @raise_irq: ops to raise a legacy, MSI or MSI-X interrupt + * @map_msi_irq: ops to map physical address to MSI address and return MSI data * @start: ops to start the PCI link * @stop: ops to stop the PCI link * @owner: the module owner containing the ops @@ -85,6 +86,9 @@ struct pci_epc_ops { int (*get_msix)(struct pci_epc *epc, u8 func_no, u8 vfunc_no); int (*raise_irq)(struct pci_epc *epc, u8 func_no, u8 vfunc_no, enum pci_epc_irq_type type, u16 interrupt_num); + int (*map_msi_irq)(struct pci_epc *epc, u8 func_no, u8 vfunc_no, + phys_addr_t phys_addr, u8 interrupt_num, + u32 entry_size, u32 *msi_data); int (*start)(struct pci_epc *epc); void (*stop)(struct pci_epc *epc); const struct pci_epc_features* (*get_features)(struct pci_epc *epc, @@ -212,6 +216,9 @@ int pci_epc_get_msi(struct pci_epc *epc, u8 func_no, u8 vfunc_no); int pci_epc_set_msix(struct pci_epc *epc, u8 func_no, u8 vfunc_no, u16 interrupts); int pci_epc_get_msix(struct pci_epc *epc, u8 func_no, u8 vfunc_no); +int pci_epc_map_msi_irq(struct pci_epc *epc, u8 func_no, u8 vfunc_no, + phys_addr_t phys_addr, u8 interrupt_num, + u32 entry_size, u32 *msi_data); int pci_epc_raise_irq(struct pci_epc *epc, u8 func_no, u8 vfunc_no, enum pci_epc_irq_type type, u16 interrupt_num); int pci_epc_start(struct pci_epc *epc); -- 2.17.1