[PATCH v3 00/16] New DRM accel driver for Texas Instruments' C7x DSPs
From: Tomeu Vizoso
Date: Fri Oct 23 2026 - 02:39:48 EST
This series adds a new DRM accel driver that supports the C7x DSPs
inside some Texas Instruments SoCs such as the J722S (the only SoC
currently supported). These can be used as accelerators for various
workloads, including machine learning inference.
This driver attaches to the DSPs through remoteproc and talks to the
firmware running on them through shared memory and a mailbox. The
firmware is the accelerator's command processor: the driver pushes Jobs
onto a per-core Ring in shared memory and rings a mailbox doorbell; the
firmware runs each Job's Kernel in the DSP's user mode on the client's
own page table, moves a Fence when the Job is done and rings back.
The kernel driver itself allocates buffers, manages contexts and submits
jobs to the DSP firmware. It also populates the per-client page tables
with io-pgtable-arm.
No carveout holds buffers any more: every buffer is the kernel driver's,
page-backed and mapped through the DSP's MMU in the client's own page
table, which answers Andrew F. Davis's question on v2. The one reserved
region the driver uses is the first 256 KiB of the IPC pool, where the
handshake, the Ring and the Context table live. A buffer that a DMA
transfer names must be physically contiguous, since the DRU does not
go through the MMU; the client asks for that at creation.
If there is more than one C7x DSP core, the driver will load balance
jobs between them with drm-gpu-scheduler.
The firmware isolates clients by using its MMU to protect their memory
and by running their kernels at a lower privilege level.
Besides executing user-generated DSP kernels, the firmware can also
execute DMA transfers at the request of userspace. These don't go via
the MMU, so are validated by the kernel driver.
The source code for the firmware running on the DSP is available at:
https://gitlab.freedesktop.org/tomeu/thames-firmware/ mostly under the MIT
license. The ABI with the firmware is defined in a shared header with
versioning.
Known limitations of this version:
- Runtime power management is not implemented (system suspend and
resume are).
- The J722S EVM does not resume from s2idle with TI's shipped
system-controller firmware, so the resume path ran only in the
driver's own tests; the suspend path ran on the board.
- The submit IOCTL waits on no sync object, which a Vulkan driver will
need.
- The 4D block move is the only DMA transfer type accepted.
- One firmware image serves both cores; a core found running another
firmware is left out after the handshake's five seconds.
- The DRU channel stride is stated for the J722S instead of queried.
- The J722S is the only SoC this version runs on.
Three additions were needed in the device tree bindings:
- power domain references for the two SoC timers the DSP firmware
drives, which the remoteproc driver does not hold;
- a second mailbox doorbell, since remoteproc's own serves rpmsg and
this firmware rings the Ring's; and
- reg entries for the AUX SRAM and the DMA engine's registers, which
the driver maps into every client's page table.
Everything else is done in userspace, as a Gallium driver (also called
thames) that is part of the Mesa3D project: https://docs.mesa3d.org/teflon.html
Userspace portion of the driver: https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/39298
Signed-off-by: Tomeu Vizoso <tomeu@xxxxxxxxxxxxxxx>
---
Changes in v3:
- Shared-memory ring and mailbox doorbell replace rpmsg
- The kernel driver writes the client page tables
- Buffers are bound at userspace-chosen DSP addresses
- Kernels run in the DSP's user mode; faults reported per job
- DRU transfers submitted by userspace, checked and translated by the kernel driver
- System suspend and resume
- Versioned firmware ABI; hardware ID reported and checked against the SoC
- Firmware rewritten bare-metal, MIT
- Link to v2: https://lore.kernel.org/r/20260114-thames-v2-0-e94a6636e050@xxxxxxxxxxxxxxx
Changes in v2:
- Add thames_accel.h UAPI header (Robert Nelson).
- Link to v1: https://lore.kernel.org/r/20260113-thames-v1-0-99390026937c@xxxxxxxxxxxxxxx
To: Bjorn Andersson <andersson@xxxxxxxxxx>
To: Mathieu Poirier <mathieu.poirier@xxxxxxxxxx>
To: Rob Herring <robh@xxxxxxxxxx>
To: Krzysztof Kozlowski <krzk+dt@xxxxxxxxxx>
To: Conor Dooley <conor+dt@xxxxxxxxxx>
To: Suman Anna <s-anna@xxxxxx>
To: Tomeu Vizoso <tomeu@xxxxxxxxxxxxxxx>
To: Oded Gabbay <ogabbay@xxxxxxxxxx>
To: Maarten Lankhorst <maarten.lankhorst@xxxxxxxxxxxxxxx>
To: Maxime Ripard <mripard@xxxxxxxxxx>
To: Thomas Zimmermann <tzimmermann@xxxxxxx>
To: David Airlie <airlied@xxxxxxxxx>
To: Simona Vetter <simona@xxxxxxxx>
To: Kees Cook <kees@xxxxxxxxxx>
To: "Gustavo A. R. Silva" <gustavoars@xxxxxxxxxx>
To: Sumit Semwal <sumit.semwal@xxxxxxxxxx>
To: Christian König <christian.koenig@xxxxxxx>
To: Jonathan Corbet <corbet@xxxxxxx>
To: Shuah Khan <skhan@xxxxxxxxxxxxxxxxxxx>
To: Randy Dunlap <rdunlap@xxxxxxxxxxxxx>
To: Nishanth Menon <nm@xxxxxx>
To: Vignesh Raghavendra <vigneshr@xxxxxx>
To: Tero Kristo <kristo@xxxxxxxxxx>
Cc: linux-remoteproc@xxxxxxxxxxxxxxx
Cc: devicetree@xxxxxxxxxxxxxxx
Cc: linux-kernel@xxxxxxxxxxxxxxx
Cc: dri-devel@xxxxxxxxxxxxxxxxxxxxx
Cc: linux-hardening@xxxxxxxxxxxxxxx
Cc: linux-media@xxxxxxxxxxxxxxx
Cc: linaro-mm-sig@xxxxxxxxxxxxxxxx
Cc: linux-doc@xxxxxxxxxxxxxxx
Cc: linux-arm-kernel@xxxxxxxxxxxxxxxxxxx
---
Tomeu Vizoso (16):
dt-bindings: remoteproc: k3-dsp: Add the L2 auxiliary and DRU regions
dt-bindings: remoteproc: k3-dsp: Allow a second sub-mailbox
dt-bindings: remoteproc: k3-dsp: Allow referencing the timers' power domains
accel/thames: Add header with IPC definitions
accel/thames: Add driver for the C7x DSPs in TI SoCs
accel/thames: Create a context per client on device open
accel/thames: Add IOCTLs for BO creation and mapping
accel/thames: Add support for submitting DMA operations
accel/thames: Add IOCTLs for job creation and submission
accel/thames: Recover from faults and timeouts
accel/thames: Add IOCTL for memory synchronization
accel/thames: Install memory mappings populated and dirty
Documentation: accel/thames: Add initial docs
arm64: dts: ti: k3-j722s: Add the AUX L2 SRAM and DRU regions
arm64: dts: ti: k3-j722s: Add second submailbox to the C7x cores
arm64: dts: ti: k3-j722s: Reference the power domains of the C7x timers
Documentation/accel/index.rst | 1 +
Documentation/accel/thames/index.rst | 47 +
.../bindings/remoteproc/ti,k3-dsp-rproc.yaml | 33 +-
MAINTAINERS | 9 +
arch/arm64/boot/dts/ti/k3-j722s-main.dtsi | 16 +-
.../boot/dts/ti/k3-j722s-ti-ipc-firmware.dtsi | 27 +-
arch/arm64/boot/dts/ti/k3-j722s.dtsi | 4 +
drivers/accel/Kconfig | 1 +
drivers/accel/Makefile | 3 +-
drivers/accel/thames/Kconfig | 27 +
drivers/accel/thames/Makefile | 12 +
drivers/accel/thames/thames_abi.h | 238 ++++
drivers/accel/thames/thames_core.c | 867 +++++++++++++
drivers/accel/thames/thames_core.h | 120 ++
drivers/accel/thames/thames_device.h | 97 ++
drivers/accel/thames/thames_drv.c | 554 ++++++++
drivers/accel/thames/thames_drv.h | 67 +
drivers/accel/thames/thames_gem.c | 1077 ++++++++++++++++
drivers/accel/thames/thames_gem.h | 77 ++
drivers/accel/thames/thames_job.c | 1319 ++++++++++++++++++++
drivers/accel/thames/thames_job.h | 81 ++
drivers/accel/thames/thames_trace.h | 77 ++
drivers/accel/thames/thames_transfers.c | 405 ++++++
drivers/accel/thames/thames_transfers.h | 52 +
include/uapi/drm/thames_accel.h | 843 +++++++++++++
25 files changed, 6043 insertions(+), 11 deletions(-)
---
base-commit: 1ecab8b0bad393750c60cc3819ce9c256595463c
change-id: 20260113-thames-334127a2d91d
Best regards,
--
Tomeu Vizoso <tomeu@xxxxxxxxxxxxxxx>