diff options
Diffstat (limited to 'users/flokli/ipu6-softisp/libcamera/0002-libcamera-internal-Move-dma_heaps.-h-cpp-to-common-d.patch')
-rw-r--r-- | users/flokli/ipu6-softisp/libcamera/0002-libcamera-internal-Move-dma_heaps.-h-cpp-to-common-d.patch | 350 |
1 files changed, 350 insertions, 0 deletions
diff --git a/users/flokli/ipu6-softisp/libcamera/0002-libcamera-internal-Move-dma_heaps.-h-cpp-to-common-d.patch b/users/flokli/ipu6-softisp/libcamera/0002-libcamera-internal-Move-dma_heaps.-h-cpp-to-common-d.patch new file mode 100644 index 0000000000..450a0a21f1 --- /dev/null +++ b/users/flokli/ipu6-softisp/libcamera/0002-libcamera-internal-Move-dma_heaps.-h-cpp-to-common-d.patch @@ -0,0 +1,350 @@ +From 96e50c6a43352a9cb81d558fea27e580f2b26585 Mon Sep 17 00:00:00 2001 +From: Andrey Konovalov <andrey.konovalov@linaro.org> +Date: Mon, 11 Mar 2024 15:15:06 +0100 +Subject: [PATCH 02/21] libcamera: internal: Move dma_heaps.[h, cpp] to common + directories + +DmaHeap class is useful outside the RPi pipeline handler too. + +Move dma_heaps.h and dma_heaps.cpp to common directories. Update +the build files and RPi vc4 pipeline handler accordingly. + +Tested-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org> # sc8280xp Lenovo x13s +Tested-by: Pavel Machek <pavel@ucw.cz> +Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> +Reviewed-by: Naushir Patuck <naush@raspberrypi.com> +Reviewed-by: Pavel Machek <pavel@ucw.cz> +Signed-off-by: Andrey Konovalov <andrey.konovalov@linaro.org> +Signed-off-by: Hans de Goede <hdegoede@redhat.com> +Reviewed-by: Milan Zamazal <mzamazal@redhat.com> +--- + .../libcamera/internal}/dma_heaps.h | 4 - + include/libcamera/internal/meson.build | 1 + + src/libcamera/dma_heaps.cpp | 127 ++++++++++++++++++ + src/libcamera/meson.build | 1 + + src/libcamera/pipeline/rpi/vc4/dma_heaps.cpp | 90 ------------- + src/libcamera/pipeline/rpi/vc4/meson.build | 1 - + src/libcamera/pipeline/rpi/vc4/vc4.cpp | 5 +- + 7 files changed, 131 insertions(+), 98 deletions(-) + rename {src/libcamera/pipeline/rpi/vc4 => include/libcamera/internal}/dma_heaps.h (92%) + create mode 100644 src/libcamera/dma_heaps.cpp + delete mode 100644 src/libcamera/pipeline/rpi/vc4/dma_heaps.cpp + +diff --git a/src/libcamera/pipeline/rpi/vc4/dma_heaps.h b/include/libcamera/internal/dma_heaps.h +similarity index 92% +rename from src/libcamera/pipeline/rpi/vc4/dma_heaps.h +rename to include/libcamera/internal/dma_heaps.h +index 0a4a8d86..cff8f140 100644 +--- a/src/libcamera/pipeline/rpi/vc4/dma_heaps.h ++++ b/include/libcamera/internal/dma_heaps.h +@@ -13,8 +13,6 @@ + + namespace libcamera { + +-namespace RPi { +- + class DmaHeap + { + public: +@@ -27,6 +25,4 @@ private: + UniqueFD dmaHeapHandle_; + }; + +-} /* namespace RPi */ +- + } /* namespace libcamera */ +diff --git a/include/libcamera/internal/meson.build b/include/libcamera/internal/meson.build +index 7f1f3440..33eb0fb3 100644 +--- a/include/libcamera/internal/meson.build ++++ b/include/libcamera/internal/meson.build +@@ -25,6 +25,7 @@ libcamera_internal_headers = files([ + 'device_enumerator.h', + 'device_enumerator_sysfs.h', + 'device_enumerator_udev.h', ++ 'dma_heaps.h', + 'formats.h', + 'framebuffer.h', + 'ipa_manager.h', +diff --git a/src/libcamera/dma_heaps.cpp b/src/libcamera/dma_heaps.cpp +new file mode 100644 +index 00000000..38ef175a +--- /dev/null ++++ b/src/libcamera/dma_heaps.cpp +@@ -0,0 +1,127 @@ ++/* SPDX-License-Identifier: LGPL-2.1-or-later */ ++/* ++ * Copyright (C) 2020, Raspberry Pi Ltd ++ * ++ * dma_heaps.h - Helper class for dma-heap allocations. ++ */ ++ ++#include "libcamera/internal/dma_heaps.h" ++ ++#include <array> ++#include <fcntl.h> ++#include <sys/ioctl.h> ++#include <unistd.h> ++ ++#include <linux/dma-buf.h> ++#include <linux/dma-heap.h> ++ ++#include <libcamera/base/log.h> ++ ++/** ++ * \file dma_heaps.cpp ++ * \brief CMA dma-heap allocator ++ */ ++ ++/* ++ * /dev/dma_heap/linux,cma is the dma-heap allocator, which allows dmaheap-cma ++ * to only have to worry about importing. ++ * ++ * Annoyingly, should the cma heap size be specified on the kernel command line ++ * instead of DT, the heap gets named "reserved" instead. ++ */ ++static constexpr std::array<const char *, 2> heapNames = { ++ "/dev/dma_heap/linux,cma", ++ "/dev/dma_heap/reserved" ++}; ++ ++namespace libcamera { ++ ++LOG_DEFINE_CATEGORY(DmaHeap) ++ ++/** ++ * \class DmaHeap ++ * \brief Helper class for CMA dma-heap allocations ++ */ ++ ++/** ++ * \brief Construct a DmaHeap that owns a CMA dma-heap file descriptor ++ * ++ * Goes through the internal list of possible names of the CMA dma-heap devices ++ * until a CMA dma-heap device is successfully opened. If it fails to open any ++ * dma-heap device, an invalid DmaHeap object is constructed. A valid DmaHeap ++ * object owns a wrapped dma-heap file descriptor. ++ * ++ * Please check the new DmaHeap object with \ref DmaHeap::isValid before using it. ++ */ ++DmaHeap::DmaHeap() ++{ ++ for (const char *name : heapNames) { ++ int ret = ::open(name, O_RDWR | O_CLOEXEC, 0); ++ if (ret < 0) { ++ ret = errno; ++ LOG(DmaHeap, Debug) ++ << "Failed to open " << name << ": " ++ << strerror(ret); ++ continue; ++ } ++ ++ dmaHeapHandle_ = UniqueFD(ret); ++ break; ++ } ++ ++ if (!dmaHeapHandle_.isValid()) ++ LOG(DmaHeap, Error) << "Could not open any dmaHeap device"; ++} ++ ++/** ++ * \brief Destroy the DmaHeap instance ++ * ++ * Destroying a DmaHeap instance which owns a wrapped dma-heap file descriptor ++ * closes the descriptor automatically. ++ */ ++DmaHeap::~DmaHeap() = default; ++ ++/** ++ * \fn DmaHeap::isValid() ++ * \brief Check if the DmaHeap instance is valid ++ * \return True if the DmaHeap is valid, false otherwise ++ */ ++ ++/** ++ * \brief Allocate a dma-buf from the DmaHeap ++ * \param [in] name The name to set for the allocated buffer ++ * \param [in] size The size of the buffer to allocate ++ * \return The \ref UniqueFD of the allocated buffer ++ * ++ * Allocates a dma-buf with read/write access. ++ * If the allocation fails returns invalid UniqueFD. ++ */ ++UniqueFD DmaHeap::alloc(const char *name, std::size_t size) ++{ ++ int ret; ++ ++ if (!name) ++ return {}; ++ ++ struct dma_heap_allocation_data alloc = {}; ++ ++ alloc.len = size; ++ alloc.fd_flags = O_CLOEXEC | O_RDWR; ++ ++ ret = ::ioctl(dmaHeapHandle_.get(), DMA_HEAP_IOCTL_ALLOC, &alloc); ++ if (ret < 0) { ++ LOG(DmaHeap, Error) << "dmaHeap allocation failure for " << name; ++ return {}; ++ } ++ ++ UniqueFD allocFd(alloc.fd); ++ ret = ::ioctl(allocFd.get(), DMA_BUF_SET_NAME, name); ++ if (ret < 0) { ++ LOG(DmaHeap, Error) << "dmaHeap naming failure for " << name; ++ return {}; ++ } ++ ++ return allocFd; ++} ++ ++} /* namespace libcamera */ +diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build +index 45f63e93..3c5e43df 100644 +--- a/src/libcamera/meson.build ++++ b/src/libcamera/meson.build +@@ -17,6 +17,7 @@ libcamera_sources = files([ + 'delayed_controls.cpp', + 'device_enumerator.cpp', + 'device_enumerator_sysfs.cpp', ++ 'dma_heaps.cpp', + 'fence.cpp', + 'formats.cpp', + 'framebuffer.cpp', +diff --git a/src/libcamera/pipeline/rpi/vc4/dma_heaps.cpp b/src/libcamera/pipeline/rpi/vc4/dma_heaps.cpp +deleted file mode 100644 +index 317b1fc1..00000000 +--- a/src/libcamera/pipeline/rpi/vc4/dma_heaps.cpp ++++ /dev/null +@@ -1,90 +0,0 @@ +-/* SPDX-License-Identifier: LGPL-2.1-or-later */ +-/* +- * Copyright (C) 2020, Raspberry Pi Ltd +- * +- * dma_heaps.h - Helper class for dma-heap allocations. +- */ +- +-#include "dma_heaps.h" +- +-#include <array> +-#include <fcntl.h> +-#include <linux/dma-buf.h> +-#include <linux/dma-heap.h> +-#include <sys/ioctl.h> +-#include <unistd.h> +- +-#include <libcamera/base/log.h> +- +-/* +- * /dev/dma-heap/linux,cma is the dma-heap allocator, which allows dmaheap-cma +- * to only have to worry about importing. +- * +- * Annoyingly, should the cma heap size be specified on the kernel command line +- * instead of DT, the heap gets named "reserved" instead. +- */ +-static constexpr std::array<const char *, 2> heapNames = { +- "/dev/dma_heap/linux,cma", +- "/dev/dma_heap/reserved" +-}; +- +-namespace libcamera { +- +-LOG_DECLARE_CATEGORY(RPI) +- +-namespace RPi { +- +-DmaHeap::DmaHeap() +-{ +- for (const char *name : heapNames) { +- int ret = ::open(name, O_RDWR | O_CLOEXEC, 0); +- if (ret < 0) { +- ret = errno; +- LOG(RPI, Debug) << "Failed to open " << name << ": " +- << strerror(ret); +- continue; +- } +- +- dmaHeapHandle_ = UniqueFD(ret); +- break; +- } +- +- if (!dmaHeapHandle_.isValid()) +- LOG(RPI, Error) << "Could not open any dmaHeap device"; +-} +- +-DmaHeap::~DmaHeap() = default; +- +-UniqueFD DmaHeap::alloc(const char *name, std::size_t size) +-{ +- int ret; +- +- if (!name) +- return {}; +- +- struct dma_heap_allocation_data alloc = {}; +- +- alloc.len = size; +- alloc.fd_flags = O_CLOEXEC | O_RDWR; +- +- ret = ::ioctl(dmaHeapHandle_.get(), DMA_HEAP_IOCTL_ALLOC, &alloc); +- if (ret < 0) { +- LOG(RPI, Error) << "dmaHeap allocation failure for " +- << name; +- return {}; +- } +- +- UniqueFD allocFd(alloc.fd); +- ret = ::ioctl(allocFd.get(), DMA_BUF_SET_NAME, name); +- if (ret < 0) { +- LOG(RPI, Error) << "dmaHeap naming failure for " +- << name; +- return {}; +- } +- +- return allocFd; +-} +- +-} /* namespace RPi */ +- +-} /* namespace libcamera */ +diff --git a/src/libcamera/pipeline/rpi/vc4/meson.build b/src/libcamera/pipeline/rpi/vc4/meson.build +index cdb049c5..386e2296 100644 +--- a/src/libcamera/pipeline/rpi/vc4/meson.build ++++ b/src/libcamera/pipeline/rpi/vc4/meson.build +@@ -1,7 +1,6 @@ + # SPDX-License-Identifier: CC0-1.0 + + libcamera_sources += files([ +- 'dma_heaps.cpp', + 'vc4.cpp', + ]) + +diff --git a/src/libcamera/pipeline/rpi/vc4/vc4.cpp b/src/libcamera/pipeline/rpi/vc4/vc4.cpp +index 26102ea7..3a42e75e 100644 +--- a/src/libcamera/pipeline/rpi/vc4/vc4.cpp ++++ b/src/libcamera/pipeline/rpi/vc4/vc4.cpp +@@ -12,12 +12,11 @@ + #include <libcamera/formats.h> + + #include "libcamera/internal/device_enumerator.h" ++#include "libcamera/internal/dma_heaps.h" + + #include "../common/pipeline_base.h" + #include "../common/rpi_stream.h" + +-#include "dma_heaps.h" +- + using namespace std::chrono_literals; + + namespace libcamera { +@@ -87,7 +86,7 @@ public: + RPi::Device<Isp, 4> isp_; + + /* DMAHEAP allocation helper. */ +- RPi::DmaHeap dmaHeap_; ++ DmaHeap dmaHeap_; + SharedFD lsTable_; + + struct Config { +-- +2.43.2 + |