From nobody Sat Oct 4 12:44:51 2025 Received: from pegase2.c-s.fr (pegase2.c-s.fr [93.17.235.10]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 190062FF676; Mon, 18 Aug 2025 08:50:44 +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=1755507046; cv=none; b=GvskhLSZ54Lhfb18Vtr19vJnfcJCnv6LWAuc/sRBiZ6ci9M5+N8Rzle3HWMOJulxtf3WY8OQ4dSYWZdI01bxHFSkb7BBc2gKjS7G9IJi9461gK3js0NKdPCSOihAxFto7PveizA3n3rq05IYR7rccxPUJREU0tuHE3dYkcJn8jM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755507046; c=relaxed/simple; bh=kh9PQCdvsuxt4RhIWm9+RprrvTqMluzmq/Q0sECbAY0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GSAbvyMWgva9uk1YRg7SHh0koEGbpp9XaulfWoJXaaM6h5fYJoVPWAVe2tOj42Dp8Dm6vooGXFOyOvGUyRbe6gWWQYmfceKTa3ynlEmqsx2z//DbxyHEZfi72r/NoN608RgDpXwviVitAjQ4ep23nR+tLGY9RoLg0cNoH/MR0ys= 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 4c55HT1D2Wz9sWC; Mon, 18 Aug 2025 10:20:05 +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 zqfx_29jJklv; Mon, 18 Aug 2025 10:20:05 +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 4c55HS3MbQz9sW4; Mon, 18 Aug 2025 10:20:04 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 5975F8B766; Mon, 18 Aug 2025 10:20:04 +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 5uGw3xFPn1L2; Mon, 18 Aug 2025 10:20:04 +0200 (CEST) Received: from PO20335.idsi0.si.c-s.fr (unknown [10.25.207.160]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 22E3A8B764; Mon, 18 Aug 2025 10:20:04 +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 v3 1/4] soc: fsl: qmc: Only set completion interrupt when needed Date: Mon, 18 Aug 2025 10:20:00 +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=1755505199; l=3298; i=christophe.leroy@csgroup.eu; s=20211009; h=from:subject:message-id; bh=kh9PQCdvsuxt4RhIWm9+RprrvTqMluzmq/Q0sECbAY0=; b=V4R9Apsqr1Vcvnj5Mk1Fb0ZSXT/AZXjv+rBkjj0zzoV7QIS8SqFTd2svAgAzMFPgZ4oW28/1z u4S4lxsGkmvDAZQkafc5mGgwTaA/zVeXuYjFgW5tankXhrLdquZsA5V 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 Acked-by: Herve Codina --- 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 36c0ccc06151..da5ea6d35618 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_R | 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_E | 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