From nobody Thu Oct 2 04:50:32 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 0460030FC09; Tue, 23 Sep 2025 07:38:27 +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=1758613109; cv=none; b=TX5wgO5I97JaiXd6ogK4hIs5S7iHp2Y3jPs7we5WoLWNh+qLY0dOS1ZGCpw/CkxgUOju4JMHC/9IWQOPHuFhrusXZKyGocFs7Yf6fzCLJqJStoR0zYPzfbeRhemiZ0Pn1dtS2u10gnof+P6ebFkE5VrJ1vVFPeun86QgE7jc8XA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758613109; c=relaxed/simple; bh=X9W89atoT3dbms5B/ViTcW1rExoXCh4aecFDBnWU464=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=mKv8UX+Q7lDBqCcHcLkhnQrS9WixnZDZbzUT6aqcSa/Dotc3Rq0FBfxqwUr73gn6clHqcISIjQx+0FBvIWeaKVEPXv6TJt6kUZi0YzfXRNWbQX6QXWd4aItFMofQJ9B31ErzcSI4r+bfH9td7mv1cqFaCEYGFoaSAhiJgr2kX/s= 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=EWuQJQPs; 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="EWuQJQPs" Received: from pps.filterd (m0279870.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 58N6ZiiT003712; Tue, 23 Sep 2025 07:38:21 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= luVxSIFJWQ28fuVwXGXwQgOngnYBzBBpTjgF+FdmKrk=; b=EWuQJQPs3nagyLmE u593boUe366e9efmbzubShiSAAyVP9Rprh5+rLy/+o5IITBUGs5Ah3xyV0xIzx36 z8tDmYUMFhV3bOcqCG5gnLKeGRv6ZSsqPfK2a09bt2NKAzcRzxO88+joOJSk26BJ oRfzmXQomlnF134qr/aTIiYkSRSjB0EB0xMDoN3ALOg4UzGcItEZPjAdJbr+jsMy xiW3WyEkIn7t5i0QWOKFUBFiddgoFy7fJG92jZZklo4jefkuvLKlrmV/tSebPkdv kbSU718E6BCX+2Ja4QMJcW1TmCijQOpvtKok34bzK2Oz+SVKyoHb86Zq5js2qBtj DRfhFQ== Received: from nasanppmta05.qualcomm.com (i-global254.qualcomm.com [199.106.103.254]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 49b3kk3h8y-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 23 Sep 2025 07:38:21 +0000 (GMT) Received: from nasanex01b.na.qualcomm.com (nasanex01b.na.qualcomm.com [10.46.141.250]) by NASANPPMTA05.qualcomm.com (8.18.1.2/8.18.1.2) with ESMTPS id 58N7cK8T011083 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 23 Sep 2025 07:38:20 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; Tue, 23 Sep 2025 00:38:14 -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 RESEND 1/2] dmaengine: qcom: gpi: Add GPI Block event interrupt support Date: Tue, 23 Sep 2025 13:07:51 +0530 Message-ID: <20250923073752.1425802-2-quic_jseerapu@quicinc.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250923073752.1425802-1-quic_jseerapu@quicinc.com> References: <20250923073752.1425802-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: nasanex01a.na.qualcomm.com (10.52.223.231) 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-GUID: Cjzw90u47HyGliC2yYUSf0rkZnHZ9U0E X-Proofpoint-ORIG-GUID: Cjzw90u47HyGliC2yYUSf0rkZnHZ9U0E X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwOTIyMDA4OSBTYWx0ZWRfX+4pM0FCXrzpv w30h7+VZgAzi/qKoBZ/KzmW9QMQLg0yS6Vy2EXAmdM04sXRnxgoU9Lrro1ERvxjdhus6lG6lpGU L93H8S4MT6m3Rt6WJtOi3C0WVkQMaMENypncbrHQjjJIn24ShwesuVdASaORFmOTg7K3QFpPetx /orliV6C+PyXZPMVxWQjai4/D+OuPyOkBUxLLebbyvO7ssh6t5Wi24W+EGT1z6T3jn4gcVTqzdQ yJ5IHSz+tivUj8hQcqmqV0WrNtYuHu7iLiBK2CFZel79qN/LYo+yQlyGts6Nx1EVFPFJh5jfNqu D8pgHB5TVw0uKHefWe6cmkGKEwi7DcxNCXw2W9LTsTM2FoqZutJxjNQ0ns9LEYhBhawxQouceRx WRpYZ4ik X-Authority-Analysis: v=2.4 cv=BabY0qt2 c=1 sm=1 tr=0 ts=68d24e6d 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-23_01,2025-09-22_05,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 clxscore=1015 phishscore=0 bulkscore=0 priorityscore=1501 adultscore=0 malwarescore=0 spamscore=0 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2507300000 definitions=main-2509220089 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. 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