Try   HackMD

Enable graphics acceleration on Raspberry Pi 4B

tags: 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.

Build the kernel

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.

Applied cleanly:

Fixed conflict and applied:

Just the build config:

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.

Prepare the system boot path

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!

Check the V3D

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.

Recap

  • The v5.15 and latest mainline kernel with fixed conflict patches and fixed "flip_done timed out" bug can play the v3d gpu on Ubuntu 21.10. So, the device tree part & binding in the patch series are okay.
  • However, the patch [v3,11/15] drm/v3d: Get rid of pm code makes me thinking: Is there any better way to do that. And, this might be why upstream did not merge the patch series.
  • Have to find out why the v3d gpu of modified kernel works with Ubuntu, but does not work with other distros, like Endless OS. Problems in mesa, libdrm, Xorg/Wayland or any other packages?
    • Mesa: Installed the same Mesa 21.2.2-1ubuntu1
    • libdrm: Installed the same libdrm 2.4.107-8ubuntu1
    • Xorg/Wayland (both run with Wayland):
      • Ubuntu Impish has xwayland 2:1.20.13-1ubuntu1
      • Endless OS has xwayland 2:1.20.11-1endless1bem1