Re: [PATCH v2 4/4] arm64: dts: qcom: x1-dell-thena: bump linux,cma to 256 MiB
From: Michael Scott
Date: Fri May 22 2026 - 13:25:31 EST
On 5/21/26 5:04 AM, Bryan O'Donoghue wrote:
On 21/05/2026 02:09, Michael Scott wrote:
The 128 MiB linux,cma reserved-memory pool on dell-thena is too small
to support the camera pipeline in parallel with the normal Linux
desktop. On a freshly-booted system with GNOME running, the typical
runtime consumers — msm DRM framebuffers (Wayland triple buffering on
the eDP panel), qcom_iris video codec buffers, qcom_camss VFE
pre-allocated buffers — already occupy ~100 MiB of the pool, leaving
only ~25 MiB free.
The libcamera "simple" pipeline handler used by /dev/media0 on
dell-thena allocates four ABGR8888 frames at 1920×1088 = 32 MiB total.
That request fails on the fourth frame:
ERROR DmaBufAllocator: dma-heap allocation failure for frame-3
ERROR Allocator: Stream is not part of /base/.../camera@10 active configuration
Can't allocate buffers
Failed to start camera session
resulting in gnome-snapshot's "Could not play camera stream" and any
other libcamera-mediated app being unable to actually stream.
Bumping linux,cma to 256 MiB (a 0.9% reservation on these laptops'
typical 27 GiB RAM) leaves ~150 MiB free at runtime — sufficient for
the libcamera buffer set plus headroom for video playback or other
CMA-hungry workloads in parallel.
Tested on Dell Latitude 7455: with the 256 MiB pool, CmaFree at
GNOME-desktop idle is ~150 MiB, gnome-snapshot streams the OV02E10
camera cleanly, and `cam -c 1 --capture=2` succeeds.
The companion board files dell-inspiron-14-plus-7441 and the upstream
.dts variants inherit from x1-dell-thena.dtsi, so this changes the
pool size for every dell-thena-based laptop in one place.
Signed-off-by: Michael Scott <mike.scott@xxxxxxxxxxxxxxxx>
---
arch/arm64/boot/dts/qcom/x1-dell-thena.dtsi | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/arm64/boot/dts/qcom/x1-dell-thena.dtsi b/arch/arm64/boot/dts/qcom/x1-dell-thena.dtsi
index d6de4da02dcd..714988a81384 100644
--- a/arch/arm64/boot/dts/qcom/x1-dell-thena.dtsi
+++ b/arch/arm64/boot/dts/qcom/x1-dell-thena.dtsi
@@ -167,7 +167,7 @@ led-camera-indicator {
reserved-memory {
linux,cma {
compatible = "shared-dma-pool";
- size = <0x0 0x8000000>;
+ size = <0x0 0x10000000>;
reusable;
linux,cma-default;
};
How old is your version of libcamera ?
With CONFIG_UDMA=y you don't need a contiguous memory area at all and you will get juicy and delicious GPUISP.
I have CONFIG_UDMABUF=y enabled.
Instead of allocating in the kernel just use a better version of libcamera
┌─[deckard@inspiron14p-linux] - [~/Development/libcamera] - [Thu May 21, 13:03]
└─[$] <git:(0.7.0-multipass-v0*)> zcat /proc/config.gz | grep UDMA
CONFIG_UDMABUF=y
┌─[deckard@inspiron14p-linux] - [~/Development/libcamera] - [Thu May 21, 13:03]
└─[$] <git:(0.7.0-multipass-v0*)> cam -v
libcamera version v0.7.1
┌─[deckard@inspiron14p-linux] - [~/Development/libcamera] - [Thu May 21, 13:03]
└─[$] <git:(0.7.0-multipass-v0*)> qcam
[68:50:10.493478857] [438859] INFO Camera camera_manager.cpp:340 libcamera v0.7.1
[68:50:10.511134091] [438863] ERROR V4L2 v4l2_subdevice.cpp:1192 'ov02e10 10-0010': Unable to get rectangle 2 on pad 0/0: Inappropriate ioctl for device
[68:50:10.511201590] [438863] WARN CameraSensor camera_sensor_legacy.cpp:402 'ov02e10 10-0010': The PixelArraySize property has been defaulted to 1928x1088
[68:50:10.511206069] [438863] ERROR V4L2 v4l2_subdevice.cpp:1192 'ov02e10 10-0010': Unable to get rectangle 1 on pad 0/0: Inappropriate ioctl for device
[68:50:10.511209559] [438863] WARN CameraSensor camera_sensor_legacy.cpp:413 'ov02e10 10-0010': The PixelArrayActiveAreas property has been defaulted to (0, 0)/1928x1088
[68:50:10.511213778] [438863] ERROR V4L2 v4l2_subdevice.cpp:1192 'ov02e10 10-0010': Unable to get rectangle 0 on pad 0/0: Inappropriate ioctl for device
[68:50:10.511216590] [438863] WARN CameraSensor camera_sensor_legacy.cpp:421 'ov02e10 10-0010': Failed to retrieve the sensor crop rectangle
[68:50:10.511219559] [438863] WARN CameraSensor camera_sensor_legacy.cpp:427 'ov02e10 10-0010': The sensor kernel driver needs to be fixed
[68:50:10.511221746] [438863] WARN CameraSensor camera_sensor_legacy.cpp:429 'ov02e10 10-0010': See Documentation/sensor_driver_requirements.rst in the libcamera sources for more information
[68:50:10.511327474] [438863] WARN CameraSensorProperties camera_sensor_properties.cpp:538 No static properties available for 'ov02e10'
[68:50:10.511330599] [438863] WARN CameraSensorProperties camera_sensor_properties.cpp:540 Please consider updating the camera sensor properties database
[68:50:10.511334089] [438863] WARN CameraSensor camera_sensor_legacy.cpp:617 'ov02e10 10-0010': Rotation control not available, default to 0 degrees
[68:50:10.511340912] [438863] WARN CameraSensor camera_sensor_legacy.cpp:502 'ov02e10 10-0010': No sensor delays found in static properties. Assuming unverified defaults.
[68:50:10.512362985] [438863] WARN IPAProxy ipa_proxy.cpp:196 Configuration file 'ov02e10.yaml' not found for IPA module 'simple', falling back to '/usr/share/libcamera/ipa/simple/uncalibrated.yaml'
[68:50:10.512372828] [438863] ERROR V4L2 v4l2_subdevice.cpp:1192 'ov02e10 10-0010': Unable to get rectangle 0 on pad 0/0: Inappropriate ioctl for device
[68:50:10.512377464] [438863] WARN CameraSensor camera_sensor_legacy.cpp:881 'ov02e10 10-0010': The analogue crop rectangle has been defaulted to the active area size
[68:50:10.512386578] [438863] WARN IPASoft soft_simple.cpp:104 IPASoft: Failed to create camera sensor helper for ov02e10
[68:50:10.512505275] [438863] INFO Camera camera_manager.cpp:223 Adding camera '/base/soc@0/cci@ac16000/i2c-bus@1/camera@10' for pipeline handler simple
[68:50:10.548026157] [438859] INFO Camera camera.cpp:1216 configuring streams: (0) 1920x1088-ABGR8888/sRGB
[68:50:10.548323081] [438863] INFO IPASoft soft_simple.cpp:258 IPASoft: Exposure 1-2242, gain 16-248 (1)
[68:50:10.548402247] [438863] INFO SoftwareIsp software_isp.cpp:278 Input 1928x1088-GRBG-10-CSI2P stride 2416
Zero-copy enabled
[68:50:10.636862424] [438866] INFO eGL egl.cpp:288 EGL: EGL_VERSION: 1.5
[68:50:10.636899299] [438866] INFO eGL egl.cpp:289 EGL: EGL_VENDOR: Mesa Project
[68:50:10.636902112] [438866] INFO eGL egl.cpp:290 EGL: EGL_CLIENT_APIS: OpenGL OpenGL_ES
[68:50:10.636904768] [438866] INFO eGL egl.cpp:291 EGL: EGL_EXTENSIONS: EGL_ANDROID_blob_cache EGL_ANDROID_native_fence_sync EGL_EXT_config_select_group EGL_EXT_create_context_robustness EGL_EXT_image_dma_buf_import EGL_EXT_image_dma_buf_import_modifiers EGL_EXT_query_reset_notification_strategy EGL_EXT_surface_compression EGL_IMG_context_priority EGL_KHR_cl_event2 EGL_KHR_config_attribs EGL_KHR_context_flush_control EGL_KHR_create_context EGL_KHR_create_context_no_error EGL_KHR_fence_sync EGL_KHR_get_all_proc_addresses EGL_KHR_gl_colorspace EGL_KHR_gl_renderbuffer_image EGL_KHR_gl_texture_2D_image EGL_KHR_gl_texture_3D_image EGL_KHR_gl_texture_cubemap_image EGL_KHR_image_base EGL_KHR_no_config_context EGL_KHR_reusable_sync EGL_KHR_surfaceless_context EGL_EXT_pixel_format_float EGL_KHR_wait_sync EGL_MESA_configless_context EGL_MESA_gl_interop EGL_MESA_image_dma_buf_export EGL_MESA_query_driver EGL_MESA_x11_native_visual_id EGL_NV_context_priority_realtime
[68:50:10.643064652] [438866] INFO eGL egl.cpp:332 EGL: GL_VERSION: OpenGL ES 3.2 Mesa 26.0.6-arch1.1
[68:50:12.667202273] [438866] INFO Benchmark benchmark.cpp:89 Debayer processed 30 frames in 228802us, 7626 us/frame
┌─[deckard@inspiron14p-linux] - [~/Development/libcamera] - [Thu May 21, 13:03]
└─[$] <git:(0.7.0-multipass-v0*)>
Good point about the libcamera version. I debugged this on Ubuntu 26.04 (v0.7.0+patches). I tried testing v0.7.1, but it caused a crash due to API changes with other parts of the subsystem. I checked the diff of upstream between v0.7.0 and v0.7.1 for the dma allocator code and I didn't see any changes, but I wasn't looking at the software ISP changes.
This highlights that "I'm doing this wrong". I'll move to a cleaner rolling distro where staying current is a lot easier.
The GPUISP support looks great!
Dropping this patch as I'm not understanding the full allocator story. Sorry for the noise.