All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lu Baolu <baolu.lu@linux.intel.com>
To: Ingo Molnar <mingo@kernel.org>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Mathias Nyman <mathias.nyman@linux.intel.com>,
	Ingo Molnar <mingo@redhat.com>,
	tglx@linutronix.de, peterz@infradead.org,
	linux-usb@vger.kernel.org, x86@kernel.org,
	linux-kernel@vger.kernel.org, Jiri Slaby <jslaby@suse.cz>
Subject: Re: [PATCH v5 1/4] usb: dbc: early driver for xhci debug capability
Date: Wed, 25 Jan 2017 13:28:31 +0800	[thread overview]
Message-ID: <5888377F.8090709@linux.intel.com> (raw)
In-Reply-To: <20170124082039.GB8667@gmail.com>

Hi Ingo,

On 01/24/2017 04:20 PM, Ingo Molnar wrote:
> * Lu Baolu <baolu.lu@linux.intel.com> wrote:
>
>> Hi Ingo,
>>
>> On 01/22/2017 05:04 PM, Ingo Molnar wrote:
>>> * Lu Baolu <baolu.lu@linux.intel.com> wrote:
>>>
>>>>>> +static void xdbc_runtime_delay(unsigned long count)
>>>>>> +{
>>>>>> +	udelay(count);
>>>>>> +}
>>>>>> +static void (*xdbc_delay)(unsigned long) = xdbc_early_delay;
>>>>> Is this udelay() complication really necessary? udelay() should work fine even in 
>>>>> early code. It might not be precisely calibrated, but should be good enough.
>>>> I tried udelay() in the early code. It's not precise enough for the
>>>> hardware handshaking.
>>> Possibly because on x86 early udelay() did not work at all - i.e. there's no delay 
>>> whatsoever.
>> Yes.
>>
>>> Could you try it on top of this commit in tip:timers/core:
>>>
>>>   4c45c5167c95 x86/timer: Make delay() work during early bootup
>>>
>>> ?
>> I tried tip:timers/core. It's not precise enough for my context either.
>>
>> __const_udelay().
>>
>> 157 inline void __const_udelay(unsigned long xloops)
>> 158 {
>> 159         unsigned long lpj = this_cpu_read(cpu_info.loops_per_jiffy) ? : loops_per_jiffy;
>> 160         int d0;
>> 161
>> 162         xloops *= 4;
>> 163         asm("mull %%edx"
>> 164                 :"=d" (xloops), "=&a" (d0)
>> 165                 :"1" (xloops), "0" (lpj * (HZ / 4)));
>> 166
>> 167         __delay(++xloops);
>> 168 }
>>
>>
>> In my early  code, loops_per_jiffy is not initialized yet. Hence "lpj" for the asm line
>> is 4096 (default value).
>>
>> The  cpu_info.loops_per_jiffy actually reads 8832000 after initialization. They are
>> about 2000 times different.
>>
>> I did a hacky test in kernel to check the difference between these two different
>> "lpj" values. (The hacky patch is attached.) Below is the output for 100ms delay.
>>
>> [    2.494751] udelay_test uninitialized ---->start
>> [    2.494820] udelay_test uninitialized ---->end
>> [    2.494828] udelay_test initialized ---->start
>> [    2.595234] udelay_test initialized ---->end
>>
>> For 100ms delay, udelay() with uninitialized loops_per_jiffy only gives a delay of
>> only 69us.
> Ok, then could we add some simple calibration to make udelay work much better - or 
> perhaps move the udelay calibration up earlier?
>
> Hiding essentially an early udelay() implementation in an early-printk driver is 
> ugly and counterproductive.

Sure. How about below change?

diff --git a/drivers/usb/early/xhci-dbc.c b/drivers/usb/early/xhci-dbc.c
index d3f0c84..940989e 100644
--- a/drivers/usb/early/xhci-dbc.c
+++ b/drivers/usb/early/xhci-dbc.c
@@ -587,6 +587,35 @@ static int xdbc_bulk_transfer(void *data, int size, bool read)
        return size;
 }
 
+static void __init xdbc_udelay_calibration(void)
+{
+       unsigned long lpj = 0;
+       unsigned int tsc_khz, cpu_khz;
+
+       if (!boot_cpu_has(X86_FEATURE_TSC))
+               goto calibration_out;
+
+       cpu_khz = x86_platform.calibrate_cpu();
+       tsc_khz = x86_platform.calibrate_tsc();
+
+       if (tsc_khz == 0)
+               tsc_khz = cpu_khz;
+       else if (abs(cpu_khz - tsc_khz) * 10 > tsc_khz)
+               cpu_khz = tsc_khz;
+
+       if (!tsc_khz)
+               goto calibration_out;
+
+       lpj = tsc_khz * 1000;
+       do_div(lpj, HZ);
+
+calibration_out:
+       if (!lpj)
+               lpj = 1 << 22;
+
+       loops_per_jiffy = lpj;
+}
+
 static int __init xdbc_early_setup(void)
 {
        int ret;
@@ -686,6 +715,8 @@ int __init early_xdbc_parse_parameter(char *s)
        }
        xdbc.xdbc_reg = (struct xdbc_regs __iomem *)(xdbc.xhci_base + offset);
 
+       xdbc_udelay_calibration();
+
        return 0;
 }

Best regards,
Lu Baolu

  reply	other threads:[~2017-01-25  5:28 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-11-15  6:02 [PATCH v5 0/4] usb: early: add support for early printk through USB3 debug port Lu Baolu
2016-11-15  6:02 ` [PATCH v5 1/4] usb: dbc: early driver for xhci debug capability Lu Baolu
2017-01-19  9:37   ` Ingo Molnar
2017-01-20  2:47     ` Lu Baolu
2017-01-22  9:04       ` Ingo Molnar
2017-01-24  4:44         ` Lu Baolu
2017-01-24  8:20           ` Ingo Molnar
2017-01-25  5:28             ` Lu Baolu [this message]
2017-01-25  9:23               ` Ingo Molnar
2017-01-25  9:57                 ` Peter Zijlstra
2017-01-25 12:27                   ` Lu Baolu
2017-01-25 14:38                     ` Peter Zijlstra
2017-01-25 15:51                       ` Lu Baolu
2017-01-25 16:16                         ` Peter Zijlstra
2017-01-26  3:37                           ` Lu Baolu
2017-01-26  7:19                             ` Ingo Molnar
2017-01-26  7:49                               ` Lu Baolu
2017-01-26  8:17                                 ` Ingo Molnar
2017-01-26 10:28                               ` Peter Zijlstra
2017-01-26 16:01                                 ` Ingo Molnar
2017-01-26 17:39                                   ` Peter Zijlstra
2017-01-27  6:51                                     ` Ingo Molnar
2017-02-09  5:59                               ` Lu Baolu
2017-01-26  7:22                         ` Ingo Molnar
2017-02-09  7:37                           ` Lu Baolu
2017-01-25 12:17                 ` Lu Baolu
2017-01-26  3:26                 ` Lu Baolu
2016-11-15  6:02 ` [PATCH v5 2/4] x86: add support for earlyprintk via USB3 debug port Lu Baolu
2017-01-19  9:38   ` Ingo Molnar
2017-01-20  2:48     ` Lu Baolu
2016-11-15  6:02 ` [PATCH v5 3/4] usb: serial: usb_debug: add support for dbc debug device Lu Baolu
2017-01-19  9:39   ` Ingo Molnar
2017-01-20  2:50     ` Lu Baolu
2016-11-15  6:02 ` [PATCH v5 4/4] usb: doc: add document for USB3 debug port usage Lu Baolu
2017-01-19  9:41   ` Ingo Molnar
2017-01-20  2:53     ` Lu Baolu
2017-01-18  6:20 ` [PATCH v5 0/4] usb: early: add support for early printk through USB3 debug port Lu Baolu
2017-01-19  9:06   ` Greg Kroah-Hartman
2017-01-19  9:09     ` Ingo Molnar
2017-01-19 11:24       ` Mathias Nyman
2017-01-19  9:12 ` Ingo Molnar
2017-01-20  2:56   ` Lu Baolu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5888377F.8090709@linux.intel.com \
    --to=baolu.lu@linux.intel.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=jslaby@suse.cz \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=mathias.nyman@linux.intel.com \
    --cc=mingo@kernel.org \
    --cc=mingo@redhat.com \
    --cc=peterz@infradead.org \
    --cc=tglx@linutronix.de \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.