RE: [RFC PATCH 22/22] thunderbolt: Do not start firmware unless asked by the user
From: Mario.Limonciello
Date: Tue Oct 01 2019 - 10:43:20 EST
> -----Original Message-----
> From: Mika Westerberg <mika.westerberg@xxxxxxxxxxxxxxx>
> Sent: Tuesday, October 1, 2019 6:39 AM
> To: linux-usb@xxxxxxxxxxxxxxx
> Cc: Andreas Noever; Michael Jamet; Mika Westerberg; Yehezkel Bernat; Rajmohan
> Mani; Nicholas Johnson; Lukas Wunner; Greg Kroah-Hartman; Alan Stern;
> Limonciello, Mario; Anthony Wong; linux-kernel@xxxxxxxxxxxxxxx
> Subject: [RFC PATCH 22/22] thunderbolt: Do not start firmware unless asked by the
> user
>
>
> [EXTERNAL EMAIL]
>
> 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.
If the host system firmware didn't start the ICM, does that mean SW connection
manager would just take over even on systems with discrete AR/TR controllers?
>
> Signed-off-by: Mika Westerberg <mika.westerberg@xxxxxxxxxxxxxxx>
> ---
> drivers/thunderbolt/icm.c | 14 +++++++++++---
> drivers/thunderbolt/tb.c | 4 ----
> 2 files changed, 11 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/thunderbolt/icm.c b/drivers/thunderbolt/icm.c
> index 9c9c6ea2b790..c4a2de0f2a44 100644
> --- a/drivers/thunderbolt/icm.c
> +++ b/drivers/thunderbolt/icm.c
> @@ -11,6 +11,7 @@
>
> #include <linux/delay.h>
> #include <linux/mutex.h>
> +#include <linux/moduleparam.h>
> #include <linux/pci.h>
> #include <linux/pm_runtime.h>
> #include <linux/platform_data/x86/apple.h>
> @@ -43,6 +44,10 @@
> #define ICM_APPROVE_TIMEOUT 10000 /* ms */
> #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
> * @request_lock: Makes sure only one message is send to ICM at time
> @@ -1353,13 +1358,16 @@ static bool icm_ar_is_supported(struct tb *tb)
> {
> struct pci_dev *upstream_port;
> struct icm *icm = tb_priv(tb);
> + u32 val;
>
> /*
> * Starting from Alpine Ridge we can use ICM on Apple machines
> * as well. We just need to reset and re-enable it first.
This comment doesn't really seem as relevant anymore. The meaning of it
has nothing to do with Apple anymore.
> + * However, only start it if explicitly asked by the user.
> */
> - if (!x86_apple_machine)
> - return true;
> + val = ioread32(tb->nhi->iobase + REG_FW_STS);
> + if (!(val & REG_FW_STS_ICM_EN) && !start_icm)
> + return false;
This code is already in icm_firmware_start. Maybe split it to a small function
So you can just have the more readable
If (!icm_firmware_running(tb) && !start_icm))
>
> /*
> * Find the upstream PCIe port in case we need to do reset
> @@ -2224,7 +2232,7 @@ struct tb *icm_probe(struct tb_nhi *nhi)
>
> case PCI_DEVICE_ID_INTEL_ICL_NHI0:
> 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->set_uuid = icm_icl_set_uuid;
> icm->device_connected = icm_icl_device_connected;
> diff --git a/drivers/thunderbolt/tb.c b/drivers/thunderbolt/tb.c
> index 6c468ba96e9a..aebf2c10aa85 100644
> --- a/drivers/thunderbolt/tb.c
> +++ b/drivers/thunderbolt/tb.c
> @@ -9,7 +9,6 @@
> #include <linux/slab.h>
> #include <linux/errno.h>
> #include <linux/delay.h>
> -#include <linux/platform_data/x86/apple.h>
>
> #include "tb.h"
> #include "tb_regs.h"
> @@ -1117,9 +1116,6 @@ struct tb *tb_probe(struct tb_nhi *nhi)
> struct tb_cm *tcm;
> struct tb *tb;
>
> - if (!x86_apple_machine)
> - return NULL;
> -
> tb = tb_domain_alloc(nhi, sizeof(*tcm));
> if (!tb)
> return NULL;
> --
> 2.23.0