| From: |
| Sarah Walker <sarah.walker-AT-imgtec.com> |
| To: |
| <dri-devel-AT-lists.freedesktop.org> |
| Subject: |
| [PATCH v6 00/20] Imagination Technologies PowerVR DRM driver |
| Date: |
| Wed, 06 Sep 2023 10:55:22 +0100 |
| Message-ID: |
| <20230906095542.3280699-1-sarah.walker@imgtec.com> |
| Cc: |
| <frank.binns-AT-imgtec.com>, <donald.robson-AT-imgtec.com>, <boris.brezillon-AT-collabora.com>, <airlied-AT-gmail.com>, <daniel-AT-ffwll.ch>, <robh+dt-AT-kernel.org>, <krzysztof.kozlowski+dt-AT-linaro.org>, <conor+dt-AT-kernel.org>, <maarten.lankhorst-AT-linux.intel.com>, <mripard-AT-kernel.org>, <tzimmermann-AT-suse.de>, <corbet-AT-lwn.net>, <christian.koenig-AT-amd.com>, <linus.walleij-AT-linaro.org>, <matt.coster-AT-imgtec.com>, <linux-kernel-AT-vger.kernel.org>, <devicetree-AT-vger.kernel.org>, <linux-doc-AT-vger.kernel.org>, <faith.ekstrand-AT-collabora.com>, <afd-AT-ti.com>, <hns-AT-goldelico.com>, <matthew.brost-AT-intel.com>, <luben.tuikov-AT-amd.com>, <dakr-AT-redhat.com> |
| Archive-link: |
| Article |
This patch series adds the initial DRM driver for Imagination Technologies PowerVR
GPUs, starting with those based on our Rogue architecture. It's worth pointing
out that this is a new driver, written from the ground up, rather than a
refactored version of our existing downstream driver (pvrsrvkm).
This new DRM driver supports:
- GEM shmem allocations
- dma-buf / PRIME
- Per-context userspace managed virtual address space
- DRM sync objects (binary and timeline)
- Power management suspend / resume
- GPU job submission (geometry, fragment, compute, transfer)
- META firmware processor
- MIPS firmware processor
- GPU hang detection and recovery
Currently our main focus is on the AXE-1-16M GPU. Testing so far has been done
using a TI SK-AM62 board (AXE-1-16M GPU). Firmware for the AXE-1-16M can be
found here:
https://gitlab.freedesktop.org/frankbinns/linux-firmware/...
A Vulkan driver that works with our downstream kernel driver has already been
merged into Mesa [1][2]. Support for this new DRM driver is being maintained in
a merge request [3], with the branch located here:
https://gitlab.freedesktop.org/frankbinns/mesa/-/tree/pow...
Job stream formats are documented at:
https://gitlab.freedesktop.org/mesa/mesa/-/blob/f8d2b42ae...
The Vulkan driver is progressing towards Vulkan 1.0. We're code complete, and
are working towards passing conformance. The current combination of this kernel
driver with the Mesa Vulkan driver (powervr-mesa-next branch) achieves 88.3% conformance.
The code in this patch series, along with the needed dts changes can be found here:
https://gitlab.freedesktop.org/sarah-walker-imgtec/powerv...
The full development history can be found here:
https://gitlab.freedesktop.org/frankbinns/powervr/-/tree/...
This patch series has dependencies on a number of patches not yet merged. They
are listed below :
drm/sched: Convert drm scheduler to use a work queue rather than kthread:
https://lore.kernel.org/dri-devel/20230404002211.3611376-...
drm/sched: Move schedule policy to scheduler / entity:
https://lore.kernel.org/dri-devel/20230404002211.3611376-...
drm/sched: Add DRM_SCHED_POLICY_SINGLE_ENTITY scheduling policy:
https://lore.kernel.org/dri-devel/20230404002211.3611376-...
drm/sched: Start run wq before TDR in drm_sched_start:
https://lore.kernel.org/dri-devel/20230404002211.3611376-...
drm/sched: Submit job before starting TDR:
https://lore.kernel.org/dri-devel/20230404002211.3611376-...
drm/sched: Add helper to set TDR timeout:
https://lore.kernel.org/dri-devel/20230404002211.3611376-...
[1] https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests...
[2] https://gitlab.freedesktop.org/mesa/mesa/-/tree/main/src/...
[3] https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests...
High level summary of changes:
v6:
* Fix a number of error paths
* Attempt to recover GPU on MMU flush command failure
* Defer freeing/releasing page table backing pages until after TLB flush
* Add memory barriers and use WRITE_ONCE() when writing to page tables
* Add Kconfig dependency on CONFIG_PM
* Fix a few issues with GPU VA manager usage
* Split up header commit due to size
* Update compatible string and driver description to match marketing name
* Use alloc_page() to allocate MIPS pagetable
* Remove obsolete documentation
v5:
* Retrieve GPU device information from firmware image header
* Address issues with DT binding and example DTS
* Update VM code for upstream GPU VA manager
* BOs are always zeroed on allocation
* Update copyright
v4:
* Implemented hang recovery via firmware hard reset
* Add support for partial render jobs
* Move to a threaded IRQ
* Remove unnecessary read/write and clock helpers
* Remove device tree elements not relevant to AXE-1-16M
* Clean up resource acquisition
* Remove unused DT binding attributes
v3:
* Use drm_sched for scheduling
* Use GPU VA manager
* Use runtime PM
* Use drm_gem_shmem
* GPU watchdog and device loss handling
* DT binding changes: remove unused attributes, add additionProperties:false
v2:
* Redesigned and simplified UAPI based on RFC feedback from XDC 2022
* Support for transfer and partial render jobs
* Support for timeline sync objects
RFC v1: https://lore.kernel.org/dri-devel/20220815165156.118212-1...
RFC v2: https://lore.kernel.org/dri-devel/20230413103419.293493-1...
v3: https://lore.kernel.org/dri-devel/20230613144800.52657-1-...
v4: https://lore.kernel.org/dri-devel/20230714142355.111382-1...
v5: https://lore.kernel.org/dri-devel/20230816082531.164695-1...
Donald Robson (1):
drm/gpuva_mgr: Helper to get range of unmap from a remap op.
Matt Coster (1):
sizes.h: Add entries between 32G and 64T
Sarah Walker (18):
dt-bindings: gpu: Add Imagination Technologies PowerVR/IMG GPU
drm/imagination/uapi: Add PowerVR driver UAPI
drm/imagination: Add skeleton PowerVR driver
drm/imagination: Get GPU resources
drm/imagination: Add GPU register headers
drm/imagination: Add firmware and MMU related headers
drm/imagination: Add FWIF headers
drm/imagination: Add GPU ID parsing and firmware loading
drm/imagination: Add GEM and VM related code
drm/imagination: Implement power management
drm/imagination: Implement firmware infrastructure and META FW support
drm/imagination: Implement MIPS firmware processor and MMU support
drm/imagination: Implement free list and HWRT create and destroy
ioctls
drm/imagination: Implement context creation/destruction ioctls
drm/imagination: Implement job submission and scheduling
drm/imagination: Add firmware trace header
drm/imagination: Add firmware trace to debugfs
drm/imagination: Add driver documentation
.../devicetree/bindings/gpu/img,powervr.yaml | 73 +
Documentation/gpu/drivers.rst | 2 +
Documentation/gpu/imagination/index.rst | 13 +
Documentation/gpu/imagination/uapi.rst | 174 +
MAINTAINERS | 10 +
drivers/gpu/drm/Kconfig | 2 +
drivers/gpu/drm/Makefile | 1 +
drivers/gpu/drm/imagination/Kconfig | 17 +
drivers/gpu/drm/imagination/Makefile | 35 +
drivers/gpu/drm/imagination/pvr_ccb.c | 641 ++
drivers/gpu/drm/imagination/pvr_ccb.h | 71 +
drivers/gpu/drm/imagination/pvr_cccb.c | 267 +
drivers/gpu/drm/imagination/pvr_cccb.h | 109 +
drivers/gpu/drm/imagination/pvr_context.c | 464 ++
drivers/gpu/drm/imagination/pvr_context.h | 205 +
drivers/gpu/drm/imagination/pvr_debugfs.c | 53 +
drivers/gpu/drm/imagination/pvr_debugfs.h | 29 +
drivers/gpu/drm/imagination/pvr_device.c | 651 ++
drivers/gpu/drm/imagination/pvr_device.h | 704 ++
drivers/gpu/drm/imagination/pvr_device_info.c | 254 +
drivers/gpu/drm/imagination/pvr_device_info.h | 186 +
drivers/gpu/drm/imagination/pvr_drv.c | 1513 ++++
drivers/gpu/drm/imagination/pvr_drv.h | 129 +
drivers/gpu/drm/imagination/pvr_free_list.c | 625 ++
drivers/gpu/drm/imagination/pvr_free_list.h | 195 +
drivers/gpu/drm/imagination/pvr_fw.c | 1470 ++++
drivers/gpu/drm/imagination/pvr_fw.h | 508 ++
drivers/gpu/drm/imagination/pvr_fw_info.h | 135 +
drivers/gpu/drm/imagination/pvr_fw_meta.c | 554 ++
drivers/gpu/drm/imagination/pvr_fw_meta.h | 14 +
drivers/gpu/drm/imagination/pvr_fw_mips.c | 252 +
drivers/gpu/drm/imagination/pvr_fw_mips.h | 48 +
.../gpu/drm/imagination/pvr_fw_startstop.c | 304 +
.../gpu/drm/imagination/pvr_fw_startstop.h | 13 +
drivers/gpu/drm/imagination/pvr_fw_trace.c | 515 ++
drivers/gpu/drm/imagination/pvr_fw_trace.h | 78 +
drivers/gpu/drm/imagination/pvr_gem.c | 409 ++
drivers/gpu/drm/imagination/pvr_gem.h | 191 +
drivers/gpu/drm/imagination/pvr_hwrt.c | 549 ++
drivers/gpu/drm/imagination/pvr_hwrt.h | 165 +
drivers/gpu/drm/imagination/pvr_job.c | 773 ++
drivers/gpu/drm/imagination/pvr_job.h | 161 +
drivers/gpu/drm/imagination/pvr_mmu.c | 2593 +++++++
drivers/gpu/drm/imagination/pvr_mmu.h | 108 +
drivers/gpu/drm/imagination/pvr_params.c | 147 +
drivers/gpu/drm/imagination/pvr_params.h | 72 +
drivers/gpu/drm/imagination/pvr_power.c | 433 ++
drivers/gpu/drm/imagination/pvr_power.h | 41 +
drivers/gpu/drm/imagination/pvr_queue.c | 1455 ++++
drivers/gpu/drm/imagination/pvr_queue.h | 179 +
.../gpu/drm/imagination/pvr_rogue_cr_defs.h | 6193 +++++++++++++++++
.../imagination/pvr_rogue_cr_defs_client.h | 159 +
drivers/gpu/drm/imagination/pvr_rogue_defs.h | 179 +
drivers/gpu/drm/imagination/pvr_rogue_fwif.h | 2208 ++++++
.../drm/imagination/pvr_rogue_fwif_check.h | 491 ++
.../drm/imagination/pvr_rogue_fwif_client.h | 371 +
.../imagination/pvr_rogue_fwif_client_check.h | 133 +
.../drm/imagination/pvr_rogue_fwif_common.h | 60 +
.../drm/imagination/pvr_rogue_fwif_dev_info.h | 113 +
.../pvr_rogue_fwif_resetframework.h | 28 +
.../gpu/drm/imagination/pvr_rogue_fwif_sf.h | 1648 +++++
.../drm/imagination/pvr_rogue_fwif_shared.h | 258 +
.../imagination/pvr_rogue_fwif_shared_check.h | 108 +
.../drm/imagination/pvr_rogue_fwif_stream.h | 78 +
.../drm/imagination/pvr_rogue_heap_config.h | 113 +
drivers/gpu/drm/imagination/pvr_rogue_meta.h | 356 +
drivers/gpu/drm/imagination/pvr_rogue_mips.h | 335 +
.../drm/imagination/pvr_rogue_mips_check.h | 58 +
.../gpu/drm/imagination/pvr_rogue_mmu_defs.h | 136 +
drivers/gpu/drm/imagination/pvr_stream.c | 285 +
drivers/gpu/drm/imagination/pvr_stream.h | 75 +
drivers/gpu/drm/imagination/pvr_stream_defs.c | 351 +
drivers/gpu/drm/imagination/pvr_stream_defs.h | 16 +
drivers/gpu/drm/imagination/pvr_sync.c | 287 +
drivers/gpu/drm/imagination/pvr_sync.h | 84 +
drivers/gpu/drm/imagination/pvr_vm.c | 963 +++
drivers/gpu/drm/imagination/pvr_vm.h | 60 +
drivers/gpu/drm/imagination/pvr_vm_mips.c | 236 +
drivers/gpu/drm/imagination/pvr_vm_mips.h | 22 +
include/drm/drm_gpuva_mgr.h | 27 +
include/linux/sizes.h | 9 +
include/uapi/drm/pvr_drm.h | 1306 ++++
82 files changed, 34336 insertions(+)
create mode 100644 Documentation/devicetree/bindings/gpu/img,powervr.yaml
create mode 100644 Documentation/gpu/imagination/index.rst
create mode 100644 Documentation/gpu/imagination/uapi.rst
create mode 100644 drivers/gpu/drm/imagination/Kconfig
create mode 100644 drivers/gpu/drm/imagination/Makefile
create mode 100644 drivers/gpu/drm/imagination/pvr_ccb.c
create mode 100644 drivers/gpu/drm/imagination/pvr_ccb.h
create mode 100644 drivers/gpu/drm/imagination/pvr_cccb.c
create mode 100644 drivers/gpu/drm/imagination/pvr_cccb.h
create mode 100644 drivers/gpu/drm/imagination/pvr_context.c
create mode 100644 drivers/gpu/drm/imagination/pvr_context.h
create mode 100644 drivers/gpu/drm/imagination/pvr_debugfs.c
create mode 100644 drivers/gpu/drm/imagination/pvr_debugfs.h
create mode 100644 drivers/gpu/drm/imagination/pvr_device.c
create mode 100644 drivers/gpu/drm/imagination/pvr_device.h
create mode 100644 drivers/gpu/drm/imagination/pvr_device_info.c
create mode 100644 drivers/gpu/drm/imagination/pvr_device_info.h
create mode 100644 drivers/gpu/drm/imagination/pvr_drv.c
create mode 100644 drivers/gpu/drm/imagination/pvr_drv.h
create mode 100644 drivers/gpu/drm/imagination/pvr_free_list.c
create mode 100644 drivers/gpu/drm/imagination/pvr_free_list.h
create mode 100644 drivers/gpu/drm/imagination/pvr_fw.c
create mode 100644 drivers/gpu/drm/imagination/pvr_fw.h
create mode 100644 drivers/gpu/drm/imagination/pvr_fw_info.h
create mode 100644 drivers/gpu/drm/imagination/pvr_fw_meta.c
create mode 100644 drivers/gpu/drm/imagination/pvr_fw_meta.h
create mode 100644 drivers/gpu/drm/imagination/pvr_fw_mips.c
create mode 100644 drivers/gpu/drm/imagination/pvr_fw_mips.h
create mode 100644 drivers/gpu/drm/imagination/pvr_fw_startstop.c
create mode 100644 drivers/gpu/drm/imagination/pvr_fw_startstop.h
create mode 100644 drivers/gpu/drm/imagination/pvr_fw_trace.c
create mode 100644 drivers/gpu/drm/imagination/pvr_fw_trace.h
create mode 100644 drivers/gpu/drm/imagination/pvr_gem.c
create mode 100644 drivers/gpu/drm/imagination/pvr_gem.h
create mode 100644 drivers/gpu/drm/imagination/pvr_hwrt.c
create mode 100644 drivers/gpu/drm/imagination/pvr_hwrt.h
create mode 100644 drivers/gpu/drm/imagination/pvr_job.c
create mode 100644 drivers/gpu/drm/imagination/pvr_job.h
create mode 100644 drivers/gpu/drm/imagination/pvr_mmu.c
create mode 100644 drivers/gpu/drm/imagination/pvr_mmu.h
create mode 100644 drivers/gpu/drm/imagination/pvr_params.c
create mode 100644 drivers/gpu/drm/imagination/pvr_params.h
create mode 100644 drivers/gpu/drm/imagination/pvr_power.c
create mode 100644 drivers/gpu/drm/imagination/pvr_power.h
create mode 100644 drivers/gpu/drm/imagination/pvr_queue.c
create mode 100644 drivers/gpu/drm/imagination/pvr_queue.h
create mode 100644 drivers/gpu/drm/imagination/pvr_rogue_cr_defs.h
create mode 100644 drivers/gpu/drm/imagination/pvr_rogue_cr_defs_client.h
create mode 100644 drivers/gpu/drm/imagination/pvr_rogue_defs.h
create mode 100644 drivers/gpu/drm/imagination/pvr_rogue_fwif.h
create mode 100644 drivers/gpu/drm/imagination/pvr_rogue_fwif_check.h
create mode 100644 drivers/gpu/drm/imagination/pvr_rogue_fwif_client.h
create mode 100644 drivers/gpu/drm/imagination/pvr_rogue_fwif_client_check.h
create mode 100644 drivers/gpu/drm/imagination/pvr_rogue_fwif_common.h
create mode 100644 drivers/gpu/drm/imagination/pvr_rogue_fwif_dev_info.h
create mode 100644 drivers/gpu/drm/imagination/pvr_rogue_fwif_resetframework.h
create mode 100644 drivers/gpu/drm/imagination/pvr_rogue_fwif_sf.h
create mode 100644 drivers/gpu/drm/imagination/pvr_rogue_fwif_shared.h
create mode 100644 drivers/gpu/drm/imagination/pvr_rogue_fwif_shared_check.h
create mode 100644 drivers/gpu/drm/imagination/pvr_rogue_fwif_stream.h
create mode 100644 drivers/gpu/drm/imagination/pvr_rogue_heap_config.h
create mode 100644 drivers/gpu/drm/imagination/pvr_rogue_meta.h
create mode 100644 drivers/gpu/drm/imagination/pvr_rogue_mips.h
create mode 100644 drivers/gpu/drm/imagination/pvr_rogue_mips_check.h
create mode 100644 drivers/gpu/drm/imagination/pvr_rogue_mmu_defs.h
create mode 100644 drivers/gpu/drm/imagination/pvr_stream.c
create mode 100644 drivers/gpu/drm/imagination/pvr_stream.h
create mode 100644 drivers/gpu/drm/imagination/pvr_stream_defs.c
create mode 100644 drivers/gpu/drm/imagination/pvr_stream_defs.h
create mode 100644 drivers/gpu/drm/imagination/pvr_sync.c
create mode 100644 drivers/gpu/drm/imagination/pvr_sync.h
create mode 100644 drivers/gpu/drm/imagination/pvr_vm.c
create mode 100644 drivers/gpu/drm/imagination/pvr_vm.h
create mode 100644 drivers/gpu/drm/imagination/pvr_vm_mips.c
create mode 100644 drivers/gpu/drm/imagination/pvr_vm_mips.h
create mode 100644 include/uapi/drm/pvr_drm.h
--
2.42.0