From: M Chetan Kumar <m.chetan.kumar@intel.com>
To: netdev@vger.kernel.org, linux-wireless@vger.kernel.org
Cc: johannes@sipsolutions.net, krishna.c.sudi@intel.com,
m.chetan.kumar@intel.com
Subject: [RFC 02/18] net: iosm: irq handling
Date: Mon, 23 Nov 2020 19:21:07 +0530 [thread overview]
Message-ID: <20201123135123.48892-3-m.chetan.kumar@intel.com> (raw)
In-Reply-To: <20201123135123.48892-1-m.chetan.kumar@intel.com>
1) Request interrupt vector, frees allocated resource.
2) Registers IRQ handler.
Signed-off-by: M Chetan Kumar <m.chetan.kumar@intel.com>
---
drivers/net/wwan/iosm/iosm_ipc_irq.c | 95 ++++++++++++++++++++++++++++++++++++
drivers/net/wwan/iosm/iosm_ipc_irq.h | 35 +++++++++++++
2 files changed, 130 insertions(+)
create mode 100644 drivers/net/wwan/iosm/iosm_ipc_irq.c
create mode 100644 drivers/net/wwan/iosm/iosm_ipc_irq.h
diff --git a/drivers/net/wwan/iosm/iosm_ipc_irq.c b/drivers/net/wwan/iosm/iosm_ipc_irq.c
new file mode 100644
index 000000000000..b9e1bc7959db
--- /dev/null
+++ b/drivers/net/wwan/iosm/iosm_ipc_irq.c
@@ -0,0 +1,95 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (C) 2020 Intel Corporation.
+ */
+
+#include "iosm_ipc_pcie.h"
+#include "iosm_ipc_protocol.h"
+
+/* Write to the specified register offset for doorbell interrupt */
+static inline void write_dbell_reg(struct iosm_pcie *ipc_pcie, int irq_n,
+ u32 data)
+{
+ void __iomem *write_reg;
+
+ /* Select the first doorbell register, which is only currently needed
+ * by CP.
+ */
+ write_reg = (void __iomem *)((u8 __iomem *)ipc_pcie->ipc_regs +
+ ipc_pcie->doorbell_write +
+ (irq_n * ipc_pcie->doorbell_reg_offset));
+
+ /* Fire the doorbell irq by writing data on the doorbell write pointer
+ * register.
+ */
+ iowrite32(data, write_reg);
+}
+
+void ipc_doorbell_fire(struct iosm_pcie *ipc_pcie, int irq_n, u32 data)
+{
+ if (!ipc_pcie || !ipc_pcie->ipc_regs)
+ return;
+
+ write_dbell_reg(ipc_pcie, irq_n, data);
+}
+
+/* Threaded Interrupt handler for MSI interrupts */
+static irqreturn_t ipc_msi_interrupt(int irq, void *dev_id)
+{
+ struct iosm_pcie *ipc_pcie = dev_id;
+ int instance = irq - ipc_pcie->pci->irq;
+
+ /* Shift the MSI irq actions to the IPC tasklet. IRQ_NONE means the
+ * irq was not from the IPC device or could not be served.
+ */
+ if (instance >= ipc_pcie->nvec)
+ return IRQ_NONE;
+
+ ipc_imem_irq_process(ipc_pcie->imem, instance);
+
+ return IRQ_HANDLED;
+}
+
+void ipc_release_irq(struct iosm_pcie *ipc_pcie)
+{
+ struct pci_dev *pdev = ipc_pcie->pci;
+
+ if (pdev->msi_enabled) {
+ while (--ipc_pcie->nvec >= 0)
+ free_irq(pdev->irq + ipc_pcie->nvec, ipc_pcie);
+ }
+ pci_free_irq_vectors(pdev);
+}
+
+int ipc_acquire_irq(struct iosm_pcie *ipc_pcie)
+{
+ struct pci_dev *pdev = ipc_pcie->pci;
+ int i, rc = 0;
+
+ ipc_pcie->nvec = pci_alloc_irq_vectors(pdev, IPC_MSI_VECTORS,
+ IPC_MSI_VECTORS, PCI_IRQ_MSI);
+
+ if (ipc_pcie->nvec < 0)
+ return ipc_pcie->nvec;
+
+ if (!pdev->msi_enabled) {
+ rc = -1;
+ goto error;
+ }
+
+ for (i = 0; i < ipc_pcie->nvec; ++i) {
+ rc = request_threaded_irq(pdev->irq + i, NULL,
+ ipc_msi_interrupt, 0, KBUILD_MODNAME,
+ ipc_pcie);
+ if (rc) {
+ dev_err(ipc_pcie->dev, "unable to grab IRQ %d, rc=%d",
+ pdev->irq, rc);
+ ipc_pcie->nvec = i;
+ ipc_release_irq(ipc_pcie);
+ goto error;
+ }
+ }
+
+error:
+ return rc;
+}
diff --git a/drivers/net/wwan/iosm/iosm_ipc_irq.h b/drivers/net/wwan/iosm/iosm_ipc_irq.h
new file mode 100644
index 000000000000..db207cb95a8a
--- /dev/null
+++ b/drivers/net/wwan/iosm/iosm_ipc_irq.h
@@ -0,0 +1,35 @@
+/* SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Copyright (C) 2020 Intel Corporation.
+ */
+
+#ifndef IOSM_IPC_IRQ_H
+#define IOSM_IPC_IRQ_H
+
+#include "iosm_ipc_pcie.h"
+
+struct iosm_pcie;
+
+/**
+ * ipc_doorbell_fire - fire doorbell to CP
+ * @ipc_pcie: Pointer to iosm_pcie
+ * @irq_n: Doorbell type
+ * @data: ipc state
+ */
+void ipc_doorbell_fire(struct iosm_pcie *ipc_pcie, int irq_n, u32 data);
+
+/**
+ * ipc_release_irq - Remove the IRQ handler.
+ * @ipc_pcie: Pointer to iosm_pcie struct
+ */
+void ipc_release_irq(struct iosm_pcie *ipc_pcie);
+
+/**
+ * ipc_acquire_irq - Install the IPC IRQ handler.
+ * @ipc_pcie: Pointer to iosm_pcie struct
+ *
+ * Return: 0 on success and -1 on failure
+ */
+int ipc_acquire_irq(struct iosm_pcie *ipc_pcie);
+
+#endif
--
2.12.3
next prev parent reply other threads:[~2020-11-23 13:52 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-23 13:51 [RFC 00/18] net: iosm: PCIe Driver for Intel M.2 Modem M Chetan Kumar
2020-11-23 13:51 ` [RFC 01/18] net: iosm: entry point M Chetan Kumar
2020-11-23 13:51 ` M Chetan Kumar [this message]
2020-11-23 13:51 ` [RFC 03/18] net: iosm: mmio scratchpad M Chetan Kumar
2020-11-23 13:51 ` [RFC 04/18] net: iosm: shared memory IPC interface M Chetan Kumar
2020-11-23 13:51 ` [RFC 05/18] net: iosm: shared memory I/O operations M Chetan Kumar
2020-11-23 13:51 ` [RFC 06/18] net: iosm: channel configuration M Chetan Kumar
2020-11-23 13:51 ` [RFC 07/18] net: iosm: char device for FW flash & coredump M Chetan Kumar
2020-11-23 13:51 ` [RFC 08/18] net: iosm: MBIM control device M Chetan Kumar
2020-11-23 13:51 ` [RFC 09/18] net: iosm: bottom half M Chetan Kumar
2020-11-23 13:51 ` [RFC 10/18] net: iosm: multiplex IP sessions M Chetan Kumar
2020-11-23 13:51 ` [RFC 11/18] net: iosm: encode or decode datagram M Chetan Kumar
2020-11-23 13:51 ` [RFC 12/18] net: iosm: power management M Chetan Kumar
2020-11-23 13:51 ` [RFC 13/18] net: iosm: shared memory protocol M Chetan Kumar
2020-11-23 13:51 ` [RFC 14/18] net: iosm: protocol operations M Chetan Kumar
2020-11-23 13:51 ` [RFC 15/18] net: iosm: uevent support M Chetan Kumar
2020-11-23 13:51 ` [RFC 16/18] net: iosm: net driver M Chetan Kumar
2020-11-23 13:51 ` [RFC 17/18] net: iosm: readme file M Chetan Kumar
2020-11-23 13:51 ` [RFC 18/18] net: iosm: infrastructure M Chetan Kumar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201123135123.48892-3-m.chetan.kumar@intel.com \
--to=m.chetan.kumar@intel.com \
--cc=johannes@sipsolutions.net \
--cc=krishna.c.sudi@intel.com \
--cc=linux-wireless@vger.kernel.org \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).