[PATCH v10 0/5] drm/microchip: add GFX2D support for SAM9X60 and SAM9X75

From: Cyrille Pitchen

Date: Thu Oct 08 2026 - 09:24:41 EST


Hi all,

This series of patches adds GFX2D support.
The GFX2D is a 2D GPU embedded in some Microchip SoCs such as the
SAM9X60 and SAM9X75.

Patches have been developped on top the 'linux-6.12-mchp' branch of the
https://github.com/linux4microchip/linux.git repository and tested on
mainly on a sam9x75-curiosity board and also on a sam9x60-ek board.

Later, the patches have also been rebased on the 'linux-6.18-mchp'
branch of the https://github.com/linux4microchip/linux.git repository
then tested on a sam9x75-curiosity board.

Finally, they have been rebased on top of the 'drm-misc-next' branch
of the https://gitlab.freedesktop.org/drm/misc/kernel.git repository
for mainlining. Hence, they have been tested on a sam9x75-curiosity
board running a linux4microchip 26.04 image where the kernel + DTB
have been replaced with the new kernel compiled from the 'drm-misc-next'
branch (currently based on linux 7.3.0-rc4).

About the tests, the GFX2D driver was used with the M2D (Multi 2D)
library: https://github.com/linux4sam/libm2d

This is an open source library that abstracts 2D GPUs like the Microchip
GFX2D and the Vivante GC520UL, providing graphics applications or
libraries with a unified API, inspired from OpenGL but focused on 2D GPUs.
The libm2d library itself relies on the libdrm library to send commands to
the relevant DRM driver in the Linux kernel.
The libm2d library has not been designed to be thread-safe. Indeed, it is
intended to be used by a single thread for better performances.

M2D comes with a m2d_test program to run basic unitary tests.
In addition, libm2d has been integrated to two graphics frameworks:
- EGT: https://github.com/linux4sam/egt
- LVGL: https://github.com/lvgl/lvgl/pull/8729

Tested the system suspend with the 'systemctl suspend' command.
Tested the runtime pm with the 'egt_boards' application.

BR,

Cyrille

Signed-off-by: Cyrille Pitchen <cyrille.pitchen@xxxxxxxxxxxxx>
---
Changes in v10:
- Reworked patch 2 based on sashiko comments:
+ Fixed mchp_gfx2d_cleanup_command_queue() to correctly release
resources from both the running and free command lists.
+ Replaced pm_runtime_get_no_resume() with pm_runtime_resume_and_get()
in mchp_gfx2d_thread().
+ Added locks to handle races between the IRQ handler/thread and the
suspend/resume/remove functions.
+ Added a comment to explain why flush_cache_mm() is called from
mchp_gfx2d_ioctl_sync_for_gpu().
+ Replaced enums with __u32 and added explicit padding fields in UAPI
structures.
+ Called drm_gem_handle_delete() in all error paths within
mchp_gfx2d_ioctl_import_buffer().
- Link to v9: https://lore.kernel.org/r/20261006-cpitchen-mainline_gfx2d-v9-0-74bd3df2e183@xxxxxxxxxxxxx

Changes in v9:
- Rebased onto the 'drm-misc-next' branch on 2026-10-06.
- Reworked patch 2 mainly based on sashiko comments:
+ Used 'struct drm_gem_dma_object' as the new base for 'struct
mchp_gfx2d_gem_object'.
+ Removed useless initialization of 'ret' in mchp_gfx2d_schedule().
+ Changed type of 'struct drm_mchp_gfx2d_submit.num_rectangles' from
'__kernel_size_t' to '__u32'.
+ Added missing support of special blend functions in blend commands.
+ Added helper functions to {en,de}queue commands in the running list.
+ Enabled the EXEND interrupt when partial or pending commands are
scheduled to make sure such commands can actually progress.
+ Replaced pm_runtime_resume_and_get() with pm_runtime_get_noresume()
in mchp_gfx2d_thread().
+ Added a comment about the 'BLEND_SREG' GPU internal register that
could be overwritten on SAM9X60 SoCs.
+ Fixed integer truncation of the ROP mode in
mchp_gfx2d_set_rop_params() to prevent userspace from bypassing mask
validation.
+ Added upper bound check for the number of rectangles in SUBMIT ioctl.
+ Fixed mchp_gfx2d_cleanup_command_queue() to access hardware
registers only if the peripheral clock is enabled.
+ Fixed potential corrumption of 'priv->wlist' by concurrent WAIT ioctls
on the same GEM object.
+ Kept imported surface metadata immutable after first import.
+ Changed type of 'next_id' from 'static uint32_t' to 'static
atomic_t' to avoid potential races.
+ Replaced atomic_dec() with atomic_dec_return() in
mchp_gfx2d_gem_unref().
+ Fixed potential corruption of the shared per-file 'rectangles' buffer
by concurrent SUBMIT ioctls on the same file descriptor.
+ Fixed the potential Use-After-Free of GEM object in
mchp_gfx2d_ioctl_alloc_buffer().
+ Made mchp_gfx2d_ioctl_sync_for_cpu() invalidate the CPU cache for
non-coherent buffers by calling dma_sync_single_for_cpu().
+ Made mchp_gfx2d_ioctl_sync_for_gpu() clean the CPU cache for
non-coherent buffers by calling dma_sync_single_for_device().
+ Replaced flush_cache_range() with flush_cache_mm() in
mchp_gfx2d_ioctl_sync_for_gpu() to manage the cache aliasing issue
on SAM9 (ARM926) without copying a 'struct vm_area_struct'.
- Link to v8: https://lore.kernel.org/r/20260828-cpitchen-mainline_gfx2d-v8-0-378374559738@xxxxxxxxxxxxx

Changes in v8:
- Rebased onto the 'drm-misc-next' branch on 2026-08-28.
- Collected Reviewed-by tags from Manikandan Muralidharan on patches 3
and 4
- Replaced kzalloc() with kzalloc_obj() in patch 2 as suggested by
checkpatch.pl.
- Link to v7: https://lore.kernel.org/r/20260209-cpitchen-mainline_gfx2d-v7-0-0c12e64a0950@xxxxxxxxxxxxx

Changes in v7:
- Rebased onto the 'drm-misc-next' branch on 2026-02-09.
- Rewored patch 2:
+ Reworked the former valid_pixel_format() function into the new
mchp_gfx2d_valid_buffer_params() function, which is called from both
the mchp_gfx2d_ioctl_{alloc,import}_buffer() functions and now checks
the `width` and `stride` parameters in addition to the `format` one.
+ Added the mchp_gfx2d_valid_size() function, which is called from both
the mchp_gfx2d_ioctl_{alloc,import}_buffer() functions and checks
(`stride` * `height`) against `size` as suggested by Daniel Stone.
- Link to v6: https://lore.kernel.org/r/20260120-cpitchen-mainline_gfx2d-v6-0-1a16cd1d70b8@xxxxxxxxxxxxx

Changes in v6:
- Shrank the size of the register set in the device tree from 0x4000
down to 0x100 (patches 1, 3 and 4).
- Collected Reviewed-by and Acked-by tags from Nicolas Ferre on patches
1 and 5.
- Rebased onto the 'drm-misc-next' branch on 2026-01-20.
- Link to v5: https://lore.kernel.org/r/20260113-cpitchen-mainline_gfx2d-v5-0-9cdab8fa699b@xxxxxxxxxxxxx

Changes in v5:
- Fixed compilation issues in patch 2:
+ Included <drm/drm_print.h> from mchp_gfx2d_cmd.c, mchp_gfx2d_drv.c
and mchp_gfx2d_gem.c.
+ Replaced '.remove_new' with '.remove' in definition of 'struct
platform_driver mchp_gfx2d_platform_driver' to match the latest
definition of 'struct platform_driver'.
+ Removed the '.date' member from the definition of 'struct drm_driver
mchp_gfx2d_drm_driver' since this 'date' member has been removed from
'struct drm_driver'.
- Fixed typos in doxygen documentations of two functions:
+ mchp_gfx2d_process_completed_commands()
+ mchp_gfx2d_init_command_queue()
- Link to v4: https://lore.kernel.org/r/20260112-cpitchen-mainline_gfx2d-v4-0-f210041ad343@xxxxxxxxxxxxx

Changes in v4:
- Rebased onto the 'drm-misc-next' branch on 2026-01-12.
- Link to v3: https://lore.kernel.org/r/20251124-cpitchen-mainline_gfx2d-v3-0-607f8c407286@xxxxxxxxxxxxx

Changes in v3:
- Collected Acked-by tag from Conor Dooley on patch 1
- Rebased onto the 'drm-misc-next' branch on 2025-11-24.
- Link to v2: https://lore.kernel.org/r/20250918-cpitchen-mainline_gfx2d-v2-0-6cfac9d56612@xxxxxxxxxxxxx

Changes in v2:
- Renamed microchip,gfx2d.yaml into microchip,sam9x60-gfx2d.yaml.
- Removed the 'clock-names' property from the DT bindings.
- Renamed the GPU node from 'gfx2d' to 'gpu' in sam9x{60,7}.dtsi files.
- Link to v1: https://lore.kernel.org/r/20250911-cpitchen-mainline_gfx2d-v1-0-d7fab1a381ee@xxxxxxxxxxxxx

---
Cyrille Pitchen (5):
dt-bindings: gpu: add bindings for the Microchip GFX2D GPU
drm/microchip: add a driver for the Microchip GFX2D GPU
ARM: dts: microchip: sam9x60: Add GFX2D GPU
ARM: dts: microchip: sam9x7: Add GFX2D GPU
ARM: configs: at91_dt_defconfig: enable GFX2D driver

.../bindings/gpu/microchip,sam9x60-gfx2d.yaml | 46 +
MAINTAINERS | 10 +
arch/arm/boot/dts/microchip/sam9x60.dtsi | 8 +
arch/arm/boot/dts/microchip/sam9x7.dtsi | 8 +
arch/arm/configs/at91_dt_defconfig | 1 +
drivers/gpu/drm/Kconfig | 1 +
drivers/gpu/drm/Makefile | 1 +
drivers/gpu/drm/microchip/Kconfig | 22 +
drivers/gpu/drm/microchip/Makefile | 8 +
drivers/gpu/drm/microchip/mchp_gfx2d_cmd.c | 1924 ++++++++++++++++++++
drivers/gpu/drm/microchip/mchp_gfx2d_cmd.h | 181 ++
drivers/gpu/drm/microchip/mchp_gfx2d_drv.c | 425 +++++
drivers/gpu/drm/microchip/mchp_gfx2d_drv.h | 152 ++
drivers/gpu/drm/microchip/mchp_gfx2d_gem.c | 178 ++
drivers/gpu/drm/microchip/mchp_gfx2d_gem.h | 78 +
drivers/gpu/drm/microchip/mchp_gfx2d_ioctl.c | 346 ++++
drivers/gpu/drm/microchip/mchp_gfx2d_ioctl.h | 17 +
include/uapi/drm/microchip_drm.h | 288 +++
18 files changed, 3694 insertions(+)
---
base-commit: 4f2fb106c459e6b96ddfa542de40e517b5274c44
change-id: 20250911-cpitchen-mainline_gfx2d-6631e9352af7

Best regards,
--
Cyrille Pitchen <cyrille.pitchen@xxxxxxxxxxxxx>