[libcamera-devel] [PATCH v2 1/3] libcamera: raspberrypi: dmaheaps: Improve device open

Jacopo Mondi jacopo at jmondi.org
Fri Aug 28 17:51:34 CEST 2020


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 it's value
at destruction time.

Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
---
 .../pipeline/raspberrypi/dma_heaps.cpp        | 28 +++++++++++++------
 1 file changed, 20 insertions(+), 8 deletions(-)

diff --git a/src/libcamera/pipeline/raspberrypi/dma_heaps.cpp b/src/libcamera/pipeline/raspberrypi/dma_heaps.cpp
index 6769c04640f1..4d5dd6cb87cc 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_);
 }
 
-- 
2.28.0



More information about the libcamera-devel mailing list