[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] drivers/char: add timeout for XHCI console cable


  • To: Jan Beulich <jbeulich@xxxxxxxx>
  • From: Marek Marczykowski-Górecki <marmarek@xxxxxxxxxxxxxxxxxxxxxx>
  • Date: Thu, 8 Oct 2026 18:08:16 +0200
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=fm1 header.d=invisiblethingslab.com header.i="@invisiblethingslab.com" header.h="Cc:Content-Type:Date:From:In-Reply-To:Message-ID:MIME-Version:References:Subject:To"; dkim=pass header.s=fm2 header.d=messagingengine.com header.i="@messagingengine.com" header.h="Cc:Content-Type:Date:Feedback-ID:From:In-Reply-To:Message-ID:MIME-Version:References:Subject:To:X-ME-Proxy:X-ME-Sender"
  • Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, Anthony PERARD <anthony.perard@xxxxxxxxxx>, Michal Orzel <michal.orzel@xxxxxxx>, Julien Grall <julien@xxxxxxx>, Roger Pau Monné <roger@xxxxxxxxxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, xen-devel@xxxxxxxxxxxxxxxxxxxx
  • Delivery-date: Thu, 08 Oct 2026 16:08:35 +0000
  • Dkim2-signature: i=1; m=1; t=1791475700; d=invisiblethingslab.com; mf=PG1hcm1hcmVrQGludmlzaWJsZXRoaW5nc2xhYi5jb20+; rt=PHhlbi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZz4=; s=fm1:rsa-sha256:oQRvh1qw/5Gm4/kTdiAvLeMswnc/bnfdXwimvfzRDoaKCV/ 4kwDSE7ls4TvhWYQW0WYp2ddYvvA3U6fsj7TcL7ch8mUFz+TdMdCXbse5ethtnIV JGLlCdumAmTVF51NfzIJM3FLOI2eZoiHFqf0ZQ4BoHQ/SI7uJCdpAhOr4kXcfiUo ENg+fooRYH3MtJ76LF5Fzcc5XfnGJD7nD15FHuj6tzMnR04ZAkF6rod/C9VQ73lJ ELQ1M+InHyILd/rPvc5BNFjdM9QerZIhLMBeKotRmObHtNieJqGwVMOYDwOKYKxS ql9i+6o7r5Qdad9Bv1pKJ9EgZf5PnoXIwTgo9Ug==;
  • Feedback-id: i1568416f:Fastmail
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Message-instance: m=1; h=sha256:cO1nAwtgffwz6uMCVr/qINUXSQjslTQr8MrCvI1aieM=:WUcRze/hXAyibIAcgHT9rlQCh+eo1SYSiI9gXmQc80E=;

On Thu, Oct 08, 2026 at 05:54:53PM +0200, Jan Beulich wrote:
> On 08.10.2026 17:05, Marek Marczykowski-Górecki wrote:
> > Do not wait indefinitely for XHCI to configure console connection. If
> > the cable is not plugged in, timeout after about 1s and continue boot.
> > If the cable is plugged in later, the console will be activated then
> > (see final part of dbc_ensure_running()). When timeout occurs, print a
> > warning message - it will be saved in the console ring buffer, to be
> > later retrieved from dom0, or possibly later printed when the cable is
> > finally connected. But, do not print the warning when waiting after
> > controller reset, as that may have been called from from console
> > dbc_putc() and printing here would result in (possibly infinite)
> > recursion.
> > 
> > Try the timeout to be about 1s, which is way above time needed for
> > configuring already connected cable. But, since this part runs very
> > early in the Xen startup, time is not calibrated yet, and functions like
> > NOW() do not work yet. Use raw TSC and estimate needed time to be at
> > least 1s on a fast CPU (5GHz), and possibly longer on a slower one. This
> > is not very accurate method, but fortunately it doesn't need to be.
> 
> A little fragile, but well...
> 
> > --- a/xen/drivers/char/xhci-dbc.c
> > +++ b/xen/drivers/char/xhci-dbc.c
> > @@ -851,9 +851,15 @@ static void dbc_reset_debug_port(struct dbc *dbc)
> >      }
> >  }
> >  
> > -static void dbc_enable_dbc(struct dbc *dbc)
> > +static bool dbc_enable_dbc(struct dbc *dbc)
> >  {
> >      struct dbc_reg *reg = dbc->dbc_reg;
> > +    s_time_t start;
> > +    /*
> > +     * Too early for proper time calibration, assume a 5GHz CPU and let it 
> > wait
> > +     * about 1s, with still reasonable timeout on a slower CPU.
> > +     */
> > +    unsigned long timeout_ticks = 5UL*1000*1000*1000;
> 
> Even if right now we don't use the driver in any 32-bit env, I think we
> better wouldn't deliberately break such a possible use. IOW unsigned
> long isn't a suitable type to use here.

So, uint64_t?

> Also, nit (style): Blanks please around *.
> 
> > @@ -870,8 +876,12 @@ static void dbc_enable_dbc(struct dbc *dbc)
> >      writel(readl(&reg->portsc) | (1U << DBC_PSC_PED), &reg->portsc);
> >      wmb();
> >  
> > -    while ( (readl(&reg->ctrl) & (1U << DBC_CTRL_DCR)) == 0 )
> > +    start = rdtsc_ordered();
> > +    while ( (readl(&reg->ctrl) & (1U << DBC_CTRL_DCR)) == 0 &&
> > +            rdtsc_ordered() - start < timeout_ticks )
> 
> Urgh - now the driver's truly becoming x86-specific. Is there a reason
> this cannot be get_cycles()?

Sure, it can be get_cycles(). I just need it to not try to apply scaling
that works only after calibration, but indeed get_cycles() should work.

-- 
Best Regards,
Marek Marczykowski-Górecki
Invisible Things Lab

Attachment: signature.asc
Description: PGP signature


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.