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>
This commit is contained in:
Jacopo Mondi
2020-08-28 17:39:53 +02:00
parent 1e8c91b656
commit 2ad832fa6e

View File

@@ -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_);
}