[RFC PATCH v1 00/14] Enable drm/imagination BXM-4-64 Support for LicheePi 4A

From: Michal Wilczynski
Date: Tue Dec 03 2024 - 08:42:19 EST


The LicheePi 4A board, featuring the T-HEAD TH1520 SoC, includes an Imagination
Technologies BXM-4-64 GPU. Initial support for this GPU was provided through a
downstream driver [1]. Recently, efforts have been made to upstream support for
the Rogue family GPUs, which the BXM-4-64 is part of [2].

While the initial upstream driver focused on the AXE-1-16 GPU, newer patches
have introduced support for the BXS-4-64 GPU [3]. The modern upstream
drm/imagination driver is expected to support the BXM-4-64 as well [4][5]. As
this support is being developed, it's crucial to upstream the necessary glue
code including clock and power-domain drivers so they're ready for integration
with the drm/imagination driver.

Recent Progress:

Firmware Improvements:
Since August, the vendor has provided updated firmware
[6][7] that correctly initiates the firmware for the BXM-4-64.

Mesa Driver Testing:
The vendor-supplied Mesa driver [8] partially works with Vulkan examples, such
as rendering a triangle using Sascha Willems' Vulkan samples [9]. Although the
triangle isn't rendered correctly (only the blue background appears), shader
job submissions function properly, and IOCTL calls are correctly invoked. For
testing, we used the following resources:

Kernel Source: Custom kernel with necessary modifications [10].
Mesa Driver: Vendor-provided Mesa implementation [11].

Dependencies:
Testing required a functional Display Processing Unit (DPU) and HDMI driver,
which are currently not upstreamed. Efforts are underway to upstream the DPU
DC8200 driver used in StarFive boards [12], which is the same DPU used on the
LicheePi 4A. Once the DPU and HDMI drivers are upstreamed, GPU support can be
fully upstream.

Testing Status:
This series has been tested by performing a probe-only operation, confirming
that the firmware begins execution. The probe function initiates firmware
execution and waits for the firmware to flip a specific status bit.

[ 12.637880] powervr ffef400000.gpu: [drm] loaded firmware powervr/rogue_36.52.104.182_v1.fw
[ 12.648979] powervr ffef400000.gpu: [drm] FW version v1.0 (build 6645434 OS)
[ 12.678906] [drm] Initialized powervr 1.0.0 for ffef400000.gpu on minor 0

Power Management:
Full power management capabilities require implementing the T-HEAD SoC AON
protocol messaging via the hardware mailbox. While support for the mailbox was
merged in kernel 6.13 [13], the AON protocol implementation is still in development.
Therefore, this series focuses on preparing the groundwork without full power
management support at this time.

References:

[1] Downstream Driver Source:
    https://gitlab.freedesktop.org/frankbinns/powervr/-/blob/cb1929932095649a24f051b9cfdd2cd2ceab35cb/drivers/gpu/drm/img-rogue/Kconfig

[2] Initial Upstream Driver Series:
    https://lore.kernel.org/all/cover.1700668843.git.donald.robson@xxxxxxxxxx/

[3] BXS-4-64 GPU Support Patches:
    https://lore.kernel.org/all/20241105-sets-bxs-4-64-patch-v1-v1-0-4ed30e865892@xxxxxxxxxx/

[4] Firmware Issue Discussion 1:
    https://gitlab.freedesktop.org/imagination/linux-firmware/-/issues/1

[5] Firmware Issue Discussion 2:
    https://gitlab.freedesktop.org/imagination/linux-firmware/-/issues/2

[6] Firmware Update Commit 1:
    https://gitlab.freedesktop.org/imagination/linux-firmware/-/commit/6ac2247e9a1d1837af495fb6d0fbd6f35547c2d1

[7] Firmware Update Commit 2:
    https://gitlab.freedesktop.org/imagination/linux-firmware/-/commit/efbebc90f25adb2b2e1499e3cc24ea3f3c3e4f4c

[8] Vendor-Provided Mesa Driver:
    https://gitlab.freedesktop.org/imagination/mesa/-/tree/dev/devinfo

[9] Sascha Willems' Vulkan Samples:     https://github.com/SaschaWillems/Vulkan

[10] Test Kernel Source:
https://github.com/mwilczy/linux/tree/2_December_reference_linux_kernel_imagination

[11] Test Mesa Driver:
https://github.com/mwilczy/mesa-reference

[12] DPU DC8200 Driver Upstream Attempt:
    https://lore.kernel.org/all/20241120061848.196754-1-keith.zhao@xxxxxxxxxxxxxxxx/

[13] Pull request kernel 6.13 for mailbox
https://lore.kernel.org/all/CABb+yY33qnivK-PzqpSMgmtbFid4nS8wcNvP7wED9DXrYAyLKg@xxxxxxxxxxxxxx/

Michal Wilczynski (14):
clk: thead: Refactor TH1520 clock driver to share common code
dt-bindings: clock: thead,th1520: Rename header file
clk: thead: Enable clock gates with regmaps
clk: thead: Add clock driver for TH1520 Video Output subsystem
dt-bindings: clock: thead,th1520: Add support for Video Output
subsystem
dt-bindings: clock: thead,th1520: Rename YAML schema file
soc: thead: power-domain: Add skeleton power-domain driver for TH1520
dt-bindings: power: thead,th1520: Add support for power domains
riscv: Enable PM_GENERIC_DOMAINS for T-Head SoCs
drm/imagination: Add support for IMG BXM-4-64 GPU
drm/imagination: Enable PowerVR driver for RISC-V
riscv: dts: Add Video Output clock and syscon regmap nodes
riscv: dts: Introduce power domain node with simple-bus compatible
riscv: dts: Add GPU node to TH1520 device tree

.../bindings/clock/thead,th1520-clk-ap.yaml | 53 ---
.../bindings/clock/thead,th1520-clk.yaml | 72 +++++
.../bindings/mailbox/thead,th1520-mbox.yaml | 2 +-
.../bindings/power/thead,th1520-power.yaml | 52 +++
MAINTAINERS | 9 +-
arch/riscv/Kconfig.socs | 1 +
arch/riscv/boot/dts/thead/th1520.dtsi | 37 ++-
drivers/clk/thead/Kconfig | 11 +
drivers/clk/thead/Makefile | 3 +-
drivers/clk/thead/clk-th1520-ap.c | 301 +-----------------
drivers/clk/thead/clk-th1520-vo.c | 168 ++++++++++
drivers/clk/thead/clk-th1520.c | 194 +++++++++++
drivers/clk/thead/clk-th1520.h | 149 +++++++++
drivers/gpu/drm/imagination/Kconfig | 2 +-
drivers/gpu/drm/imagination/pvr_drv.c | 1 +
drivers/pmdomain/Kconfig | 1 +
drivers/pmdomain/Makefile | 1 +
drivers/pmdomain/thead/Kconfig | 12 +
drivers/pmdomain/thead/Makefile | 2 +
drivers/pmdomain/thead/th1520-pm-domains.c | 195 ++++++++++++
...ead,th1520-clk-ap.h => thead,th1520-clk.h} | 34 ++
.../dt-bindings/power/thead,th1520-power.h | 19 ++
22 files changed, 960 insertions(+), 359 deletions(-)
delete mode 100644 Documentation/devicetree/bindings/clock/thead,th1520-clk-ap.yaml
create mode 100644 Documentation/devicetree/bindings/clock/thead,th1520-clk.yaml
create mode 100644 Documentation/devicetree/bindings/power/thead,th1520-power.yaml
create mode 100644 drivers/clk/thead/clk-th1520-vo.c
create mode 100644 drivers/clk/thead/clk-th1520.c
create mode 100644 drivers/clk/thead/clk-th1520.h
create mode 100644 drivers/pmdomain/thead/Kconfig
create mode 100644 drivers/pmdomain/thead/Makefile
create mode 100644 drivers/pmdomain/thead/th1520-pm-domains.c
rename include/dt-bindings/clock/{thead,th1520-clk-ap.h => thead,th1520-clk.h} (71%)
create mode 100644 include/dt-bindings/power/thead,th1520-power.h

--
2.34.1