Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp941663imm; Thu, 13 Sep 2018 10:02:28 -0700 (PDT) X-Google-Smtp-Source: ANB0VdYEPItco8x8+8Cg95rmdJ1UXmbCCpPyHw+f9EMH+OARUbku+bmiM70ryzzP3YC4Bor+fRVd X-Received: by 2002:a63:88c8:: with SMTP id l191-v6mr7996920pgd.340.1536858148632; Thu, 13 Sep 2018 10:02:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1536858148; cv=none; d=google.com; s=arc-20160816; b=NovrmB7vnjBVBlScuaNMMyH/W53HTXPWh4wE6RkJWwJIpaByaabZ+BS/NWjr0PP7il P17Y2ZTJWEUl7GT0zu2J+1QYZMdcVC6BhjSSvXMe55KwkpTeXdp/rsj1l57Eo+BvnR3Q nH3R9ThyYiMs/qi5LzK56OGOmXad+ZrC73krzVLooVDU7GkUUFP8f+hdwE8PologfM/B i4QshUz+3HizxMiieRnOvVFbLBPknN2Y8QRf3pho4SYUIlVHcNo+PsccaZnsnuMAzA1J zQjgIE9+4+b14MElXCZnLDDiePpRIkIFA5scFtyDN+B30atmafuYe0XLfS2iEZUwbcZd DmRg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject; bh=ANpxqHzPtVN6B5T7pwnbp7zU+izDgSoFTYuBzpVyA9o=; b=HyOwjuZZmGhphpye+54g1HoKXAB9yqayTktJjWc0+6Vch6TICgO5ufqfE2OKXAf/lW 7PSMeH2UxfzS/xM8ycGs2PmQs9jYHcW/AjD5okRBl0/BUNKimgEnDd5ORRhNRlpPG+Z5 JDHfQHp99Gdo0crFTXSRxh04oaKEj2UKyWodyOC3AQ82o6Grpt45J1aSNb1YkhZjeSIR cvQ2bk8Z6CIjmdGI76TM3oMTvK0O1REDxLaaPsUsyHnpfpy0+rilrKYsY1NAycNSRORR 9apvVraToprXVb0dF/T/UV5rDn1ZJebXWW4RR6w1hMeZe25k9ruOXEzL6iR4BgKolkxx wi3g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f14-v6si4376362pln.317.2018.09.13.10.02.12; Thu, 13 Sep 2018 10:02:28 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727838AbeIMWLn (ORCPT + 99 others); Thu, 13 Sep 2018 18:11:43 -0400 Received: from mga06.intel.com ([134.134.136.31]:24353 "EHLO mga06.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726821AbeIMWLn (ORCPT ); Thu, 13 Sep 2018 18:11:43 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 13 Sep 2018 10:01:16 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.53,369,1531810800"; d="scan'208";a="262345315" Received: from yoojae-mobl1.amr.corp.intel.com (HELO [10.7.153.143]) ([10.7.153.143]) by fmsmga005.fm.intel.com with ESMTP; 13 Sep 2018 10:01:00 -0700 Subject: Re: [PATCH i2c-next v6] i2c: aspeed: Handle master/slave combined irq events properly To: =?UTF-8?Q?C=c3=a9dric_Le_Goater?= , Guenter Roeck Cc: Joel Stanley , linux-aspeed@lists.ozlabs.org, Vernon Mauery , OpenBMC Maillist , Brendan Higgins , Linux Kernel Mailing List , linux-i2c@vger.kernel.org, jarkko.nikula@linux.intel.com, Linux ARM , James Feist References: <20180823225731.19063-1-jae.hyun.yoo@linux.intel.com> <20180911183734.GA21976@roeck-us.net> <1f34fe8c-69ef-5f2d-25dc-d5f6037cc558@linux.intel.com> <20180911204107.GA26017@roeck-us.net> <20180911233302.GA18799@roeck-us.net> <5698ca34-14c9-8d05-c4e6-5acf85ff9d14@linux.intel.com> <20180912013449.GA12612@roeck-us.net> <7fd98646-fb5a-be4d-ce37-84b74e0fa8b3@linux.intel.com> <285ea914-5407-7fde-036d-95978f95a430@kaod.org> <7a1706b1-7787-eeff-2295-f6180fe84c6e@linux.intel.com> <798fd5fe-475f-f633-c830-62a3e4f1692d@kaod.org> From: Jae Hyun Yoo Message-ID: <4d5fbe0c-0844-767e-22ce-346e60ed45cd@linux.intel.com> Date: Thu, 13 Sep 2018 10:01:00 -0700 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 In-Reply-To: <798fd5fe-475f-f633-c830-62a3e4f1692d@kaod.org> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 9/13/2018 9:51 AM, Cédric Le Goater wrote: > Hello ! > > On 09/13/2018 06:31 PM, Jae Hyun Yoo wrote: >> Hi Cédric, >> >> On 9/12/2018 10:47 PM, Cédric Le Goater wrote: >>> On 09/12/2018 06:54 PM, Jae Hyun Yoo wrote: >>>> On 9/11/2018 6:34 PM, Guenter Roeck wrote: >>>>> On Tue, Sep 11, 2018 at 04:58:44PM -0700, Jae Hyun Yoo wrote: >>>>>> On 9/11/2018 4:33 PM, Guenter Roeck wrote: >>>>>>> Looking into the patch, clearing the interrupt status at the end of an >>>>>>> interrupt handler is always suspicious and tends to result in race >>>>>>> conditions (because additional interrupts may have arrived while handling >>>>>>> the existing interrupts, or because interrupt handling itself may trigger >>>>>>> another interrupt). With that in mind, the following patch fixes the >>>>>>> problem for me. >>>>>>> >>>>>>> Guenter >>>>>>> >>>>>>> --- >>>>>>> >>>>>>> diff --git a/drivers/i2c/busses/i2c-aspeed.c b/drivers/i2c/busses/i2c-aspeed.c >>>>>>> index c258c4d9a4c0..c488e6950b7c 100644 >>>>>>> --- a/drivers/i2c/busses/i2c-aspeed.c >>>>>>> +++ b/drivers/i2c/busses/i2c-aspeed.c >>>>>>> @@ -552,6 +552,8 @@ static irqreturn_t aspeed_i2c_bus_irq(int irq, void *dev_id) >>>>>>>        spin_lock(&bus->lock); >>>>>>>        irq_received = readl(bus->base + ASPEED_I2C_INTR_STS_REG); >>>>>>> +    /* Ack all interrupt bits. */ >>>>>>> +    writel(irq_received, bus->base + ASPEED_I2C_INTR_STS_REG); >>>>>>>        irq_remaining = irq_received; >>>>>>>    #if IS_ENABLED(CONFIG_I2C_SLAVE) >>>>>>> @@ -584,8 +586,6 @@ static irqreturn_t aspeed_i2c_bus_irq(int irq, void *dev_id) >>>>>>>                "irq handled != irq. expected 0x%08x, but was 0x%08x\n", >>>>>>>                irq_received, irq_handled); >>>>>>> -    /* Ack all interrupt bits. */ >>>>>>> -    writel(irq_received, bus->base + ASPEED_I2C_INTR_STS_REG); >>>>>>>        spin_unlock(&bus->lock); >>>>>>>        return irq_remaining ? IRQ_NONE : IRQ_HANDLED; >>>>>>>    } >>>>>>> >>>>>> >>>>>> My intention of putting the code at the end of interrupt handler was, >>>>>> to reduce possibility of combined irq calls which is explained in this >>>>>> patch. But YES, I agree with you. It could make a potential race >>>>> >>>>> Hmm, yes, but that doesn't explain why it would make sense to acknowledge >>>>> the interrupt late. The interrupt ack only means "I am going to handle these >>>>> interrupts". If additional interrupts arrive while the interrupt handler >>>>> is active, those will have to be acknowledged separately. >>>>> >>>>> Sure, there is a risk that an interrupt arrives while the handler is >>>>> running, and that it is handled but not acknowledged. That can happen >>>>> with pretty much all interrupt handlers, and there are mitigations to >>>>> limit the impact (for example, read the interrupt status register in >>>>> a loop until no more interrupts are pending). But acknowledging >>>>> an interrupt that was possibly not handled is always bad idea. >>>> >>>> Well, that's generally right but not always. Sometimes that depends on >>>> hardware and Aspeed I2C is the case. >>>> >>>> This is a description from Aspeed AST2500 datasheet: >>>>    I2CD10 Interrupt Status Register >>>>    bit 2 Receive Done Interrupt status >>>>          S/W needs to clear this status bit to allow next data receiving. >>>> >>>> It means, driver should hold this bit to prevent transition of hardware >>>> state machine until the driver handles received data, so the bit should >>>> be cleared at the end of interrupt handler. >>>> >>>> Let me share my test result. Your code change works on 100KHz bus speed >>>> but doesn't work well on 1MHz bus speed. Investigated that interrupt >>>> handling is fast enough in 100KHz test but in 1MHz, most of data is >>>> corrupted because the bit is cleared at the beginning of interrupt >>>> handler so it allows receiving of the next data but the interrupt >>>> handler isn't fast enough to read the data buffer on time. I checked >>>> this problem on BMC-ME channel which ME sends lots of IPMB packets to >>>> BMC at 1MHz speed. You could simply check the data corruption problem on >>>> the BMC-ME channel. >>> >>> OK. >>> >>>> My thought is, the current code is right for real Aspeed I2C hardware. >>>> It seems that QEMU 3.0 model for witherspoon-bmc doesn't simulate the >>>> actual Aspeed I2C hardware correctly. >>> >>> That might be very well possible yes. it also misses support for the slave >>> mode and the DMA registers. >>> >> >> Yes, it would be good if qemu's Aspeed I2C model supports slave mode. >> Since the current linux Aspeed I2C driver supports byte transfer mode >> only, so DMA transfer mode support in qemu could be considered later. > > The Aspeed SDK already does, so yes, we will need to consider it. > Yes, Aspeed SDK does but the driver in upstream doesn't at this time. So we will need to consider it because byte mode makes too many interrupt calls which is not good for performance. >> Implementing pool mode and DMA mode for linux Aspeed I2C are in my >> backlog at this moment. > > Is there a QEMU model for an I2C/IPMB device ? > Not sure because I'm not familiar with QEMU. Need to check. Thanks, Jae > There is already a large IPMI framework in QEMU, that would be interesting. > to extend. > > Thanks, > > C. > >