diff options
author | Jacopo Mondi <jacopo@jmondi.org> | 2020-08-28 17:39:53 +0200 |
---|---|---|
committer | Jacopo Mondi <jacopo@jmondi.org> | 2020-08-28 18:19:13 +0200 |
commit | 2ad832fa6e9c06b671d61aac3cf9eac5a36a6b86 (patch) | |
tree | d48c6b8d47676d6acbcc8e5c9f41fa252e2ab743 | |
parent | 1e8c91b65695449c5246d17ba7dc439c8058b781 (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.cpp | 28 |
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_); } |