Raspberry Pi
Linux Kernel
DRM
GPU
Note: This is a test report, not an official solution yet.
Thanks to the ecosystem's effort. The pure Linux mainline kernel (not RPi OS kernel) works well on Raspberry Pi 4B 4GB, which I have on hands. System boots up, gets into GNOME desktop environment, has the VC4 DRM driver, connects to the HDMI (including HDMI audio). The ethernet & WiFi work as well.
It is "almost" good to be a normal computer for daily usage now. Why it is "almost"??? Because, it lacks the driver to support the V3D GPU on BCM2711, which will make the UI acting more smoothly.
Stefan has listed the supporting status at "Upstream Raspberry Pi 4 B support".
In Febuaraury of this year, Nicolas sent out the patch series "[RFC/PATCH,00/11] Raspberry PI 4 V3D enablement".
Following that, a few days later, there is the new patch series "[v3,00/15] Raspberry PI 4 V3D enablement".
Earlier this month, I participated in #EndlessOrangeWeek, a program where the entire Endless team engages in projects designed to grow our collective learning related to our skills, work and mission. I chose this topic to test the GPU on Raspberry Pi 4B.
I applied the v3 patch series based on mainline Linux kernel at tags/v5.15. Then tested the modified kernel with Ubuntu 21.10 RPi 4B image by replacing the kernel, device tree blob and initrd.
Here is my test repository: https://github.com/starnight/linux/tree/v3d-5.15
The kernel is built as aarch64 architecture with enabled CONFIG_DRM_V3D
and CONFIG_DRM_VC4
.
Then, install the kernel, initrd and device tree blob into the boot partion.
Edit the config.txt to use the modified kernel and initrd.
kernel=vmlinux-5.15.0+
initramfs initrd.imag-5.15.0+ followkernel
Comment all of the dtoverlay
in config.txt as well. I use the device tree blob from the patched kernel for this test.
Insert the SD card to Rasperry Pi 4B and power on!
Seems the kernel initialized the V3D GPU.
$ dmesg | grep v3d
[ 2.274145] [drm] Initialized v3d 1.0.0 20180419 for fec00000.gpu on minor 0
The device tree has the GPU node.
$ cat /proc/device-tree/scb/gpu@7ec00000/compatible
brcm,bcm2711-v3d
Mesa shows "GL_RENDERER: V3D 4.2
"!
$ es2_info
EGL_VERSION: 1.4
EGL_VENDOR: Mesa Project
EGL_EXTENSIONS:
EGL_ANDROID_blob_cache, EGL_CHROMIUM_sync_control, EGL_EXT_buffer_age,
EGL_EXT_image_dma_buf_import, EGL_EXT_image_dma_buf_import_modifiers,
EGL_EXT_swap_buffers_with_damage, EGL_KHR_cl_event2,
EGL_KHR_config_attribs, 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, EGL_KHR_image_base, EGL_KHR_image_pixmap,
EGL_KHR_no_config_context, EGL_KHR_reusable_sync,
EGL_KHR_surfaceless_context, EGL_KHR_swap_buffers_with_damage,
EGL_EXT_pixel_format_float, EGL_KHR_wait_sync,
EGL_MESA_configless_context, EGL_MESA_drm_image,
EGL_MESA_image_dma_buf_export, EGL_MESA_query_driver,
EGL_NOK_texture_from_pixmap
EGL_CLIENT_APIS: OpenGL OpenGL_ES
GL_VERSION: OpenGL ES 3.1 Mesa 21.2.2
GL_RENDERER: V3D 4.2
GL_EXTENSIONS:
GL_EXT_blend_minmax, GL_EXT_multi_draw_arrays,
GL_EXT_texture_compression_s3tc, GL_EXT_texture_compression_dxt1,
GL_EXT_texture_format_BGRA8888, GL_OES_compressed_ETC1_RGB8_texture,
GL_OES_depth24, GL_OES_element_index_uint, GL_OES_fbo_render_mipmap,
GL_OES_mapbuffer, GL_OES_rgb8_rgba8, GL_OES_standard_derivatives,
GL_OES_stencil8, GL_OES_texture_3D, GL_OES_texture_float,
GL_OES_texture_half_float, GL_OES_texture_half_float_linear,
GL_OES_texture_npot, GL_OES_vertex_half_float, GL_EXT_draw_instanced,
GL_EXT_texture_sRGB_decode, GL_OES_EGL_image, GL_OES_depth_texture,
GL_OES_packed_depth_stencil, GL_EXT_texture_type_2_10_10_10_REV,
GL_OES_get_program_binary, GL_APPLE_texture_max_level,
GL_EXT_discard_framebuffer, GL_EXT_read_format_bgra, GL_EXT_frag_depth,
GL_NV_fbo_color_attachments, GL_OES_EGL_image_external, GL_OES_EGL_sync,
GL_OES_vertex_array_object, GL_ANGLE_pack_reverse_row_order,
GL_ANGLE_texture_compression_dxt3, GL_ANGLE_texture_compression_dxt5,
GL_EXT_occlusion_query_boolean, GL_EXT_texture_rg, GL_EXT_unpack_subimage,
GL_NV_draw_buffers, GL_NV_read_buffer, GL_NV_read_depth,
GL_NV_read_depth_stencil, GL_NV_read_stencil, GL_EXT_draw_buffers,
GL_EXT_map_buffer_range, GL_KHR_debug,
GL_KHR_texture_compression_astc_ldr, GL_NV_pixel_buffer_object,
GL_OES_depth_texture_cube_map, GL_OES_required_internalformat,
GL_OES_surfaceless_context, GL_EXT_color_buffer_float,
GL_EXT_sRGB_write_control, GL_EXT_separate_shader_objects,
GL_EXT_shader_implicit_conversions, GL_EXT_shader_integer_mix,
GL_EXT_base_instance, GL_EXT_compressed_ETC1_RGB8_sub_texture,
GL_EXT_draw_elements_base_vertex, GL_EXT_primitive_bounding_box,
GL_EXT_shader_io_blocks, GL_EXT_texture_border_clamp,
GL_KHR_context_flush_control, GL_NV_image_formats,
GL_OES_draw_elements_base_vertex, GL_OES_primitive_bounding_box,
GL_OES_shader_io_blocks, GL_OES_texture_border_clamp,
GL_OES_texture_stencil8, GL_OES_texture_storage_multisample_2d_array,
GL_EXT_buffer_storage, GL_EXT_float_blend, GL_EXT_geometry_point_size,
GL_EXT_geometry_shader, GL_KHR_no_error,
GL_KHR_texture_compression_astc_sliced_3d, GL_OES_EGL_image_external_essl3,
GL_OES_geometry_point_size, GL_OES_geometry_shader,
GL_OES_shader_image_atomic, GL_EXT_texture_compression_s3tc_srgb,
GL_MESA_shader_integer_functions, GL_KHR_parallel_shader_compile,
GL_EXT_EGL_image_storage, GL_MESA_framebuffer_flip_y,
GL_EXT_texture_query_lod, GL_MESA_bgra
Then, test it with es2gears
.
But, the UI becomes frozen some times and the kernel shows the error "flip_done timed out
":
[drm:drm_crtc_commit_wait] *ERROR* flip_done timed out
[drm:drm_atomic_helper_wait_for_flip_done] *ERROR* [CRTC:68:crtc-3] flip_done timed out
[drm:drm_atomic_helper_wait_for_dependencies] *ERROR* [CRTC:68:crtc-3] commit wait timed out
[drm:drm_crtc_commit_wait] *ERROR* flip_done timed out
vc4-drm gpu: [drm] *ERROR* Timed out waiting for commit
I notice that this error happens when ever applications touch GL related things with ont only patched kernel, but also the pure mainline kernel. So, I filed this bug to upstream as "VC4 DRM waiting for flip down makes UI freeze a while with kernel 5.15".
I found this error is related to the commits:
So, I reverted these two commits as a workaround. After this, the "flip_done timed out" error does not appear again.
Okay! Let's play the 3D game OpenArena for test!!!
It works better than without GPU! However, the resolution has to be downgraded to 1024x576 for example. Otherwise, the UI response will be so lag.