Commit 354a7a77 authored by Mika Westerberg's avatar Mika Westerberg

thunderbolt: Do not start firmware unless asked by the user

Since now we can do pretty much the same thing in the software
connection manager than the firmware would do, there is no point
starting it by default. Instead we can just continue using the software
connection manager.

Make it possible for user to switch between the two by adding a module
pararameter (start_icm) which is by default false. Having this ability
to enable the firmware may be useful at least when debugging possible
issues with the software connection manager implementation.
Signed-off-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
parent a11b88ad
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/moduleparam.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>
#include <linux/platform_data/x86/apple.h> #include <linux/platform_data/x86/apple.h>
...@@ -43,6 +44,10 @@ ...@@ -43,6 +44,10 @@
#define ICM_APPROVE_TIMEOUT 10000 /* ms */ #define ICM_APPROVE_TIMEOUT 10000 /* ms */
#define ICM_MAX_LINK 4 #define ICM_MAX_LINK 4
static bool start_icm;
module_param(start_icm, bool, 0444);
MODULE_PARM_DESC(start_icm, "start ICM firmware if it is not running (default: false)");
/** /**
* struct icm - Internal connection manager private data * struct icm - Internal connection manager private data
* @request_lock: Makes sure only one message is send to ICM at time * @request_lock: Makes sure only one message is send to ICM at time
...@@ -350,6 +355,14 @@ static void icm_veto_end(struct tb *tb) ...@@ -350,6 +355,14 @@ static void icm_veto_end(struct tb *tb)
} }
} }
static bool icm_firmware_running(const struct tb_nhi *nhi)
{
u32 val;
val = ioread32(nhi->iobase + REG_FW_STS);
return !!(val & REG_FW_STS_ICM_EN);
}
static bool icm_fr_is_supported(struct tb *tb) static bool icm_fr_is_supported(struct tb *tb)
{ {
return !x86_apple_machine; return !x86_apple_machine;
...@@ -1381,9 +1394,12 @@ static bool icm_ar_is_supported(struct tb *tb) ...@@ -1381,9 +1394,12 @@ static bool icm_ar_is_supported(struct tb *tb)
/* /*
* Starting from Alpine Ridge we can use ICM on Apple machines * Starting from Alpine Ridge we can use ICM on Apple machines
* as well. We just need to reset and re-enable it first. * as well. We just need to reset and re-enable it first.
* However, only start it if explicitly asked by the user.
*/ */
if (!x86_apple_machine) if (icm_firmware_running(tb->nhi))
return true; return true;
if (!start_icm)
return false;
/* /*
* Find the upstream PCIe port in case we need to do reset * Find the upstream PCIe port in case we need to do reset
...@@ -1736,8 +1752,7 @@ static int icm_firmware_start(struct tb *tb, struct tb_nhi *nhi) ...@@ -1736,8 +1752,7 @@ static int icm_firmware_start(struct tb *tb, struct tb_nhi *nhi)
u32 val; u32 val;
/* Check if the ICM firmware is already running */ /* Check if the ICM firmware is already running */
val = ioread32(nhi->iobase + REG_FW_STS); if (icm_firmware_running(nhi))
if (val & REG_FW_STS_ICM_EN)
return 0; return 0;
dev_dbg(&nhi->pdev->dev, "starting ICM firmware\n"); dev_dbg(&nhi->pdev->dev, "starting ICM firmware\n");
...@@ -2244,7 +2259,7 @@ struct tb *icm_probe(struct tb_nhi *nhi) ...@@ -2244,7 +2259,7 @@ struct tb *icm_probe(struct tb_nhi *nhi)
case PCI_DEVICE_ID_INTEL_ICL_NHI0: case PCI_DEVICE_ID_INTEL_ICL_NHI0:
case PCI_DEVICE_ID_INTEL_ICL_NHI1: case PCI_DEVICE_ID_INTEL_ICL_NHI1:
icm->is_supported = icm_ar_is_supported; icm->is_supported = icm_fr_is_supported;
icm->driver_ready = icm_icl_driver_ready; icm->driver_ready = icm_icl_driver_ready;
icm->set_uuid = icm_icl_set_uuid; icm->set_uuid = icm_icl_set_uuid;
icm->device_connected = icm_icl_device_connected; icm->device_connected = icm_icl_device_connected;
......
...@@ -9,7 +9,6 @@ ...@@ -9,7 +9,6 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/platform_data/x86/apple.h>
#include "tb.h" #include "tb.h"
#include "tb_regs.h" #include "tb_regs.h"
...@@ -990,9 +989,6 @@ struct tb *tb_probe(struct tb_nhi *nhi) ...@@ -990,9 +989,6 @@ struct tb *tb_probe(struct tb_nhi *nhi)
struct tb_cm *tcm; struct tb_cm *tcm;
struct tb *tb; struct tb *tb;
if (!x86_apple_machine)
return NULL;
tb = tb_domain_alloc(nhi, sizeof(*tcm)); tb = tb_domain_alloc(nhi, sizeof(*tcm));
if (!tb) if (!tb)
return NULL; return NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment