[PATCH linux dev-4.10 13/16] Revert "drivers/fsi: GPIO stability changes for Cronus/Hostboot"

Christopher Bostic cbostic at linux.vnet.ibm.com
Fri Feb 16 04:46:39 AEDT 2018



On 2/15/18 6:36 AM, Andrew Jeffery wrote:
> This reverts commit cecf390c294cd6cf1080ed45cf0966691879750d.
>
> The cost of reading OCC hwmon attributes is reduced by roughly 50%[0] when we
> do not incur large delays between cycles in the FSI GPIO master. No impact was
> observed on the stability of Hostboot by reverting the delays, though
> admittedly it was not tested with Cronus.
Hi Andrew,

The delay values you are reverting were chosen because they fixed highly 
intermittent FSI ECC bus failures flagged during heavy bus traffic 
generated via Cronus.   I'd not feel comfortable with this update unless 
it can be verified this is no longer an issue.

Regards,
Chris
>
> [0] Down from ~0.5 to ~0.25 seconds
>
> Signed-off-by: Andrew Jeffery <andrew at aj.id.au>
> ---
>   drivers/fsi/fsi-master-gpio.c | 7 ++++---
>   1 file changed, 4 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/fsi/fsi-master-gpio.c b/drivers/fsi/fsi-master-gpio.c
> index 3d31e50269fe..485ecb88b115 100644
> --- a/drivers/fsi/fsi-master-gpio.c
> +++ b/drivers/fsi/fsi-master-gpio.c
> @@ -15,7 +15,7 @@
>
>   #include "fsi-master.h"
>
> -#define	FSI_GPIO_STD_DLY	3	/* Standard pin delay in uS */
> +#define	FSI_GPIO_STD_DLY	1	/* Standard pin delay in nS */
>   #define	FSI_ECHO_DELAY_CLOCKS	16	/* Number clocks for echo delay */
>   #define	FSI_PRE_BREAK_CLOCKS	50	/* Number clocks to prep for break */
>   #define	FSI_BREAK_CLOCKS	256	/* Number of clocks to issue break */
> @@ -78,10 +78,10 @@ static void clock_toggle(struct fsi_master_gpio *master, int count)
>   	int i;
>
>   	for (i = 0; i < count; i++) {
> +		ndelay(FSI_GPIO_STD_DLY);
>   		gpiod_set_value(master->gpio_clk, 0);
> -		udelay(FSI_GPIO_STD_DLY);
> +		ndelay(FSI_GPIO_STD_DLY);
>   		gpiod_set_value(master->gpio_clk, 1);
> -		udelay(FSI_GPIO_STD_DLY);
>   	}
>   }
>
> @@ -89,6 +89,7 @@ static int sda_in(struct fsi_master_gpio *master)
>   {
>   	int in;
>
> +	ndelay(FSI_GPIO_STD_DLY);
>   	in = gpiod_get_value(master->gpio_data);
>   	return in ? 1 : 0;
>   }



More information about the openbmc mailing list