Received: by 2002:a05:6500:1b8a:b0:1ef:a0f1:aef6 with SMTP id df10csp74122lqb; Sun, 10 Mar 2024 05:50:54 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCXvu79ZqpMkPi3MqAwDxWX0qj/rZ5R79Aay9DYy7CoHPZ6+Wy33RufJYxlKaw0TzIi6jweLpz04mAEh5GGBESfWrvBw+LRUneHJjCHPJw== X-Google-Smtp-Source: AGHT+IGkFu9DTGhhdocqINUJtnHdWvqVYlKnTO8bQ+c+KoTsi/TBdaWF1TXLzZvYkm88D6Vw4JAO X-Received: by 2002:a05:622a:1c7:b0:42e:f3ba:9998 with SMTP id t7-20020a05622a01c700b0042ef3ba9998mr6292378qtw.39.1710075054057; Sun, 10 Mar 2024 05:50:54 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1710075054; cv=pass; d=google.com; s=arc-20160816; b=erCZx8AkHA1liqJ4WnbM1UU4GxGDv0Nx1rD7MZf9A8THHNK3ndveFO7A+nAKb1bz3l 9LIL2KgDNG4p1t0SrYOxfQX5zySr+ciGqPomigrUrlV0MLtTp2loTrvUuTJEVPnJJ91g pFIWZzKrjc03okc2Z3kVqQM2EkoVzwjfAjR+eoTEVuiCF69/3Ep9MKwKw3BjF37WSzaX SYfx1F/G2q1IqXDzBXCOrngfHquQvwON6V5zDV5CDmGAKf3X2HebdlhaYpRV5xlujOFX nkRjJHJIuXmGO0cpMDBaU0mBmdZ9WqlMzRMmzNPoRKFhv23zLwasvsbt3wUSuNytcT14 Swkg== 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=diVnTKGYmGTXMK2fWu9xl+JrtOVoNzvMtMZ/RN8kb8E=; fh=yZS2g+QQKdMrQ3jorRH5H6dPNDM7GRj3yrDB9sYJ3mc=; b=BLyq1vd2md0t76HjvfUhxyMXezwuQcAbtMWhgVVGRM1m8xUrMz1Yasrg0g96Qu9BBb vfQxyl6snpzWS8JJpIEx7TT2+dEIyqYu6uN5eqiUnF3xLmIaVSYuCJhrbcafY3a518tw XtuUZo9S2KMCEZJzsgXgPrSf5M+pOqgzf96IxSW2fUjph0o/zfGQWsKZ7S5VOdjrADtJ wZIjMASTvdQJoaALIcdIwQyeflMw1r7aoO4au6mF9kZaI5Rm4H8oK2UXeUT7oYPBzb9G M9qPqXEBoFYbLbyFbjB6Oaq5kRqAxUY2Emj/rOJEbia1FTINnK68a4HY2j2HMFM4Q5WE favA==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@crapouillou.net header.s=mail header.b=pAm7j1Z4; 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-98219-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-98219-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. [147.75.199.223]) by mx.google.com with ESMTPS id x8-20020a05622a000800b0042efb328395si3367437qtw.619.2024.03.10.05.50.53 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 10 Mar 2024 05:50:54 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-98219-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) client-ip=147.75.199.223; Authentication-Results: mx.google.com; dkim=pass header.i=@crapouillou.net header.s=mail header.b=pAm7j1Z4; 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-98219-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-98219-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 C788C1C20FA8 for ; Sun, 10 Mar 2024 12:50:53 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 1CBDA39AD1; Sun, 10 Mar 2024 12:49:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=crapouillou.net header.i=@crapouillou.net header.b="pAm7j1Z4" 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 87CC235F18; Sun, 10 Mar 2024 12:49:37 +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=1710074979; cv=none; b=lnsVanSkbuvceN4qZEjARa9W5O4vGbs034smIyDT6Lx9h+guO/PfcG7kqWTk70xxXnB5Eb6qYfH8pww7J1tYqElPjwkcyGjYpQjJu85JQq+PguTiRqR9V20AbdmWpIFq1bmT7kRKXT6Qbq+FhX93kCpllr/HdkLZ0Ngf+8eUBfI= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710074979; c=relaxed/simple; bh=v8F5DoNlHt0mR7veIGDJ45cx2qJsTw433pwoyOQmQcg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QEmu5BiCt9e8jezsUo7+NhrMT8yX+eGLxRpb5KZUUMU3D/55IoUvxw5yNYkj6az/pmw3JOb17m50L91QsRfg4xHOo5oZyWuO5JnG68TOozh908zbnjefiX6Gb2P89YGcWOi4BTjQbeJYZUpHlipXx1zmXkMbC5CsT16ZYApSIoY= 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=pAm7j1Z4; 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=1710074931; 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=diVnTKGYmGTXMK2fWu9xl+JrtOVoNzvMtMZ/RN8kb8E=; b=pAm7j1Z47WXnEZGdirKQ3YaN9erqfkhzUcCQWJZgAMfM+fLkLddlgxX81jL+CBrmZ5N+N2 OCGrt+EeIWHnXdjKo2HTDgX0jg7cl7dLCeJx+MCPIlDtty/Bx0d1RXX2e71mfxsYBzDYb2 LIbWEepHpCFAaeFBJ+XXlD36MTrQfs4= From: Paul Cercueil To: Jonathan Cameron , =?UTF-8?q?Christian=20K=C3=B6nig?= , Jonathan Corbet , Lars-Peter Clausen , Vinod Koul , Sumit Semwal Cc: 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 v9 5/6] iio: buffer-dmaengine: Support new DMABUF based userspace API Date: Sun, 10 Mar 2024 13:48:34 +0100 Message-ID: <20240310124836.31863-6-paul@crapouillou.net> In-Reply-To: <20240310124836.31863-1-paul@crapouillou.net> References: <20240310124836.31863-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 Signed-off-by: Nuno Sa --- 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 v7: Adapted patch for the changes made in patch 1. --- .../buffer/industrialio-buffer-dmaengine.c | 59 +++++++++++++++++-- 1 file changed, 53 insertions(+), 6 deletions(-) diff --git a/drivers/iio/buffer/industrialio-buffer-dmaengine.c b/drivers/iio/buffer/industrialio-buffer-dmaengine.c index a18c1da292af..3b7b649f0a89 100644 --- a/drivers/iio/buffer/industrialio-buffer-dmaengine.c +++ b/drivers/iio/buffer/industrialio-buffer-dmaengine.c @@ -64,15 +64,55 @@ 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_peripheral_dma_vec(dmaengine_buffer->chan, + vecs, nents, + DMA_DEV_TO_MEM, + DMA_PREP_INTERRUPT, 0); + 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 +160,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