From patchwork Mon Sep 14 02:44:22 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wenmeng Liu X-Patchwork-Id: 28237 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id F1898C3200 for ; Mon, 14 Sep 2026 02:44:54 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id C706B68679; Mon, 14 Sep 2026 04:44:53 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=qualcomm.com header.i=@qualcomm.com header.b="Ld1ns4tZ"; dkim=pass (2048-bit key; unprotected) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="ZB7+lTQi"; dkim-atps=neutral Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id BAF376849B for ; Mon, 14 Sep 2026 04:44:52 +0200 (CEST) Received: from pps.filterd (m0279873.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68E2ejG63454068 for ; Mon, 14 Sep 2026 02:44:51 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:message-id :mime-version:subject:to; s=qcppdkim1; bh=62glGYF5iZQz+QqW4rdC7F aMTMno+z2/snvs0L3cJ+Q=; b=Ld1ns4tZ7nuwQ2cpwSq2gMgRMEm1lsKQpRl2Tt zceWEt/Im2c/AewbbblVX07xF29BjgKm29wOomW0v9IOg5pM4V3/KFktZ8iuuPJY 1FC1Q6ViF01oOLx7HARLhRUXSG7t62Rg+G/8U5PcJz0yiydGZ08db+s5QEvPRL9N tend8xD5/wCRYrmrvqxMPDhy7HJXFgulESUMEsLJ95ym+FNEH6xfEu85aqmff2OU MMPQWXQUQoSVb/f5qOiaxGcid1rZHHuCN4DuDxq+fDsO4eft82VwQ3sPAiQ5m/rr gmDBMXb3fvUTxD6fS6sD/JYeglXv1APDf7+V0PNFJz5mvOBg== Received: from mail-qv1-f72.google.com (mail-qv1-f72.google.com [209.85.219.72]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gmy9c4r9j-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 14 Sep 2026 02:44:50 +0000 (GMT) Received: by mail-qv1-f72.google.com with SMTP id 6a1803df08f44-9102f07f2fdso75093446d6.0 for ; Sun, 13 Sep 2026 19:44:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1789353890; x=1789958690; darn=lists.libcamera.org; h=cc:to:message-id:content-transfer-encoding:content-type :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to:content-type; bh=62glGYF5iZQz+QqW4rdC7FaMTMno+z2/snvs0L3cJ+Q=; b=ZB7+lTQiyWQ1gpOVXxu8OsBRqxmpmziswYX5iXNnLHBw75qBHzbvl/ttG1Mlec7jce Nqo2itcvTnbVnjIpB2DGfNcjEP9mizIvjVGq9jG/pYMIVgIlQFmR2g12dbLKo4tTQdj5 XeFoCsdXex/aAnLGB19aOsWI+nn3bW8yAYwNyYhPvZ7/q8GaS3RIlEszdq0+tbWuAaeh wC5GZnqggrMmTDaFrpSsyA3a0ekZJd47/mxR9hZqByOthG1+7P5yjjAQs+RKcX2/ifki FgFlLc4HxgZi8HcmaCE/qBXKxOYyKK10YHS8X0+jcdQIId2VXBD02nOjoj5UWjtzo62d rvsw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1789353890; x=1789958690; h=cc:to:message-id:content-transfer-encoding:content-type :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to:content-type; bh=62glGYF5iZQz+QqW4rdC7FaMTMno+z2/snvs0L3cJ+Q=; b=nFBcijDBsgZlU8rGDaVsQTCK2pWNZDJ54bqIb4MRhSWk/4e2331dk8Mh7lxJadoYg2 hy1GEAC8ueEYEYUZkFmUZBTrFftcgqoQSavrQYdlg+zhm4FwizlCU0Bt5X6yIO2WOSzy 9mS1zQkhzXk1yGC5KFUg3K3+J10OyKMQOHEwZQZa707QtSBcIg3WRh9pVbm7dcufQnc9 VTAVohNTJZ0rBTn5R+og8z20vXCGxseaLkekbvBiJoC8liTwUoyw1JAY7gGg7EzB1u6k tMpc9vR3xfAiBe4zha71w8hJ3vPIehD462hFU+wwOdBYIP43SwcOCjsVmbRUI9HeSM37 rEog== X-Gm-Message-State: AFuF++lNbySVUPt2xyTjH7sGH3SIduOqeHZy00ddGtwoGvBeJgZdcaKx odrHkfiMn8fAG08heeJ0iHtGMOVDybislUOYT7jL3bpmkNu3im4kEF82RgiIeDwTk+8k0WtuAH1 usz/ZUKTFhZi2sppD3IOEUGT5JR8bhauLDGgvrGFxj0ynxkTDNaUTJ8g7JJbRj1Ehqv1FwHwBhn KiMWbraZPz X-Gm-Gg: AYBFou3881pM6rL30Da5acjgT3a+B1fE0qIDgYbF+ivlNUjFuHPsjYvqvSdO7KIL4cH mn4QQtGmqWrrogdLLdIafGINru6mdAxq/m0a3a1RjkOZSnGFGJV59C/xTBzR6ieCXToNq3668av 5slkbeBj4f+NMRGyLvrYlYyaerjc62rH2GOd9IIG5guk6rj2EA7GbQlbV9KioAYSzH3nR9vFEKZ jio01MBy4XGjnF9+AuTAdi1flV00s+Rkm/no3dwS1yZJkAMHu1WINmxhOxVSHMeUy8pp89czXRQ ho/SiIOfDI+FMs7kpxc5ykS+OXyeATzxOk/iSGJn4lOMBZq+JyzyiAxP2S7RJfphd4EDkxiEm5O AuJU2+/Ld4qmarBRj6AYSKLEadTQSU/0XVI5Ij0AwhUxr8PMR/mnj6VlCUF3jmvb/U5q3 X-Received: by 2002:ac8:5a03:0:b0:530:6457:d96e with SMTP id d75a77b69052e-5310d783c71mr6676291cf.16.1789353889282; Sun, 13 Sep 2026 19:44:49 -0700 (PDT) X-Received: by 2002:ac8:5a03:0:b0:530:6457:d96e with SMTP id d75a77b69052e-5310d783c71mr6676051cf.16.1789353888829; Sun, 13 Sep 2026 19:44:48 -0700 (PDT) Received: from WENMLIU-LAB01.ap.qualcomm.com (Global_NAT1_IAD_FW.qualcomm.com. [129.46.232.65]) by smtp.gmail.com with ESMTPSA id d75a77b69052e-53104165737sm16766911cf.27.2026.09.13.19.44.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 13 Sep 2026 19:44:48 -0700 (PDT) From: Wenmeng Liu Date: Mon, 14 Sep 2026 10:44:22 +0800 Subject: [PATCH] libcamera: dma_buf_allocator: Make provider priority configurable MIME-Version: 1.0 Message-Id: <20260914-udma-v1-1-dca4f6609a9b@oss.qualcomm.com> X-B4-Tracking: v=1; b=H4sIAIVfp2oC/6tWKk4tykwtVrJSqFYqSi3LLM7MzwNyDHUUlJIzE vPSU3UzU4B8JSMDIzMDS0ND3dKU3ETdRAMDozQLSwMjQ6NkJaDSgqLUtMwKsDHRsbW1ANdhokJ WAAAA X-Change-ID: 20260911-udma-a002f890212c To: libcamera-devel@lists.libcamera.org, johannes.goede@oss.qualcomm.com, bryan.odonoghue@linaro.org Cc: Wenmeng Liu X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1789353886; l=11676; i=wenmeng.liu@oss.qualcomm.com; s=20250925; h=from:subject:message-id; bh=cnxDhbhcHnDBRvl9WDcLglBZw/8T9zH43oadX/LxRp8=; b=cA1yNsArG6Komvx852a+htS40DEmBdholZwjcxz/6cg+OQWs14UE6l7xS4gbGcL9dJLs2V09x fqp/+z1NJncB0eTo0BTH9ErKzCvPWdcpwTY6UohrMW/RIU5HOl72MVU X-Developer-Key: i=wenmeng.liu@oss.qualcomm.com; a=ed25519; pk=fQJjf9C3jGDjE1zj2kO3NQLTbQEaZObVcXAzx5WLPX0= X-Proofpoint-ORIG-GUID: Ndanz7MnVNecf-NnN07yriqTzv8v4IjK X-Proofpoint-GUID: Ndanz7MnVNecf-NnN07yriqTzv8v4IjK X-Authority-Analysis: v=2.4 cv=c5Y+0h9l c=1 sm=1 tr=0 ts=6aa75fa2 cx=c_pps a=7E5Bxpl4vBhpaufnMqZlrw==:117 a=C3Dk8TwHQYyIj7nOf9RCJw==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=rJkE3RaqiGZ5pbrm-msn:22 a=EUspDBNiAAAA:8 a=y8COwbpnH-QoeSrSND8A:9 a=QEXdDO2ut3YA:10 a=pJ04lnu7RYOZP9TFuWaZ:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE0MDAzNSBTYWx0ZWRfX41tqhl8Lxti9 XZdLscXu3PjfhKZXzyVmrKp9T9O32BGcDjfEVfj8hZ/YxWlwU41H8+tzQR/wSuoulU8ZQODoOQe htvFg3CUg/GjdaAec1F38xln0dTqBOdjtvEbNT224qpfQQddPQHgly6rC/Y5BykADEFiBa3eiAd 7c/QdYaQq/z9h2jeHnt8izte7JuxSqpBkrAYJcMEWoaT5U1volZ52cIKXHqqlneDbHpCdxHRBpt 0mGIf33AuRcZrHzbhCMN7sfovouTcIHhNjBzXf4+tXa4q9ytMfTn9LICEU+wSCcWGQgldS9hfeN iEnUbPFYA+4pIYhi/J3IQ2doB+jIKJxGxIOSRt+uwYdYV9haKemqbubJXB36kYDPrLUHyzDBvwt uboLgasJz5VeHdcOQeOA748azN6iUG2mD0manURlR+bURzE9DM6+MT3lpUZLloMCb63grWDduSX U9ZTHB6r1uEmSlqy82Q== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE0MDAzNSBTYWx0ZWRfX/9n88zgM+RVu UVS0davVxo4I66403MupeEWJGqPEJeubY5f8LRuNl2LTjofB9WAkSGKVgzc06IIOLHERGA1xk+H o7yEvLAWsKbuYVYUQcTGNNYeF9YJffg= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293, Aquarius:18.0.1176, Hydra:6.1.134, FMLib:17.12.100.49 definitions=2026-09-14_01,2026-09-13_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 clxscore=1011 priorityscore=1501 lowpriorityscore=0 bulkscore=0 impostorscore=0 suspectscore=0 malwarescore=0 phishscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609140035 X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" DmaBufAllocator selects a provider using a fixed priority (CMA heap, system heap, then udmabuf) and picks the first one that can be opened. On platforms with a small CMA region this is suboptimal: CMA is always chosen when present even though it may be too small, while udmabuf, backed by pageable system memory, would work. Make the provider priority order configurable. DmaBufAllocator now accepts an ordered list of preferred provider names; providers not listed are tried afterwards in the built-in order. When the list is empty the historical order is kept, so behaviour is unchanged by default. The allocator itself stays free of any configuration dependency. The priority list is read from the 'dma_buf_allocator/provider_priority' global configuration option by the components that allow multiple providers (software ISP and the virtual pipeline). This lets a platform prefer udmabuf by shipping a configuration.yaml. The set of providers stays limited to what the caller requested, so a component that requires physically-contiguous memory (CMA only) is not given a udmabuf-backed buffer. Document the new option in runtime_configuration.rst. Signed-off-by: Wenmeng Liu --- Documentation/runtime_configuration.rst | 30 +++++++++ include/libcamera/internal/dma_buf_allocator.h | 3 +- src/libcamera/dma_buf_allocator.cpp | 92 +++++++++++++++++++++----- src/libcamera/pipeline/virtual/virtual.cpp | 6 +- src/libcamera/software_isp/software_isp.cpp | 6 +- 5 files changed, 115 insertions(+), 22 deletions(-) --- base-commit: 87c7285663aaad7608fdc18d5216ec6811c685c7 change-id: 20260911-udma-a002f890212c Best regards, diff --git a/Documentation/runtime_configuration.rst b/Documentation/runtime_configuration.rst index a71b715a17245fc5fea405165323a607827a9ecb..0919f2f1ba3e817cbf37338f83a38aa1e3309b53 100644 --- a/Documentation/runtime_configuration.rst +++ b/Documentation/runtime_configuration.rst @@ -33,6 +33,9 @@ file structure: :: configuration: + dma_buf_allocator: + provider_priority: + - ... # dma-buf provider name: cma, system, or udmabuf ipa: force_isolation: # true/false config_paths: @@ -62,6 +65,11 @@ Configuration file example --- version: 1 configuration: + dma_buf_allocator: + provider_priority: + - udmabuf + - cma + - system ipa: config_paths: - /home/user/.libcamera/share/ipa @@ -150,6 +158,28 @@ LIBCAMERA_SOFTISP_MODE, software_isp.mode Example value: ``gpu`` +dma_buf_allocator.provider_priority + Define an ordered list of dma-buf providers to try when libcamera + allocates buffers internally (for example for the software ISP). The + first requested provider that is available on the system is used. Valid + provider names are ``cma`` (CMA dma-heap), ``system`` (system dma-heap) + and ``udmabuf`` (memfd + /dev/udmabuf). Providers accepted by a component + but not listed here are tried after the listed ones, in libcamera's + built-in order. + + This is useful on platforms with a small CMA region, where preferring + ``udmabuf`` avoids exhausting the CMA heap. + + Example value: + + :: + + dma_buf_allocator: + provider_priority: + - udmabuf + - cma + - system + pipelines.simple.supported_devices.driver, pipelines.simple.supported_devices.software_isp Override whether software ISP is enabled for the given driver. diff --git a/include/libcamera/internal/dma_buf_allocator.h b/include/libcamera/internal/dma_buf_allocator.h index 13600915a066d61c6f0dac2bfc7ec21d7fef33ef..a713675c77e174170356d5e191b5a9756a8b8e2e 100644 --- a/include/libcamera/internal/dma_buf_allocator.h +++ b/include/libcamera/internal/dma_buf_allocator.h @@ -31,7 +31,8 @@ public: using DmaBufAllocatorFlags = Flags; - DmaBufAllocator(DmaBufAllocatorFlags flags = DmaBufAllocatorFlag::CmaHeap); + DmaBufAllocator(DmaBufAllocatorFlags flags = DmaBufAllocatorFlag::CmaHeap, + const std::vector &providerPriority = {}); ~DmaBufAllocator(); bool isValid() const { return providerHandle_.isValid(); } UniqueFD alloc(const char *name, std::size_t size); diff --git a/src/libcamera/dma_buf_allocator.cpp b/src/libcamera/dma_buf_allocator.cpp index c673d23ec761e62b746f8984dfbdd0b01a858a38..ae33fc5d95be1ad8ea67c01d87d004733aedc217 100644 --- a/src/libcamera/dma_buf_allocator.cpp +++ b/src/libcamera/dma_buf_allocator.cpp @@ -8,13 +8,16 @@ #include "libcamera/internal/dma_buf_allocator.h" +#include #include #include +#include #include #include #include #include #include +#include #include #include @@ -51,6 +54,26 @@ static constexpr std::array providerInfos = { { { DmaBufAllocator::DmaBufAllocatorFlag::UDmaBuf, "/dev/udmabuf" }, } }; +/* Built-in provider priority, used when no other order is specified. */ +static constexpr std::array + defaultProviderPriority = { { + DmaBufAllocator::DmaBufAllocatorFlag::CmaHeap, + DmaBufAllocator::DmaBufAllocatorFlag::SystemHeap, + DmaBufAllocator::DmaBufAllocatorFlag::UDmaBuf, + } }; + +static std::optional +providerFromName(const std::string &name) +{ + if (name == "cma") + return DmaBufAllocator::DmaBufAllocatorFlag::CmaHeap; + if (name == "system") + return DmaBufAllocator::DmaBufAllocatorFlag::SystemHeap; + if (name == "udmabuf") + return DmaBufAllocator::DmaBufAllocatorFlag::UDmaBuf; + return {}; +} + LOG_DEFINE_CATEGORY(DmaBufAllocator) /** @@ -84,35 +107,70 @@ LOG_DEFINE_CATEGORY(DmaBufAllocator) /** * \brief Construct a DmaBufAllocator of a given type * \param[in] type The type(s) of the dma-buf providers to allocate from + * \param[in] providerPriority Ordered list of preferred provider names * * The dma-buf provider type is selected with the \a type parameter, which * defaults to the CMA heap. If no provider of the given type can be accessed, * the constructed DmaBufAllocator instance is invalid as indicated by * the isValid() function. * - * Multiple types can be selected by combining type flags, in which case - * the constructed DmaBufAllocator will match one of the types. If multiple - * requested types can work on the system, which provider is used is undefined. + * Multiple types can be selected by combining type flags. In that case the + * provider to use is chosen by priority: the names listed in \a + * providerPriority (valid names are "cma", "system" and "udmabuf") take + * precedence, followed by libcamera's built-in order (CMA heap, system heap, + * then udmabuf). The first provider that is both requested and accessible is + * used, so passing an empty \a providerPriority keeps the built-in order. */ -DmaBufAllocator::DmaBufAllocator(DmaBufAllocatorFlags type) +DmaBufAllocator::DmaBufAllocator(DmaBufAllocatorFlags type, + const std::vector &providerPriority) { - for (const auto &info : providerInfos) { - if (!(type & info.type)) - continue; + std::vector priority; - int ret = ::open(info.deviceNodeName, O_RDONLY | O_CLOEXEC, 0); - if (ret < 0) { - ret = errno; - LOG(DmaBufAllocator, Debug) - << "Failed to open " << info.deviceNodeName << ": " - << strerror(ret); + /* + * The caller can override the provider priority; providers not listed + * are appended in the built-in order, so no acceptable provider is ever + * dropped. + */ + for (const std::string &name : providerPriority) { + auto flag = providerFromName(name); + if (flag) + priority.push_back(*flag); + else + LOG(DmaBufAllocator, Warning) + << "Ignoring unknown dma-buf provider \"" + << name << "\""; + } + + for (DmaBufAllocatorFlag flag : defaultProviderPriority) { + if (std::find(priority.begin(), priority.end(), flag) == priority.end()) + priority.push_back(flag); + } + + for (DmaBufAllocatorFlag flag : priority) { + if (!(type & flag)) continue; + + for (const auto &info : providerInfos) { + if (info.type != flag) + continue; + + int ret = ::open(info.deviceNodeName, O_RDONLY | O_CLOEXEC, 0); + if (ret < 0) { + ret = errno; + LOG(DmaBufAllocator, Debug) + << "Failed to open " << info.deviceNodeName + << ": " << strerror(ret); + continue; + } + + LOG(DmaBufAllocator, Debug) << "Using " << info.deviceNodeName; + providerHandle_ = UniqueFD(ret); + type_ = info.type; + break; } - LOG(DmaBufAllocator, Debug) << "Using " << info.deviceNodeName; - providerHandle_ = UniqueFD(ret); - type_ = info.type; - break; + if (providerHandle_.isValid()) + break; } if (!providerHandle_.isValid()) diff --git a/src/libcamera/pipeline/virtual/virtual.cpp b/src/libcamera/pipeline/virtual/virtual.cpp index e25dd85a7391b61bcea50e71e6264500d1e8a5b3..815542b5520c73dd1958e06899a16169732e6c37 100644 --- a/src/libcamera/pipeline/virtual/virtual.cpp +++ b/src/libcamera/pipeline/virtual/virtual.cpp @@ -32,6 +32,7 @@ #include #include "libcamera/internal/camera.h" +#include "libcamera/internal/camera_manager.h" #include "libcamera/internal/dma_buf_allocator.h" #include "libcamera/internal/formats.h" #include "libcamera/internal/framebuffer.h" @@ -239,8 +240,9 @@ bool PipelineHandlerVirtual::created_ = false; PipelineHandlerVirtual::PipelineHandlerVirtual(CameraManager *manager) : PipelineHandler(manager), dmaBufAllocator_(DmaBufAllocator::DmaBufAllocatorFlag::CmaHeap | - DmaBufAllocator::DmaBufAllocatorFlag::SystemHeap | - DmaBufAllocator::DmaBufAllocatorFlag::UDmaBuf) + DmaBufAllocator::DmaBufAllocatorFlag::SystemHeap | + DmaBufAllocator::DmaBufAllocatorFlag::UDmaBuf, + manager->_d()->configuration().listOption({ "dma_buf_allocator", "provider_priority" }).value_or(utils::defopt)) { } diff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp index f8efd24424a3981fd3eca03d2fcf27723480d08c..2cf0dff837d76169744a37e6556ae9ab6cd09830 100644 --- a/src/libcamera/software_isp/software_isp.cpp +++ b/src/libcamera/software_isp/software_isp.cpp @@ -24,6 +24,7 @@ #include #include "libcamera/internal/bayer_format.h" +#include "libcamera/internal/camera_manager.h" #include "libcamera/internal/framebuffer.h" #include "libcamera/internal/software_isp/debayer_params.h" @@ -82,8 +83,9 @@ SoftwareIsp::SoftwareIsp(PipelineHandler *pipe, const CameraSensor *sensor, ControlInfoMap *ipaControls) : ispWorkerThread_("SWIspWorker"), dmaHeap_(DmaBufAllocator::DmaBufAllocatorFlag::CmaHeap | - DmaBufAllocator::DmaBufAllocatorFlag::SystemHeap | - DmaBufAllocator::DmaBufAllocatorFlag::UDmaBuf) + DmaBufAllocator::DmaBufAllocatorFlag::SystemHeap | + DmaBufAllocator::DmaBufAllocatorFlag::UDmaBuf, + pipe->cameraManager()->_d()->configuration().listOption({ "dma_buf_allocator", "provider_priority" }).value_or(utils::defopt)) { if (!dmaHeap_.isValid()) { LOG(SoftwareIsp, Error) << "Failed to create DmaBufAllocator object";