Linux-ACPI Archive on lore.kernel.org
 help / color / Atom feed
* [PATCH v3 0/8] thunderbolt: Intel Ice Lake support
@ 2019-08-19 11:22 Mika Westerberg
  2019-08-19 11:22 ` [PATCH v3 1/8] thunderbolt: Correct path indices for PCIe tunnel Mika Westerberg
                   ` (9 more replies)
  0 siblings, 10 replies; 17+ messages in thread
From: Mika Westerberg @ 2019-08-19 11:22 UTC (permalink / raw)
  To: linux-kernel
  Cc: Andreas Noever, Michael Jamet, Yehezkel Bernat,
	Rafael J. Wysocki, Len Brown, Lukas Wunner, Mario.Limonciello,
	Anthony Wong, Rajmohan Mani, Raanan Avargil, David Laight,
	Mika Westerberg, linux-acpi

Hi all,

This is third iteration of the patch series adding support for the Intel
Ice Lake integrated Thunderbolt controller. The biggest difference from the
previous discrete controllers is that the Ice Lake Thunderbolt controller
is now integrated as part of the SoC. The firmware messages pretty much
follow Titan Ridge but there are some differences as well (such as the new
RTD3 veto notification). Also Ice Lake does not implement security levels
so DMA protection is handled by IOMMU.

The previous versions of the series can be found here:

  v2: https://lwn.net/Articles/795979/
  v1: https://lwn.net/Articles/793066/

Changes from v2:

  * Moved ICL specific NHI ops into a separate file (nhi_ops.c)

  * Postpone rescan thread during resume when if get device connected
    notification from the firmware. This fixes an issue that happened
    occasionally when resuming with full chain of devices. The driver
    started to remove last devices in the chain even if they are still
    connected.

  * Move call to nhi->ops->init() before CM specific probe happens.
  
  * Added ack from Rafael

Changes from v1:

  * Check !x86_apple_machine for Titan Ridge also.

  * Drop ioread32() when updating prod/cons because hardware ignores writes
    to the read-only parts of the register this allows us to save one read.

  * Remove Light Ridge specific handling in eeprom.c as it is not necessary
    after patch 4/8.

  * Moved RTD3 veto handling into separate functions to avoid code
    duplication.

  * Reworked struct nhi_ops so that it provides hooks such as
    runtime_suspend and so on. The NHI implementation then can use those
    hooks to implement whatever additional logic is needed. This should
    allow us to move those bits into a separate files in future if needed.

    I also looked whether we could replace
    quirk_apple_poweroff_thunderbolt() using struct nhi_ops as well but it
    turns out to be unsuitable. The reason is that the ACPI magic sequence
    needs to be done after PCI core has moved the device into D3. The NHI
    driver does not have easy means to do so.

  * Clarified comment in icl_nhi_suspend()

  * Added clarification comment to icl_nhi_force_power()

  * Use "Thunderbolt" instead of "TBT" in new GUID entries

  * Added reviewed tag from Yehezkel

Mika Westerberg (8):
  thunderbolt: Correct path indices for PCIe tunnel
  thunderbolt: Move NVM upgrade support flag to struct icm
  thunderbolt: Use 32-bit writes when writing ring producer/consumer
  thunderbolt: Do not fail adding switch if some port is not implemented
  thunderbolt: Hide switch attributes that are not set
  thunderbolt: Expose active parts of NVM even if upgrade is not supported
  thunderbolt: Add support for Intel Ice Lake
  ACPI / property: Add two new Thunderbolt property GUIDs to the list

 drivers/acpi/property.c        |   6 +
 drivers/thunderbolt/Makefile   |   2 +-
 drivers/thunderbolt/ctl.c      |  23 +++-
 drivers/thunderbolt/eeprom.c   |   4 -
 drivers/thunderbolt/icm.c      | 194 ++++++++++++++++++++++++++++++---
 drivers/thunderbolt/nhi.c      | 134 +++++++++++++++++++++--
 drivers/thunderbolt/nhi.h      |  22 ++++
 drivers/thunderbolt/nhi_ops.c  | 179 ++++++++++++++++++++++++++++++
 drivers/thunderbolt/nhi_regs.h |  37 +++++++
 drivers/thunderbolt/switch.c   |  52 +++++++--
 drivers/thunderbolt/tb_msgs.h  |  16 ++-
 drivers/thunderbolt/tunnel.c   |   4 +-
 include/linux/thunderbolt.h    |   2 +
 13 files changed, 622 insertions(+), 53 deletions(-)
 create mode 100644 drivers/thunderbolt/nhi_ops.c

-- 
2.23.0.rc1


^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH v3 1/8] thunderbolt: Correct path indices for PCIe tunnel
  2019-08-19 11:22 [PATCH v3 0/8] thunderbolt: Intel Ice Lake support Mika Westerberg
@ 2019-08-19 11:22 ` Mika Westerberg
  2019-08-19 11:22 ` [PATCH v3 2/8] thunderbolt: Move NVM upgrade support flag to struct icm Mika Westerberg
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 17+ messages in thread
From: Mika Westerberg @ 2019-08-19 11:22 UTC (permalink / raw)
  To: linux-kernel
  Cc: Andreas Noever, Michael Jamet, Yehezkel Bernat,
	Rafael J. Wysocki, Len Brown, Lukas Wunner, Mario.Limonciello,
	Anthony Wong, Rajmohan Mani, Raanan Avargil, David Laight,
	Mika Westerberg, linux-acpi

PCIe tunnel path indices got mixed up when we added support for tunnels
between switches that are not adjacent. This did not affect the
functionality as it is just an index but fix it now nevertheless to make
the code easier to understand.

Reported-by: Rajmohan Mani <rajmohan.mani@intel.com>
Fixes: 8c7acaaf020f ("thunderbolt: Extend tunnel creation to more than 2 adjacent switches")
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Reviewed-by: Yehezkel Bernat <YehezkelShB@gmail.com>
---
 drivers/thunderbolt/tunnel.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/thunderbolt/tunnel.c b/drivers/thunderbolt/tunnel.c
index 31d0234837e4..5a99234826e7 100644
--- a/drivers/thunderbolt/tunnel.c
+++ b/drivers/thunderbolt/tunnel.c
@@ -211,7 +211,7 @@ struct tb_tunnel *tb_tunnel_alloc_pci(struct tb *tb, struct tb_port *up,
 		return NULL;
 	}
 	tb_pci_init_path(path);
-	tunnel->paths[TB_PCI_PATH_UP] = path;
+	tunnel->paths[TB_PCI_PATH_DOWN] = path;
 
 	path = tb_path_alloc(tb, up, TB_PCI_HOPID, down, TB_PCI_HOPID, 0,
 			     "PCIe Up");
@@ -220,7 +220,7 @@ struct tb_tunnel *tb_tunnel_alloc_pci(struct tb *tb, struct tb_port *up,
 		return NULL;
 	}
 	tb_pci_init_path(path);
-	tunnel->paths[TB_PCI_PATH_DOWN] = path;
+	tunnel->paths[TB_PCI_PATH_UP] = path;
 
 	return tunnel;
 }
-- 
2.23.0.rc1


^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH v3 2/8] thunderbolt: Move NVM upgrade support flag to struct icm
  2019-08-19 11:22 [PATCH v3 0/8] thunderbolt: Intel Ice Lake support Mika Westerberg
  2019-08-19 11:22 ` [PATCH v3 1/8] thunderbolt: Correct path indices for PCIe tunnel Mika Westerberg
@ 2019-08-19 11:22 ` Mika Westerberg
  2019-08-19 11:22 ` [PATCH v3 3/8] thunderbolt: Use 32-bit writes when writing ring producer/consumer Mika Westerberg
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 17+ messages in thread
From: Mika Westerberg @ 2019-08-19 11:22 UTC (permalink / raw)
  To: linux-kernel
  Cc: Andreas Noever, Michael Jamet, Yehezkel Bernat,
	Rafael J. Wysocki, Len Brown, Lukas Wunner, Mario.Limonciello,
	Anthony Wong, Rajmohan Mani, Raanan Avargil, David Laight,
	Mika Westerberg, linux-acpi

This is depends on the controller and on the platform/CPU we are
running. Move it to struct icm so we can set it per controller.

Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Reviewed-by: Yehezkel Bernat <YehezkelShB@gmail.com>
---
 drivers/thunderbolt/icm.c | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/drivers/thunderbolt/icm.c b/drivers/thunderbolt/icm.c
index fbdcef56a676..e9835ab35465 100644
--- a/drivers/thunderbolt/icm.c
+++ b/drivers/thunderbolt/icm.c
@@ -55,6 +55,7 @@
  * @safe_mode: ICM is in safe mode
  * @max_boot_acl: Maximum number of preboot ACL entries (%0 if not supported)
  * @rpm: Does the controller support runtime PM (RTD3)
+ * @can_upgrade_nvm: Can the NVM firmware be upgrade on this controller
  * @is_supported: Checks if we can support ICM on this controller
  * @cio_reset: Trigger CIO reset
  * @get_mode: Read and return the ICM firmware mode (optional)
@@ -74,6 +75,7 @@ struct icm {
 	int vnd_cap;
 	bool safe_mode;
 	bool rpm;
+	bool can_upgrade_nvm;
 	bool (*is_supported)(struct tb *tb);
 	int (*cio_reset)(struct tb *tb);
 	int (*get_mode)(struct tb *tb);
@@ -1913,12 +1915,7 @@ static int icm_start(struct tb *tb)
 	if (IS_ERR(tb->root_switch))
 		return PTR_ERR(tb->root_switch);
 
-	/*
-	 * NVM upgrade has not been tested on Apple systems and they
-	 * don't provide images publicly either. To be on the safe side
-	 * prevent root switch NVM upgrade on Macs for now.
-	 */
-	tb->root_switch->no_nvm_upgrade = x86_apple_machine;
+	tb->root_switch->no_nvm_upgrade = !icm->can_upgrade_nvm;
 	tb->root_switch->rpm = icm->rpm;
 
 	ret = tb_switch_add(tb->root_switch);
@@ -2021,6 +2018,7 @@ struct tb *icm_probe(struct tb_nhi *nhi)
 	switch (nhi->pdev->device) {
 	case PCI_DEVICE_ID_INTEL_FALCON_RIDGE_2C_NHI:
 	case PCI_DEVICE_ID_INTEL_FALCON_RIDGE_4C_NHI:
+		icm->can_upgrade_nvm = true;
 		icm->is_supported = icm_fr_is_supported;
 		icm->get_route = icm_fr_get_route;
 		icm->save_devices = icm_fr_save_devices;
@@ -2038,6 +2036,13 @@ struct tb *icm_probe(struct tb_nhi *nhi)
 	case PCI_DEVICE_ID_INTEL_ALPINE_RIDGE_C_4C_NHI:
 	case PCI_DEVICE_ID_INTEL_ALPINE_RIDGE_C_2C_NHI:
 		icm->max_boot_acl = ICM_AR_PREBOOT_ACL_ENTRIES;
+		/*
+		 * NVM upgrade has not been tested on Apple systems and
+		 * they don't provide images publicly either. To be on
+		 * the safe side prevent root switch NVM upgrade on Macs
+		 * for now.
+		 */
+		icm->can_upgrade_nvm = !x86_apple_machine;
 		icm->is_supported = icm_ar_is_supported;
 		icm->cio_reset = icm_ar_cio_reset;
 		icm->get_mode = icm_ar_get_mode;
@@ -2054,6 +2059,7 @@ struct tb *icm_probe(struct tb_nhi *nhi)
 	case PCI_DEVICE_ID_INTEL_TITAN_RIDGE_2C_NHI:
 	case PCI_DEVICE_ID_INTEL_TITAN_RIDGE_4C_NHI:
 		icm->max_boot_acl = ICM_AR_PREBOOT_ACL_ENTRIES;
+		icm->can_upgrade_nvm = !x86_apple_machine;
 		icm->is_supported = icm_ar_is_supported;
 		icm->cio_reset = icm_tr_cio_reset;
 		icm->get_mode = icm_ar_get_mode;
-- 
2.23.0.rc1


^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH v3 3/8] thunderbolt: Use 32-bit writes when writing ring producer/consumer
  2019-08-19 11:22 [PATCH v3 0/8] thunderbolt: Intel Ice Lake support Mika Westerberg
  2019-08-19 11:22 ` [PATCH v3 1/8] thunderbolt: Correct path indices for PCIe tunnel Mika Westerberg
  2019-08-19 11:22 ` [PATCH v3 2/8] thunderbolt: Move NVM upgrade support flag to struct icm Mika Westerberg
@ 2019-08-19 11:22 ` Mika Westerberg
  2019-08-19 11:22 ` [PATCH v3 4/8] thunderbolt: Do not fail adding switch if some port is not implemented Mika Westerberg
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 17+ messages in thread
From: Mika Westerberg @ 2019-08-19 11:22 UTC (permalink / raw)
  To: linux-kernel
  Cc: Andreas Noever, Michael Jamet, Yehezkel Bernat,
	Rafael J. Wysocki, Len Brown, Lukas Wunner, Mario.Limonciello,
	Anthony Wong, Rajmohan Mani, Raanan Avargil, David Laight,
	Mika Westerberg, linux-acpi

The register access should be using 32-bit reads/writes according to the
datasheet. With the previous generation hardware 16-bit writes have been
working but starting with ICL this is not the case anymore so fix
producer/consumer register update to use correct width register address.

Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Reviewed-by: Yehezkel Bernat <YehezkelShB@gmail.com>
---
 drivers/thunderbolt/nhi.c | 22 ++++++++++++++++++----
 1 file changed, 18 insertions(+), 4 deletions(-)

diff --git a/drivers/thunderbolt/nhi.c b/drivers/thunderbolt/nhi.c
index 27fbe62c7ddd..9c782706e652 100644
--- a/drivers/thunderbolt/nhi.c
+++ b/drivers/thunderbolt/nhi.c
@@ -143,9 +143,20 @@ static void __iomem *ring_options_base(struct tb_ring *ring)
 	return io;
 }
 
-static void ring_iowrite16desc(struct tb_ring *ring, u32 value, u32 offset)
+static void ring_iowrite_cons(struct tb_ring *ring, u16 cons)
 {
-	iowrite16(value, ring_desc_base(ring) + offset);
+	/*
+	 * The other 16-bits in the register is read-only and writes to it
+	 * are ignored by the hardware so we can save one ioread32() by
+	 * filling the read-only bits with zeroes.
+	 */
+	iowrite32(cons, ring_desc_base(ring) + 8);
+}
+
+static void ring_iowrite_prod(struct tb_ring *ring, u16 prod)
+{
+	/* See ring_iowrite_cons() above for explanation */
+	iowrite32(prod << 16, ring_desc_base(ring) + 8);
 }
 
 static void ring_iowrite32desc(struct tb_ring *ring, u32 value, u32 offset)
@@ -197,7 +208,10 @@ static void ring_write_descriptors(struct tb_ring *ring)
 			descriptor->sof = frame->sof;
 		}
 		ring->head = (ring->head + 1) % ring->size;
-		ring_iowrite16desc(ring, ring->head, ring->is_tx ? 10 : 8);
+		if (ring->is_tx)
+			ring_iowrite_prod(ring, ring->head);
+		else
+			ring_iowrite_cons(ring, ring->head);
 	}
 }
 
@@ -662,7 +676,7 @@ void tb_ring_stop(struct tb_ring *ring)
 
 	ring_iowrite32options(ring, 0, 0);
 	ring_iowrite64desc(ring, 0, 0);
-	ring_iowrite16desc(ring, 0, ring->is_tx ? 10 : 8);
+	ring_iowrite32desc(ring, 0, 8);
 	ring_iowrite32desc(ring, 0, 12);
 	ring->head = 0;
 	ring->tail = 0;
-- 
2.23.0.rc1


^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH v3 4/8] thunderbolt: Do not fail adding switch if some port is not implemented
  2019-08-19 11:22 [PATCH v3 0/8] thunderbolt: Intel Ice Lake support Mika Westerberg
                   ` (2 preceding siblings ...)
  2019-08-19 11:22 ` [PATCH v3 3/8] thunderbolt: Use 32-bit writes when writing ring producer/consumer Mika Westerberg
@ 2019-08-19 11:22 ` Mika Westerberg
  2019-08-19 11:22 ` [PATCH v3 5/8] thunderbolt: Hide switch attributes that are not set Mika Westerberg
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 17+ messages in thread
From: Mika Westerberg @ 2019-08-19 11:22 UTC (permalink / raw)
  To: linux-kernel
  Cc: Andreas Noever, Michael Jamet, Yehezkel Bernat,
	Rafael J. Wysocki, Len Brown, Lukas Wunner, Mario.Limonciello,
	Anthony Wong, Rajmohan Mani, Raanan Avargil, David Laight,
	Mika Westerberg, linux-acpi

There are two ways to mark a port as unimplemented. Typical way is to
return port type as TB_TYPE_INACTIVE when its config space is read.
Alternatively if the port is not physically present (such as ports 10
and 11 in ICL) reading from port config space returns
TB_CFG_ERROR_INVALID_CONFIG_SPACE instead. Currently the driver bails
out from adding the switch if it receives any error during port
inititialization which is wrong.

Handle this properly and just leave the port as TB_TYPE_INACTIVE before
continuing to the next port.

This also allows us to get rid of special casing for Light Ridge port 5
in eeprom.c.

Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Reviewed-by: Yehezkel Bernat <YehezkelShB@gmail.com>
---
 drivers/thunderbolt/ctl.c    | 23 +++++++++++++++++++----
 drivers/thunderbolt/eeprom.c |  4 ----
 drivers/thunderbolt/switch.c |  8 +++++++-
 3 files changed, 26 insertions(+), 9 deletions(-)

diff --git a/drivers/thunderbolt/ctl.c b/drivers/thunderbolt/ctl.c
index 2427d73be731..2ec1af8f7968 100644
--- a/drivers/thunderbolt/ctl.c
+++ b/drivers/thunderbolt/ctl.c
@@ -930,6 +930,23 @@ struct tb_cfg_result tb_cfg_write_raw(struct tb_ctl *ctl, const void *buffer,
 	return res;
 }
 
+static int tb_cfg_get_error(struct tb_ctl *ctl, enum tb_cfg_space space,
+			    const struct tb_cfg_result *res)
+{
+	/*
+	 * For unimplemented ports access to port config space may return
+	 * TB_CFG_ERROR_INVALID_CONFIG_SPACE (alternatively their type is
+	 * set to TB_TYPE_INACTIVE). In the former case return -ENODEV so
+	 * that the caller can mark the port as disabled.
+	 */
+	if (space == TB_CFG_PORT &&
+	    res->tb_error == TB_CFG_ERROR_INVALID_CONFIG_SPACE)
+		return -ENODEV;
+
+	tb_cfg_print_error(ctl, res);
+	return -EIO;
+}
+
 int tb_cfg_read(struct tb_ctl *ctl, void *buffer, u64 route, u32 port,
 		enum tb_cfg_space space, u32 offset, u32 length)
 {
@@ -942,8 +959,7 @@ int tb_cfg_read(struct tb_ctl *ctl, void *buffer, u64 route, u32 port,
 
 	case 1:
 		/* Thunderbolt error, tb_error holds the actual number */
-		tb_cfg_print_error(ctl, &res);
-		return -EIO;
+		return tb_cfg_get_error(ctl, space, &res);
 
 	case -ETIMEDOUT:
 		tb_ctl_warn(ctl, "timeout reading config space %u from %#x\n",
@@ -969,8 +985,7 @@ int tb_cfg_write(struct tb_ctl *ctl, const void *buffer, u64 route, u32 port,
 
 	case 1:
 		/* Thunderbolt error, tb_error holds the actual number */
-		tb_cfg_print_error(ctl, &res);
-		return -EIO;
+		return tb_cfg_get_error(ctl, space, &res);
 
 	case -ETIMEDOUT:
 		tb_ctl_warn(ctl, "timeout writing config space %u to %#x\n",
diff --git a/drivers/thunderbolt/eeprom.c b/drivers/thunderbolt/eeprom.c
index 81e8ac4c5805..3b2fb4aafd92 100644
--- a/drivers/thunderbolt/eeprom.c
+++ b/drivers/thunderbolt/eeprom.c
@@ -525,10 +525,6 @@ int tb_drom_read(struct tb_switch *sw)
 		sw->ports[3].dual_link_port = &sw->ports[4];
 		sw->ports[4].dual_link_port = &sw->ports[3];
 
-		/* Port 5 is inaccessible on this gen 1 controller */
-		if (sw->config.device_id == PCI_DEVICE_ID_INTEL_LIGHT_RIDGE)
-			sw->ports[5].disabled = true;
-
 		return 0;
 	}
 
diff --git a/drivers/thunderbolt/switch.c b/drivers/thunderbolt/switch.c
index 5668a44e0653..64f845fe4690 100644
--- a/drivers/thunderbolt/switch.c
+++ b/drivers/thunderbolt/switch.c
@@ -611,8 +611,14 @@ static int tb_init_port(struct tb_port *port)
 	int cap;
 
 	res = tb_port_read(port, &port->config, TB_CFG_PORT, 0, 8);
-	if (res)
+	if (res) {
+		if (res == -ENODEV) {
+			tb_dbg(port->sw->tb, " Port %d: not implemented\n",
+			       port->port);
+			return 0;
+		}
 		return res;
+	}
 
 	/* Port 0 is the switch itself and has no PHY. */
 	if (port->config.type == TB_TYPE_PORT && port->port != 0) {
-- 
2.23.0.rc1


^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH v3 5/8] thunderbolt: Hide switch attributes that are not set
  2019-08-19 11:22 [PATCH v3 0/8] thunderbolt: Intel Ice Lake support Mika Westerberg
                   ` (3 preceding siblings ...)
  2019-08-19 11:22 ` [PATCH v3 4/8] thunderbolt: Do not fail adding switch if some port is not implemented Mika Westerberg
@ 2019-08-19 11:22 ` Mika Westerberg
  2019-08-19 11:22 ` [PATCH v3 6/8] thunderbolt: Expose active parts of NVM even if upgrade is not supported Mika Westerberg
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 17+ messages in thread
From: Mika Westerberg @ 2019-08-19 11:22 UTC (permalink / raw)
  To: linux-kernel
  Cc: Andreas Noever, Michael Jamet, Yehezkel Bernat,
	Rafael J. Wysocki, Len Brown, Lukas Wunner, Mario.Limonciello,
	Anthony Wong, Rajmohan Mani, Raanan Avargil, David Laight,
	Mika Westerberg, linux-acpi

Thunderbolt host routers may not always contain DROM that includes
device identification information. This is mostly needed for Ice Lake
systems but some Falcon Ridge controllers on PCs also do not have DROM.

In that case hide the identification attributes.

Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Reviewed-by: Yehezkel Bernat <YehezkelShB@gmail.com>
---
 drivers/thunderbolt/switch.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/drivers/thunderbolt/switch.c b/drivers/thunderbolt/switch.c
index 64f845fe4690..bd3eaaf34ea1 100644
--- a/drivers/thunderbolt/switch.c
+++ b/drivers/thunderbolt/switch.c
@@ -1337,7 +1337,19 @@ static umode_t switch_attr_is_visible(struct kobject *kobj,
 	struct device *dev = container_of(kobj, struct device, kobj);
 	struct tb_switch *sw = tb_to_switch(dev);
 
-	if (attr == &dev_attr_key.attr) {
+	if (attr == &dev_attr_device.attr) {
+		if (!sw->device)
+			return 0;
+	} else if (attr == &dev_attr_device_name.attr) {
+		if (!sw->device_name)
+			return 0;
+	} else if (attr == &dev_attr_vendor.attr)  {
+		if (!sw->vendor)
+			return 0;
+	} else if (attr == &dev_attr_vendor_name.attr)  {
+		if (!sw->vendor_name)
+			return 0;
+	} else if (attr == &dev_attr_key.attr) {
 		if (tb_route(sw) &&
 		    sw->tb->security_level == TB_SECURITY_SECURE &&
 		    sw->security_level == TB_SECURITY_SECURE)
-- 
2.23.0.rc1


^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH v3 6/8] thunderbolt: Expose active parts of NVM even if upgrade is not supported
  2019-08-19 11:22 [PATCH v3 0/8] thunderbolt: Intel Ice Lake support Mika Westerberg
                   ` (4 preceding siblings ...)
  2019-08-19 11:22 ` [PATCH v3 5/8] thunderbolt: Hide switch attributes that are not set Mika Westerberg
@ 2019-08-19 11:22 ` Mika Westerberg
  2019-08-19 11:22 ` [PATCH v3 7/8] thunderbolt: Add support for Intel Ice Lake Mika Westerberg
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 17+ messages in thread
From: Mika Westerberg @ 2019-08-19 11:22 UTC (permalink / raw)
  To: linux-kernel
  Cc: Andreas Noever, Michael Jamet, Yehezkel Bernat,
	Rafael J. Wysocki, Len Brown, Lukas Wunner, Mario.Limonciello,
	Anthony Wong, Rajmohan Mani, Raanan Avargil, David Laight,
	Mika Westerberg, linux-acpi

Ice Lake Thunderbolt controller NVM firmware is part of the BIOS image
which means it is not writable through the DMA port anymore. However, we
can still read it so we can keep nvm_version and active parts of NVM.
This way users still can find out the active NVM version and other
potentially useful information directly from Linux.

Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Reviewed-by: Yehezkel Bernat <YehezkelShB@gmail.com>
---
 drivers/thunderbolt/switch.c | 28 +++++++++++++++++++---------
 1 file changed, 19 insertions(+), 9 deletions(-)

diff --git a/drivers/thunderbolt/switch.c b/drivers/thunderbolt/switch.c
index bd3eaaf34ea1..531f11fecf75 100644
--- a/drivers/thunderbolt/switch.c
+++ b/drivers/thunderbolt/switch.c
@@ -364,12 +364,14 @@ static int tb_switch_nvm_add(struct tb_switch *sw)
 		nvm->active = nvm_dev;
 	}
 
-	nvm_dev = register_nvmem(sw, nvm->id, NVM_MAX_SIZE, false);
-	if (IS_ERR(nvm_dev)) {
-		ret = PTR_ERR(nvm_dev);
-		goto err_nvm_active;
+	if (!sw->no_nvm_upgrade) {
+		nvm_dev = register_nvmem(sw, nvm->id, NVM_MAX_SIZE, false);
+		if (IS_ERR(nvm_dev)) {
+			ret = PTR_ERR(nvm_dev);
+			goto err_nvm_active;
+		}
+		nvm->non_active = nvm_dev;
 	}
-	nvm->non_active = nvm_dev;
 
 	sw->nvm = nvm;
 	return 0;
@@ -398,7 +400,8 @@ static void tb_switch_nvm_remove(struct tb_switch *sw)
 	if (!nvm->authenticating)
 		nvm_clear_auth_status(sw);
 
-	nvmem_unregister(nvm->non_active);
+	if (nvm->non_active)
+		nvmem_unregister(nvm->non_active);
 	if (nvm->active)
 		nvmem_unregister(nvm->active);
 	ida_simple_remove(&nvm_ida, nvm->id);
@@ -1355,8 +1358,11 @@ static umode_t switch_attr_is_visible(struct kobject *kobj,
 		    sw->security_level == TB_SECURITY_SECURE)
 			return attr->mode;
 		return 0;
-	} else if (attr == &dev_attr_nvm_authenticate.attr ||
-		   attr == &dev_attr_nvm_version.attr) {
+	} else if (attr == &dev_attr_nvm_authenticate.attr) {
+		if (sw->dma_port && !sw->no_nvm_upgrade)
+			return attr->mode;
+		return 0;
+	} else if (attr == &dev_attr_nvm_version.attr) {
 		if (sw->dma_port)
 			return attr->mode;
 		return 0;
@@ -1707,13 +1713,17 @@ static int tb_switch_add_dma_port(struct tb_switch *sw)
 		break;
 	}
 
-	if (sw->no_nvm_upgrade)
+	/* Root switch DMA port requires running firmware */
+	if (!tb_route(sw) && sw->config.enabled)
 		return 0;
 
 	sw->dma_port = dma_port_alloc(sw);
 	if (!sw->dma_port)
 		return 0;
 
+	if (sw->no_nvm_upgrade)
+		return 0;
+
 	/*
 	 * Check status of the previous flash authentication. If there
 	 * is one we need to power cycle the switch in any case to make
-- 
2.23.0.rc1


^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH v3 7/8] thunderbolt: Add support for Intel Ice Lake
  2019-08-19 11:22 [PATCH v3 0/8] thunderbolt: Intel Ice Lake support Mika Westerberg
                   ` (5 preceding siblings ...)
  2019-08-19 11:22 ` [PATCH v3 6/8] thunderbolt: Expose active parts of NVM even if upgrade is not supported Mika Westerberg
@ 2019-08-19 11:22 ` Mika Westerberg
  2019-08-19 11:22 ` [PATCH v3 8/8] ACPI / property: Add two new Thunderbolt property GUIDs to the list Mika Westerberg
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 17+ messages in thread
From: Mika Westerberg @ 2019-08-19 11:22 UTC (permalink / raw)
  To: linux-kernel
  Cc: Andreas Noever, Michael Jamet, Yehezkel Bernat,
	Rafael J. Wysocki, Len Brown, Lukas Wunner, Mario.Limonciello,
	Anthony Wong, Rajmohan Mani, Raanan Avargil, David Laight,
	Mika Westerberg, linux-acpi

The Thunderbolt controller is integrated into the Ice Lake CPU itself
and requires special flows to power it on and off using force power bit
in NHI VSEC registers. Runtime PM (RTD3) and Sx flows also differ from
the discrete solutions. Now the firmware notifies the driver whether
RTD3 entry or exit are possible. The driver is responsible of sending
Go2Sx command through link controller mailbox when system enters Sx
states (suspend-to-mem/disk). Rest of the ICM firwmare flows follow
Titan Ridge.

Signed-off-by: Raanan Avargil <raanan.avargil@intel.com>
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Reviewed-by: Yehezkel Bernat <YehezkelShB@gmail.com>
---
 drivers/thunderbolt/Makefile   |   2 +-
 drivers/thunderbolt/icm.c      | 176 ++++++++++++++++++++++++++++++--
 drivers/thunderbolt/nhi.c      | 112 +++++++++++++++++++--
 drivers/thunderbolt/nhi.h      |  22 ++++
 drivers/thunderbolt/nhi_ops.c  | 179 +++++++++++++++++++++++++++++++++
 drivers/thunderbolt/nhi_regs.h |  37 +++++++
 drivers/thunderbolt/switch.c   |   2 +
 drivers/thunderbolt/tb_msgs.h  |  16 ++-
 include/linux/thunderbolt.h    |   2 +
 9 files changed, 526 insertions(+), 22 deletions(-)
 create mode 100644 drivers/thunderbolt/nhi_ops.c

diff --git a/drivers/thunderbolt/Makefile b/drivers/thunderbolt/Makefile
index 3f55cb3c81b2..001187c577bf 100644
--- a/drivers/thunderbolt/Makefile
+++ b/drivers/thunderbolt/Makefile
@@ -1,4 +1,4 @@
 # SPDX-License-Identifier: GPL-2.0-only
 obj-${CONFIG_THUNDERBOLT} := thunderbolt.o
-thunderbolt-objs := nhi.o ctl.o tb.o switch.o cap.o path.o tunnel.o eeprom.o
+thunderbolt-objs := nhi.o nhi_ops.o ctl.o tb.o switch.o cap.o path.o tunnel.o eeprom.o
 thunderbolt-objs += domain.o dma_port.o icm.o property.o xdomain.o lc.o
diff --git a/drivers/thunderbolt/icm.c b/drivers/thunderbolt/icm.c
index e9835ab35465..245588f691e7 100644
--- a/drivers/thunderbolt/icm.c
+++ b/drivers/thunderbolt/icm.c
@@ -56,16 +56,19 @@
  * @max_boot_acl: Maximum number of preboot ACL entries (%0 if not supported)
  * @rpm: Does the controller support runtime PM (RTD3)
  * @can_upgrade_nvm: Can the NVM firmware be upgrade on this controller
+ * @veto: Is RTD3 veto in effect
  * @is_supported: Checks if we can support ICM on this controller
  * @cio_reset: Trigger CIO reset
  * @get_mode: Read and return the ICM firmware mode (optional)
  * @get_route: Find a route string for given switch
  * @save_devices: Ask ICM to save devices to ACL when suspending (optional)
  * @driver_ready: Send driver ready message to ICM
+ * @set_uuid: Set UUID for the root switch (optional)
  * @device_connected: Handle device connected ICM message
  * @device_disconnected: Handle device disconnected ICM message
  * @xdomain_connected - Handle XDomain connected ICM message
  * @xdomain_disconnected - Handle XDomain disconnected ICM message
+ * @rtd3_veto: Handle RTD3 veto notification ICM message
  */
 struct icm {
 	struct mutex request_lock;
@@ -76,6 +79,7 @@ struct icm {
 	bool safe_mode;
 	bool rpm;
 	bool can_upgrade_nvm;
+	bool veto;
 	bool (*is_supported)(struct tb *tb);
 	int (*cio_reset)(struct tb *tb);
 	int (*get_mode)(struct tb *tb);
@@ -84,6 +88,7 @@ struct icm {
 	int (*driver_ready)(struct tb *tb,
 			    enum tb_security_level *security_level,
 			    size_t *nboot_acl, bool *rpm);
+	void (*set_uuid)(struct tb *tb);
 	void (*device_connected)(struct tb *tb,
 				 const struct icm_pkg_header *hdr);
 	void (*device_disconnected)(struct tb *tb,
@@ -92,6 +97,7 @@ struct icm {
 				  const struct icm_pkg_header *hdr);
 	void (*xdomain_disconnected)(struct tb *tb,
 				     const struct icm_pkg_header *hdr);
+	void (*rtd3_veto)(struct tb *tb, const struct icm_pkg_header *hdr);
 };
 
 struct icm_notification {
@@ -296,6 +302,43 @@ static int icm_request(struct tb *tb, const void *request, size_t request_size,
 	return -ETIMEDOUT;
 }
 
+/*
+ * If rescan is queued to run (we are resuming), postpone it to give the
+ * firmware some more time to send device connected notifications for next
+ * devices in the chain.
+ */
+static void icm_postpone_rescan(struct tb *tb)
+{
+	struct icm *icm = tb_priv(tb);
+
+	if (delayed_work_pending(&icm->rescan_work))
+		mod_delayed_work(tb->wq, &icm->rescan_work,
+				 msecs_to_jiffies(500));
+}
+
+static void icm_veto_begin(struct tb *tb)
+{
+	struct icm *icm = tb_priv(tb);
+
+	if (!icm->veto) {
+		icm->veto = true;
+		/* Keep the domain powered while veto is in effect */
+		pm_runtime_get(&tb->dev);
+	}
+}
+
+static void icm_veto_end(struct tb *tb)
+{
+	struct icm *icm = tb_priv(tb);
+
+	if (icm->veto) {
+		icm->veto = false;
+		/* Allow the domain suspend now */
+		pm_runtime_mark_last_busy(&tb->dev);
+		pm_runtime_put_autosuspend(&tb->dev);
+	}
+}
+
 static bool icm_fr_is_supported(struct tb *tb)
 {
 	return !x86_apple_machine;
@@ -519,14 +562,16 @@ static int icm_fr_disconnect_xdomain_paths(struct tb *tb, struct tb_xdomain *xd)
 	return 0;
 }
 
-static void add_switch(struct tb_switch *parent_sw, u64 route,
-		       const uuid_t *uuid, const u8 *ep_name,
-		       size_t ep_name_size, u8 connection_id, u8 connection_key,
-		       u8 link, u8 depth, enum tb_security_level security_level,
-		       bool authorized, bool boot)
+static struct tb_switch *add_switch(struct tb_switch *parent_sw, u64 route,
+				    const uuid_t *uuid, const u8 *ep_name,
+				    size_t ep_name_size, u8 connection_id,
+				    u8 connection_key, u8 link, u8 depth,
+				    enum tb_security_level security_level,
+				    bool authorized, bool boot)
 {
 	const struct intel_vss *vss;
 	struct tb_switch *sw;
+	int ret;
 
 	pm_runtime_get_sync(&parent_sw->dev);
 
@@ -557,14 +602,18 @@ static void add_switch(struct tb_switch *parent_sw, u64 route,
 	tb_port_at(route, parent_sw)->remote = tb_upstream_port(sw);
 	tb_upstream_port(sw)->remote = tb_port_at(route, parent_sw);
 
-	if (tb_switch_add(sw)) {
+	ret = tb_switch_add(sw);
+	if (ret) {
 		tb_port_at(tb_route(sw), parent_sw)->remote = NULL;
 		tb_switch_put(sw);
+		sw = ERR_PTR(ret);
 	}
 
 out:
 	pm_runtime_mark_last_busy(&parent_sw->dev);
 	pm_runtime_put_autosuspend(&parent_sw->dev);
+
+	return sw;
 }
 
 static void update_switch(struct tb_switch *parent_sw, struct tb_switch *sw,
@@ -656,6 +705,8 @@ icm_fr_device_connected(struct tb *tb, const struct icm_pkg_header *hdr)
 	u64 route;
 	int ret;
 
+	icm_postpone_rescan(tb);
+
 	link = pkg->link_info & ICM_LINK_INFO_LINK_MASK;
 	depth = (pkg->link_info & ICM_LINK_INFO_DEPTH_MASK) >>
 		ICM_LINK_INFO_DEPTH_SHIFT;
@@ -1086,7 +1137,8 @@ static int icm_tr_disconnect_xdomain_paths(struct tb *tb, struct tb_xdomain *xd)
 }
 
 static void
-icm_tr_device_connected(struct tb *tb, const struct icm_pkg_header *hdr)
+__icm_tr_device_connected(struct tb *tb, const struct icm_pkg_header *hdr,
+			  bool force_rtd3)
 {
 	const struct icm_tr_event_device_connected *pkg =
 		(const struct icm_tr_event_device_connected *)hdr;
@@ -1096,6 +1148,8 @@ icm_tr_device_connected(struct tb *tb, const struct icm_pkg_header *hdr)
 	bool authorized, boot;
 	u64 route;
 
+	icm_postpone_rescan(tb);
+
 	/*
 	 * Currently we don't use the QoS information coming with the
 	 * device connected message so simply just ignore that extra
@@ -1151,13 +1205,21 @@ icm_tr_device_connected(struct tb *tb, const struct icm_pkg_header *hdr)
 		return;
 	}
 
-	add_switch(parent_sw, route, &pkg->ep_uuid, (const u8 *)pkg->ep_name,
-		   sizeof(pkg->ep_name), pkg->connection_id,
-		   0, 0, 0, security_level, authorized, boot);
+	sw = add_switch(parent_sw, route, &pkg->ep_uuid, (const u8 *)pkg->ep_name,
+			sizeof(pkg->ep_name), pkg->connection_id, 0, 0, 0,
+			security_level, authorized, boot);
+	if (!IS_ERR(sw) && force_rtd3)
+		sw->rpm = true;
 
 	tb_switch_put(parent_sw);
 }
 
+static void
+icm_tr_device_connected(struct tb *tb, const struct icm_pkg_header *hdr)
+{
+	__icm_tr_device_connected(tb, hdr, false);
+}
+
 static void
 icm_tr_device_disconnected(struct tb *tb, const struct icm_pkg_header *hdr)
 {
@@ -1468,6 +1530,61 @@ static int icm_ar_set_boot_acl(struct tb *tb, const uuid_t *uuids,
 	return 0;
 }
 
+static int
+icm_icl_driver_ready(struct tb *tb, enum tb_security_level *security_level,
+		    size_t *nboot_acl, bool *rpm)
+{
+	struct icm_tr_pkg_driver_ready_response reply;
+	struct icm_pkg_driver_ready request = {
+		.hdr.code = ICM_DRIVER_READY,
+	};
+	int ret;
+
+	memset(&reply, 0, sizeof(reply));
+	ret = icm_request(tb, &request, sizeof(request), &reply, sizeof(reply),
+			  1, 20000);
+	if (ret)
+		return ret;
+
+	/* Ice Lake always supports RTD3 */
+	if (rpm)
+		*rpm = true;
+
+	return 0;
+}
+
+static void icm_icl_set_uuid(struct tb *tb)
+{
+	struct tb_nhi *nhi = tb->nhi;
+	u32 uuid[4];
+
+	pci_read_config_dword(nhi->pdev, VS_CAP_10, &uuid[0]);
+	pci_read_config_dword(nhi->pdev, VS_CAP_11, &uuid[1]);
+	uuid[2] = 0xffffffff;
+	uuid[3] = 0xffffffff;
+
+	tb->root_switch->uuid = kmemdup(uuid, sizeof(uuid), GFP_KERNEL);
+}
+
+static void
+icm_icl_device_connected(struct tb *tb, const struct icm_pkg_header *hdr)
+{
+	__icm_tr_device_connected(tb, hdr, true);
+}
+
+static void icm_icl_rtd3_veto(struct tb *tb, const struct icm_pkg_header *hdr)
+{
+	const struct icm_icl_event_rtd3_veto *pkg =
+		(const struct icm_icl_event_rtd3_veto *)hdr;
+
+	tb_dbg(tb, "ICM rtd3 veto=0x%08x\n", pkg->veto_reason);
+
+	if (pkg->veto_reason)
+		icm_veto_begin(tb);
+	else
+		icm_veto_end(tb);
+}
+
 static void icm_handle_notification(struct work_struct *work)
 {
 	struct icm_notification *n = container_of(work, typeof(*n), work);
@@ -1495,6 +1612,9 @@ static void icm_handle_notification(struct work_struct *work)
 		case ICM_EVENT_XDOMAIN_DISCONNECTED:
 			icm->xdomain_disconnected(tb, n->pkg);
 			break;
+		case ICM_EVENT_RTD3_VETO:
+			icm->rtd3_veto(tb, n->pkg);
+			break;
 		}
 	}
 
@@ -1853,6 +1973,13 @@ static void icm_complete(struct tb *tb)
 	if (tb->nhi->going_away)
 		return;
 
+	/*
+	 * If RTD3 was vetoed before we entered system suspend allow it
+	 * again now before driver ready is sent. Firmware sends a new RTD3
+	 * veto if it is still the case after we have sent it driver ready
+	 * command.
+	 */
+	icm_veto_end(tb);
 	icm_unplug_children(tb->root_switch);
 
 	/*
@@ -1918,6 +2045,9 @@ static int icm_start(struct tb *tb)
 	tb->root_switch->no_nvm_upgrade = !icm->can_upgrade_nvm;
 	tb->root_switch->rpm = icm->rpm;
 
+	if (icm->set_uuid)
+		icm->set_uuid(tb);
+
 	ret = tb_switch_add(tb->root_switch);
 	if (ret) {
 		tb_switch_put(tb->root_switch);
@@ -2002,6 +2132,19 @@ static const struct tb_cm_ops icm_tr_ops = {
 	.disconnect_xdomain_paths = icm_tr_disconnect_xdomain_paths,
 };
 
+/* Ice Lake */
+static const struct tb_cm_ops icm_icl_ops = {
+	.driver_ready = icm_driver_ready,
+	.start = icm_start,
+	.stop = icm_stop,
+	.complete = icm_complete,
+	.runtime_suspend = icm_runtime_suspend,
+	.runtime_resume = icm_runtime_resume,
+	.handle_event = icm_handle_event,
+	.approve_xdomain_paths = icm_tr_approve_xdomain_paths,
+	.disconnect_xdomain_paths = icm_tr_disconnect_xdomain_paths,
+};
+
 struct tb *icm_probe(struct tb_nhi *nhi)
 {
 	struct icm *icm;
@@ -2070,6 +2213,19 @@ struct tb *icm_probe(struct tb_nhi *nhi)
 		icm->xdomain_disconnected = icm_tr_xdomain_disconnected;
 		tb->cm_ops = &icm_tr_ops;
 		break;
+
+	case PCI_DEVICE_ID_INTEL_ICL_NHI0:
+	case PCI_DEVICE_ID_INTEL_ICL_NHI1:
+		icm->is_supported = icm_ar_is_supported;
+		icm->driver_ready = icm_icl_driver_ready;
+		icm->set_uuid = icm_icl_set_uuid;
+		icm->device_connected = icm_icl_device_connected;
+		icm->device_disconnected = icm_tr_device_disconnected;
+		icm->xdomain_connected = icm_tr_xdomain_connected;
+		icm->xdomain_disconnected = icm_tr_xdomain_disconnected;
+		icm->rtd3_veto = icm_icl_rtd3_veto;
+		tb->cm_ops = &icm_icl_ops;
+		break;
 	}
 
 	if (!icm->is_supported || !icm->is_supported(tb)) {
diff --git a/drivers/thunderbolt/nhi.c b/drivers/thunderbolt/nhi.c
index 9c782706e652..641b21b54460 100644
--- a/drivers/thunderbolt/nhi.c
+++ b/drivers/thunderbolt/nhi.c
@@ -16,6 +16,7 @@
 #include <linux/interrupt.h>
 #include <linux/module.h>
 #include <linux/delay.h>
+#include <linux/property.h>
 
 #include "nhi.h"
 #include "nhi_regs.h"
@@ -859,12 +860,52 @@ static irqreturn_t nhi_msi(int irq, void *data)
 	return IRQ_HANDLED;
 }
 
-static int nhi_suspend_noirq(struct device *dev)
+static int __nhi_suspend_noirq(struct device *dev, bool wakeup)
 {
 	struct pci_dev *pdev = to_pci_dev(dev);
 	struct tb *tb = pci_get_drvdata(pdev);
+	struct tb_nhi *nhi = tb->nhi;
+	int ret;
+
+	ret = tb_domain_suspend_noirq(tb);
+	if (ret)
+		return ret;
+
+	if (nhi->ops && nhi->ops->suspend_noirq) {
+		ret = nhi->ops->suspend_noirq(tb->nhi, wakeup);
+		if (ret)
+			return ret;
+	}
+
+	return 0;
+}
+
+static int nhi_suspend_noirq(struct device *dev)
+{
+	return __nhi_suspend_noirq(dev, device_may_wakeup(dev));
+}
+
+static bool nhi_wake_supported(struct pci_dev *pdev)
+{
+	u8 val;
+
+	/*
+	 * If power rails are sustainable for wakeup from S4 this
+	 * property is set by the BIOS.
+	 */
+	if (device_property_read_u8(&pdev->dev, "WAKE_SUPPORTED", &val))
+		return !!val;
+
+	return true;
+}
+
+static int nhi_poweroff_noirq(struct device *dev)
+{
+	struct pci_dev *pdev = to_pci_dev(dev);
+	bool wakeup;
 
-	return tb_domain_suspend_noirq(tb);
+	wakeup = device_may_wakeup(dev) && nhi_wake_supported(pdev);
+	return __nhi_suspend_noirq(dev, wakeup);
 }
 
 static void nhi_enable_int_throttling(struct tb_nhi *nhi)
@@ -887,16 +928,24 @@ static int nhi_resume_noirq(struct device *dev)
 {
 	struct pci_dev *pdev = to_pci_dev(dev);
 	struct tb *tb = pci_get_drvdata(pdev);
+	struct tb_nhi *nhi = tb->nhi;
+	int ret;
 
 	/*
 	 * Check that the device is still there. It may be that the user
 	 * unplugged last device which causes the host controller to go
 	 * away on PCs.
 	 */
-	if (!pci_device_is_present(pdev))
-		tb->nhi->going_away = true;
-	else
+	if (!pci_device_is_present(pdev)) {
+		nhi->going_away = true;
+	} else {
+		if (nhi->ops && nhi->ops->resume_noirq) {
+			ret = nhi->ops->resume_noirq(nhi);
+			if (ret)
+				return ret;
+		}
 		nhi_enable_int_throttling(tb->nhi);
+	}
 
 	return tb_domain_resume_noirq(tb);
 }
@@ -929,16 +978,35 @@ static int nhi_runtime_suspend(struct device *dev)
 {
 	struct pci_dev *pdev = to_pci_dev(dev);
 	struct tb *tb = pci_get_drvdata(pdev);
+	struct tb_nhi *nhi = tb->nhi;
+	int ret;
+
+	ret = tb_domain_runtime_suspend(tb);
+	if (ret)
+		return ret;
 
-	return tb_domain_runtime_suspend(tb);
+	if (nhi->ops && nhi->ops->runtime_suspend) {
+		ret = nhi->ops->runtime_suspend(tb->nhi);
+		if (ret)
+			return ret;
+	}
+	return 0;
 }
 
 static int nhi_runtime_resume(struct device *dev)
 {
 	struct pci_dev *pdev = to_pci_dev(dev);
 	struct tb *tb = pci_get_drvdata(pdev);
+	struct tb_nhi *nhi = tb->nhi;
+	int ret;
+
+	if (nhi->ops && nhi->ops->runtime_resume) {
+		ret = nhi->ops->runtime_resume(nhi);
+		if (ret)
+			return ret;
+	}
 
-	nhi_enable_int_throttling(tb->nhi);
+	nhi_enable_int_throttling(nhi);
 	return tb_domain_runtime_resume(tb);
 }
 
@@ -966,6 +1034,9 @@ static void nhi_shutdown(struct tb_nhi *nhi)
 		flush_work(&nhi->interrupt_work);
 	}
 	ida_destroy(&nhi->msix_ida);
+
+	if (nhi->ops && nhi->ops->shutdown)
+		nhi->ops->shutdown(nhi);
 }
 
 static int nhi_init_msi(struct tb_nhi *nhi)
@@ -1010,12 +1081,27 @@ static int nhi_init_msi(struct tb_nhi *nhi)
 	return 0;
 }
 
+static bool nhi_imr_valid(struct pci_dev *pdev)
+{
+	u8 val;
+
+	if (!device_property_read_u8(&pdev->dev, "IMR_VALID", &val))
+		return !!val;
+
+	return true;
+}
+
 static int nhi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 {
 	struct tb_nhi *nhi;
 	struct tb *tb;
 	int res;
 
+	if (!nhi_imr_valid(pdev)) {
+		dev_warn(&pdev->dev, "firmware image not valid, aborting\n");
+		return -ENODEV;
+	}
+
 	res = pcim_enable_device(pdev);
 	if (res) {
 		dev_err(&pdev->dev, "cannot enable PCI device, aborting\n");
@@ -1033,6 +1119,7 @@ static int nhi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 		return -ENOMEM;
 
 	nhi->pdev = pdev;
+	nhi->ops = (const struct tb_nhi_ops *)id->driver_data;
 	/* cannot fail - table is allocated bin pcim_iomap_regions */
 	nhi->iobase = pcim_iomap_table(pdev)[0];
 	nhi->hop_count = ioread32(nhi->iobase + REG_HOP_COUNT) & 0x3ff;
@@ -1065,6 +1152,12 @@ static int nhi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 
 	pci_set_master(pdev);
 
+	if (nhi->ops && nhi->ops->init) {
+		res = nhi->ops->init(nhi);
+		if (res)
+			return res;
+	}
+
 	tb = icm_probe(nhi);
 	if (!tb)
 		tb = tb_probe(nhi);
@@ -1125,6 +1218,7 @@ static const struct dev_pm_ops nhi_pm_ops = {
 	.restore_noirq = nhi_resume_noirq,
 	.suspend = nhi_suspend,
 	.freeze = nhi_suspend,
+	.poweroff_noirq = nhi_poweroff_noirq,
 	.poweroff = nhi_suspend,
 	.complete = nhi_complete,
 	.runtime_suspend = nhi_runtime_suspend,
@@ -1172,6 +1266,10 @@ static struct pci_device_id nhi_ids[] = {
 	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_ALPINE_RIDGE_C_USBONLY_NHI) },
 	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_TITAN_RIDGE_2C_NHI) },
 	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_TITAN_RIDGE_4C_NHI) },
+	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_ICL_NHI0),
+	  .driver_data = (kernel_ulong_t)&icl_nhi_ops },
+	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_ICL_NHI1),
+	  .driver_data = (kernel_ulong_t)&icl_nhi_ops },
 
 	{ 0,}
 };
diff --git a/drivers/thunderbolt/nhi.h b/drivers/thunderbolt/nhi.h
index 1b5d47ecd3ed..b7b973949f8e 100644
--- a/drivers/thunderbolt/nhi.h
+++ b/drivers/thunderbolt/nhi.h
@@ -30,6 +30,26 @@ enum nhi_mailbox_cmd {
 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);
 
+/**
+ * struct tb_nhi_ops - NHI specific optional operations
+ * @init: NHI specific initialization
+ * @suspend_noirq: NHI specific suspend_noirq hook
+ * @resume_noirq: NHI specific resume_noirq hook
+ * @runtime_suspend: NHI specific runtime_suspend hook
+ * @runtime_resume: NHI specific runtime_resume hook
+ * @shutdown: NHI specific shutdown
+ */
+struct tb_nhi_ops {
+	int (*init)(struct tb_nhi *nhi);
+	int (*suspend_noirq)(struct tb_nhi *nhi, bool wakeup);
+	int (*resume_noirq)(struct tb_nhi *nhi);
+	int (*runtime_suspend)(struct tb_nhi *nhi);
+	int (*runtime_resume)(struct tb_nhi *nhi);
+	void (*shutdown)(struct tb_nhi *nhi);
+};
+
+extern const struct tb_nhi_ops icl_nhi_ops;
+
 /*
  * 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
@@ -51,5 +71,7 @@ enum nhi_fw_mode nhi_mailbox_mode(struct tb_nhi *nhi);
 #define PCI_DEVICE_ID_INTEL_TITAN_RIDGE_4C_BRIDGE	0x15ea
 #define PCI_DEVICE_ID_INTEL_TITAN_RIDGE_4C_NHI		0x15eb
 #define PCI_DEVICE_ID_INTEL_TITAN_RIDGE_DD_BRIDGE	0x15ef
+#define PCI_DEVICE_ID_INTEL_ICL_NHI1			0x8a0d
+#define PCI_DEVICE_ID_INTEL_ICL_NHI0			0x8a17
 
 #endif
diff --git a/drivers/thunderbolt/nhi_ops.c b/drivers/thunderbolt/nhi_ops.c
new file mode 100644
index 000000000000..61cd09cef943
--- /dev/null
+++ b/drivers/thunderbolt/nhi_ops.c
@@ -0,0 +1,179 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * NHI specific operations
+ *
+ * Copyright (C) 2019, Intel Corporation
+ * Author: Mika Westerberg <mika.westerberg@linux.intel.com>
+ */
+
+#include <linux/delay.h>
+#include <linux/suspend.h>
+
+#include "nhi.h"
+#include "nhi_regs.h"
+#include "tb.h"
+
+/* Ice Lake specific NHI operations */
+
+#define ICL_LC_MAILBOX_TIMEOUT	500 /* ms */
+
+static int check_for_device(struct device *dev, void *data)
+{
+	return tb_is_switch(dev);
+}
+
+static bool icl_nhi_is_device_connected(struct tb_nhi *nhi)
+{
+	struct tb *tb = pci_get_drvdata(nhi->pdev);
+	int ret;
+
+	ret = device_for_each_child(&tb->root_switch->dev, NULL,
+				    check_for_device);
+	return ret > 0;
+}
+
+static int icl_nhi_force_power(struct tb_nhi *nhi, bool power)
+{
+	u32 vs_cap;
+
+	/*
+	 * The Thunderbolt host controller is present always in Ice Lake
+	 * but the firmware may not be loaded and running (depending
+	 * whether there is device connected and so on). Each time the
+	 * controller is used we need to "Force Power" it first and wait
+	 * for the firmware to indicate it is up and running. This "Force
+	 * Power" is really not about actually powering on/off the
+	 * controller so it is accessible even if "Force Power" is off.
+	 *
+	 * The actual power management happens inside shared ACPI power
+	 * resources using standard ACPI methods.
+	 */
+	pci_read_config_dword(nhi->pdev, VS_CAP_22, &vs_cap);
+	if (power) {
+		vs_cap &= ~VS_CAP_22_DMA_DELAY_MASK;
+		vs_cap |= 0x22 << VS_CAP_22_DMA_DELAY_SHIFT;
+		vs_cap |= VS_CAP_22_FORCE_POWER;
+	} else {
+		vs_cap &= ~VS_CAP_22_FORCE_POWER;
+	}
+	pci_write_config_dword(nhi->pdev, VS_CAP_22, vs_cap);
+
+	if (power) {
+		unsigned int retries = 10;
+		u32 val;
+
+		/* Wait until the firmware tells it is up and running */
+		do {
+			pci_read_config_dword(nhi->pdev, VS_CAP_9, &val);
+			if (val & VS_CAP_9_FW_READY)
+				return 0;
+			msleep(250);
+		} while (--retries);
+
+		return -ETIMEDOUT;
+	}
+
+	return 0;
+}
+
+static void icl_nhi_lc_mailbox_cmd(struct tb_nhi *nhi, enum icl_lc_mailbox_cmd cmd)
+{
+	u32 data;
+
+	pci_read_config_dword(nhi->pdev, VS_CAP_19, &data);
+	data = (cmd << VS_CAP_19_CMD_SHIFT) & VS_CAP_19_CMD_MASK;
+	pci_write_config_dword(nhi->pdev, VS_CAP_19, data | VS_CAP_19_VALID);
+}
+
+static int icl_nhi_lc_mailbox_cmd_complete(struct tb_nhi *nhi, int timeout)
+{
+	unsigned long end;
+	u32 data;
+
+	if (!timeout)
+		goto clear;
+
+	end = jiffies + msecs_to_jiffies(timeout);
+	do {
+		pci_read_config_dword(nhi->pdev, VS_CAP_18, &data);
+		if (data & VS_CAP_18_DONE)
+			goto clear;
+		msleep(100);
+	} while (time_before(jiffies, end));
+
+	return -ETIMEDOUT;
+
+clear:
+	/* Clear the valid bit */
+	pci_write_config_dword(nhi->pdev, VS_CAP_19, 0);
+	return 0;
+}
+
+static void icl_nhi_set_ltr(struct tb_nhi *nhi)
+{
+	u32 max_ltr, ltr;
+
+	pci_read_config_dword(nhi->pdev, VS_CAP_16, &max_ltr);
+	max_ltr &= 0xffff;
+	/* Program the same value for both snoop and no-snoop */
+	ltr = max_ltr << 16 | max_ltr;
+	pci_write_config_dword(nhi->pdev, VS_CAP_15, ltr);
+}
+
+static int icl_nhi_suspend(struct tb_nhi *nhi)
+{
+	int ret;
+
+	if (icl_nhi_is_device_connected(nhi))
+		return 0;
+
+	/*
+	 * If there is no device connected we need to perform both: a
+	 * handshake through LC mailbox and force power down before
+	 * entering D3.
+	 */
+	icl_nhi_lc_mailbox_cmd(nhi, ICL_LC_PREPARE_FOR_RESET);
+	ret = icl_nhi_lc_mailbox_cmd_complete(nhi, ICL_LC_MAILBOX_TIMEOUT);
+	if (ret)
+		return ret;
+
+	return icl_nhi_force_power(nhi, false);
+}
+
+static int icl_nhi_suspend_noirq(struct tb_nhi *nhi, bool wakeup)
+{
+	enum icl_lc_mailbox_cmd cmd;
+
+	if (!pm_suspend_via_firmware())
+		return icl_nhi_suspend(nhi);
+
+	cmd = wakeup ? ICL_LC_GO2SX : ICL_LC_GO2SX_NO_WAKE;
+	icl_nhi_lc_mailbox_cmd(nhi, cmd);
+	return icl_nhi_lc_mailbox_cmd_complete(nhi, ICL_LC_MAILBOX_TIMEOUT);
+}
+
+static int icl_nhi_resume(struct tb_nhi *nhi)
+{
+	int ret;
+
+	ret = icl_nhi_force_power(nhi, true);
+	if (ret)
+		return ret;
+
+	icl_nhi_set_ltr(nhi);
+	return 0;
+}
+
+static void icl_nhi_shutdown(struct tb_nhi *nhi)
+{
+	icl_nhi_force_power(nhi, false);
+}
+
+const struct tb_nhi_ops icl_nhi_ops = {
+	.init = icl_nhi_resume,
+	.suspend_noirq = icl_nhi_suspend_noirq,
+	.resume_noirq = icl_nhi_resume,
+	.runtime_suspend = icl_nhi_suspend,
+	.runtime_resume = icl_nhi_resume,
+	.shutdown = icl_nhi_shutdown,
+};
diff --git a/drivers/thunderbolt/nhi_regs.h b/drivers/thunderbolt/nhi_regs.h
index a60bd98c1d04..0d4970dcef84 100644
--- a/drivers/thunderbolt/nhi_regs.h
+++ b/drivers/thunderbolt/nhi_regs.h
@@ -124,4 +124,41 @@ struct ring_desc {
 #define REG_FW_STS_ICM_EN_INVERT	BIT(1)
 #define REG_FW_STS_ICM_EN		BIT(0)
 
+/* ICL NHI VSEC registers */
+
+/* FW ready */
+#define VS_CAP_9			0xc8
+#define VS_CAP_9_FW_READY		BIT(31)
+/* UUID */
+#define VS_CAP_10			0xcc
+#define VS_CAP_11			0xd0
+/* LTR */
+#define VS_CAP_15			0xe0
+#define VS_CAP_16			0xe4
+/* TBT2PCIe */
+#define VS_CAP_18			0xec
+#define VS_CAP_18_DONE			BIT(0)
+/* PCIe2TBT */
+#define VS_CAP_19			0xf0
+#define VS_CAP_19_VALID			BIT(0)
+#define VS_CAP_19_CMD_SHIFT		1
+#define VS_CAP_19_CMD_MASK		GENMASK(7, 1)
+/* Force power */
+#define VS_CAP_22			0xfc
+#define VS_CAP_22_FORCE_POWER		BIT(1)
+#define VS_CAP_22_DMA_DELAY_MASK	GENMASK(31, 24)
+#define VS_CAP_22_DMA_DELAY_SHIFT	24
+
+/**
+ * enum icl_lc_mailbox_cmd - ICL specific LC mailbox commands
+ * @ICL_LC_GO2SX: Ask LC to enter Sx without wake
+ * @ICL_LC_GO2SX_NO_WAKE: Ask LC to enter Sx with wake
+ * @ICL_LC_PREPARE_FOR_RESET: Prepare LC for reset
+ */
+enum icl_lc_mailbox_cmd {
+	ICL_LC_GO2SX = 0x02,
+	ICL_LC_GO2SX_NO_WAKE = 0x03,
+	ICL_LC_PREPARE_FOR_RESET = 0x21,
+};
+
 #endif
diff --git a/drivers/thunderbolt/switch.c b/drivers/thunderbolt/switch.c
index 531f11fecf75..410bf1bceeee 100644
--- a/drivers/thunderbolt/switch.c
+++ b/drivers/thunderbolt/switch.c
@@ -1470,6 +1470,8 @@ static int tb_switch_get_generation(struct tb_switch *sw)
 	case PCI_DEVICE_ID_INTEL_TITAN_RIDGE_2C_BRIDGE:
 	case PCI_DEVICE_ID_INTEL_TITAN_RIDGE_4C_BRIDGE:
 	case PCI_DEVICE_ID_INTEL_TITAN_RIDGE_DD_BRIDGE:
+	case PCI_DEVICE_ID_INTEL_ICL_NHI0:
+	case PCI_DEVICE_ID_INTEL_ICL_NHI1:
 		return 3;
 
 	default:
diff --git a/drivers/thunderbolt/tb_msgs.h b/drivers/thunderbolt/tb_msgs.h
index afbe1d29bb03..4b641e4ee0c5 100644
--- a/drivers/thunderbolt/tb_msgs.h
+++ b/drivers/thunderbolt/tb_msgs.h
@@ -104,10 +104,11 @@ enum icm_pkg_code {
 };
 
 enum icm_event_code {
-	ICM_EVENT_DEVICE_CONNECTED = 3,
-	ICM_EVENT_DEVICE_DISCONNECTED = 4,
-	ICM_EVENT_XDOMAIN_CONNECTED = 6,
-	ICM_EVENT_XDOMAIN_DISCONNECTED = 7,
+	ICM_EVENT_DEVICE_CONNECTED = 0x3,
+	ICM_EVENT_DEVICE_DISCONNECTED = 0x4,
+	ICM_EVENT_XDOMAIN_CONNECTED = 0x6,
+	ICM_EVENT_XDOMAIN_DISCONNECTED = 0x7,
+	ICM_EVENT_RTD3_VETO = 0xa,
 };
 
 struct icm_pkg_header {
@@ -463,6 +464,13 @@ struct icm_tr_pkg_disconnect_xdomain_response {
 	uuid_t remote_uuid;
 };
 
+/* Ice Lake messages */
+
+struct icm_icl_event_rtd3_veto {
+	struct icm_pkg_header hdr;
+	u32 veto_reason;
+};
+
 /* XDomain messages */
 
 struct tb_xdomain_header {
diff --git a/include/linux/thunderbolt.h b/include/linux/thunderbolt.h
index 2d7e012db03f..ece782ef5466 100644
--- a/include/linux/thunderbolt.h
+++ b/include/linux/thunderbolt.h
@@ -429,6 +429,7 @@ static inline struct tb_xdomain *tb_service_parent(struct tb_service *svc)
  * @lock: Must be held during ring creation/destruction. Is acquired by
  *	  interrupt_work when dispatching interrupts to individual rings.
  * @pdev: Pointer to the PCI device
+ * @ops: NHI specific optional ops
  * @iobase: MMIO space of the NHI
  * @tx_rings: All Tx rings available on this host controller
  * @rx_rings: All Rx rings available on this host controller
@@ -442,6 +443,7 @@ static inline struct tb_xdomain *tb_service_parent(struct tb_service *svc)
 struct tb_nhi {
 	spinlock_t lock;
 	struct pci_dev *pdev;
+	const struct tb_nhi_ops *ops;
 	void __iomem *iobase;
 	struct tb_ring **tx_rings;
 	struct tb_ring **rx_rings;
-- 
2.23.0.rc1


^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH v3 8/8] ACPI / property: Add two new Thunderbolt property GUIDs to the list
  2019-08-19 11:22 [PATCH v3 0/8] thunderbolt: Intel Ice Lake support Mika Westerberg
                   ` (6 preceding siblings ...)
  2019-08-19 11:22 ` [PATCH v3 7/8] thunderbolt: Add support for Intel Ice Lake Mika Westerberg
@ 2019-08-19 11:22 ` Mika Westerberg
  2019-08-19 16:29 ` [PATCH v3 0/8] thunderbolt: Intel Ice Lake support Mario.Limonciello
  2019-08-26  9:20 ` Mika Westerberg
  9 siblings, 0 replies; 17+ messages in thread
From: Mika Westerberg @ 2019-08-19 11:22 UTC (permalink / raw)
  To: linux-kernel
  Cc: Andreas Noever, Michael Jamet, Yehezkel Bernat,
	Rafael J. Wysocki, Len Brown, Lukas Wunner, Mario.Limonciello,
	Anthony Wong, Rajmohan Mani, Raanan Avargil, David Laight,
	Mika Westerberg, linux-acpi

Ice Lake Thunderbolt controller includes two new device property
compatible properties that we need to be able to extract in the driver
so add them to the growing array of GUIDs.

Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
---
 drivers/acpi/property.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/acpi/property.c b/drivers/acpi/property.c
index ea3d700da3ca..e095334eaec9 100644
--- a/drivers/acpi/property.c
+++ b/drivers/acpi/property.c
@@ -39,6 +39,12 @@ static const guid_t prp_guids[] = {
 	/* External facing port GUID: efcc06cc-73ac-4bc3-bff0-76143807c389 */
 	GUID_INIT(0xefcc06cc, 0x73ac, 0x4bc3,
 		  0xbf, 0xf0, 0x76, 0x14, 0x38, 0x07, 0xc3, 0x89),
+	/* Thunderbolt GUID for IMR_VALID: c44d002f-69f9-4e7d-a904-a7baabdf43f7 */
+	GUID_INIT(0xc44d002f, 0x69f9, 0x4e7d,
+		  0xa9, 0x04, 0xa7, 0xba, 0xab, 0xdf, 0x43, 0xf7),
+	/* Thunderbolt GUID for WAKE_SUPPORTED: 6c501103-c189-4296-ba72-9bf5a26ebe5d */
+	GUID_INIT(0x6c501103, 0xc189, 0x4296,
+		  0xba, 0x72, 0x9b, 0xf5, 0xa2, 0x6e, 0xbe, 0x5d),
 };
 
 /* ACPI _DSD data subnodes GUID: dbb8e3e6-5886-4ba6-8795-1319f52a966b */
-- 
2.23.0.rc1


^ permalink raw reply	[flat|nested] 17+ messages in thread

* RE: [PATCH v3 0/8] thunderbolt: Intel Ice Lake support
  2019-08-19 11:22 [PATCH v3 0/8] thunderbolt: Intel Ice Lake support Mika Westerberg
                   ` (7 preceding siblings ...)
  2019-08-19 11:22 ` [PATCH v3 8/8] ACPI / property: Add two new Thunderbolt property GUIDs to the list Mika Westerberg
@ 2019-08-19 16:29 ` Mario.Limonciello
  2019-08-19 17:57   ` Mika Westerberg
  2019-08-20 11:34   ` Lukas Wunner
  2019-08-26  9:20 ` Mika Westerberg
  9 siblings, 2 replies; 17+ messages in thread
From: Mario.Limonciello @ 2019-08-19 16:29 UTC (permalink / raw)
  To: mika.westerberg, linux-kernel
  Cc: andreas.noever, michael.jamet, YehezkelShB, rjw, lenb, lukas,
	anthony.wong, rajmohan.mani, raanan.avargil, David.Laight,
	linux-acpi

> -----Original Message-----
> From: Mika Westerberg <mika.westerberg@linux.intel.com>
> Sent: Monday, August 19, 2019 6:22 AM
> To: linux-kernel@vger.kernel.org
> Cc: Andreas Noever; Michael Jamet; Yehezkel Bernat; Rafael J. Wysocki; Len
> Brown; Lukas Wunner; Limonciello, Mario; Anthony Wong; Rajmohan Mani;
> Raanan Avargil; David Laight; Mika Westerberg; linux-acpi@vger.kernel.org
> Subject: [PATCH v3 0/8] thunderbolt: Intel Ice Lake support
> 
> 
> [EXTERNAL EMAIL]
> 
> Hi all,
> 
> This is third iteration of the patch series adding support for the Intel
> Ice Lake integrated Thunderbolt controller. The biggest difference from the
> previous discrete controllers is that the Ice Lake Thunderbolt controller
> is now integrated as part of the SoC. The firmware messages pretty much
> follow Titan Ridge but there are some differences as well (such as the new
> RTD3 veto notification). Also Ice Lake does not implement security levels
> so DMA protection is handled by IOMMU.
> 
> The previous versions of the series can be found here:
> 
>   v2: https://lwn.net/Articles/795979/
>   v1: https://lwn.net/Articles/793066/
> 
> Changes from v2:
> 
>   * Moved ICL specific NHI ops into a separate file (nhi_ops.c)
> 
>   * Postpone rescan thread during resume when if get device connected
>     notification from the firmware. This fixes an issue that happened
>     occasionally when resuming with full chain of devices. The driver
>     started to remove last devices in the chain even if they are still
>     connected.
> 
>   * Move call to nhi->ops->init() before CM specific probe happens.
> 
>   * Added ack from Rafael
> 
> Changes from v1:
> 
>   * Check !x86_apple_machine for Titan Ridge also.
> 
>   * Drop ioread32() when updating prod/cons because hardware ignores writes
>     to the read-only parts of the register this allows us to save one read.
> 
>   * Remove Light Ridge specific handling in eeprom.c as it is not necessary
>     after patch 4/8.
> 
>   * Moved RTD3 veto handling into separate functions to avoid code
>     duplication.
> 
>   * Reworked struct nhi_ops so that it provides hooks such as
>     runtime_suspend and so on. The NHI implementation then can use those
>     hooks to implement whatever additional logic is needed. This should
>     allow us to move those bits into a separate files in future if needed.
> 
>     I also looked whether we could replace
>     quirk_apple_poweroff_thunderbolt() using struct nhi_ops as well but it
>     turns out to be unsuitable. The reason is that the ACPI magic sequence
>     needs to be done after PCI core has moved the device into D3. The NHI
>     driver does not have easy means to do so.
> 
>   * Clarified comment in icl_nhi_suspend()
> 
>   * Added clarification comment to icl_nhi_force_power()
> 
>   * Use "Thunderbolt" instead of "TBT" in new GUID entries
> 
>   * Added reviewed tag from Yehezkel
> 
> Mika Westerberg (8):
>   thunderbolt: Correct path indices for PCIe tunnel
>   thunderbolt: Move NVM upgrade support flag to struct icm
>   thunderbolt: Use 32-bit writes when writing ring producer/consumer
>   thunderbolt: Do not fail adding switch if some port is not implemented
>   thunderbolt: Hide switch attributes that are not set
>   thunderbolt: Expose active parts of NVM even if upgrade is not supported
>   thunderbolt: Add support for Intel Ice Lake
>   ACPI / property: Add two new Thunderbolt property GUIDs to the list
> 
>  drivers/acpi/property.c        |   6 +
>  drivers/thunderbolt/Makefile   |   2 +-
>  drivers/thunderbolt/ctl.c      |  23 +++-
>  drivers/thunderbolt/eeprom.c   |   4 -
>  drivers/thunderbolt/icm.c      | 194 ++++++++++++++++++++++++++++++---
>  drivers/thunderbolt/nhi.c      | 134 +++++++++++++++++++++--
>  drivers/thunderbolt/nhi.h      |  22 ++++
>  drivers/thunderbolt/nhi_ops.c  | 179 ++++++++++++++++++++++++++++++
>  drivers/thunderbolt/nhi_regs.h |  37 +++++++
>  drivers/thunderbolt/switch.c   |  52 +++++++--
>  drivers/thunderbolt/tb_msgs.h  |  16 ++-
>  drivers/thunderbolt/tunnel.c   |   4 +-
>  include/linux/thunderbolt.h    |   2 +
>  13 files changed, 622 insertions(+), 53 deletions(-)
>  create mode 100644 drivers/thunderbolt/nhi_ops.c
> 
> --
> 2.23.0.rc1

I've tested this on a pre-production ICL platform.  This was on top of 5.3-rc5, both of
your patches from -next and this series.

I've run into a problem when using
a WD19TB that after unplugging it will cause the following to spew in dmesg:

[ 2198.017003] ============================================
[ 2198.017005] WARNING: possible recursive locking detected
[ 2198.017008] 5.3.0-rc5+ #75 Not tainted
[ 2198.017009] --------------------------------------------
[ 2198.017012] irq/122-pciehp/121 is trying to acquire lock:
[ 2198.017015] 00000000801d4de8 (&ctrl->reset_lock){.+.+}, at: pciehp_check_presence+0x1b/0x80
[ 2198.017026] 
               but task is already holding lock:
[ 2198.017028] 000000000899e2eb (&ctrl->reset_lock){.+.+}, at: pciehp_ist+0xaf/0x1c0
[ 2198.017033] 
               other info that might help us debug this:
[ 2198.017035]  Possible unsafe locking scenario:

[ 2198.017037]        CPU0
[ 2198.017038]        ----
[ 2198.017041]   lock(&ctrl->reset_lock);
[ 2198.017044]   lock(&ctrl->reset_lock);
[ 2198.017046] 
                *** DEADLOCK ***

[ 2198.017048]  May be due to missing lock nesting notation

[ 2198.017051] 3 locks held by irq/122-pciehp/121:
[ 2198.017052]  #0: 000000000899e2eb (&ctrl->reset_lock){.+.+}, at: pciehp_ist+0xaf/0x1c0
[ 2198.017057]  #1: 0000000069e1fd47 (pci_rescan_remove_lock){+.+.}, at: pciehp_unconfigure_device+0x41/0x130
[ 2198.017064]  #2: 0000000046a5bfbf (&dev->mutex){....}, at: device_release_driver_internal+0x1c/0x1a0
[ 2198.017071] 
               stack backtrace:
[ 2198.017075] CPU: 3 PID: 121 Comm: irq/122-pciehp Not tainted 5.3.0-rc5+ #75
[ 2198.017077] Hardware name: Dell Inc. XPS 13 7300/, BIOS 0.1.16 08/06/2019
[ 2198.017079] Call Trace:
[ 2198.017089]  dump_stack+0x5e/0x8b
[ 2198.017096]  __lock_acquire+0x12fe/0x1520
[ 2198.017102]  lock_acquire+0x9d/0x1a0
[ 2198.017105]  ? pciehp_check_presence+0x1b/0x80
[ 2198.017113]  ? pci_restore_standard_config+0x40/0x40
[ 2198.017118]  down_read+0x3b/0x160
[ 2198.017121]  ? pciehp_check_presence+0x1b/0x80
[ 2198.017123]  pciehp_check_presence+0x1b/0x80
[ 2198.017128]  ? quirk_disable_msi.part.29+0x31/0x31
[ 2198.017131]  pciehp_resume+0x27/0x30
[ 2198.017136]  device_for_each_child+0x47/0x90
[ 2198.017140]  ? pci_restore_standard_config+0x40/0x40
[ 2198.017145]  pcie_port_device_runtime_resume+0x30/0x50
[ 2198.017150]  pci_pm_runtime_resume+0x6e/0xc0
[ 2198.017156]  __rpm_callback+0xb0/0x110
[ 2198.017161]  ? pci_restore_standard_config+0x40/0x40
[ 2198.017165]  rpm_callback+0x1f/0x70
[ 2198.017169]  ? pci_restore_standard_config+0x40/0x40
[ 2198.017173]  rpm_resume+0x4fe/0x690
[ 2198.017179]  ? irq_forced_thread_fn+0x70/0x70
[ 2198.017183]  __pm_runtime_resume+0x47/0x80
[ 2198.017187]  device_release_driver_internal+0x7c/0x1a0
[ 2198.017191]  pci_stop_bus_device+0x5d/0x80
[ 2198.017195]  pci_stop_bus_device+0x2b/0x80
[ 2198.017198]  pci_stop_and_remove_bus_device+0xe/0x20
[ 2198.017202]  pciehp_unconfigure_device+0x7c/0x130
[ 2198.017206]  pciehp_disable_slot+0x69/0x120
[ 2198.017211]  pciehp_handle_presence_or_link_change+0x7d/0x4b0
[ 2198.017215]  pciehp_ist+0x12a/0x1c0
[ 2198.017219]  irq_thread_fn+0x1b/0x60
[ 2198.017222]  irq_thread+0x15b/0x1c0
[ 2198.017226]  ? lockdep_hardirqs_on+0x115/0x180
[ 2198.017229]  ? wake_threads_waitq+0x30/0x30
[ 2198.017233]  ? irq_thread_dtor+0x90/0x90
[ 2198.017237]  kthread+0x101/0x140
[ 2198.017241]  ? kthread_cancel_delayed_work_sync+0x10/0x10
[ 2198.017245]  ret_from_fork+0x24/0x30
[ 2198.017897] xhci_hcd 0000:03:00.0: remove, state 1
[ 2198.017917] usb usb6: USB disconnect, device number 1
[ 2198.017925] usb 6-2: USB disconnect, device number 2
[ 2198.017932] usb 6-2.3: USB disconnect, device number 3
[ 2198.017939] usb 6-2.3.1: USB disconnect, device number 5
[ 2198.019565] sd 0:0:0:0: [sda] Synchronizing SCSI cache
[ 2198.019671] sd 0:0:0:0: [sda] Synchronize Cache(10) failed: Result: hostbyte=DID_NO_CONNECT driverbyte=DRIVER_OK
[ 2198.057200] xhci_hcd 0000:03:00.0: xHCI host controller not responding, assume dead
[ 2198.057227] r8152 6-2.4:1.0 enxd8d090034dcb: Stop submitting intr, status -108
[ 2198.057574] usb 6-2.4: USB disconnect, device number 4
[ 2198.074541] xhci_hcd 0000:03:00.0: USB bus 6 deregistered
[ 2198.074558] xhci_hcd 0000:03:00.0: remove, state 1
[ 2198.074564] usb usb5: USB disconnect, device number 1
[ 2198.074566] usb 5-2: USB disconnect, device number 2
[ 2198.074569] usb 5-2.3: USB disconnect, device number 3
[ 2198.074571] usb 5-2.3.4: USB disconnect, device number 5
[ 2198.077367] usb 5-2.3.5: USB disconnect, device number 6
[ 2198.078488] usb 5-2.5: USB disconnect, device number 4
[ 2198.080340] xhci_hcd 0000:03:00.0: Host halt failed, -19
[ 2198.080344] xhci_hcd 0000:03:00.0: Host not accessible, reset failed.
[ 2198.080770] xhci_hcd 0000:03:00.0: USB bus 5 deregistered
[ 2198.081153] pci 0000:03:00.0: Removing from iommu group 3
[ 2198.081180] pci_bus 0000:03: busn_res: [bus 03] is released
[ 2198.081287] pci 0000:02:02.0: Removing from iommu group 3
[ 2198.081396] pci_bus 0000:04: busn_res: [bus 04-2d] is released
[ 2198.081509] pci 0000:02:04.0: Removing from iommu group 3
[ 2198.082273] pci_bus 0000:02: busn_res: [bus 02-2d] is released
[ 2198.085759] pci 0000:01:00.0: Removing from iommu group 3
[ 2198.630098] thunderbolt 0-1: device disconnected

Additionally I've found after this I can't get the dock to work by hotplugging again
until I reboot the system.


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v3 0/8] thunderbolt: Intel Ice Lake support
  2019-08-19 16:29 ` [PATCH v3 0/8] thunderbolt: Intel Ice Lake support Mario.Limonciello
@ 2019-08-19 17:57   ` Mika Westerberg
  2019-08-19 18:22     ` Mario.Limonciello
  2019-08-20 11:34   ` Lukas Wunner
  1 sibling, 1 reply; 17+ messages in thread
From: Mika Westerberg @ 2019-08-19 17:57 UTC (permalink / raw)
  To: Mario.Limonciello
  Cc: linux-kernel, andreas.noever, michael.jamet, YehezkelShB, rjw,
	lenb, lukas, anthony.wong, rajmohan.mani, raanan.avargil,
	David.Laight, linux-acpi

On Mon, Aug 19, 2019 at 04:29:35PM +0000, Mario.Limonciello@dell.com wrote:
> > -----Original Message-----
> > From: Mika Westerberg <mika.westerberg@linux.intel.com>
> > Sent: Monday, August 19, 2019 6:22 AM
> > To: linux-kernel@vger.kernel.org
> > Cc: Andreas Noever; Michael Jamet; Yehezkel Bernat; Rafael J. Wysocki; Len
> > Brown; Lukas Wunner; Limonciello, Mario; Anthony Wong; Rajmohan Mani;
> > Raanan Avargil; David Laight; Mika Westerberg; linux-acpi@vger.kernel.org
> > Subject: [PATCH v3 0/8] thunderbolt: Intel Ice Lake support
> > 
> > 
> > [EXTERNAL EMAIL]
> > 
> > Hi all,
> > 
> > This is third iteration of the patch series adding support for the Intel
> > Ice Lake integrated Thunderbolt controller. The biggest difference from the
> > previous discrete controllers is that the Ice Lake Thunderbolt controller
> > is now integrated as part of the SoC. The firmware messages pretty much
> > follow Titan Ridge but there are some differences as well (such as the new
> > RTD3 veto notification). Also Ice Lake does not implement security levels
> > so DMA protection is handled by IOMMU.
> > 
> > The previous versions of the series can be found here:
> > 
> >   v2: https://lwn.net/Articles/795979/
> >   v1: https://lwn.net/Articles/793066/
> > 
> > Changes from v2:
> > 
> >   * Moved ICL specific NHI ops into a separate file (nhi_ops.c)
> > 
> >   * Postpone rescan thread during resume when if get device connected
> >     notification from the firmware. This fixes an issue that happened
> >     occasionally when resuming with full chain of devices. The driver
> >     started to remove last devices in the chain even if they are still
> >     connected.
> > 
> >   * Move call to nhi->ops->init() before CM specific probe happens.
> > 
> >   * Added ack from Rafael
> > 
> > Changes from v1:
> > 
> >   * Check !x86_apple_machine for Titan Ridge also.
> > 
> >   * Drop ioread32() when updating prod/cons because hardware ignores writes
> >     to the read-only parts of the register this allows us to save one read.
> > 
> >   * Remove Light Ridge specific handling in eeprom.c as it is not necessary
> >     after patch 4/8.
> > 
> >   * Moved RTD3 veto handling into separate functions to avoid code
> >     duplication.
> > 
> >   * Reworked struct nhi_ops so that it provides hooks such as
> >     runtime_suspend and so on. The NHI implementation then can use those
> >     hooks to implement whatever additional logic is needed. This should
> >     allow us to move those bits into a separate files in future if needed.
> > 
> >     I also looked whether we could replace
> >     quirk_apple_poweroff_thunderbolt() using struct nhi_ops as well but it
> >     turns out to be unsuitable. The reason is that the ACPI magic sequence
> >     needs to be done after PCI core has moved the device into D3. The NHI
> >     driver does not have easy means to do so.
> > 
> >   * Clarified comment in icl_nhi_suspend()
> > 
> >   * Added clarification comment to icl_nhi_force_power()
> > 
> >   * Use "Thunderbolt" instead of "TBT" in new GUID entries
> > 
> >   * Added reviewed tag from Yehezkel
> > 
> > Mika Westerberg (8):
> >   thunderbolt: Correct path indices for PCIe tunnel
> >   thunderbolt: Move NVM upgrade support flag to struct icm
> >   thunderbolt: Use 32-bit writes when writing ring producer/consumer
> >   thunderbolt: Do not fail adding switch if some port is not implemented
> >   thunderbolt: Hide switch attributes that are not set
> >   thunderbolt: Expose active parts of NVM even if upgrade is not supported
> >   thunderbolt: Add support for Intel Ice Lake
> >   ACPI / property: Add two new Thunderbolt property GUIDs to the list
> > 
> >  drivers/acpi/property.c        |   6 +
> >  drivers/thunderbolt/Makefile   |   2 +-
> >  drivers/thunderbolt/ctl.c      |  23 +++-
> >  drivers/thunderbolt/eeprom.c   |   4 -
> >  drivers/thunderbolt/icm.c      | 194 ++++++++++++++++++++++++++++++---
> >  drivers/thunderbolt/nhi.c      | 134 +++++++++++++++++++++--
> >  drivers/thunderbolt/nhi.h      |  22 ++++
> >  drivers/thunderbolt/nhi_ops.c  | 179 ++++++++++++++++++++++++++++++
> >  drivers/thunderbolt/nhi_regs.h |  37 +++++++
> >  drivers/thunderbolt/switch.c   |  52 +++++++--
> >  drivers/thunderbolt/tb_msgs.h  |  16 ++-
> >  drivers/thunderbolt/tunnel.c   |   4 +-
> >  include/linux/thunderbolt.h    |   2 +
> >  13 files changed, 622 insertions(+), 53 deletions(-)
> >  create mode 100644 drivers/thunderbolt/nhi_ops.c
> > 
> > --
> > 2.23.0.rc1
> 
> I've tested this on a pre-production ICL platform.  This was on top of 5.3-rc5, both of
> your patches from -next and this series.
> 
> I've run into a problem when using
> a WD19TB that after unplugging it will cause the following to spew in dmesg:
> 
> [ 2198.017003] ============================================
> [ 2198.017005] WARNING: possible recursive locking detected
> [ 2198.017008] 5.3.0-rc5+ #75 Not tainted
> [ 2198.017009] --------------------------------------------
> [ 2198.017012] irq/122-pciehp/121 is trying to acquire lock:
> [ 2198.017015] 00000000801d4de8 (&ctrl->reset_lock){.+.+}, at: pciehp_check_presence+0x1b/0x80
> [ 2198.017026] 
>                but task is already holding lock:
> [ 2198.017028] 000000000899e2eb (&ctrl->reset_lock){.+.+}, at: pciehp_ist+0xaf/0x1c0
> [ 2198.017033] 
>                other info that might help us debug this:
> [ 2198.017035]  Possible unsafe locking scenario:
> 
> [ 2198.017037]        CPU0
> [ 2198.017038]        ----
> [ 2198.017041]   lock(&ctrl->reset_lock);
> [ 2198.017044]   lock(&ctrl->reset_lock);
> [ 2198.017046] 
>                 *** DEADLOCK ***
> 
> [ 2198.017048]  May be due to missing lock nesting notation
> 
> [ 2198.017051] 3 locks held by irq/122-pciehp/121:
> [ 2198.017052]  #0: 000000000899e2eb (&ctrl->reset_lock){.+.+}, at: pciehp_ist+0xaf/0x1c0
> [ 2198.017057]  #1: 0000000069e1fd47 (pci_rescan_remove_lock){+.+.}, at: pciehp_unconfigure_device+0x41/0x130
> [ 2198.017064]  #2: 0000000046a5bfbf (&dev->mutex){....}, at: device_release_driver_internal+0x1c/0x1a0
> [ 2198.017071] 
>                stack backtrace:
> [ 2198.017075] CPU: 3 PID: 121 Comm: irq/122-pciehp Not tainted 5.3.0-rc5+ #75
> [ 2198.017077] Hardware name: Dell Inc. XPS 13 7300/, BIOS 0.1.16 08/06/2019
> [ 2198.017079] Call Trace:
> [ 2198.017089]  dump_stack+0x5e/0x8b
> [ 2198.017096]  __lock_acquire+0x12fe/0x1520
> [ 2198.017102]  lock_acquire+0x9d/0x1a0
> [ 2198.017105]  ? pciehp_check_presence+0x1b/0x80
> [ 2198.017113]  ? pci_restore_standard_config+0x40/0x40
> [ 2198.017118]  down_read+0x3b/0x160
> [ 2198.017121]  ? pciehp_check_presence+0x1b/0x80
> [ 2198.017123]  pciehp_check_presence+0x1b/0x80
> [ 2198.017128]  ? quirk_disable_msi.part.29+0x31/0x31
> [ 2198.017131]  pciehp_resume+0x27/0x30
> [ 2198.017136]  device_for_each_child+0x47/0x90
> [ 2198.017140]  ? pci_restore_standard_config+0x40/0x40
> [ 2198.017145]  pcie_port_device_runtime_resume+0x30/0x50
> [ 2198.017150]  pci_pm_runtime_resume+0x6e/0xc0
> [ 2198.017156]  __rpm_callback+0xb0/0x110
> [ 2198.017161]  ? pci_restore_standard_config+0x40/0x40
> [ 2198.017165]  rpm_callback+0x1f/0x70
> [ 2198.017169]  ? pci_restore_standard_config+0x40/0x40
> [ 2198.017173]  rpm_resume+0x4fe/0x690
> [ 2198.017179]  ? irq_forced_thread_fn+0x70/0x70
> [ 2198.017183]  __pm_runtime_resume+0x47/0x80
> [ 2198.017187]  device_release_driver_internal+0x7c/0x1a0
> [ 2198.017191]  pci_stop_bus_device+0x5d/0x80
> [ 2198.017195]  pci_stop_bus_device+0x2b/0x80
> [ 2198.017198]  pci_stop_and_remove_bus_device+0xe/0x20
> [ 2198.017202]  pciehp_unconfigure_device+0x7c/0x130
> [ 2198.017206]  pciehp_disable_slot+0x69/0x120
> [ 2198.017211]  pciehp_handle_presence_or_link_change+0x7d/0x4b0
> [ 2198.017215]  pciehp_ist+0x12a/0x1c0
> [ 2198.017219]  irq_thread_fn+0x1b/0x60
> [ 2198.017222]  irq_thread+0x15b/0x1c0
> [ 2198.017226]  ? lockdep_hardirqs_on+0x115/0x180
> [ 2198.017229]  ? wake_threads_waitq+0x30/0x30
> [ 2198.017233]  ? irq_thread_dtor+0x90/0x90
> [ 2198.017237]  kthread+0x101/0x140
> [ 2198.017241]  ? kthread_cancel_delayed_work_sync+0x10/0x10
> [ 2198.017245]  ret_from_fork+0x24/0x30
> [ 2198.017897] xhci_hcd 0000:03:00.0: remove, state 1
> [ 2198.017917] usb usb6: USB disconnect, device number 1
> [ 2198.017925] usb 6-2: USB disconnect, device number 2
> [ 2198.017932] usb 6-2.3: USB disconnect, device number 3
> [ 2198.017939] usb 6-2.3.1: USB disconnect, device number 5
> [ 2198.019565] sd 0:0:0:0: [sda] Synchronizing SCSI cache
> [ 2198.019671] sd 0:0:0:0: [sda] Synchronize Cache(10) failed: Result: hostbyte=DID_NO_CONNECT driverbyte=DRIVER_OK
> [ 2198.057200] xhci_hcd 0000:03:00.0: xHCI host controller not responding, assume dead
> [ 2198.057227] r8152 6-2.4:1.0 enxd8d090034dcb: Stop submitting intr, status -108
> [ 2198.057574] usb 6-2.4: USB disconnect, device number 4
> [ 2198.074541] xhci_hcd 0000:03:00.0: USB bus 6 deregistered
> [ 2198.074558] xhci_hcd 0000:03:00.0: remove, state 1
> [ 2198.074564] usb usb5: USB disconnect, device number 1
> [ 2198.074566] usb 5-2: USB disconnect, device number 2
> [ 2198.074569] usb 5-2.3: USB disconnect, device number 3
> [ 2198.074571] usb 5-2.3.4: USB disconnect, device number 5
> [ 2198.077367] usb 5-2.3.5: USB disconnect, device number 6
> [ 2198.078488] usb 5-2.5: USB disconnect, device number 4
> [ 2198.080340] xhci_hcd 0000:03:00.0: Host halt failed, -19
> [ 2198.080344] xhci_hcd 0000:03:00.0: Host not accessible, reset failed.
> [ 2198.080770] xhci_hcd 0000:03:00.0: USB bus 5 deregistered
> [ 2198.081153] pci 0000:03:00.0: Removing from iommu group 3
> [ 2198.081180] pci_bus 0000:03: busn_res: [bus 03] is released
> [ 2198.081287] pci 0000:02:02.0: Removing from iommu group 3
> [ 2198.081396] pci_bus 0000:04: busn_res: [bus 04-2d] is released
> [ 2198.081509] pci 0000:02:04.0: Removing from iommu group 3
> [ 2198.082273] pci_bus 0000:02: busn_res: [bus 02-2d] is released
> [ 2198.085759] pci 0000:01:00.0: Removing from iommu group 3
> [ 2198.630098] thunderbolt 0-1: device disconnected
> 
> Additionally I've found after this I can't get the dock to work by hotplugging again
> until I reboot the system.

Can you try if the following patch helps?

https://lore.kernel.org/patchwork/patch/1113961/

^ permalink raw reply	[flat|nested] 17+ messages in thread

* RE: [PATCH v3 0/8] thunderbolt: Intel Ice Lake support
  2019-08-19 17:57   ` Mika Westerberg
@ 2019-08-19 18:22     ` Mario.Limonciello
  2019-08-19 19:36       ` Mario.Limonciello
  0 siblings, 1 reply; 17+ messages in thread
From: Mario.Limonciello @ 2019-08-19 18:22 UTC (permalink / raw)
  To: mika.westerberg
  Cc: linux-kernel, andreas.noever, michael.jamet, YehezkelShB, rjw,
	lenb, lukas, anthony.wong, rajmohan.mani, raanan.avargil,
	David.Laight, linux-acpi

> > I've tested this on a pre-production ICL platform.  This was on top of 5.3-rc5,
> both of
> > your patches from -next and this series.
> >
> > I've run into a problem when using
> > a WD19TB that after unplugging it will cause the following to spew in dmesg:
> >
> > [ 2198.017003] ============================================
> > [ 2198.017005] WARNING: possible recursive locking detected
> > [ 2198.017008] 5.3.0-rc5+ #75 Not tainted
> > [ 2198.017009] --------------------------------------------
> > [ 2198.017012] irq/122-pciehp/121 is trying to acquire lock:
> > [ 2198.017015] 00000000801d4de8 (&ctrl->reset_lock){.+.+}, at:
> pciehp_check_presence+0x1b/0x80
> > [ 2198.017026]
> >                but task is already holding lock:
> > [ 2198.017028] 000000000899e2eb (&ctrl->reset_lock){.+.+}, at:
> pciehp_ist+0xaf/0x1c0
> > [ 2198.017033]
> >                other info that might help us debug this:
> > [ 2198.017035]  Possible unsafe locking scenario:
> >
> > [ 2198.017037]        CPU0
> > [ 2198.017038]        ----
> > [ 2198.017041]   lock(&ctrl->reset_lock);
> > [ 2198.017044]   lock(&ctrl->reset_lock);
> > [ 2198.017046]
> >                 *** DEADLOCK ***
> >
> > [ 2198.017048]  May be due to missing lock nesting notation
> >
> > [ 2198.017051] 3 locks held by irq/122-pciehp/121:
> > [ 2198.017052]  #0: 000000000899e2eb (&ctrl->reset_lock){.+.+}, at:
> pciehp_ist+0xaf/0x1c0
> > [ 2198.017057]  #1: 0000000069e1fd47 (pci_rescan_remove_lock){+.+.}, at:
> pciehp_unconfigure_device+0x41/0x130
> > [ 2198.017064]  #2: 0000000046a5bfbf (&dev->mutex){....}, at:
> device_release_driver_internal+0x1c/0x1a0
> > [ 2198.017071]
> >                stack backtrace:
> > [ 2198.017075] CPU: 3 PID: 121 Comm: irq/122-pciehp Not tainted 5.3.0-rc5+ #75
> > [ 2198.017079] Call Trace:
> > [ 2198.017089]  dump_stack+0x5e/0x8b
> > [ 2198.017096]  __lock_acquire+0x12fe/0x1520
> > [ 2198.017102]  lock_acquire+0x9d/0x1a0
> > [ 2198.017105]  ? pciehp_check_presence+0x1b/0x80
> > [ 2198.017113]  ? pci_restore_standard_config+0x40/0x40
> > [ 2198.017118]  down_read+0x3b/0x160
> > [ 2198.017121]  ? pciehp_check_presence+0x1b/0x80
> > [ 2198.017123]  pciehp_check_presence+0x1b/0x80
> > [ 2198.017128]  ? quirk_disable_msi.part.29+0x31/0x31
> > [ 2198.017131]  pciehp_resume+0x27/0x30
> > [ 2198.017136]  device_for_each_child+0x47/0x90
> > [ 2198.017140]  ? pci_restore_standard_config+0x40/0x40
> > [ 2198.017145]  pcie_port_device_runtime_resume+0x30/0x50
> > [ 2198.017150]  pci_pm_runtime_resume+0x6e/0xc0
> > [ 2198.017156]  __rpm_callback+0xb0/0x110
> > [ 2198.017161]  ? pci_restore_standard_config+0x40/0x40
> > [ 2198.017165]  rpm_callback+0x1f/0x70
> > [ 2198.017169]  ? pci_restore_standard_config+0x40/0x40
> > [ 2198.017173]  rpm_resume+0x4fe/0x690
> > [ 2198.017179]  ? irq_forced_thread_fn+0x70/0x70
> > [ 2198.017183]  __pm_runtime_resume+0x47/0x80
> > [ 2198.017187]  device_release_driver_internal+0x7c/0x1a0
> > [ 2198.017191]  pci_stop_bus_device+0x5d/0x80
> > [ 2198.017195]  pci_stop_bus_device+0x2b/0x80
> > [ 2198.017198]  pci_stop_and_remove_bus_device+0xe/0x20
> > [ 2198.017202]  pciehp_unconfigure_device+0x7c/0x130
> > [ 2198.017206]  pciehp_disable_slot+0x69/0x120
> > [ 2198.017211]  pciehp_handle_presence_or_link_change+0x7d/0x4b0
> > [ 2198.017215]  pciehp_ist+0x12a/0x1c0
> > [ 2198.017219]  irq_thread_fn+0x1b/0x60
> > [ 2198.017222]  irq_thread+0x15b/0x1c0
> > [ 2198.017226]  ? lockdep_hardirqs_on+0x115/0x180
> > [ 2198.017229]  ? wake_threads_waitq+0x30/0x30
> > [ 2198.017233]  ? irq_thread_dtor+0x90/0x90
> > [ 2198.017237]  kthread+0x101/0x140
> > [ 2198.017241]  ? kthread_cancel_delayed_work_sync+0x10/0x10
> > [ 2198.017245]  ret_from_fork+0x24/0x30
> > [ 2198.017897] xhci_hcd 0000:03:00.0: remove, state 1
> > [ 2198.017917] usb usb6: USB disconnect, device number 1
> > [ 2198.017925] usb 6-2: USB disconnect, device number 2
> > [ 2198.017932] usb 6-2.3: USB disconnect, device number 3
> > [ 2198.017939] usb 6-2.3.1: USB disconnect, device number 5
> > [ 2198.019565] sd 0:0:0:0: [sda] Synchronizing SCSI cache
> > [ 2198.019671] sd 0:0:0:0: [sda] Synchronize Cache(10) failed: Result:
> hostbyte=DID_NO_CONNECT driverbyte=DRIVER_OK
> > [ 2198.057200] xhci_hcd 0000:03:00.0: xHCI host controller not responding,
> assume dead
> > [ 2198.057227] r8152 6-2.4:1.0 enxd8d090034dcb: Stop submitting intr, status -
> 108
> > [ 2198.057574] usb 6-2.4: USB disconnect, device number 4
> > [ 2198.074541] xhci_hcd 0000:03:00.0: USB bus 6 deregistered
> > [ 2198.074558] xhci_hcd 0000:03:00.0: remove, state 1
> > [ 2198.074564] usb usb5: USB disconnect, device number 1
> > [ 2198.074566] usb 5-2: USB disconnect, device number 2
> > [ 2198.074569] usb 5-2.3: USB disconnect, device number 3
> > [ 2198.074571] usb 5-2.3.4: USB disconnect, device number 5
> > [ 2198.077367] usb 5-2.3.5: USB disconnect, device number 6
> > [ 2198.078488] usb 5-2.5: USB disconnect, device number 4
> > [ 2198.080340] xhci_hcd 0000:03:00.0: Host halt failed, -19
> > [ 2198.080344] xhci_hcd 0000:03:00.0: Host not accessible, reset failed.
> > [ 2198.080770] xhci_hcd 0000:03:00.0: USB bus 5 deregistered
> > [ 2198.081153] pci 0000:03:00.0: Removing from iommu group 3
> > [ 2198.081180] pci_bus 0000:03: busn_res: [bus 03] is released
> > [ 2198.081287] pci 0000:02:02.0: Removing from iommu group 3
> > [ 2198.081396] pci_bus 0000:04: busn_res: [bus 04-2d] is released
> > [ 2198.081509] pci 0000:02:04.0: Removing from iommu group 3
> > [ 2198.082273] pci_bus 0000:02: busn_res: [bus 02-2d] is released
> > [ 2198.085759] pci 0000:01:00.0: Removing from iommu group 3
> > [ 2198.630098] thunderbolt 0-1: device disconnected
> >
> > Additionally I've found after this I can't get the dock to work by hotplugging
> again
> > until I reboot the system.
> 
> Can you try if the following patch helps?
> 
> https://lore.kernel.org/patchwork/patch/1113961/

I just checked with that patch on top of my previous test kernel, same call trace
situation.

^ permalink raw reply	[flat|nested] 17+ messages in thread

* RE: [PATCH v3 0/8] thunderbolt: Intel Ice Lake support
  2019-08-19 18:22     ` Mario.Limonciello
@ 2019-08-19 19:36       ` Mario.Limonciello
  2019-08-20 10:01         ` Mika Westerberg
  0 siblings, 1 reply; 17+ messages in thread
From: Mario.Limonciello @ 2019-08-19 19:36 UTC (permalink / raw)
  To: mika.westerberg
  Cc: linux-kernel, andreas.noever, michael.jamet, YehezkelShB, rjw,
	lenb, lukas, anthony.wong, rajmohan.mani, raanan.avargil,
	David.Laight, linux-acpi

> -----Original Message-----
> From: Limonciello, Mario
> Sent: Monday, August 19, 2019 1:22 PM
> To: 'Mika Westerberg'
> Cc: linux-kernel@vger.kernel.org; andreas.noever@gmail.com;
> michael.jamet@intel.com; YehezkelShB@gmail.com; rjw@rjwysocki.net;
> lenb@kernel.org; lukas@wunner.de; anthony.wong@canonical.com;
> rajmohan.mani@intel.com; raanan.avargil@intel.com; David.Laight@aculab.com;
> linux-acpi@vger.kernel.org
> Subject: RE: [PATCH v3 0/8] thunderbolt: Intel Ice Lake support
> 
> > > I've tested this on a pre-production ICL platform.  This was on top of 5.3-rc5,
> > both of
> > > your patches from -next and this series.
> > >
> > > I've run into a problem when using
> > > a WD19TB that after unplugging it will cause the following to spew in dmesg:
> > >
> > > [ 2198.017003] ============================================
> > > [ 2198.017005] WARNING: possible recursive locking detected
> > > [ 2198.017008] 5.3.0-rc5+ #75 Not tainted
> > > [ 2198.017009] --------------------------------------------
> > > [ 2198.017012] irq/122-pciehp/121 is trying to acquire lock:
> > > [ 2198.017015] 00000000801d4de8 (&ctrl->reset_lock){.+.+}, at:
> > pciehp_check_presence+0x1b/0x80
> > > [ 2198.017026]
> > >                but task is already holding lock:
> > > [ 2198.017028] 000000000899e2eb (&ctrl->reset_lock){.+.+}, at:
> > pciehp_ist+0xaf/0x1c0
> > > [ 2198.017033]
> > >                other info that might help us debug this:
> > > [ 2198.017035]  Possible unsafe locking scenario:
> > >
> > > [ 2198.017037]        CPU0
> > > [ 2198.017038]        ----
> > > [ 2198.017041]   lock(&ctrl->reset_lock);
> > > [ 2198.017044]   lock(&ctrl->reset_lock);
> > > [ 2198.017046]
> > >                 *** DEADLOCK ***
> > >
> > > [ 2198.017048]  May be due to missing lock nesting notation
> > >
> > > [ 2198.017051] 3 locks held by irq/122-pciehp/121:
> > > [ 2198.017052]  #0: 000000000899e2eb (&ctrl->reset_lock){.+.+}, at:
> > pciehp_ist+0xaf/0x1c0
> > > [ 2198.017057]  #1: 0000000069e1fd47 (pci_rescan_remove_lock){+.+.}, at:
> > pciehp_unconfigure_device+0x41/0x130
> > > [ 2198.017064]  #2: 0000000046a5bfbf (&dev->mutex){....}, at:
> > device_release_driver_internal+0x1c/0x1a0
> > > [ 2198.017071]
> > >                stack backtrace:
> > > [ 2198.017075] CPU: 3 PID: 121 Comm: irq/122-pciehp Not tainted 5.3.0-rc5+
> #75
> > > [ 2198.017079] Call Trace:
> > > [ 2198.017089]  dump_stack+0x5e/0x8b
> > > [ 2198.017096]  __lock_acquire+0x12fe/0x1520
> > > [ 2198.017102]  lock_acquire+0x9d/0x1a0
> > > [ 2198.017105]  ? pciehp_check_presence+0x1b/0x80
> > > [ 2198.017113]  ? pci_restore_standard_config+0x40/0x40
> > > [ 2198.017118]  down_read+0x3b/0x160
> > > [ 2198.017121]  ? pciehp_check_presence+0x1b/0x80
> > > [ 2198.017123]  pciehp_check_presence+0x1b/0x80
> > > [ 2198.017128]  ? quirk_disable_msi.part.29+0x31/0x31
> > > [ 2198.017131]  pciehp_resume+0x27/0x30
> > > [ 2198.017136]  device_for_each_child+0x47/0x90
> > > [ 2198.017140]  ? pci_restore_standard_config+0x40/0x40
> > > [ 2198.017145]  pcie_port_device_runtime_resume+0x30/0x50
> > > [ 2198.017150]  pci_pm_runtime_resume+0x6e/0xc0
> > > [ 2198.017156]  __rpm_callback+0xb0/0x110
> > > [ 2198.017161]  ? pci_restore_standard_config+0x40/0x40
> > > [ 2198.017165]  rpm_callback+0x1f/0x70
> > > [ 2198.017169]  ? pci_restore_standard_config+0x40/0x40
> > > [ 2198.017173]  rpm_resume+0x4fe/0x690
> > > [ 2198.017179]  ? irq_forced_thread_fn+0x70/0x70
> > > [ 2198.017183]  __pm_runtime_resume+0x47/0x80
> > > [ 2198.017187]  device_release_driver_internal+0x7c/0x1a0
> > > [ 2198.017191]  pci_stop_bus_device+0x5d/0x80
> > > [ 2198.017195]  pci_stop_bus_device+0x2b/0x80
> > > [ 2198.017198]  pci_stop_and_remove_bus_device+0xe/0x20
> > > [ 2198.017202]  pciehp_unconfigure_device+0x7c/0x130
> > > [ 2198.017206]  pciehp_disable_slot+0x69/0x120
> > > [ 2198.017211]  pciehp_handle_presence_or_link_change+0x7d/0x4b0
> > > [ 2198.017215]  pciehp_ist+0x12a/0x1c0
> > > [ 2198.017219]  irq_thread_fn+0x1b/0x60
> > > [ 2198.017222]  irq_thread+0x15b/0x1c0
> > > [ 2198.017226]  ? lockdep_hardirqs_on+0x115/0x180
> > > [ 2198.017229]  ? wake_threads_waitq+0x30/0x30
> > > [ 2198.017233]  ? irq_thread_dtor+0x90/0x90
> > > [ 2198.017237]  kthread+0x101/0x140
> > > [ 2198.017241]  ? kthread_cancel_delayed_work_sync+0x10/0x10
> > > [ 2198.017245]  ret_from_fork+0x24/0x30
> > > [ 2198.017897] xhci_hcd 0000:03:00.0: remove, state 1
> > > [ 2198.017917] usb usb6: USB disconnect, device number 1
> > > [ 2198.017925] usb 6-2: USB disconnect, device number 2
> > > [ 2198.017932] usb 6-2.3: USB disconnect, device number 3
> > > [ 2198.017939] usb 6-2.3.1: USB disconnect, device number 5
> > > [ 2198.019565] sd 0:0:0:0: [sda] Synchronizing SCSI cache
> > > [ 2198.019671] sd 0:0:0:0: [sda] Synchronize Cache(10) failed: Result:
> > hostbyte=DID_NO_CONNECT driverbyte=DRIVER_OK
> > > [ 2198.057200] xhci_hcd 0000:03:00.0: xHCI host controller not responding,
> > assume dead
> > > [ 2198.057227] r8152 6-2.4:1.0 enxd8d090034dcb: Stop submitting intr, status -
> > 108
> > > [ 2198.057574] usb 6-2.4: USB disconnect, device number 4
> > > [ 2198.074541] xhci_hcd 0000:03:00.0: USB bus 6 deregistered
> > > [ 2198.074558] xhci_hcd 0000:03:00.0: remove, state 1
> > > [ 2198.074564] usb usb5: USB disconnect, device number 1
> > > [ 2198.074566] usb 5-2: USB disconnect, device number 2
> > > [ 2198.074569] usb 5-2.3: USB disconnect, device number 3
> > > [ 2198.074571] usb 5-2.3.4: USB disconnect, device number 5
> > > [ 2198.077367] usb 5-2.3.5: USB disconnect, device number 6
> > > [ 2198.078488] usb 5-2.5: USB disconnect, device number 4
> > > [ 2198.080340] xhci_hcd 0000:03:00.0: Host halt failed, -19
> > > [ 2198.080344] xhci_hcd 0000:03:00.0: Host not accessible, reset failed.
> > > [ 2198.080770] xhci_hcd 0000:03:00.0: USB bus 5 deregistered
> > > [ 2198.081153] pci 0000:03:00.0: Removing from iommu group 3
> > > [ 2198.081180] pci_bus 0000:03: busn_res: [bus 03] is released
> > > [ 2198.081287] pci 0000:02:02.0: Removing from iommu group 3
> > > [ 2198.081396] pci_bus 0000:04: busn_res: [bus 04-2d] is released
> > > [ 2198.081509] pci 0000:02:04.0: Removing from iommu group 3
> > > [ 2198.082273] pci_bus 0000:02: busn_res: [bus 02-2d] is released
> > > [ 2198.085759] pci 0000:01:00.0: Removing from iommu group 3
> > > [ 2198.630098] thunderbolt 0-1: device disconnected
> > >
> > > Additionally I've found after this I can't get the dock to work by hotplugging
> > again
> > > until I reboot the system.
> >
> > Can you try if the following patch helps?
> >
> > https://lore.kernel.org/patchwork/patch/1113961/
> 
> I just checked with that patch on top of my previous test kernel, same call trace
> situation.

After checking, this is not introduced by this series, it happens on v5.3-rc5 as well.
It's a problem in pciehp that will be debugged separately.

So the Thunderbolt portion of this works for me on ICL system.

Tested-by: Mario Limonciello <mario.limonciello@dell.com>

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v3 0/8] thunderbolt: Intel Ice Lake support
  2019-08-19 19:36       ` Mario.Limonciello
@ 2019-08-20 10:01         ` Mika Westerberg
  0 siblings, 0 replies; 17+ messages in thread
From: Mika Westerberg @ 2019-08-20 10:01 UTC (permalink / raw)
  To: Mario.Limonciello
  Cc: linux-kernel, andreas.noever, michael.jamet, YehezkelShB, rjw,
	lenb, lukas, anthony.wong, rajmohan.mani, raanan.avargil,
	David.Laight, linux-acpi

On Mon, Aug 19, 2019 at 07:36:37PM +0000, Mario.Limonciello@dell.com wrote:
> After checking, this is not introduced by this series, it happens on v5.3-rc5 as well.
> It's a problem in pciehp that will be debugged separately.
> 
> So the Thunderbolt portion of this works for me on ICL system.
> 
> Tested-by: Mario Limonciello <mario.limonciello@dell.com>

Thanks for testing!

Regarding the issue, can you file a kernel bugzilla about it with the
necessary dmesg and 'sudo lspci -vv' output so we can track it? I'll
also try to reproduce it here.

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v3 0/8] thunderbolt: Intel Ice Lake support
  2019-08-19 16:29 ` [PATCH v3 0/8] thunderbolt: Intel Ice Lake support Mario.Limonciello
  2019-08-19 17:57   ` Mika Westerberg
@ 2019-08-20 11:34   ` Lukas Wunner
  2019-08-20 17:00     ` Mario.Limonciello
  1 sibling, 1 reply; 17+ messages in thread
From: Lukas Wunner @ 2019-08-20 11:34 UTC (permalink / raw)
  To: Mario.Limonciello
  Cc: mika.westerberg, linux-kernel, andreas.noever, michael.jamet,
	YehezkelShB, rjw, lenb, anthony.wong, rajmohan.mani,
	raanan.avargil, David.Laight, linux-acpi

On Mon, Aug 19, 2019 at 04:29:35PM +0000, Mario.Limonciello@dell.com wrote:
> I've run into a problem when using
> a WD19TB that after unplugging it will cause the following to spew in dmesg:
> 
> [ 2198.017003] ============================================
> [ 2198.017005] WARNING: possible recursive locking detected
> [ 2198.017008] 5.3.0-rc5+ #75 Not tainted
> [ 2198.017009] --------------------------------------------
> [ 2198.017012] irq/122-pciehp/121 is trying to acquire lock:
> [ 2198.017015] 00000000801d4de8 (&ctrl->reset_lock){.+.+}, at: pciehp_check_presence+0x1b/0x80
> [ 2198.017026] 
>                but task is already holding lock:
> [ 2198.017028] 000000000899e2eb (&ctrl->reset_lock){.+.+}, at: pciehp_ist+0xaf/0x1c0

This was first reported by Theodore in April and appears to be a
false positive:

https://lore.kernel.org/linux-pci/20190402083257.kyqmirq4ovzscxsv@wunner.de/

Thanks,

Lukas

^ permalink raw reply	[flat|nested] 17+ messages in thread

* RE: [PATCH v3 0/8] thunderbolt: Intel Ice Lake support
  2019-08-20 11:34   ` Lukas Wunner
@ 2019-08-20 17:00     ` Mario.Limonciello
  0 siblings, 0 replies; 17+ messages in thread
From: Mario.Limonciello @ 2019-08-20 17:00 UTC (permalink / raw)
  To: lukas
  Cc: mika.westerberg, linux-kernel, andreas.noever, michael.jamet,
	YehezkelShB, rjw, lenb, anthony.wong, rajmohan.mani,
	raanan.avargil, David.Laight, linux-acpi

> -----Original Message-----
> From: Lukas Wunner <lukas@wunner.de>
> Sent: Tuesday, August 20, 2019 6:34 AM
> To: Limonciello, Mario
> Cc: mika.westerberg@linux.intel.com; linux-kernel@vger.kernel.org;
> andreas.noever@gmail.com; michael.jamet@intel.com;
> YehezkelShB@gmail.com; rjw@rjwysocki.net; lenb@kernel.org;
> anthony.wong@canonical.com; rajmohan.mani@intel.com;
> raanan.avargil@intel.com; David.Laight@ACULAB.COM; linux-
> acpi@vger.kernel.org
> Subject: Re: [PATCH v3 0/8] thunderbolt: Intel Ice Lake support
> 
> 
> [EXTERNAL EMAIL]
> 
> On Mon, Aug 19, 2019 at 04:29:35PM +0000, Mario.Limonciello@dell.com wrote:
> > I've run into a problem when using
> > a WD19TB that after unplugging it will cause the following to spew in dmesg:
> >
> > [ 2198.017003] ============================================
> > [ 2198.017005] WARNING: possible recursive locking detected
> > [ 2198.017008] 5.3.0-rc5+ #75 Not tainted
> > [ 2198.017009] --------------------------------------------
> > [ 2198.017012] irq/122-pciehp/121 is trying to acquire lock:
> > [ 2198.017015] 00000000801d4de8 (&ctrl->reset_lock){.+.+}, at:
> pciehp_check_presence+0x1b/0x80
> > [ 2198.017026]
> >                but task is already holding lock:
> > [ 2198.017028] 000000000899e2eb (&ctrl->reset_lock){.+.+}, at:
> pciehp_ist+0xaf/0x1c0
> 
> This was first reported by Theodore in April and appears to be a
> false positive:
> 
> https://lore.kernel.org/linux-
> pci/20190402083257.kyqmirq4ovzscxsv@wunner.de/
> 
> Thanks,
> 
> Lukas

Indeed it does actually seem harmless and only comes up once.

I've filed https://bugzilla.kernel.org/show_bug.cgi?id=204639 to track down further
what's going on.

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v3 0/8] thunderbolt: Intel Ice Lake support
  2019-08-19 11:22 [PATCH v3 0/8] thunderbolt: Intel Ice Lake support Mika Westerberg
                   ` (8 preceding siblings ...)
  2019-08-19 16:29 ` [PATCH v3 0/8] thunderbolt: Intel Ice Lake support Mario.Limonciello
@ 2019-08-26  9:20 ` Mika Westerberg
  9 siblings, 0 replies; 17+ messages in thread
From: Mika Westerberg @ 2019-08-26  9:20 UTC (permalink / raw)
  To: linux-kernel
  Cc: Andreas Noever, Michael Jamet, Yehezkel Bernat,
	Rafael J. Wysocki, Len Brown, Lukas Wunner, Mario.Limonciello,
	Anthony Wong, Rajmohan Mani, Raanan Avargil, David Laight,
	linux-acpi

On Mon, Aug 19, 2019 at 02:22:15PM +0300, Mika Westerberg wrote:
> Hi all,
> 
> This is third iteration of the patch series adding support for the Intel
> Ice Lake integrated Thunderbolt controller. The biggest difference from the
> previous discrete controllers is that the Ice Lake Thunderbolt controller
> is now integrated as part of the SoC. The firmware messages pretty much
> follow Titan Ridge but there are some differences as well (such as the new
> RTD3 veto notification). Also Ice Lake does not implement security levels
> so DMA protection is handled by IOMMU.

Series applied to thunderbolt.git/next.

^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, back to index

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-08-19 11:22 [PATCH v3 0/8] thunderbolt: Intel Ice Lake support Mika Westerberg
2019-08-19 11:22 ` [PATCH v3 1/8] thunderbolt: Correct path indices for PCIe tunnel Mika Westerberg
2019-08-19 11:22 ` [PATCH v3 2/8] thunderbolt: Move NVM upgrade support flag to struct icm Mika Westerberg
2019-08-19 11:22 ` [PATCH v3 3/8] thunderbolt: Use 32-bit writes when writing ring producer/consumer Mika Westerberg
2019-08-19 11:22 ` [PATCH v3 4/8] thunderbolt: Do not fail adding switch if some port is not implemented Mika Westerberg
2019-08-19 11:22 ` [PATCH v3 5/8] thunderbolt: Hide switch attributes that are not set Mika Westerberg
2019-08-19 11:22 ` [PATCH v3 6/8] thunderbolt: Expose active parts of NVM even if upgrade is not supported Mika Westerberg
2019-08-19 11:22 ` [PATCH v3 7/8] thunderbolt: Add support for Intel Ice Lake Mika Westerberg
2019-08-19 11:22 ` [PATCH v3 8/8] ACPI / property: Add two new Thunderbolt property GUIDs to the list Mika Westerberg
2019-08-19 16:29 ` [PATCH v3 0/8] thunderbolt: Intel Ice Lake support Mario.Limonciello
2019-08-19 17:57   ` Mika Westerberg
2019-08-19 18:22     ` Mario.Limonciello
2019-08-19 19:36       ` Mario.Limonciello
2019-08-20 10:01         ` Mika Westerberg
2019-08-20 11:34   ` Lukas Wunner
2019-08-20 17:00     ` Mario.Limonciello
2019-08-26  9:20 ` Mika Westerberg

Linux-ACPI Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/linux-acpi/0 linux-acpi/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 linux-acpi linux-acpi/ https://lore.kernel.org/linux-acpi \
		linux-acpi@vger.kernel.org linux-acpi@archiver.kernel.org
	public-inbox-index linux-acpi

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.linux-acpi


AGPL code for this site: git clone https://public-inbox.org/ public-inbox