From patchwork Fri Jan 10 19:37:40 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Niklas_S=C3=B6derlund?= X-Patchwork-Id: 2552 Return-Path: Received: from bin-mail-out-06.binero.net (bin-mail-out-06.binero.net [195.74.38.229]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 7A42360684 for ; Fri, 10 Jan 2020 20:38:39 +0100 (CET) X-Halon-ID: caeae68c-33e0-11ea-b6d8-005056917f90 Authorized-sender: niklas@soderlund.pp.se Received: from bismarck.berto.se (p54ac5d7b.dip0.t-ipconnect.de [84.172.93.123]) by bin-vsp-out-02.atm.binero.net (Halon) with ESMTPA id caeae68c-33e0-11ea-b6d8-005056917f90; Fri, 10 Jan 2020 20:38:36 +0100 (CET) From: =?utf-8?q?Niklas_S=C3=B6derlund?= To: libcamera-devel@lists.libcamera.org Date: Fri, 10 Jan 2020 20:37:40 +0100 Message-Id: <20200110193808.2266294-6-niklas.soderlund@ragnatech.se> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200110193808.2266294-1-niklas.soderlund@ragnatech.se> References: <20200110193808.2266294-1-niklas.soderlund@ragnatech.se> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 05/33] v4l2: camera: Handle memory mapping of buffers directly X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 10 Jan 2020 19:38:41 -0000 In the upcoming FrameBuffer API the memory mapping of buffers will be left to the user of the FrameBuffer objects. Prepare the V4L2 compatibility layer to this upcoming change to ease conversion to the new API. Signed-off-by: Niklas Söderlund Reviewed-by: Laurent Pinchart --- src/v4l2/v4l2_camera.cpp | 12 ++++++------ src/v4l2/v4l2_camera.h | 4 ++-- src/v4l2/v4l2_camera_proxy.cpp | 20 +++++++++++++++----- src/v4l2/v4l2_camera_proxy.h | 2 +- src/v4l2/v4l2_compat_manager.cpp | 2 +- 5 files changed, 25 insertions(+), 15 deletions(-) diff --git a/src/v4l2/v4l2_camera.cpp b/src/v4l2/v4l2_camera.cpp index 2a507b9bb8318025..ba3783876101b284 100644 --- a/src/v4l2/v4l2_camera.cpp +++ b/src/v4l2/v4l2_camera.cpp @@ -121,12 +121,6 @@ int V4L2Camera::configure(StreamConfiguration *streamConfigOut, return 0; } -void *V4L2Camera::mmap(unsigned int index) -{ - Stream *stream = *camera_->streams().begin(); - return stream->buffers()[index].planes()[0].mem(); -} - int V4L2Camera::allocBuffers(unsigned int count) { int ret = camera_->allocateBuffers(); @@ -138,6 +132,12 @@ void V4L2Camera::freeBuffers() camera_->freeBuffers(); } +int V4L2Camera::getBufferFd(unsigned int index) +{ + Stream *stream = *camera_->streams().begin(); + return stream->buffers()[index].planes()[0].dmabuf(); +} + int V4L2Camera::streamOn() { if (isRunning_) diff --git a/src/v4l2/v4l2_camera.h b/src/v4l2/v4l2_camera.h index 81f7908e5e8a6beb..afa20a232235e778 100644 --- a/src/v4l2/v4l2_camera.h +++ b/src/v4l2/v4l2_camera.h @@ -53,14 +53,14 @@ public: void getStreamConfig(StreamConfiguration *streamConfig); std::vector completedBuffers(); - void *mmap(unsigned int index); - int configure(StreamConfiguration *streamConfigOut, const Size &size, PixelFormat pixelformat, unsigned int bufferCount); int allocBuffers(unsigned int count); void freeBuffers(); + int getBufferFd(unsigned int index); + int streamOn(); int streamOff(); diff --git a/src/v4l2/v4l2_camera_proxy.cpp b/src/v4l2/v4l2_camera_proxy.cpp index 52f8468cdaa06a7a..3c8eba6b29be4811 100644 --- a/src/v4l2/v4l2_camera_proxy.cpp +++ b/src/v4l2/v4l2_camera_proxy.cpp @@ -75,7 +75,8 @@ void V4L2CameraProxy::close() vcam_->invokeMethod(&V4L2Camera::close, ConnectionTypeBlocking); } -void *V4L2CameraProxy::mmap(size_t length, int prot, int flags, off_t offset) +void *V4L2CameraProxy::mmap(void *addr, size_t length, int prot, int flags, + off_t offset) { LOG(V4L2Compat, Debug) << "Servicing mmap"; @@ -91,13 +92,22 @@ void *V4L2CameraProxy::mmap(size_t length, int prot, int flags, off_t offset) return MAP_FAILED; } - void *val = vcam_->invokeMethod(&V4L2Camera::mmap, - ConnectionTypeBlocking, index); + int fd = vcam_->invokeMethod(&V4L2Camera::getBufferFd, + ConnectionTypeBlocking, index); + if (fd < 0) { + errno = -fd; + return MAP_FAILED; + } + + void *map = V4L2CompatManager::instance()->fops().mmap(addr, length, prot, + flags, fd, 0); + if (map == MAP_FAILED) + return map; buffers_[index].flags |= V4L2_BUF_FLAG_MAPPED; - mmaps_[val] = index; + mmaps_[map] = index; - return val; + return map; } int V4L2CameraProxy::munmap(void *addr, size_t length) diff --git a/src/v4l2/v4l2_camera_proxy.h b/src/v4l2/v4l2_camera_proxy.h index b59d19d707590d88..c8e61adf80f1b93b 100644 --- a/src/v4l2/v4l2_camera_proxy.h +++ b/src/v4l2/v4l2_camera_proxy.h @@ -28,7 +28,7 @@ public: int open(bool nonBlocking); void dup(); void close(); - void *mmap(size_t length, int prot, int flags, off_t offset); + void *mmap(void *addr, size_t length, int prot, int flags, off_t offset); int munmap(void *addr, size_t length); int ioctl(unsigned long request, void *arg); diff --git a/src/v4l2/v4l2_compat_manager.cpp b/src/v4l2/v4l2_compat_manager.cpp index fe453445a9fb2cdd..f5a7b2ac4229d5d5 100644 --- a/src/v4l2/v4l2_compat_manager.cpp +++ b/src/v4l2/v4l2_compat_manager.cpp @@ -223,7 +223,7 @@ void *V4L2CompatManager::mmap(void *addr, size_t length, int prot, int flags, if (!proxy) return fops_.mmap(addr, length, prot, flags, fd, offset); - void *map = proxy->mmap(length, prot, flags, offset); + void *map = proxy->mmap(addr, length, prot, flags, offset); if (map == MAP_FAILED) return map;