[Intel-gfx] [PATCH v5 5/6] i2c: designware-baytrail: Fix race when resetting the semaphore

Andy Shevchenko andriy.shevchenko at linux.intel.com
Mon Jan 2 09:36:41 UTC 2017


On Sun, 2017-01-01 at 21:15 +0100, Hans de Goede wrote:
> Use iosf_mbi_modify instead of iosf_mbi_read + iosf_mbi_write so that
> we keep the iosf_mbi_lock locked during the read-modify-write done to
> reset the semaphore.
> 

While patch itself looks good to me, I think it reduces a probability to
 race and doesn't eliminate an issue completely. Can you check i915 code
how it's done there?

> Signed-off-by: Hans de Goede <hdegoede at redhat.com>
> ---
> Changes in v5:
> -New patch in v5 of this patch-set
> ---
>  drivers/i2c/busses/i2c-designware-baytrail.c | 11 ++---------
>  1 file changed, 2 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/i2c/busses/i2c-designware-baytrail.c
> b/drivers/i2c/busses/i2c-designware-baytrail.c
> index 650a700..8df529c 100644
> --- a/drivers/i2c/busses/i2c-designware-baytrail.c
> +++ b/drivers/i2c/busses/i2c-designware-baytrail.c
> @@ -47,15 +47,8 @@ static int get_sem(struct dw_i2c_dev *dev, u32
> *sem)
>  
>  static void reset_semaphore(struct dw_i2c_dev *dev)
>  {
> -	u32 data;
> -
> -	if (iosf_mbi_read(BT_MBI_UNIT_PMC, MBI_REG_READ,
> PUNIT_SEMAPHORE, &data)) {
> -		dev_err(dev->dev, "iosf failed to reset punit
> semaphore during read\n");
> -		return;
> -	}
> -
> -	data &= ~PUNIT_SEMAPHORE_BIT;
> -	if (iosf_mbi_write(BT_MBI_UNIT_PMC, MBI_REG_WRITE,
> PUNIT_SEMAPHORE, data))
> +	if (iosf_mbi_modify(BT_MBI_UNIT_PMC, MBI_REG_READ,
> PUNIT_SEMAPHORE,
> +			    0, PUNIT_SEMAPHORE_BIT))
>  		dev_err(dev->dev, "iosf failed to reset punit
> semaphore during write\n");
>  
>  	pm_qos_update_request(&dev->pm_qos, PM_QOS_DEFAULT_VALUE);

-- 
Andy Shevchenko <andriy.shevchenko at linux.intel.com>
Intel Finland Oy


More information about the Intel-gfx mailing list