libcamera: pipeline: raspberrypi: DmaHeaps: Use UniqueFD for a file descriptor
Manages a file descriptor owned by DmaHeaps for a dma handle by UniqueFD. Furthermore, DmaHeaps::alloc() creates a new file descriptor and the returned file descriptor is owned by a caller. This also clarifies it by changing the returned value to UniqueFD. Signed-off-by: Hirokazu Honda <hiroh@chromium.org> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Hirokazu Honda <hiroh@chromium.org> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
This commit is contained in:
committed by
Laurent Pinchart
parent
415ac12399
commit
1af788a8fb
@@ -35,7 +35,6 @@ LOG_DECLARE_CATEGORY(RPI)
|
||||
namespace RPi {
|
||||
|
||||
DmaHeap::DmaHeap()
|
||||
: dmaHeapHandle_(-1)
|
||||
{
|
||||
for (const char *name : heapNames) {
|
||||
int ret = ::open(name, O_RDWR, 0);
|
||||
@@ -46,49 +45,44 @@ DmaHeap::DmaHeap()
|
||||
continue;
|
||||
}
|
||||
|
||||
dmaHeapHandle_ = ret;
|
||||
dmaHeapHandle_ = UniqueFD(ret);
|
||||
break;
|
||||
}
|
||||
|
||||
if (dmaHeapHandle_ < 0)
|
||||
if (!dmaHeapHandle_.isValid())
|
||||
LOG(RPI, Error) << "Could not open any dmaHeap device";
|
||||
}
|
||||
|
||||
DmaHeap::~DmaHeap()
|
||||
{
|
||||
if (dmaHeapHandle_ > -1)
|
||||
::close(dmaHeapHandle_);
|
||||
}
|
||||
DmaHeap::~DmaHeap() = default;
|
||||
|
||||
FileDescriptor DmaHeap::alloc(const char *name, std::size_t size)
|
||||
UniqueFD DmaHeap::alloc(const char *name, std::size_t size)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!name)
|
||||
return FileDescriptor();
|
||||
return {};
|
||||
|
||||
struct dma_heap_allocation_data alloc = {};
|
||||
|
||||
alloc.len = size;
|
||||
alloc.fd_flags = O_CLOEXEC | O_RDWR;
|
||||
|
||||
ret = ::ioctl(dmaHeapHandle_, DMA_HEAP_IOCTL_ALLOC, &alloc);
|
||||
|
||||
ret = ::ioctl(dmaHeapHandle_.get(), DMA_HEAP_IOCTL_ALLOC, &alloc);
|
||||
if (ret < 0) {
|
||||
LOG(RPI, Error) << "dmaHeap allocation failure for "
|
||||
<< name;
|
||||
return FileDescriptor();
|
||||
return {};
|
||||
}
|
||||
|
||||
ret = ::ioctl(alloc.fd, DMA_BUF_SET_NAME, name);
|
||||
UniqueFD allocFd(alloc.fd);
|
||||
ret = ::ioctl(allocFd.get(), DMA_BUF_SET_NAME, name);
|
||||
if (ret < 0) {
|
||||
LOG(RPI, Error) << "dmaHeap naming failure for "
|
||||
<< name;
|
||||
::close(alloc.fd);
|
||||
return FileDescriptor();
|
||||
return {};
|
||||
}
|
||||
|
||||
return FileDescriptor(std::move(alloc.fd));
|
||||
return allocFd;
|
||||
}
|
||||
|
||||
} /* namespace RPi */
|
||||
|
||||
@@ -7,7 +7,9 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <libcamera/base/file_descriptor.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#include <libcamera/base/unique_fd.h>
|
||||
|
||||
namespace libcamera {
|
||||
|
||||
@@ -18,11 +20,11 @@ class DmaHeap
|
||||
public:
|
||||
DmaHeap();
|
||||
~DmaHeap();
|
||||
bool isValid() const { return dmaHeapHandle_ > -1; }
|
||||
FileDescriptor alloc(const char *name, std::size_t size);
|
||||
bool isValid() const { return dmaHeapHandle_.isValid(); }
|
||||
UniqueFD alloc(const char *name, std::size_t size);
|
||||
|
||||
private:
|
||||
int dmaHeapHandle_;
|
||||
UniqueFD dmaHeapHandle_;
|
||||
};
|
||||
|
||||
} /* namespace RPi */
|
||||
|
||||
@@ -1393,7 +1393,7 @@ int RPiCameraData::configureIPA(const CameraConfiguration *config)
|
||||
|
||||
/* Allocate the lens shading table via dmaHeap and pass to the IPA. */
|
||||
if (!lsTable_.isValid()) {
|
||||
lsTable_ = dmaHeap_.alloc("ls_grid", ipa::RPi::MaxLsGridSize);
|
||||
lsTable_ = FileDescriptor(dmaHeap_.alloc("ls_grid", ipa::RPi::MaxLsGridSize));
|
||||
if (!lsTable_.isValid())
|
||||
return -ENOMEM;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user