summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacopo Mondi <jacopo@jmondi.org>2020-08-28 17:39:53 +0200
committerJacopo Mondi <jacopo@jmondi.org>2020-08-28 18:19:13 +0200
commit2ad832fa6e9c06b671d61aac3cf9eac5a36a6b86 (patch)
treed48c6b8d47676d6acbcc8e5c9f41fa252e2ab743
parent1e8c91b65695449c5246d17ba7dc439c8058b781 (diff)
libcamera: raspberrypi: dmaheaps: Improve device open
Improve the device opening at class construction time by testing all the available device paths and printout the appropriate error message. While at it, initialize dmaHeapHandle_ to -1 and check for its value at destruction time. Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
-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_);
}