All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mika Westerberg <mika.westerberg@linux.intel.com>
To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Andreas Noever <andreas.noever@gmail.com>,
	Michael Jamet <michael.jamet@intel.com>,
	Yehezkel Bernat <yehezkel.bernat@intel.com>,
	Lukas Wunner <lukas@wunner.de>,
	Amir Levy <amir.jer.levy@intel.com>,
	Andy Lutomirski <luto@kernel.org>,
	Mario.Limonciello@dell.com, Jared.Dominguez@dell.com,
	Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
	Mika Westerberg <mika.westerberg@linux.intel.com>,
	linux-kernel@vger.kernel.org
Subject: [PATCH v3 20/27] thunderbolt: Add support for NHI mailbox
Date: Fri,  2 Jun 2017 17:05:17 +0300	[thread overview]
Message-ID: <20170602140524.23367-21-mika.westerberg@linux.intel.com> (raw)
In-Reply-To: <20170602140524.23367-1-mika.westerberg@linux.intel.com>

The host controller includes two sets of registers that are used to
communicate with the firmware. Add functions that can be used to access
these registers.

This code is based on the work done by Amir Levy and Michael Jamet.

Signed-off-by: Michael Jamet <michael.jamet@intel.com>
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Reviewed-by: Yehezkel Bernat <yehezkel.bernat@intel.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/thunderbolt/nhi.c      | 58 ++++++++++++++++++++++++++++++++++++++++++
 drivers/thunderbolt/nhi.h      | 16 ++++++++++++
 drivers/thunderbolt/nhi_regs.h | 11 ++++++++
 3 files changed, 85 insertions(+)

diff --git a/drivers/thunderbolt/nhi.c b/drivers/thunderbolt/nhi.c
index fa4c2745dba2..c358c074f925 100644
--- a/drivers/thunderbolt/nhi.c
+++ b/drivers/thunderbolt/nhi.c
@@ -14,6 +14,7 @@
 #include <linux/interrupt.h>
 #include <linux/module.h>
 #include <linux/dmi.h>
+#include <linux/delay.h>
 
 #include "nhi.h"
 #include "nhi_regs.h"
@@ -28,6 +29,8 @@
 #define MSIX_MIN_VECS		6
 #define MSIX_MAX_VECS		16
 
+#define NHI_MAILBOX_TIMEOUT	500 /* ms */
+
 static int ring_interrupt_index(struct tb_ring *ring)
 {
 	int bit = ring->hop;
@@ -525,6 +528,61 @@ void ring_free(struct tb_ring *ring)
 	kfree(ring);
 }
 
+/**
+ * nhi_mailbox_cmd() - Send a command through NHI mailbox
+ * @nhi: Pointer to the NHI structure
+ * @cmd: Command to send
+ * @data: Data to be send with the command
+ *
+ * Sends mailbox command to the firmware running on NHI. Returns %0 in
+ * case of success and negative errno in case of failure.
+ */
+int nhi_mailbox_cmd(struct tb_nhi *nhi, enum nhi_mailbox_cmd cmd, u32 data)
+{
+	ktime_t timeout;
+	u32 val;
+
+	iowrite32(data, nhi->iobase + REG_INMAIL_DATA);
+
+	val = ioread32(nhi->iobase + REG_INMAIL_CMD);
+	val &= ~(REG_INMAIL_CMD_MASK | REG_INMAIL_ERROR);
+	val |= REG_INMAIL_OP_REQUEST | cmd;
+	iowrite32(val, nhi->iobase + REG_INMAIL_CMD);
+
+	timeout = ktime_add_ms(ktime_get(), NHI_MAILBOX_TIMEOUT);
+	do {
+		val = ioread32(nhi->iobase + REG_INMAIL_CMD);
+		if (!(val & REG_INMAIL_OP_REQUEST))
+			break;
+		usleep_range(10, 20);
+	} while (ktime_before(ktime_get(), timeout));
+
+	if (val & REG_INMAIL_OP_REQUEST)
+		return -ETIMEDOUT;
+	if (val & REG_INMAIL_ERROR)
+		return -EIO;
+
+	return 0;
+}
+
+/**
+ * nhi_mailbox_mode() - Return current firmware operation mode
+ * @nhi: Pointer to the NHI structure
+ *
+ * The function reads current firmware operation mode using NHI mailbox
+ * registers and returns it to the caller.
+ */
+enum nhi_fw_mode nhi_mailbox_mode(struct tb_nhi *nhi)
+{
+	u32 val;
+
+	val = ioread32(nhi->iobase + REG_OUTMAIL_CMD);
+	val &= REG_OUTMAIL_CMD_OPMODE_MASK;
+	val >>= REG_OUTMAIL_CMD_OPMODE_SHIFT;
+
+	return (enum nhi_fw_mode)val;
+}
+
 static void nhi_interrupt_work(struct work_struct *work)
 {
 	struct tb_nhi *nhi = container_of(work, typeof(*nhi), interrupt_work);
diff --git a/drivers/thunderbolt/nhi.h b/drivers/thunderbolt/nhi.h
index 8bd9b4e5a0b1..446ff6dac91d 100644
--- a/drivers/thunderbolt/nhi.h
+++ b/drivers/thunderbolt/nhi.h
@@ -143,6 +143,22 @@ static inline int ring_tx(struct tb_ring *ring, struct ring_frame *frame)
 	return __ring_enqueue(ring, frame);
 }
 
+enum nhi_fw_mode {
+	NHI_FW_SAFE_MODE,
+	NHI_FW_AUTH_MODE,
+	NHI_FW_EP_MODE,
+	NHI_FW_CM_MODE,
+};
+
+enum nhi_mailbox_cmd {
+	NHI_MAILBOX_SAVE_DEVS = 0x05,
+	NHI_MAILBOX_DRV_UNLOADS = 0x07,
+	NHI_MAILBOX_ALLOW_ALL_DEVS = 0x23,
+};
+
+int nhi_mailbox_cmd(struct tb_nhi *nhi, enum nhi_mailbox_cmd cmd, u32 data);
+enum nhi_fw_mode nhi_mailbox_mode(struct tb_nhi *nhi);
+
 /*
  * PCI IDs used in this driver from Win Ridge forward. There is no
  * need for the PCI quirk anymore as we will use ICM also on Apple
diff --git a/drivers/thunderbolt/nhi_regs.h b/drivers/thunderbolt/nhi_regs.h
index 48b98d3c7e6a..322fe1fa3a3c 100644
--- a/drivers/thunderbolt/nhi_regs.h
+++ b/drivers/thunderbolt/nhi_regs.h
@@ -107,4 +107,15 @@ struct ring_desc {
 #define REG_DMA_MISC			0x39864
 #define REG_DMA_MISC_INT_AUTO_CLEAR     BIT(2)
 
+#define REG_INMAIL_DATA			0x39900
+
+#define REG_INMAIL_CMD			0x39904
+#define REG_INMAIL_CMD_MASK		GENMASK(7, 0)
+#define REG_INMAIL_ERROR		BIT(30)
+#define REG_INMAIL_OP_REQUEST		BIT(31)
+
+#define REG_OUTMAIL_CMD			0x3990c
+#define REG_OUTMAIL_CMD_OPMODE_SHIFT	8
+#define REG_OUTMAIL_CMD_OPMODE_MASK	GENMASK(11, 8)
+
 #endif
-- 
2.11.0

  parent reply	other threads:[~2017-06-02 14:06 UTC|newest]

Thread overview: 56+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-06-02 14:04 [PATCH v3 00/27] Thunderbolt security levels and NVM firmware upgrade Mika Westerberg
2017-06-02 14:04 ` [PATCH v3 01/27] thunderbolt: Use const buffer pointer in write operations Mika Westerberg
2017-06-02 14:04 ` [PATCH v3 02/27] thunderbolt: No need to read UID of the root switch on resume Mika Westerberg
2017-06-02 14:05 ` [PATCH v3 03/27] thunderbolt: Do not try to read UID if DROM offset is read as 0 Mika Westerberg
2017-06-02 14:05 ` [PATCH v3 04/27] thunderbolt: Do not warn about newer DROM versions Mika Westerberg
2017-06-02 14:05 ` [PATCH v3 05/27] thunderbolt: Add MSI-X support Mika Westerberg
2017-06-02 14:05 ` [PATCH v3 06/27] thunderbolt: Rework capability handling Mika Westerberg
2017-06-04 13:52   ` Lukas Wunner
2017-06-04 15:00     ` Mika Westerberg
2017-06-04 15:06       ` Mika Westerberg
2017-06-04 18:15         ` Andy Shevchenko
2017-06-05  6:42           ` Mika Westerberg
2017-06-02 14:05 ` [PATCH v3 07/27] thunderbolt: Allow passing NULL to tb_ctl_free() Mika Westerberg
2017-06-02 14:05 ` [PATCH v3 08/27] thunderbolt: Introduce thunderbolt bus and connection manager Mika Westerberg
2017-06-05 15:10   ` Andreas Noever
2017-06-02 14:05 ` [PATCH v3 09/27] thunderbolt: Convert switch to a device Mika Westerberg
2017-06-03  9:11   ` Greg Kroah-Hartman
2017-06-02 14:05 ` [PATCH v3 10/27] thunderbolt: Fail switch adding operation if reading DROM fails Mika Westerberg
2017-06-02 14:05 ` [PATCH v3 11/27] thunderbolt: Do not fail if DROM data CRC32 is invalid Mika Westerberg
2017-06-02 14:05 ` [PATCH v3 12/27] thunderbolt: Refactor and fix parsing of port drom entries Mika Westerberg
2017-06-02 14:05 ` [PATCH v3 13/27] thunderbolt: Read vendor and device name from DROM Mika Westerberg
2017-06-02 14:05 ` [PATCH v3 14/27] thunderbolt: Move control channel messages to tb_msgs.h Mika Westerberg
2017-06-02 14:05 ` [PATCH v3 15/27] thunderbolt: Expose get_route() to other files Mika Westerberg
2017-06-02 14:05 ` [PATCH v3 16/27] thunderbolt: Expose make_header() " Mika Westerberg
2017-06-02 14:05 ` [PATCH v3 17/27] thunderbolt: Let the connection manager handle all notifications Mika Westerberg
2017-06-02 14:05 ` [PATCH v3 18/27] thunderbolt: Rework control channel to be more reliable Mika Westerberg
2017-06-02 14:05 ` [PATCH v3 19/27] thunderbolt: Add new Thunderbolt PCI IDs Mika Westerberg
2017-06-05  8:14   ` Lukas Wunner
2017-06-05  9:32     ` Mika Westerberg
2017-06-05 12:07       ` Lukas Wunner
2017-06-05 12:55         ` Mika Westerberg
2017-06-05 13:33           ` Mika Westerberg
2017-06-05 13:46             ` Lukas Wunner
2017-06-05 13:52               ` Mika Westerberg
2017-06-05 14:21             ` Andy Shevchenko
2017-06-05 14:44               ` Mika Westerberg
2017-06-05 15:20               ` Greg Kroah-Hartman
2017-06-05 15:40                 ` Mika Westerberg
2017-06-05 15:50                   ` Mario.Limonciello
2017-06-05 16:49                     ` Mika Westerberg
2017-06-02 14:05 ` Mika Westerberg [this message]
2017-06-02 14:05 ` [PATCH v3 21/27] thunderbolt: Store Thunderbolt generation in the switch structure Mika Westerberg
2017-06-02 14:05 ` [PATCH v3 22/27] thunderbolt: Add support for DMA configuration based mailbox Mika Westerberg
2017-06-02 14:05 ` [PATCH v3 23/27] thunderbolt: Do not touch the hardware if the NHI is gone on resume Mika Westerberg
2017-06-02 14:05 ` [PATCH v3 24/27] thunderbolt: Add support for Internal Connection Manager (ICM) Mika Westerberg
2017-06-02 14:05 ` [PATCH v3 25/27] thunderbolt: Add support for host and device NVM firmware upgrade Mika Westerberg
2017-06-02 14:05 ` [PATCH v3 26/27] thunderbolt: Add documentation how Thunderbolt bus can be used Mika Westerberg
2017-06-03  9:14   ` Greg Kroah-Hartman
2017-06-02 14:05 ` [PATCH v3 27/27] MAINTAINERS: Add maintainers for Thunderbolt driver Mika Westerberg
2017-06-02 17:58 ` [PATCH v3 00/27] Thunderbolt security levels and NVM firmware upgrade Andy Shevchenko
2017-06-03  9:17 ` Greg Kroah-Hartman
2017-06-05  7:18   ` Mika Westerberg
2017-06-05 17:01     ` Andreas Noever
2017-06-05 19:43       ` Mika Westerberg
2017-06-06  6:03       ` Greg Kroah-Hartman
2017-06-06  6:41         ` Mika Westerberg

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=20170602140524.23367-21-mika.westerberg@linux.intel.com \
    --to=mika.westerberg@linux.intel.com \
    --cc=Jared.Dominguez@dell.com \
    --cc=Mario.Limonciello@dell.com \
    --cc=amir.jer.levy@intel.com \
    --cc=andreas.noever@gmail.com \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lukas@wunner.de \
    --cc=luto@kernel.org \
    --cc=michael.jamet@intel.com \
    --cc=yehezkel.bernat@intel.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.