lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <078e3274-f592-4ce0-a938-d58a0f88cf84@linaro.org>
Date: Thu, 11 Jul 2024 13:07:53 +0100
From: Bryan O'Donoghue <bryan.odonoghue@...aro.org>
To: Quentin Schulz <quentin.schulz@...rry.de>,
 Sakari Ailus <sakari.ailus@...ux.intel.com>,
 Mauro Carvalho Chehab <mchehab@...nel.org>,
 Quentin Schulz <quentin.schulz@...obroma-systems.com>,
 Jacopo Mondi <jacopo@...ndi.org>
Cc: Johan Hovold <johan@...nel.org>,
 Kieran Bingham <kieran.bingham@...asonboard.com>,
 linux-media@...r.kernel.org, linux-kernel@...r.kernel.org,
 stable@...r.kernel.org, dave.stevenson@...pberrypi.com
Subject: Re: [PATCH 2/2] media: ov5675: Elongate reset to first transaction
 minimum gap

On 11/07/2024 12:41, Quentin Schulz wrote:
> Hi Bryan and Dave,
> 
> On 7/11/24 1:22 PM, Bryan O'Donoghue wrote:
>> On 11/07/2024 11:40, Quentin Schulz wrote:
>>> Hi Bryan,
>>>
>>> On 7/11/24 12:20 PM, Bryan O'Donoghue wrote:
>>>> The ov5675 specification says that the gap between XSHUTDN deassert 
>>>> and the
>>>> first I2C transaction should be a minimum of 8192 XVCLK cycles.
>>>>
>>>> Right now we use a usleep_rage() that gives a sleep time of between 
>>>> about
>>>> 430 and 860 microseconds.
>>>>
>>>> On the Lenovo X13s we have observed that in about 1/20 cases the 
>>>> current
>>>> timing is too tight and we start transacting before the ov5675's reset
>>>> cycle completes, leading to I2C bus transaction failures.
>>>>
>>>> The reset racing is sometimes triggered at initial chip probe but, more
>>>> usually on a subsequent power-off/power-on cycle e.g.
>>>>
>>>> [   71.451662] ov5675 24-0010: failed to write reg 0x0103. error = -5
>>>> [   71.451686] ov5675 24-0010: failed to set plls
>>>>
>>>> The current quiescence period we have is too tight, doubling the 
>>>> minimum
>>>> appears to fix the issue observed on X13s.
>>>>
>>>> Fixes: 49d9ad719e89 ("media: ov5675: add device-tree support and 
>>>> support runtime PM")
>>>> Cc: stable@...r.kernel.org
>>>> Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@...aro.org>
>>>> ---
>>>>   drivers/media/i2c/ov5675.c | 9 +++++++--
>>>>   1 file changed, 7 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/drivers/media/i2c/ov5675.c b/drivers/media/i2c/ov5675.c
>>>> index 92bd35133a5d..0498f8f3064d 100644
>>>> --- a/drivers/media/i2c/ov5675.c
>>>> +++ b/drivers/media/i2c/ov5675.c
>>>> @@ -1018,8 +1018,13 @@ static int ov5675_power_on(struct device *dev)
>>>>       gpiod_set_value_cansleep(ov5675->reset_gpio, 0);
>>>> -    /* 8192 xvclk cycles prior to the first SCCB transation */
>>>> -    usleep_range(delay_us, delay_us * 2);
>>>> +    /* The spec calls for a minimum delay of 8192 XVCLK cycles 
>>>> prior to
>>>> +     * transacting on the I2C bus, which translates to about 430
>>>> +     * microseconds at 19.2 MHz.
>>>> +     * Testing shows the range 8192 - 16384 cycles to be unreliable.
>>>> +     * Grant a more liberal 2x -3x clock cycle grace time.
>>>> +     */
>>>> +    usleep_range(delay_us * 2, delay_us * 3);
>>>
>>> Would it make sense to have power_off have the same logic? We do a 
>>> usleep_range of those same values currently, so keeping them in sync 
>>> seems to make sense to me.
>>
>> I have no evidence to suggest there's a problem on the shutdown path, 
>> that's why I left the quiescence period as-is there.
>>
>>> Also, I'm wondering if it isn't an issue with the gpio not being high 
>>> right after gpoiod_set_value_cansleep() returns, i.e. the time it 
>>> actually takes for the HW to reach the IO level that means "high" for 
>>> the camera. And that this increased sleep is just a way to mitigate 
>>> that?
>>
>> No, that's not what I found.
>>
>> I tried changing
>>
>>          usleep_range(2000, 2200);
>>
>> to
>>          usleep_range(200000, 220000);
>>
>> but could still elicit the I2C transaction failure. If the time it 
>> took for the GPIO to hit logical 1 were the issue then multiplying the 
>> reset time by 100 would certainly account for that.
>>
>> // BOD set the chip into reset
>>          gpiod_set_value_cansleep(ov5675->reset_gpio, 1);
>>
>> // BOD apply power
>>          ret = regulator_bulk_enable(OV5675_NUM_SUPPLIES, 
>> ov5675->supplies);
>>          if (ret) {
>>                  clk_disable_unprepare(ov5675->xvclk);
>>                  return ret;
>>          }
>>
>>          /* Reset pulse should be at least 2ms and reset gpio released 
>> only once
>>           * regulators are stable.
>>           */
>>
>> // BOD spec specifies 2 milliseconds here not a count of XVCLKs
>>          usleep_range(2000, 2200);
>>
>>          gpiod_set_value_cansleep(ov5675->reset_gpio, 0);
>>
> 
> I meant to say this gpiod_set_value_cansleep(), which is logical LOW and 
> not HIGH, brain not braining today sorry. But the question remains the 
> same.

Ah right yes I get you, you mean how can I prove the sensor has come out 
of reset by the time we start counting for the first I2C transaction delay ?

There's no way to prove that, the only thing we can do is elongate the 
post reset delay by X, whatever X we choose.

> So, maybe this is all too complex for something that could be as simple 
> as 8192 XVCLK cycles for 6MHz as Dave suggested I believe. And have some 
> wiggle room added in case we ever support 6MHz and it has the same issue 
> as you encountered with 19.2MHz (or whatever was that rate you were 
> running the camera at). 1/6MHz * 8192 * 2 ~= 2.7ms if I'm not mistaken. 
> So maybe go with that with a comment just above to justify why we are 
> doing this with hardcoded values?

2.7 milliseconds is alot.

Worst case XVCLK period is 1.365 milliseconds.

If your theory on the GPIO is correct, its still difficult to see how @ 
6MHz - which we don't yet support and probably never will, that 1.5 
milliseconds would be insufficient.

So - I'm happy enough to throw out the first patch and give a range of 
1.5 to 1.6 milliseconds instead.

---
bod


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ