Re: [RFC PATCH 22/22] thunderbolt: Do not start firmware unless asked by the user

From: Mika Westerberg
Date: Tue Oct 01 2019 - 10:58:57 EST


On Tue, Oct 01, 2019 at 02:43:15PM +0000, Mario.Limonciello@xxxxxxxx wrote:
> > -----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?

Yes. This is pretty much the case with Apple systems now.

> >
> > 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.

Actually it is still relevant. For USB4 the intent is to have FW/SW CM
switch in ACPI spec instead. But that is still under discussion.

> > + * 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))

Good point. I'll do that.