Re: [Potential Spoof] Re: [PATCH 1/2] i2c: aspeed: allow to customize base clock divisor

2019-06-21 Thread Tao Ren
On 6/20/19 1:13 AM, Tao Ren wrote:
> On 6/20/19 1:01 AM, Ryan Chen wrote:
>> Hello Tao,
>>  Let me more clear. When you set (3, 15, 14) the device sometimes 
>> response nack. 
>>  but when you set (4, 7, 7), the device always ack. Am I right? 
>> Ryan
> 
> Hello Ryan,
> 
> It's correct. We have seen the problem on 2 Facebook BMC platforms so far. 
> Given the other ~10 Facebook BMC platforms are still running kernel 4.1 (with 
> (4, 7, 7) settings), I'd assume more platforms will be impacted after 
> upgrading to the latest kernel.
> 
> Thank you for spending time on this!

Just heads up Ryan and I are working with ODM vendors to collect scope output; 
will update back when we have new findings. Thank you all for spending time on 
this.


Cheers,

Tao


Re: [PATCH 1/2] i2c: aspeed: allow to customize base clock divisor

2019-06-20 Thread Tao Ren
On 6/20/19 1:01 AM, Ryan Chen wrote:
> Hello Tao,
>   Let me more clear. When you set (3, 15, 14) the device sometimes 
> response nack. 
>   but when you set (4, 7, 7), the device always ack. Am I right? 
> Ryan

Hello Ryan,

It's correct. We have seen the problem on 2 Facebook BMC platforms so far. 
Given the other ~10 Facebook BMC platforms are still running kernel 4.1 (with 
(4, 7, 7) settings), I'd assume more platforms will be impacted after upgrading 
to the latest kernel.

Thank you for spending time on this!


Cheers,

Tao


RE: [PATCH 1/2] i2c: aspeed: allow to customize base clock divisor

2019-06-20 Thread Ryan Chen
Hello Tao,
Let me more clear. When you set (3, 15, 14) the device sometimes 
response nack. 
but when you set (4, 7, 7), the device always ack. Am I right? 
Ryan

-Original Message-
From: Tao Ren [mailto:tao...@fb.com] 
Sent: Thursday, June 20, 2019 3:57 PM
To: Ryan Chen ; Brendan Higgins 

Cc: Mark Rutland ; devicetree 
; linux-asp...@lists.ozlabs.org; OpenBMC Maillist 
; Linux Kernel Mailing List 
; Rob Herring ; Linux ARM 
; linux-...@vger.kernel.org
Subject: Re: [PATCH 1/2] i2c: aspeed: allow to customize base clock divisor

On 6/20/19 12:29 AM, Ryan Chen wrote:
> Hello Tao,
>   Our recommend about clk divider setting is follow the datasheet clock 
> setting table for clock divisor. 
> 
> Ryan  

Thanks Ryan for the response. Could you also share some recommendations/hints 
on how to solve the intermittent i2c transaction failures on Facebook AST2500 
BMC platforms?

BTW, the patch is not aimed at modifying the existing formula of calculating 
clock settings in i2c-aspeed driver: people still get the recommended settings 
by default. The goal of the patch is to allow people to customize clock 
settings in case the default/recommended one doesn't work.


Cheers, 

Tao


RE: [PATCH 1/2] i2c: aspeed: allow to customize base clock divisor

2019-06-20 Thread Ryan Chen
Hello Tao,
Our recommend about clk divider setting is follow the datasheet clock 
setting table for clock divisor. 

Ryan  
 


-Original Message-
From: Linux-aspeed 
[mailto:linux-aspeed-bounces+ryan_chen=aspeedtech@lists.ozlabs.org] On 
Behalf Of Tao Ren
Sent: Thursday, June 20, 2019 6:33 AM
To: Brendan Higgins 
Cc: Mark Rutland ; devicetree 
; linux-asp...@lists.ozlabs.org; OpenBMC Maillist 
; Linux Kernel Mailing List 
; Rob Herring ; Linux ARM 
; linux-...@vger.kernel.org
Subject: Re: [PATCH 1/2] i2c: aspeed: allow to customize base clock divisor

On 6/19/19 2:25 PM, Brendan Higgins wrote:
> On Wed, Jun 19, 2019 at 2:00 PM Tao Ren  wrote:
>>
>> Some intermittent I2C transaction failures are observed on Facebook 
>> CMM and Minipack (ast2500) BMC platforms, because slave devices (such 
>> as CPLD, BIC and etc.) NACK the address byte sometimes. The issue can 
>> be resolved by increasing base clock divisor which affects ASPEED I2C 
>> Controller's base clock and other AC timing parameters.
>>
>> This patch allows to customize ASPEED I2C Controller's base clock 
>> divisor in device tree.
> 
> First off, are you sure you actually need this?
> 
> You should be able to achieve an effectively equivalent result by just 
> lowering the `bus-frequency` property specified in the DT. The 
> `bus-frequency` property ultimately determines all the register 
> values, and you should be able to set it to whatever you want by 
> refering to the Aspeed documentation.
> 
> Nevertheless, the code that determines the correct dividers from the 
> frequency is based on the tables in the Aspeed documentation. I don't 
> think the equation makes sense when the base_clk_divisor is fixed; I 
> mean it will probably just set the other divisor to max or min 
> depending on the values chosen. I think if someone really wants to 
> program this parameter manually, they probably want to set the other 
> parameters manually too.
Thank you for the quick response, Brendan.

Aspeed I2C bus frequency is defined by 3 parameters (base_clk_divisor, 
clk_high_width, clk_low_width), and I choose base_clk_divisor because it 
controls all the Aspeed I2C timings (such as setup time and hold time). Once 
base_clk_divisor is decided (either by the current logic in i2c-aspeed driver 
or manually set in device tree), clk_high_width and clk_low_width will be 
calculated by i2c-aspeed driver to meet the specified I2C bus speed.

For example, by setting I2C bus frequency to 100KHz on AST2500 platform, 
(base_clock_divisor, clk_high_width, clk_low_width) is set to (3, 15, 14) by 
our driver. But some slave devices (on CMM i2c-8 and Minipack i2c-0) NACK byte 
transactions with the default timing setting: the issue can be resolved by 
setting base_clk_divisor to 4, and (clk_high_width, clk_low_width) will be set 
to (7, 7) by our i2c-aspeed driver to achieve similar I2C bus speed.

Not sure if my answer helps to address your concerns, but kindly let me know if 
you have further questions/suggestions.


Thanks,

Tao


Re: [PATCH 1/2] i2c: aspeed: allow to customize base clock divisor

2019-06-20 Thread Tao Ren
On 6/20/19 12:29 AM, Ryan Chen wrote:
> Hello Tao,
>   Our recommend about clk divider setting is follow the datasheet clock 
> setting table for clock divisor. 
> 
> Ryan  

Thanks Ryan for the response. Could you also share some recommendations/hints 
on how to solve the intermittent i2c transaction failures on Facebook AST2500 
BMC platforms?

BTW, the patch is not aimed at modifying the existing formula of calculating 
clock settings in i2c-aspeed driver: people still get the recommended settings 
by default. The goal of the patch is to allow people to customize clock 
settings in case the default/recommended one doesn't work.


Cheers, 

Tao


Re: [PATCH 1/2] i2c: aspeed: allow to customize base clock divisor

2019-06-19 Thread Tao Ren
On 6/19/19 4:02 PM, Benjamin Herrenschmidt wrote:
> On Wed, 2019-06-19 at 22:32 +, Tao Ren wrote:
>> Thank you for the quick response, Brendan.
>>
>> Aspeed I2C bus frequency is defined by 3 parameters
>> (base_clk_divisor, clk_high_width, clk_low_width), and I choose
>> base_clk_divisor because it controls all the Aspeed I2C timings (such
>> as setup time and hold time). Once base_clk_divisor is decided
>> (either by the current logic in i2c-aspeed driver or manually set in
>> device tree), clk_high_width and clk_low_width will be calculated by
>> i2c-aspeed driver to meet the specified I2C bus speed.
>>
>> For example, by setting I2C bus frequency to 100KHz on AST2500
>> platform, (base_clock_divisor, clk_high_width, clk_low_width) is set
>> to (3, 15, 14) by our driver. But some slave devices (on CMM i2c-8
>> and Minipack i2c-0) NACK byte transactions with the default timing
>> setting: the issue can be resolved by setting base_clk_divisor to 4,
>> and (clk_high_width, clk_low_width) will be set to (7, 7) by our i2c-
>> aspeed driver to achieve similar I2C bus speed.
>>
>> Not sure if my answer helps to address your concerns, but kindly let
>> me know if you have further questions/suggestions.
> 
> Did you look at the resulting output on a scope ? I'm curious what
> might be wrong 
> 
> CCing Ryan from Aspeed, he might have some idea.
> 
> Could it be that with some specific dividers you have more jitter ?
> Still, i2c devices tend to be rather robust vs crappy clocks unless you
> are massively out of bounds, which makes me wonder whether something
> else might be wrong in your setup.
> 
> Cheers,
> Ben.

I've reached out to hardware team to see if they can provide more inputs (such 
as protocol decoder output) but so far I don't have such data. I'm suspecting 
it's caused by I2C timing mainly because:

1) the intermittent i2c transaction failures always happen to slave devices 
which are furthest away from ASPEED chip.

2) As the i2c-aspeed driver in my kernel 4.1 tree (derived from ASPEED SDK) 
works properly, and I copied I2CD04 (Clock and AC Timing Control) register 
value from kernel 4.1 and applied to the latest upstream driver: the 
transaction failure is fixed :)

Thank you Ben for looking into the issue and involving more experts (Ryan) for 
discussion. I have been suffering from the problem for several months and I'm 
looking forward for proper/right solutions.


Cheers,

Tao




Re: [PATCH 1/2] i2c: aspeed: allow to customize base clock divisor

2019-06-19 Thread Benjamin Herrenschmidt
On Wed, 2019-06-19 at 22:32 +, Tao Ren wrote:
> Thank you for the quick response, Brendan.
> 
> Aspeed I2C bus frequency is defined by 3 parameters
> (base_clk_divisor, clk_high_width, clk_low_width), and I choose
> base_clk_divisor because it controls all the Aspeed I2C timings (such
> as setup time and hold time). Once base_clk_divisor is decided
> (either by the current logic in i2c-aspeed driver or manually set in
> device tree), clk_high_width and clk_low_width will be calculated by
> i2c-aspeed driver to meet the specified I2C bus speed.
> 
> For example, by setting I2C bus frequency to 100KHz on AST2500
> platform, (base_clock_divisor, clk_high_width, clk_low_width) is set
> to (3, 15, 14) by our driver. But some slave devices (on CMM i2c-8
> and Minipack i2c-0) NACK byte transactions with the default timing
> setting: the issue can be resolved by setting base_clk_divisor to 4,
> and (clk_high_width, clk_low_width) will be set to (7, 7) by our i2c-
> aspeed driver to achieve similar I2C bus speed.
> 
> Not sure if my answer helps to address your concerns, but kindly let
> me know if you have further questions/suggestions.

Did you look at the resulting output on a scope ? I'm curious what
might be wrong 

CCing Ryan from Aspeed, he might have some idea.

Could it be that with some specific dividers you have more jitter ?
Still, i2c devices tend to be rather robust vs crappy clocks unless you
are massively out of bounds, which makes me wonder whether something
else might be wrong in your setup.

Cheers,
Ben.




Re: [PATCH 1/2] i2c: aspeed: allow to customize base clock divisor

2019-06-19 Thread Tao Ren
On 6/19/19 2:25 PM, Brendan Higgins wrote:
> On Wed, Jun 19, 2019 at 2:00 PM Tao Ren  wrote:
>>
>> Some intermittent I2C transaction failures are observed on Facebook CMM and
>> Minipack (ast2500) BMC platforms, because slave devices (such as CPLD, BIC
>> and etc.) NACK the address byte sometimes. The issue can be resolved by
>> increasing base clock divisor which affects ASPEED I2C Controller's base
>> clock and other AC timing parameters.
>>
>> This patch allows to customize ASPEED I2C Controller's base clock divisor
>> in device tree.
> 
> First off, are you sure you actually need this?
> 
> You should be able to achieve an effectively equivalent result by just
> lowering the `bus-frequency` property specified in the DT. The
> `bus-frequency` property ultimately determines all the register
> values, and you should be able to set it to whatever you want by
> refering to the Aspeed documentation.
> 
> Nevertheless, the code that determines the correct dividers from the
> frequency is based on the tables in the Aspeed documentation. I don't
> think the equation makes sense when the base_clk_divisor is fixed; I
> mean it will probably just set the other divisor to max or min
> depending on the values chosen. I think if someone really wants to
> program this parameter manually, they probably want to set the other
> parameters manually too.
Thank you for the quick response, Brendan.

Aspeed I2C bus frequency is defined by 3 parameters (base_clk_divisor, 
clk_high_width, clk_low_width), and I choose base_clk_divisor because it 
controls all the Aspeed I2C timings (such as setup time and hold time). Once 
base_clk_divisor is decided (either by the current logic in i2c-aspeed driver 
or manually set in device tree), clk_high_width and clk_low_width will be 
calculated by i2c-aspeed driver to meet the specified I2C bus speed.

For example, by setting I2C bus frequency to 100KHz on AST2500 platform, 
(base_clock_divisor, clk_high_width, clk_low_width) is set to (3, 15, 14) by 
our driver. But some slave devices (on CMM i2c-8 and Minipack i2c-0) NACK byte 
transactions with the default timing setting: the issue can be resolved by 
setting base_clk_divisor to 4, and (clk_high_width, clk_low_width) will be set 
to (7, 7) by our i2c-aspeed driver to achieve similar I2C bus speed.

Not sure if my answer helps to address your concerns, but kindly let me know if 
you have further questions/suggestions.


Thanks,

Tao


Re: [PATCH 1/2] i2c: aspeed: allow to customize base clock divisor

2019-06-19 Thread Brendan Higgins
On Wed, Jun 19, 2019 at 2:00 PM Tao Ren  wrote:
>
> Some intermittent I2C transaction failures are observed on Facebook CMM and
> Minipack (ast2500) BMC platforms, because slave devices (such as CPLD, BIC
> and etc.) NACK the address byte sometimes. The issue can be resolved by
> increasing base clock divisor which affects ASPEED I2C Controller's base
> clock and other AC timing parameters.
>
> This patch allows to customize ASPEED I2C Controller's base clock divisor
> in device tree.

First off, are you sure you actually need this?

You should be able to achieve an effectively equivalent result by just
lowering the `bus-frequency` property specified in the DT. The
`bus-frequency` property ultimately determines all the register
values, and you should be able to set it to whatever you want by
refering to the Aspeed documentation.

Nevertheless, the code that determines the correct dividers from the
frequency is based on the tables in the Aspeed documentation. I don't
think the equation makes sense when the base_clk_divisor is fixed; I
mean it will probably just set the other divisor to max or min
depending on the values chosen. I think if someone really wants to
program this parameter manually, they probably want to set the other
parameters manually too.

[snip]