Received: by 2002:a05:7412:d1aa:b0:fc:a2b0:25d7 with SMTP id ba42csp515037rdb; Mon, 29 Jan 2024 09:04:31 -0800 (PST) X-Google-Smtp-Source: AGHT+IGtkjzsOyrDuo5SLMQ0YMJfUBiFjA5ruewiXdgVFnlqFExjij9o/9EfG9xdLVcbFhM8dFzQ X-Received: by 2002:a05:6102:5f44:b0:468:15fe:6e2e with SMTP id il4-20020a0561025f4400b0046815fe6e2emr1854726vsb.34.1706547871624; Mon, 29 Jan 2024 09:04:31 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1706547871; cv=pass; d=google.com; s=arc-20160816; b=j3dSGvp7skQ00wEszqtkZprGhhqhIw2zlZKjvWh5oCqyzgXAjmh1BfWkp0B1uOQ5sR ouzjNtxKGBHO/q7umc4HG86scsCvNyY7m7U+HrxxwD90Ja+vr3zv4ABE3Dg0KNDPyydU 8QCrt9IUZG0Vt6nguU0EMCNiI/UVFuoz2QEJ6zQaCxlkKe6I237hdLzlvSsjVrK16KCH 8Pw0ZehqfOYnX4H59L7vXHBTaA48j+k9pEqNp489Nf1Cgk3e3Rx6qOCRqqHrdc/HkCwU BnkjNryqCyigU+jhl/DNPS3Y8yXr3opkNnxYSgzWqkeKtlJwGOt7tdjtWdfT/MuUzm3m uk3Q== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=/0YZL7D5wfQtXZEBgkttnzz1qHadNtN8B09YGKH9qPc=; fh=UUvZraMiTlolibKjuaTYSz8c8N6g0y2n/C3Uf8DFNMA=; b=cpixanix5Elj3OJpJw5Ug6o82XpX9/ccda9EFk/FjMh5+q8GwHxt3Q/QcRWG4I3aQC ujJAIY6sLo8KzQN3GSnpESCsWCA5CZpnk2wQBvor8g/hg1u0dSDPRaCjgRnuH1n1eFqN DzMDfQKEdXv9Y4ptFkR+rUNbAVJ9fL0yO0zgScXn4ksV7Xxm7QUYQbLkb8VXMlqKrNh1 8t7j7sFtsXiEcKZvpugtA7SkNxOpm9Hf93BB8zov6ZyiiyX0GjYpL7nE+rVBwbaSiK6L dc0Gri8UXJrCuvl+aCgOoWLyYAexswp6MwF1A/WqXfOl5RxN97UjD+jAVltQWdv6SWrz kzVQ== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@crapouillou.net header.s=mail header.b=4QQrUwGx; arc=pass (i=1 spf=pass spfdomain=crapouillou.net dkim=pass dkdomain=crapouillou.net dmarc=pass fromdomain=crapouillou.net); spf=pass (google.com: domain of linux-kernel+bounces-43178-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-43178-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=crapouillou.net Return-Path: Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [2604:1380:45d1:ec00::1]) by mx.google.com with ESMTPS id g19-20020a67e213000000b0046b12098baasi885930vsa.758.2024.01.29.09.04.31 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jan 2024 09:04:31 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-43178-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) client-ip=2604:1380:45d1:ec00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@crapouillou.net header.s=mail header.b=4QQrUwGx; arc=pass (i=1 spf=pass spfdomain=crapouillou.net dkim=pass dkdomain=crapouillou.net dmarc=pass fromdomain=crapouillou.net); spf=pass (google.com: domain of linux-kernel+bounces-43178-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-43178-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=crapouillou.net Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id B6E671C2323D for ; Mon, 29 Jan 2024 17:04:23 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 3D42B15A4BF; Mon, 29 Jan 2024 17:03:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=crapouillou.net header.i=@crapouillou.net header.b="4QQrUwGx" Received: from aposti.net (aposti.net [89.234.176.197]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C053915A4AC; Mon, 29 Jan 2024 17:02:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=89.234.176.197 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706547781; cv=none; b=OJLz/O9puoXGg7YYcbciu88XW/LagzY7WdsTdZxEDu3gVi1F2g30iSmAeFKpEOlVNxrstl0KWbZ4dbGSK43RcCBpz9h80mzuwEpLPXAucVId52Ewt2v/W7AEfw/UqX2gAIDSRnRJNIV+3WCUWzZSNYz+EF63WRF/GVVlHUmZNns= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706547781; c=relaxed/simple; bh=UmEplxjcutZ/aaDgkwmjqVZy3IpHxf4/5tz4vN9kxyA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GJx12hkzffpgXFYaPxoTJqYbwbQgeQ+0KLD1uv0Kxe0jyGD3lPIizNXlzEugmHR1YkjEzI5/9xO0V7dID0shpvdgFFFqt9Tk0q27JnDTK/4lUqi9gAIsPUHYqI21PLE0Oys3jDFVOBk7/ts29sQWrbHXfHtGqCvLk0NLcpDPNc8= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=crapouillou.net; spf=pass smtp.mailfrom=crapouillou.net; dkim=pass (1024-bit key) header.d=crapouillou.net header.i=@crapouillou.net header.b=4QQrUwGx; arc=none smtp.client-ip=89.234.176.197 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=crapouillou.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=crapouillou.net DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=crapouillou.net; s=mail; t=1706547740; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=/0YZL7D5wfQtXZEBgkttnzz1qHadNtN8B09YGKH9qPc=; b=4QQrUwGxB/krxFoltCT9bjAvaHymTQh0LMEK3wG0UcOru+QYEW0LnHIiMi5pBKBFnrPdWD QUXwFZX7/nCdx6A1J4S6+m5Cvl1SB41GLrhxMaULwjkcl0/1VTEDcc/Oa7jEhZRQLSRfqq LfKqEqppAygtDNmFgpsKFnIn/5Epu+I= From: Paul Cercueil To: Jonathan Cameron , Jonathan Corbet , Lars-Peter Clausen , Vinod Koul , Sumit Semwal , =?UTF-8?q?Christian=20K=C3=B6nig?= Cc: Daniel Vetter , Nuno Sa , Michael Hennerich , linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, dmaengine@vger.kernel.org, linux-iio@vger.kernel.org, linux-media@vger.kernel.org, dri-devel@lists.freedesktop.org, linaro-mm-sig@lists.linaro.org, Paul Cercueil Subject: [PATCH v6 5/6] iio: buffer-dmaengine: Support new DMABUF based userspace API Date: Mon, 29 Jan 2024 18:02:00 +0100 Message-ID: <20240129170201.133785-6-paul@crapouillou.net> In-Reply-To: <20240129170201.133785-1-paul@crapouillou.net> References: <20240129170201.133785-1-paul@crapouillou.net> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Use the functions provided by the buffer-dma core to implement the DMABUF userspace API in the buffer-dmaengine IIO buffer implementation. Since we want to be able to transfer an arbitrary number of bytes and not necesarily the full DMABUF, the associated scatterlist is converted to an array of DMA addresses + lengths, which is then passed to dmaengine_prep_slave_dma_array(). Signed-off-by: Paul Cercueil --- v3: Use the new dmaengine_prep_slave_dma_array(), and adapt the code to work with the new functions introduced in industrialio-buffer-dma.c. v5: - Use the new dmaengine_prep_slave_dma_vec(). - Restrict to input buffers, since output buffers are not yet supported by IIO buffers. v6: - Populate .lock_queue / .unlock_queue callbacks - Switch to atomic memory allocations in .submit_queue, because of the dma_fence critical section - Make sure that the size of the scatterlist is enough --- .../buffer/industrialio-buffer-dmaengine.c | 58 +++++++++++++++++-- 1 file changed, 52 insertions(+), 6 deletions(-) diff --git a/drivers/iio/buffer/industrialio-buffer-dmaengine.c b/drivers/iio/buffer/industrialio-buffer-dmaengine.c index 45fe7d0d42ee..c4cfdb0c1231 100644 --- a/drivers/iio/buffer/industrialio-buffer-dmaengine.c +++ b/drivers/iio/buffer/industrialio-buffer-dmaengine.c @@ -64,15 +64,54 @@ static int iio_dmaengine_buffer_submit_block(struct iio_dma_buffer_queue *queue, struct dmaengine_buffer *dmaengine_buffer = iio_buffer_to_dmaengine_buffer(&queue->buffer); struct dma_async_tx_descriptor *desc; + struct scatterlist *sgl; + struct dma_vec *vecs; dma_cookie_t cookie; + size_t len_total; + size_t max_size; + unsigned int i; + int nents; - block->bytes_used = min(block->size, dmaengine_buffer->max_size); - block->bytes_used = round_down(block->bytes_used, - dmaengine_buffer->align); + if (queue->buffer.direction != IIO_BUFFER_DIRECTION_IN) { + /* We do not yet support output buffers. */ + return -EINVAL; + } - desc = dmaengine_prep_slave_single(dmaengine_buffer->chan, - block->phys_addr, block->bytes_used, DMA_DEV_TO_MEM, - DMA_PREP_INTERRUPT); + if (block->sg_table) { + sgl = block->sg_table->sgl; + nents = sg_nents_for_len(sgl, block->bytes_used); + if (nents < 0) + return nents; + + vecs = kmalloc_array(nents, sizeof(*vecs), GFP_ATOMIC); + if (!vecs) + return -ENOMEM; + + len_total = block->bytes_used; + + for (i = 0; i < nents; i++) { + vecs[i].addr = sg_dma_address(sgl); + vecs[i].len = min(sg_dma_len(sgl), len_total); + len_total -= vecs[i].len; + + sgl = sg_next(sgl); + } + + desc = dmaengine_prep_slave_dma_vec(dmaengine_buffer->chan, + vecs, nents, DMA_DEV_TO_MEM, + DMA_PREP_INTERRUPT); + kfree(vecs); + } else { + max_size = min(block->size, dmaengine_buffer->max_size); + max_size = round_down(max_size, dmaengine_buffer->align); + block->bytes_used = max_size; + + desc = dmaengine_prep_slave_single(dmaengine_buffer->chan, + block->phys_addr, + block->bytes_used, + DMA_DEV_TO_MEM, + DMA_PREP_INTERRUPT); + } if (!desc) return -ENOMEM; @@ -120,6 +159,13 @@ static const struct iio_buffer_access_funcs iio_dmaengine_buffer_ops = { .data_available = iio_dma_buffer_data_available, .release = iio_dmaengine_buffer_release, + .enqueue_dmabuf = iio_dma_buffer_enqueue_dmabuf, + .attach_dmabuf = iio_dma_buffer_attach_dmabuf, + .detach_dmabuf = iio_dma_buffer_detach_dmabuf, + + .lock_queue = iio_dma_buffer_lock_queue, + .unlock_queue = iio_dma_buffer_unlock_queue, + .modes = INDIO_BUFFER_HARDWARE, .flags = INDIO_BUFFER_FLAG_FIXED_WATERMARK, }; -- 2.43.0