From nobody Fri Oct 3 10:13:42 2025 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5E5C72DF124; Wed, 3 Sep 2025 07:31:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756884697; cv=none; b=AGwmXJwwyUpEMFsJNmxm+8Cz6cKmtZB2kXm/rp2yyWPMHw9iwvzq3ykJ5iPcPkIQmFWqeikHT+nM25Ek+aSJhGQrnbdMPNnu5pEud9LTP9RzpFk36bLjXErdkRTz3aC/rEzTzgLyTo67sq/u1pPRY9kWVTeZgRrqgipgWd/Xmmo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756884697; c=relaxed/simple; bh=dGtC/6qtmp79lgBHHrhA8SfefmdRKV4dIWcm/veWJj4=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=l5ct0YTzNRdD5H1alsY7Q6R6a/aRCkmFFpyj2W+AN61v9fEPiNgM9g+/iBDal2j0/g3vMU4jM0ayx1wZfjC0+WNJolJqW+lbOzuoA4pfeQvi2AnSfOjV5jl2LjGfLFweXFyWd6kTxDxSgbFK7XEx/ZN6SIrFLrwpGTJWXGQtTUY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=quicinc.com; spf=pass smtp.mailfrom=quicinc.com; dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com header.b=l+36sROX; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=quicinc.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=quicinc.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com header.b="l+36sROX" Received: from pps.filterd (m0279869.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 5832Gvtk032203; Wed, 3 Sep 2025 07:31:27 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= IoVrOn9SXyxGpl2zWnSDpIUW8jBE+L3ZBUJJnkishmY=; b=l+36sROX9fu1r8MB HwjDtORR1/DNO5hsI0T8v3IwzPnTqIh/Km1U2FlInelpBf0TeNyU2/J8hxeTcOhf pJ3Z8QRqQ/DvsUn/9GtbVnDLC5Xod/YCPvO5ZtDLqn3RFHxiu8wttA08R3PatqgI clFSGOK6HU2jbjAcb5EjH0J8pGxZG5aawmdUN/2DwWGmxeTJf5RIZA4Q/bqKUk62 LWSip50kw2gZgN7W0g/VdmKT0i99drgfekzdcz9ZferNN7B9hromEpwAZ+PUtlpt LRsMMbuX/6CIQZ97B9QP0acB4xxiB5EYtA3W4+/Oa+7b2Htwj5ZuEHyddP0XsGl8 de8j4w== Received: from nasanppmta01.qualcomm.com (i-global254.qualcomm.com [199.106.103.254]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 48ura8tkk6-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 03 Sep 2025 07:31:26 +0000 (GMT) Received: from nasanex01b.na.qualcomm.com (nasanex01b.na.qualcomm.com [10.46.141.250]) by NASANPPMTA01.qualcomm.com (8.18.1.2/8.18.1.2) with ESMTPS id 5837VPjK023915 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 3 Sep 2025 07:31:25 GMT Received: from hu-jseerapu-hyd.qualcomm.com (10.80.80.8) by nasanex01b.na.qualcomm.com (10.46.141.250) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1748.24; Wed, 3 Sep 2025 00:31:21 -0700 From: Jyothi Kumar Seerapu To: Vinod Koul , Mukesh Kumar Savaliya , Viken Dadhaniya , Andi Shyti , Sumit Semwal , =?UTF-8?q?Christian=20K=C3=B6nig?= CC: , , , , , , , Subject: [PATCH v7 1/2] dmaengine: qcom: gpi: Add GPI Block event interrupt support Date: Wed, 3 Sep 2025 13:00:58 +0530 Message-ID: <20250903073059.2151837-2-quic_jseerapu@quicinc.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250903073059.2151837-1-quic_jseerapu@quicinc.com> References: <20250903073059.2151837-1-quic_jseerapu@quicinc.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: nasanex01b.na.qualcomm.com (10.46.141.250) To nasanex01b.na.qualcomm.com (10.46.141.250) X-QCInternal: smtphost X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Proofpoint-ORIG-GUID: LDoC3IS4aosMkj2jn7XX9W__95CUUux- X-Proofpoint-GUID: LDoC3IS4aosMkj2jn7XX9W__95CUUux- X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwODMwMDAyMCBTYWx0ZWRfX7kKQXQM29Fz7 w/CSExBlwwFuNFtxJTiHwRywTJK/H368CHmX9ik8P1VoChvDCfmTlfcBVwMtTwr5m1GiULf926m J2gymQMePzTr3TlK6PVffqx6zorsnKnzLWf+p1wi9FqMYRswJhP6evJgHf3bQVIfrk6YHPrKH6x 0WJRskIQ80WbQDSQj1vEhdncWbDrecENPMPCRmHECM/H01IjNqaFRAxifbcM3Gx2RUejb9mII2H aAkGKbSE4onbbHK4aTx0H2Ac9xIIADyISmCQnktQPCi0ZcKzscN/Mgd3ZU1VKnAA9/aM4SA4AeD S5BpnBUlfnACAyKQbyfe6sUUFzhvlY+KtqQfYxv5kvxzZ2zndZwMV4ywyEgy6ZEntoNEdlQKcu2 xZy8Rqt9 X-Authority-Analysis: v=2.4 cv=VNndn8PX c=1 sm=1 tr=0 ts=68b7eece cx=c_pps a=JYp8KDb2vCoCEuGobkYCKw==:117 a=JYp8KDb2vCoCEuGobkYCKw==:17 a=GEpy-HfZoHoA:10 a=yJojWOMRYYMA:10 a=COk6AnOGAAAA:8 a=hwQltXbWhlPaccoBuB4A:9 a=TjNXssC_j7lpFel5tvFf:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1117,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-09-03_04,2025-08-28_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 spamscore=0 impostorscore=0 malwarescore=0 bulkscore=0 clxscore=1015 adultscore=0 priorityscore=1501 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2507300000 definitions=main-2508300020 Content-Type: text/plain; charset="utf-8" GSI hardware generates an interrupt for each transfer completion. For multiple messages within a single transfer, this results in N interrupts for N messages, leading to significant software interrupt latency. To mitigate this latency, utilize Block Event Interrupt (BEI) mechanism. Enabling BEI instructs the GSI hardware to prevent interrupt generation and BEI is disabled when an interrupt is necessary. Large I2C transfer can be divided into chunks of messages internally. Interrupts are not expected for the messages for which BEI bit set, only the last message triggers an interrupt, indicating the completion of N messages. This BEI mechanism enhances overall transfer efficiency. This BEI mechanism enhances overall transfer efficiency. Signed-off-by: Jyothi Kumar Seerapu --- v6 -> v7: - The design has been modified to configure BEI for interrupt generation either: After the last I2C message, if sufficient TREs are available, or After a specific I2C message, when no further TREs are available. - In the GPI driver, passed the flags argumnetr to the gpi_create_i2c_tr= e function and so avoided using external variables for DMA_PREP_INTERRUPT status. v5 ->v6: - For updating the block event interrupt bit, instead of relying on bei_flag, decision check is moved with DMA_PREP_INTERRUPT flag. v4 -> v5: - BEI flag naming changed from flags to bei_flag. - QCOM_GPI_BLOCK_EVENT_IRQ macro is removed from qcom-gpi-dma.h file, and Block event interrupt support is checked with bei_flag. v3 -> v4: - API's added for Block event interrupt with multi descriptor support for I2C is moved from qcom-gpi-dma.h file to I2C geni qcom driver file. - gpi_multi_xfer_timeout_handler function is moved from GPI driver to I2C driver. v2-> v3: - Renamed gpi_multi_desc_process to gpi_multi_xfer_timeout_handler - MIN_NUM_OF_MSGS_MULTI_DESC changed from 4 to 2 - Added documentation for newly added changes in "qcom-gpi-dma.h" file - Updated commit description. v1 -> v2: - Changed dma_addr type from array of pointers to array. - To support BEI functionality with the TRE size of 64 defined in GPI dr= iver, updated QCOM_GPI_MAX_NUM_MSGS to 16 and NUM_MSGS_PER_IRQ to 4. drivers/dma/qcom/gpi.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/drivers/dma/qcom/gpi.c b/drivers/dma/qcom/gpi.c index 8e87738086b2..66bfea1f156d 100644 --- a/drivers/dma/qcom/gpi.c +++ b/drivers/dma/qcom/gpi.c @@ -1619,7 +1619,8 @@ gpi_peripheral_config(struct dma_chan *chan, struct d= ma_slave_config *config) } =20 static int gpi_create_i2c_tre(struct gchan *chan, struct gpi_desc *desc, - struct scatterlist *sgl, enum dma_transfer_direction direction) + struct scatterlist *sgl, enum dma_transfer_direction direction, + unsigned long flags) { struct gpi_i2c_config *i2c =3D chan->config; struct device *dev =3D chan->gpii->gpi_dev->dev; @@ -1684,6 +1685,9 @@ static int gpi_create_i2c_tre(struct gchan *chan, str= uct gpi_desc *desc, =20 tre->dword[3] =3D u32_encode_bits(TRE_TYPE_DMA, TRE_FLAGS_TYPE); tre->dword[3] |=3D u32_encode_bits(1, TRE_FLAGS_IEOT); + + if (!(flags & DMA_PREP_INTERRUPT)) + tre->dword[3] |=3D u32_encode_bits(1, TRE_FLAGS_BEI); } =20 for (i =3D 0; i < tre_idx; i++) @@ -1827,6 +1831,9 @@ gpi_prep_slave_sg(struct dma_chan *chan, struct scatt= erlist *sgl, return NULL; } =20 + if (!(flags & DMA_PREP_INTERRUPT) && (nr - nr_tre < 2)) + return NULL; + gpi_desc =3D kzalloc(sizeof(*gpi_desc), GFP_NOWAIT); if (!gpi_desc) return NULL; @@ -1835,7 +1842,7 @@ gpi_prep_slave_sg(struct dma_chan *chan, struct scatt= erlist *sgl, if (gchan->protocol =3D=3D QCOM_GPI_SPI) { i =3D gpi_create_spi_tre(gchan, gpi_desc, sgl, direction); } else if (gchan->protocol =3D=3D QCOM_GPI_I2C) { - i =3D gpi_create_i2c_tre(gchan, gpi_desc, sgl, direction); + i =3D gpi_create_i2c_tre(gchan, gpi_desc, sgl, direction, flags); } else { dev_err(dev, "invalid peripheral: %d\n", gchan->protocol); kfree(gpi_desc); --=20 2.34.1