summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libcamera/pipeline/raspberrypi/dma_heaps.cpp28
1 files changed, 20 insertions, 8 deletions
diff --git a/src/libcamera/pipeline/raspberrypi/dma_heaps.cpp b/src/libcamera/pipeline/raspberrypi/dma_heaps.cpp
index 6769c046..4d5dd6cb 100644
--- a/src/libcamera/pipeline/raspberrypi/dma_heaps.cpp
+++ b/src/libcamera/pipeline/raspberrypi/dma_heaps.cpp
@@ -7,6 +7,7 @@
#include "dma_heaps.h"
+#include <array>
#include <fcntl.h>
#include <linux/dma-buf.h>
#include <linux/dma-heap.h>
@@ -22,8 +23,10 @@
* Annoyingly, should the cma heap size be specified on the kernel command line
* instead of DT, the heap gets named "reserved" instead.
*/
-#define DMA_HEAP_CMA_NAME "/dev/dma_heap/linux,cma"
-#define DMA_HEAP_CMA_ALT_NAME "/dev/dma_heap/reserved"
+static constexpr std::array<const char *, 2> heapNames = {
+ "/dev/dma_heap/linux,cma",
+ "/dev/dma_heap/reserved"
+};
namespace libcamera {
@@ -32,19 +35,28 @@ LOG_DECLARE_CATEGORY(RPI)
namespace RPi {
DmaHeap::DmaHeap()
+ : dmaHeapHandle_(-1)
{
- dmaHeapHandle_ = ::open(DMA_HEAP_CMA_NAME, O_RDWR, 0);
- if (dmaHeapHandle_ == -1) {
- dmaHeapHandle_ = ::open(DMA_HEAP_CMA_ALT_NAME, O_RDWR, 0);
- if (dmaHeapHandle_ == -1) {
- LOG(RPI, Error) << "Could not open dmaHeap device";
+ for (const char *name : heapNames) {
+ int ret = ::open(name, O_RDWR, 0);
+ if (ret < 0) {
+ ret = errno;
+ LOG(RPI, Debug) << "Failed to open " << name << ": "
+ << strerror(ret);
+ continue;
}
+
+ dmaHeapHandle_ = ret;
+ break;
}
+
+ if (dmaHeapHandle_ < 0)
+ LOG(RPI, Error) << "Could not open any dmaHeap device";
}
DmaHeap::~DmaHeap()
{
- if (dmaHeapHandle_)
+ if (dmaHeapHandle_ > -1)
::close(dmaHeapHandle_);
}