From nobody Sun Oct 5 00:14:11 2025 Received: from pegase2.c-s.fr (pegase2.c-s.fr [93.17.235.10]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 0D0272ED86F; Tue, 12 Aug 2025 11:21:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=93.17.235.10 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754997668; cv=none; b=VDvXX/1bA3uJHkkvU7kd1CNq61trYiw/xke+SW+ythOSMMlRNftcs5LGY5rK4RXwuFIJzTZZsNVi/ztWHzBY0PlmfS3IvQuWbZZu4YnzvcylzDrMQ7CL7TrsSugBvAfqbveMTKcw/YbEdMy+kTRggZNIwxF3fyVZw2Ic58YjOsA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754997668; c=relaxed/simple; bh=btE/H/h8In+zFZ3coyNkPGTFp2sXECgeWwsH+bApf+k=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=eE0ZWoHef8HQVPbTEiRYyHld029oDq1fMs8F1CYtsDYjmgMmjB2v+vqZINEjDtGnMWUHMlJoYmSiYvgphE17bPQgxlQuDS+EgQDeDlXnJtXG6TwSHnoWUCILVCntg4OC7Rp6Rt3cA9lqm7yuih0TSz4dqpQMmJOu+G3dD2YjsOc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=csgroup.eu; spf=pass smtp.mailfrom=csgroup.eu; arc=none smtp.client-ip=93.17.235.10 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=csgroup.eu Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=csgroup.eu Received: from localhost (mailhub4.si.c-s.fr [172.26.127.67]) by localhost (Postfix) with ESMTP id 4c1SwZ1yR4z9sSL; Tue, 12 Aug 2025 12:51:10 +0200 (CEST) X-Virus-Scanned: amavisd-new at c-s.fr Received: from pegase2.c-s.fr ([172.26.127.65]) by localhost (pegase2.c-s.fr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id TZTC41d0Ji7b; Tue, 12 Aug 2025 12:51:10 +0200 (CEST) Received: from messagerie.si.c-s.fr (messagerie.si.c-s.fr [192.168.25.192]) by pegase2.c-s.fr (Postfix) with ESMTP id 4c1SwZ10sYz9sSK; Tue, 12 Aug 2025 12:51:10 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 090E48B764; Tue, 12 Aug 2025 12:51:10 +0200 (CEST) X-Virus-Scanned: amavisd-new at c-s.fr Received: from messagerie.si.c-s.fr ([127.0.0.1]) by localhost (messagerie.si.c-s.fr [127.0.0.1]) (amavisd-new, port 10023) with ESMTP id oYqVmKfN6oVn; Tue, 12 Aug 2025 12:51:09 +0200 (CEST) Received: from PO20335.idsi0.si.c-s.fr (unknown [192.168.235.99]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 4C2A18B765; Tue, 12 Aug 2025 12:51:09 +0200 (CEST) From: Christophe Leroy To: Herve Codina , Qiang Zhao , Shengjiu Wang , Xiubo Li , Fabio Estevam , Nicolin Chen , Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai Cc: Christophe Leroy , linuxppc-dev@lists.ozlabs.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-sound@vger.kernel.org Subject: [PATCH v2 1/4] soc: fsl: qmc: Only set completion interrupt when needed Date: Tue, 12 Aug 2025 12:50:55 +0200 Message-ID: X-Mailer: git-send-email 2.49.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1754995860; l=3383; i=christophe.leroy@csgroup.eu; s=20211009; h=from:subject:message-id; bh=btE/H/h8In+zFZ3coyNkPGTFp2sXECgeWwsH+bApf+k=; b=zVwDmHckJ9mDmT1RDuIFBLmmtGpvCrpdaM679R61Csv/878/XJddDu6BCqmg5MWdRPutlVzV8 Tx9V7OFk3U+Cl67z/fTXBHb4yPB9HbRBYFB3c7X4RnCAC8pKGvZDWFv X-Developer-Key: i=christophe.leroy@csgroup.eu; a=ed25519; pk=HIzTzUj91asvincQGOFx6+ZF5AoUuP9GdOtQChs7Mm0= Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When no post-completion processing is expected, don't waste time handling useless interrupts. Only set QMC_BD_[R/T]X_I when a completion function is passed in, and perform seamless completion on submit for interruptless buffers. Signed-off-by: Christophe Leroy --- v2: Keep the UB flag to mark not completed buffers and seamlessly flag them= as completed during next submit. --- drivers/soc/fsl/qe/qmc.c | 44 ++++++++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/drivers/soc/fsl/qe/qmc.c b/drivers/soc/fsl/qe/qmc.c index 36c0ccc06151f..8f76b9a5e385d 100644 --- a/drivers/soc/fsl/qe/qmc.c +++ b/drivers/soc/fsl/qe/qmc.c @@ -461,9 +461,16 @@ int qmc_chan_write_submit(struct qmc_chan *chan, dma_a= ddr_t addr, size_t length, =20 ctrl =3D qmc_read16(&bd->cbd_sc); if (ctrl & (QMC_BD_TX_R | QMC_BD_TX_UB)) { - /* We are full ... */ - ret =3D -EBUSY; - goto end; + if (!(ctrl & QMC_BD_TX_I) && bd =3D=3D chan->txbd_done) { + if (ctrl & QMC_BD_TX_W) + chan->txbd_done =3D chan->txbds; + else + chan->txbd_done++; + } else { + /* We are full ... */ + ret =3D -EBUSY; + goto end; + } } =20 qmc_write16(&bd->cbd_datlen, length); @@ -475,6 +482,10 @@ int qmc_chan_write_submit(struct qmc_chan *chan, dma_a= ddr_t addr, size_t length, =20 /* Activate the descriptor */ ctrl |=3D (QMC_BD_TX_R | QMC_BD_TX_UB); + if (complete) + ctrl |=3D QMC_BD_TX_I; + else + ctrl &=3D ~QMC_BD_TX_I; wmb(); /* Be sure to flush the descriptor before control update */ qmc_write16(&bd->cbd_sc, ctrl); =20 @@ -569,9 +580,16 @@ int qmc_chan_read_submit(struct qmc_chan *chan, dma_ad= dr_t addr, size_t length, =20 ctrl =3D qmc_read16(&bd->cbd_sc); if (ctrl & (QMC_BD_RX_E | QMC_BD_RX_UB)) { - /* We are full ... */ - ret =3D -EBUSY; - goto end; + if (!(ctrl & QMC_BD_RX_I) && bd =3D=3D chan->rxbd_done) { + if (ctrl & QMC_BD_RX_W) + chan->rxbd_done =3D chan->rxbds; + else + chan->rxbd_done++; + } else { + /* We are full ... */ + ret =3D -EBUSY; + goto end; + } } =20 qmc_write16(&bd->cbd_datlen, 0); /* data length is updated by the QMC */ @@ -587,6 +605,10 @@ int qmc_chan_read_submit(struct qmc_chan *chan, dma_ad= dr_t addr, size_t length, =20 /* Activate the descriptor */ ctrl |=3D (QMC_BD_RX_E | QMC_BD_RX_UB); + if (complete) + ctrl |=3D QMC_BD_RX_I; + else + ctrl &=3D ~QMC_BD_RX_I; wmb(); /* Be sure to flush data before descriptor activation */ qmc_write16(&bd->cbd_sc, ctrl); =20 @@ -1482,19 +1504,19 @@ static int qmc_setup_chan(struct qmc *qmc, struct q= mc_chan *chan) =20 /* Init Rx BDs and set Wrap bit on last descriptor */ BUILD_BUG_ON(QMC_NB_RXBDS =3D=3D 0); - val =3D QMC_BD_RX_I; for (i =3D 0; i < QMC_NB_RXBDS; i++) { bd =3D chan->rxbds + i; - qmc_write16(&bd->cbd_sc, val); + qmc_write16(&bd->cbd_sc, 0); } bd =3D chan->rxbds + QMC_NB_RXBDS - 1; - qmc_write16(&bd->cbd_sc, val | QMC_BD_RX_W); + qmc_write16(&bd->cbd_sc, QMC_BD_RX_W); =20 /* Init Tx BDs and set Wrap bit on last descriptor */ BUILD_BUG_ON(QMC_NB_TXBDS =3D=3D 0); - val =3D QMC_BD_TX_I; if (chan->mode =3D=3D QMC_HDLC) - val |=3D QMC_BD_TX_L | QMC_BD_TX_TC; + val =3D QMC_BD_TX_L | QMC_BD_TX_TC; + else + val =3D 0; for (i =3D 0; i < QMC_NB_TXBDS; i++) { bd =3D chan->txbds + i; qmc_write16(&bd->cbd_sc, val); --=20 2.49.0