From: Cody Kang via B4 Relay <devnull+codykang.hk.gmail.com@kernel.org>
To: "David Airlie" <airlied@gmail.com>,
"Simona Vetter" <simona@ffwll.ch>,
"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
"Maxime Ripard" <mripard@kernel.org>,
"Thomas Zimmermann" <tzimmermann@suse.de>,
"Rob Herring" <robh@kernel.org>,
"Krzysztof Kozlowski" <krzk+dt@kernel.org>,
"Conor Dooley" <conor+dt@kernel.org>,
"Yixun Lan" <dlan@kernel.org>, "Vinod Koul" <vkoul@kernel.org>,
"Neil Armstrong" <neil.armstrong@linaro.org>,
"Haylen Chu" <heylenay@4d2.org>,
"Michael Turquette" <mturquette@baylibre.com>,
"Stephen Boyd" <sboyd@kernel.org>,
"Brian Masney" <bmasney@redhat.com>,
"Philipp Zabel" <p.zabel@pengutronix.de>,
"Paul Walmsley" <pjw@kernel.org>,
"Palmer Dabbelt" <palmer@dabbelt.com>,
"Albert Ou" <aou@eecs.berkeley.edu>,
"Alexandre Ghiti" <alex@ghiti.fr>, "Yao Zi" <me@ziyao.cc>,
"Uwe Kleine-König" <u.kleine-koenig@baylibre.com>,
"Guodong Xu" <docular.xu@gmail.com>
Cc: dri-devel@lists.freedesktop.org, linux-riscv@lists.infradead.org,
devicetree@vger.kernel.org, spacemit@lists.linux.dev,
linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org,
linux-clk@vger.kernel.org, Cody Kang <codykang.hk@gmail.com>
Subject: [PATCH v2 07/17] drm/spacemit: add Saturn DPU register model
Date: Sun, 09 Aug 2026 21:14:16 +0800 [thread overview]
Message-ID: <20260809-k3-display-v2-7-327d7910bf71@gmail.com> (raw)
In-Reply-To: <20260809-k3-display-v2-0-327d7910bf71@gmail.com>
From: Cody Kang <codykang.hk@gmail.com>
The Saturn display processing unit is programmed through a set of
register blocks (composer, RDMA, timing generator, cmdlist engine,
display MMU) laid out identically in both SoC instances. Add the block
address map, the per-field word offset and mask tables consumed by the
field accessors, the interrupt bit layout and the compositor and
output-format ID encodings. The address map describes the whole
IP block on purpose, including blocks the driver does not touch; the
field tables carry the fields the driver programs, with each block's
full word count kept as its NWORDS extent.
Consumers arrive with the following patches; the driver only becomes
buildable once the final patch adds the Kconfig and Makefile glue.
Signed-off-by: Cody Kang <codykang.hk@gmail.com>
---
v2:
- no change
---
drivers/gpu/drm/spacemit/dpu/saturn_regs/dpu_int.h | 25 ++
.../gpu/drm/spacemit/dpu/saturn_regs/reg_map_hee.h | 64 +++++
.../drm/spacemit/dpu/saturn_regs/saturn_fields.h | 298 +++++++++++++++++++++
drivers/gpu/drm/spacemit/spacemit_dpu_ids.h | 22 ++
4 files changed, 409 insertions(+)
diff --git a/drivers/gpu/drm/spacemit/dpu/saturn_regs/dpu_int.h b/drivers/gpu/drm/spacemit/dpu/saturn_regs/dpu_int.h
new file mode 100644
index 0000000000000..2c7fa00ba31e9
--- /dev/null
+++ b/drivers/gpu/drm/spacemit/dpu/saturn_regs/dpu_int.h
@@ -0,0 +1,25 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2025-2026 SpacemiT Co., Ltd.
+ *
+ */
+
+#ifndef DPU_INT_REG_H
+#define DPU_INT_REG_H
+
+#include <linux/bits.h>
+
+#define DPU_INT_CMDLIST_CH_FRM_CFG_DONE_MASK (0xff)
+#define DPU_INT_CMDLIST_CH_FRM_CFG_DONE (DPU_INT_CMDLIST_CH_FRM_CFG_DONE_MASK << 11)
+#define DPU_INT_FRM_TIMING_UNFLOW BIT(8)
+#define DPU_INT_CFG_RDY_CLR BIT(5)
+#define DPU_INT_FRM_TIMING_CFG_LINE BIT(4)
+#define DPU_INT_FRM_TIMING_CFG_EOF (BIT(2) | BIT(3))
+#define DPU_INT_FRM_TIMING_EOF BIT(1)
+#define DPU_INT_FRM_TIMING_VSYNC BIT(0)
+#define DPU_REST_INT_BITS (DPU_INT_FRM_TIMING_CFG_EOF | \
+ DPU_INT_FRM_TIMING_CFG_LINE | \
+ DPU_INT_FRM_TIMING_EOF | \
+ DPU_INT_CMDLIST_CH_FRM_CFG_DONE)
+
+#endif
diff --git a/drivers/gpu/drm/spacemit/dpu/saturn_regs/reg_map_hee.h b/drivers/gpu/drm/spacemit/dpu/saturn_regs/reg_map_hee.h
new file mode 100644
index 0000000000000..9490021cdb918
--- /dev/null
+++ b/drivers/gpu/drm/spacemit/dpu/saturn_regs/reg_map_hee.h
@@ -0,0 +1,64 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2025-2026 SpacemiT Co., Ltd.
+ *
+ */
+
+#ifndef _SATURN_REG_MAP_hee_H_
+#define _SATURN_REG_MAP_hee_H_
+
+#include "dpu_int.h"
+
+/* Base address, then bit definitions */
+
+#define DPU_TOP_BASE_ADDR 0x0
+#define DPU_CTRL_BASE_ADDR 0x3c0 /* dpu_ctl_top start address */
+#define CMDLIST_BASE_ADDR 0x500
+#define DPU_INT_BASE_ADDR 0x700
+
+#define DPU_ONLINE_IRQ_MSK (3 * 4)
+#define DPU_ONLINE_IRQ_STS (12 * 4)
+
+#define DMA_TOP_BASE_ADDR (RDMA0_BASE_ADDR + 0x280)
+
+#define RDMA0_BASE_ADDR (0x00001000)
+#define RDMA1_BASE_ADDR (RDMA0_BASE_ADDR + 0x1000)
+#define RDMA2_BASE_ADDR (RDMA0_BASE_ADDR + 0xa000)
+#define RDMA3_BASE_ADDR (RDMA0_BASE_ADDR + 0xb000)
+
+#define MMU_BASE_ADDR (0x1100)
+#define MMU_TOP_BASE_ADDR (MMU_BASE_ADDR + 0x100)
+
+#define TBU0_ADDR 0x1100
+#define TBU1_ADDR 0x1180
+#define TBU2_ADDR 0x2100
+#define TBU3_ADDR 0x2180
+#define TBU4_ADDR 0xb100
+#define TBU5_ADDR 0xb180
+#define TBU6_ADDR 0xc100
+#define TBU7_ADDR 0xc180
+
+#define CMP0_BASE_ADDR 0x00018000
+#define CMP1_BASE_ADDR (CMP0_BASE_ADDR + 0x18000)
+#define CMP2_BASE_ADDR (CMP0_BASE_ADDR + 0x30000)
+
+#define PREPIPE_SCAL0_BASE_ADDR 0x14000
+#define PREPIPE_SCAL1_BASE_ADDR 0x14400
+#define PREPIPE_SCAL2_BASE_ADDR 0x14800
+#define PREPIPE_SCAL3_BASE_ADDR 0x14c00
+
+#define POST_PIPE_ADDR (CMP1_BASE_ADDR + 0x300)
+
+#define EE_ADDR (CMP1_BASE_ADDR + 0xd00)
+
+#define DPU_SCENE_CTL_BASE_ADDR (0x300)
+#define DPU_SCENE_CTL_SIZE 0x40
+#define DPU_SCENE_CTL_ADDR(i) (DPU_SCENE_CTL_BASE_ADDR + (i) * DPU_SCENE_CTL_SIZE)
+
+#define TMG0_BASE_ADDR (0x00051000 + 0x200)
+
+#define CMDLIST_CH_Y 0x188
+#define CMDLIST_CH_START_CMPS_Y 0x90
+#define CMDLIST_CFG_READY 0x34
+
+#endif
diff --git a/drivers/gpu/drm/spacemit/dpu/saturn_regs/saturn_fields.h b/drivers/gpu/drm/spacemit/dpu/saturn_regs/saturn_fields.h
new file mode 100644
index 0000000000000..f745dfdaa83de
--- /dev/null
+++ b/drivers/gpu/drm/spacemit/dpu/saturn_regs/saturn_fields.h
@@ -0,0 +1,298 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2025-2026 SpacemiT Co., Ltd.
+ *
+ * Saturn DPU register field map: word offset and mask per field, consumed by
+ * the dpu_write()/dpu_read() accessors.
+ */
+
+#ifndef SATURN_FIELDS_H
+#define SATURN_FIELDS_H
+
+#include <linux/bits.h>
+
+/* CMDLIST_REG: 128 x 32-bit registers */
+#define CMDLIST_REG__NWORDS 128
+#define CMDLIST_REG__cmdlist_reg_0__cmdlist_ch_start_addrl_WORD(i) (0 + (i))
+#define CMDLIST_REG__cmdlist_reg_0__cmdlist_ch_start_addrl_MASK GENMASK(31, 4)
+#define CMDLIST_REG__cmdlist_reg_16__cmdlist_ch_start_addrh_WORD(i) (16 + (i))
+#define CMDLIST_REG__cmdlist_reg_16__cmdlist_ch_start_addrh_MASK GENMASK(5, 0)
+#define CMDLIST_REG__cmdlist_reg_48__cmdlist_ch_y_first_WORD(i) (48 + (i))
+#define CMDLIST_REG__cmdlist_reg_48__cmdlist_ch_y_first_MASK GENMASK(24, 12)
+
+/* CMPS_X_REG: 146 x 32-bit registers */
+#define CMPS_X_REG__NWORDS 146
+#define CMPS_X_REG__module_enable_WORD 0
+#define CMPS_X_REG__module_enable_MASK GENMASK(0, 0)
+#define CMPS_X_REG__dst_w_WORD 1
+#define CMPS_X_REG__dst_w_MASK GENMASK(15, 0)
+#define CMPS_X_REG__dst_h_WORD 1
+#define CMPS_X_REG__dst_h_MASK GENMASK(31, 16)
+#define CMPS_X_REG__bg_color_r_WORD 2
+#define CMPS_X_REG__bg_color_r_MASK GENMASK(9, 0)
+#define CMPS_X_REG__bg_color_g_WORD 3
+#define CMPS_X_REG__bg_color_g_MASK GENMASK(9, 0)
+#define CMPS_X_REG__bg_color_b_WORD 4
+#define CMPS_X_REG__bg_color_b_MASK GENMASK(9, 0)
+#define CMPS_X_REG__bg_color_a_WORD 5
+#define CMPS_X_REG__bg_color_a_MASK GENMASK(7, 0)
+#define CMPS_X_REG__layer00_area_left_WORD 8
+#define CMPS_X_REG__layer00_area_left_MASK GENMASK(15, 0)
+#define CMPS_X_REG__layer00_area_right_WORD 8
+#define CMPS_X_REG__layer00_area_right_MASK GENMASK(31, 16)
+#define CMPS_X_REG__layer00_area_top_WORD 9
+#define CMPS_X_REG__layer00_area_top_MASK GENMASK(15, 0)
+#define CMPS_X_REG__layer00_area_bottom_WORD 9
+#define CMPS_X_REG__layer00_area_bottom_MASK GENMASK(31, 16)
+#define CMPS_X_REG__layer00_solid_color_r_WORD 10
+#define CMPS_X_REG__layer00_solid_color_r_MASK GENMASK(9, 0)
+#define CMPS_X_REG__layer00_solid_color_g_WORD 11
+#define CMPS_X_REG__layer00_solid_color_g_MASK GENMASK(9, 0)
+#define CMPS_X_REG__layer00_solid_color_b_WORD 12
+#define CMPS_X_REG__layer00_solid_color_b_MASK GENMASK(9, 0)
+#define CMPS_X_REG__layer00_solid_color_a_WORD 13
+#define CMPS_X_REG__layer00_solid_color_a_MASK GENMASK(7, 0)
+#define CMPS_X_REG__layer00_blend_mode_WORD 13
+#define CMPS_X_REG__layer00_blend_mode_MASK GENMASK(15, 14)
+#define CMPS_X_REG__layer00_colorkey_en_WORD 13
+#define CMPS_X_REG__layer00_colorkey_en_MASK GENMASK(18, 18)
+#define CMPS_X_REG__layer00_en_WORD 14
+#define CMPS_X_REG__layer00_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer00_blend_sel_WORD 14
+#define CMPS_X_REG__layer00_blend_sel_MASK GENMASK(2, 1)
+#define CMPS_X_REG__layer00_solid_en_WORD 14
+#define CMPS_X_REG__layer00_solid_en_MASK GENMASK(3, 3)
+#define CMPS_X_REG__layer00_dma_id_WORD 14
+#define CMPS_X_REG__layer00_dma_id_MASK GENMASK(7, 4)
+#define CMPS_X_REG__layer00_layer_alpha_WORD 14
+#define CMPS_X_REG__layer00_layer_alpha_MASK GENMASK(15, 8)
+#define CMPS_X_REG__layer00_alpha_ratio_WORD 14
+#define CMPS_X_REG__layer00_alpha_ratio_MASK GENMASK(23, 16)
+#define CMPS_X_REG__layer01_en_WORD 21
+#define CMPS_X_REG__layer01_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer02_en_WORD 28
+#define CMPS_X_REG__layer02_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer03_en_WORD 35
+#define CMPS_X_REG__layer03_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer04_en_WORD 42
+#define CMPS_X_REG__layer04_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer05_en_WORD 49
+#define CMPS_X_REG__layer05_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer06_en_WORD 56
+#define CMPS_X_REG__layer06_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer07_en_WORD 63
+#define CMPS_X_REG__layer07_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer08_en_WORD 70
+#define CMPS_X_REG__layer08_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer09_en_WORD 77
+#define CMPS_X_REG__layer09_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer10_en_WORD 84
+#define CMPS_X_REG__layer10_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer11_en_WORD 91
+#define CMPS_X_REG__layer11_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer12_en_WORD 98
+#define CMPS_X_REG__layer12_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer13_en_WORD 105
+#define CMPS_X_REG__layer13_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer14_en_WORD 112
+#define CMPS_X_REG__layer14_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer15_en_WORD 119
+#define CMPS_X_REG__layer15_en_MASK GENMASK(0, 0)
+
+/* DMA_TOP_REG: 25 x 32-bit registers */
+#define DMA_TOP_REG__NWORDS 25
+#define DMA_TOP_REG__image_rr_ratio_WORD 1
+#define DMA_TOP_REG__image_rr_ratio_MASK GENMASK(7, 0)
+#define DMA_TOP_REG__pixel_num_th_WORD 1
+#define DMA_TOP_REG__pixel_num_th_MASK GENMASK(14, 9)
+#define DMA_TOP_REG__rdma_timeout_limit_WORD 2
+#define DMA_TOP_REG__rdma_timeout_limit_MASK GENMASK(15, 0)
+#define DMA_TOP_REG__wdma_timeout_limit_WORD 2
+#define DMA_TOP_REG__wdma_timeout_limit_MASK GENMASK(31, 16)
+
+/* DPU_CTL_REG: 15 x 32-bit registers */
+#define DPU_CTL_REG__NWORDS 15
+#define DPU_CTL_REG__nml_rch_en_WORD 0
+#define DPU_CTL_REG__nml_rch_en_MASK GENMASK(9, 0)
+#define DPU_CTL_REG__nml_scl_en_WORD 0
+#define DPU_CTL_REG__nml_scl_en_MASK GENMASK(13, 10)
+#define DPU_CTL_REG__nml_outctl_en_WORD 0
+#define DPU_CTL_REG__nml_outctl_en_MASK GENMASK(18, 18)
+#define DPU_CTL_REG__nml_frm_timing_en_WORD 0
+#define DPU_CTL_REG__nml_frm_timing_en_MASK GENMASK(25, 23)
+#define DPU_CTL_REG__both_cfg_rdy_WORD 2
+#define DPU_CTL_REG__both_cfg_rdy_MASK GENMASK(0, 0)
+#define DPU_CTL_REG__video_mod_WORD 3
+#define DPU_CTL_REG__video_mod_MASK GENMASK(0, 0)
+#define DPU_CTL_REG__dbg_mod_WORD 3
+#define DPU_CTL_REG__dbg_mod_MASK GENMASK(1, 1)
+#define DPU_CTL_REG__timing_inter0_WORD 3
+#define DPU_CTL_REG__timing_inter0_MASK GENMASK(7, 2)
+#define DPU_CTL_REG__timing_inter1_WORD 3
+#define DPU_CTL_REG__timing_inter1_MASK GENMASK(13, 8)
+#define DPU_CTL_REG__sw_start_WORD 4
+#define DPU_CTL_REG__sw_start_MASK GENMASK(0, 0)
+#define DPU_CTL_REG__nml_rch_vrt_reuse_WORD 7
+#define DPU_CTL_REG__nml_rch_vrt_reuse_MASK GENMASK(9, 0)
+
+/* DPU_CTL_TOP_REG: 53 x 32-bit registers */
+#define DPU_CTL_TOP_REG__NWORDS 53
+#define DPU_CTL_TOP_REG__dpu_ctl_top_reg_0__cmdlist_rch_en_WORD(i) (0 + (i))
+#define DPU_CTL_TOP_REG__dpu_ctl_top_reg_0__cmdlist_rch_en_MASK GENMASK(0, 0)
+#define DPU_CTL_TOP_REG__dpu_ctl_top_reg_10__cmdlist_cmps_other_en_WORD(i) (10 + (i))
+#define DPU_CTL_TOP_REG__dpu_ctl_top_reg_10__cmdlist_cmps_other_en_MASK GENMASK(0, 0)
+#define DPU_CTL_TOP_REG__dpu_ctl_top_reg_10__cmdlist_cmps_top_en_WORD(i) (10 + (i))
+#define DPU_CTL_TOP_REG__dpu_ctl_top_reg_10__cmdlist_cmps_top_en_MASK GENMASK(1, 1)
+
+/* DPU_INTP_REG: 50 x 32-bit registers */
+#define DPU_INTP_REG__NWORDS 50
+
+/* EE_REG: 51 x 32-bit registers */
+#define EE_REG__NWORDS 51
+#define EE_REG__m_benable_WORD 0
+#define EE_REG__m_benable_MASK GENMASK(0, 0)
+
+/* MMU_TBU_REG: 21 x 32-bit registers */
+#define MMU_TBU_REG__NWORDS 21
+#define MMU_TBU_REG__tbu_base_addr0_low_WORD 1
+#define MMU_TBU_REG__tbu_base_addr0_low_MASK GENMASK(31, 0)
+#define MMU_TBU_REG__tbu_base_addr0_high_WORD 2
+#define MMU_TBU_REG__tbu_base_addr0_high_MASK GENMASK(11, 0)
+#define MMU_TBU_REG__tbu_base_addr1_low_WORD 3
+#define MMU_TBU_REG__tbu_base_addr1_low_MASK GENMASK(31, 0)
+#define MMU_TBU_REG__tbu_base_addr1_high_WORD 4
+#define MMU_TBU_REG__tbu_base_addr1_high_MASK GENMASK(11, 0)
+#define MMU_TBU_REG__tbu_base_addr2_low_WORD 5
+#define MMU_TBU_REG__tbu_base_addr2_low_MASK GENMASK(31, 0)
+#define MMU_TBU_REG__tbu_base_addr2_high_WORD 6
+#define MMU_TBU_REG__tbu_base_addr2_high_MASK GENMASK(11, 0)
+#define MMU_TBU_REG__tbu_va0_WORD 7
+#define MMU_TBU_REG__tbu_va0_MASK GENMASK(31, 0)
+#define MMU_TBU_REG__tbu_va1_WORD 8
+#define MMU_TBU_REG__tbu_va1_MASK GENMASK(31, 0)
+#define MMU_TBU_REG__tbu_va2_WORD 9
+#define MMU_TBU_REG__tbu_va2_MASK GENMASK(31, 0)
+#define MMU_TBU_REG__tbu_size0_WORD 10
+#define MMU_TBU_REG__tbu_size0_MASK GENMASK(15, 0)
+#define MMU_TBU_REG__tbu_size1_WORD 11
+#define MMU_TBU_REG__tbu_size1_MASK GENMASK(15, 0)
+#define MMU_TBU_REG__tbu_size2_WORD 12
+#define MMU_TBU_REG__tbu_size2_MASK GENMASK(15, 0)
+#define MMU_TBU_REG__vsync_update_en_WORD 13
+#define MMU_TBU_REG__vsync_update_en_MASK GENMASK(1, 1)
+
+/* MMU_TOP_REG: 23 x 32-bit registers */
+#define MMU_TOP_REG__NWORDS 23
+#define MMU_TOP_REG__rdma_timelimit_WORD 0
+#define MMU_TOP_REG__rdma_timelimit_MASK GENMASK(31, 16)
+#define MMU_TOP_REG__sram0_tlb_axi_port_sel_WORD 1
+#define MMU_TOP_REG__sram0_tlb_axi_port_sel_MASK GENMASK(1, 0)
+#define MMU_TOP_REG__sram1_tlb_axi_port_sel_WORD 1
+#define MMU_TOP_REG__sram1_tlb_axi_port_sel_MASK GENMASK(3, 2)
+#define MMU_TOP_REG__dmac0_rd_outs_num_WORD 2
+#define MMU_TOP_REG__dmac0_rd_outs_num_MASK GENMASK(7, 0)
+#define MMU_TOP_REG__dmac1_rd_outs_num_WORD 3
+#define MMU_TOP_REG__dmac1_rd_outs_num_MASK GENMASK(7, 0)
+
+/* POSTPIPE_REG: 50 x 32-bit registers */
+#define POSTPIPE_REG__NWORDS 50
+#define POSTPIPE_REG__m_inwidth_WORD 13
+#define POSTPIPE_REG__m_inwidth_MASK GENMASK(15, 0)
+#define POSTPIPE_REG__m_inheight_WORD 13
+#define POSTPIPE_REG__m_inheight_MASK GENMASK(31, 16)
+
+/* RDMA_PATH_X_REG: 60 x 32-bit registers */
+#define RDMA_PATH_X_REG__NWORDS 60
+#define RDMA_PATH_X_REG__layer_mode_WORD 0
+#define RDMA_PATH_X_REG__layer_mode_MASK GENMASK(1, 0)
+#define RDMA_PATH_X_REG__layer_cmpsr_id_WORD 0
+#define RDMA_PATH_X_REG__layer_cmpsr_id_MASK GENMASK(15, 13)
+#define RDMA_PATH_X_REG__is_two_layers_WORD 1
+#define RDMA_PATH_X_REG__is_two_layers_MASK GENMASK(0, 0)
+#define RDMA_PATH_X_REG__is_offline_WORD 1
+#define RDMA_PATH_X_REG__is_offline_MASK GENMASK(1, 1)
+#define RDMA_PATH_X_REG__base_addr0_low_ly0_WORD 9
+#define RDMA_PATH_X_REG__base_addr0_low_ly0_MASK GENMASK(31, 0)
+#define RDMA_PATH_X_REG__base_addr0_high_ly0_WORD 10
+#define RDMA_PATH_X_REG__base_addr0_high_ly0_MASK GENMASK(1, 0)
+#define RDMA_PATH_X_REG__base_addr1_low_ly0_WORD 11
+#define RDMA_PATH_X_REG__base_addr1_low_ly0_MASK GENMASK(31, 0)
+#define RDMA_PATH_X_REG__base_addr1_high_ly0_WORD 12
+#define RDMA_PATH_X_REG__base_addr1_high_ly0_MASK GENMASK(1, 0)
+#define RDMA_PATH_X_REG__base_addr2_low_ly0_WORD 13
+#define RDMA_PATH_X_REG__base_addr2_low_ly0_MASK GENMASK(31, 0)
+#define RDMA_PATH_X_REG__base_addr2_high_ly0_WORD 14
+#define RDMA_PATH_X_REG__base_addr2_high_ly0_MASK GENMASK(1, 0)
+#define RDMA_PATH_X_REG__rdma_stride0_layer0_WORD 15
+#define RDMA_PATH_X_REG__rdma_stride0_layer0_MASK GENMASK(15, 0)
+#define RDMA_PATH_X_REG__rdma_stride1_layer0_WORD 15
+#define RDMA_PATH_X_REG__rdma_stride1_layer0_MASK GENMASK(31, 16)
+#define RDMA_PATH_X_REG__img_width_ly0_WORD 16
+#define RDMA_PATH_X_REG__img_width_ly0_MASK GENMASK(15, 0)
+#define RDMA_PATH_X_REG__img_height_ly0_WORD 16
+#define RDMA_PATH_X_REG__img_height_ly0_MASK GENMASK(31, 16)
+#define RDMA_PATH_X_REG__bbox_start_x_ly0_WORD 17
+#define RDMA_PATH_X_REG__bbox_start_x_ly0_MASK GENMASK(15, 0)
+#define RDMA_PATH_X_REG__bbox_start_y_ly0_WORD 17
+#define RDMA_PATH_X_REG__bbox_start_y_ly0_MASK GENMASK(31, 16)
+#define RDMA_PATH_X_REG__bbox_end_x_ly0_WORD 18
+#define RDMA_PATH_X_REG__bbox_end_x_ly0_MASK GENMASK(15, 0)
+#define RDMA_PATH_X_REG__bbox_end_y_ly0_WORD 18
+#define RDMA_PATH_X_REG__bbox_end_y_ly0_MASK GENMASK(31, 16)
+#define RDMA_PATH_X_REG__pixel_format_WORD 29
+#define RDMA_PATH_X_REG__pixel_format_MASK GENMASK(5, 0)
+#define RDMA_PATH_X_REG__uv_swap_WORD 29
+#define RDMA_PATH_X_REG__uv_swap_MASK GENMASK(6, 6)
+#define RDMA_PATH_X_REG__rot_mode_ly0_WORD 29
+#define RDMA_PATH_X_REG__rot_mode_ly0_MASK GENMASK(10, 8)
+
+/* TMG_REG: 30 x 32-bit registers */
+#define TMG_REG__NWORDS 30
+#define TMG_REG__split_en_WORD 0
+#define TMG_REG__split_en_MASK GENMASK(0, 0)
+#define TMG_REG__cmd_screen_WORD 0
+#define TMG_REG__cmd_screen_MASK GENMASK(1, 1)
+#define TMG_REG__fm_timing_en_WORD 0
+#define TMG_REG__fm_timing_en_MASK GENMASK(2, 2)
+#define TMG_REG__cmd_wait_en_WORD 0
+#define TMG_REG__cmd_wait_en_MASK GENMASK(3, 3)
+#define TMG_REG__cmd_wait_te_WORD 0
+#define TMG_REG__cmd_wait_te_MASK GENMASK(4, 4)
+#define TMG_REG__disp_ready_man_en_WORD 0
+#define TMG_REG__disp_ready_man_en_MASK GENMASK(5, 5)
+#define TMG_REG__hsp_WORD 0
+#define TMG_REG__hsp_MASK GENMASK(7, 7)
+#define TMG_REG__vsp_WORD 0
+#define TMG_REG__vsp_MASK GENMASK(8, 8)
+#define TMG_REG__user_WORD 2
+#define TMG_REG__user_MASK GENMASK(15, 12)
+#define TMG_REG__hfp_WORD 3
+#define TMG_REG__hfp_MASK GENMASK(27, 16)
+#define TMG_REG__hsync_width_WORD 4
+#define TMG_REG__hsync_width_MASK GENMASK(9, 0)
+#define TMG_REG__hbp_WORD 4
+#define TMG_REG__hbp_MASK GENMASK(27, 16)
+#define TMG_REG__vfp_WORD 5
+#define TMG_REG__vfp_MASK GENMASK(15, 0)
+#define TMG_REG__vsync_width_WORD 5
+#define TMG_REG__vsync_width_MASK GENMASK(25, 16)
+#define TMG_REG__vbp_WORD 6
+#define TMG_REG__vbp_MASK GENMASK(11, 0)
+#define TMG_REG__h_active_WORD 6
+#define TMG_REG__h_active_MASK GENMASK(29, 16)
+#define TMG_REG__v_active_WORD 7
+#define TMG_REG__v_active_MASK GENMASK(13, 0)
+#define TMG_REG__background_r_WORD 9
+#define TMG_REG__background_r_MASK GENMASK(11, 0)
+#define TMG_REG__background_g_WORD 9
+#define TMG_REG__background_g_MASK GENMASK(27, 16)
+#define TMG_REG__background_b_WORD 10
+#define TMG_REG__background_b_MASK GENMASK(11, 0)
+#define TMG_REG__eof_1st_ln_dly_num_WORD 11
+#define TMG_REG__eof_1st_ln_dly_num_MASK GENMASK(15, 0)
+#define TMG_REG__eof_2nd_ln_dly_num_WORD 11
+#define TMG_REG__eof_2nd_ln_dly_num_MASK GENMASK(31, 16)
+#define TMG_REG__sof_pre_ln_num_WORD 14
+#define TMG_REG__sof_pre_ln_num_MASK GENMASK(16, 0)
+
+#endif /* SATURN_FIELDS_H */
diff --git a/drivers/gpu/drm/spacemit/spacemit_dpu_ids.h b/drivers/gpu/drm/spacemit/spacemit_dpu_ids.h
new file mode 100644
index 0000000000000..41014dda927b9
--- /dev/null
+++ b/drivers/gpu/drm/spacemit/spacemit_dpu_ids.h
@@ -0,0 +1,22 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2025-2026 SpacemiT Co., Ltd.
+ */
+
+#ifndef _SPACEMIT_DPU_IDS_H_
+#define _SPACEMIT_DPU_IDS_H_
+
+/* Saturn online compositor instance ids (hardware IRQ-table indices). */
+#define COMPOSER0 0
+#define COMPOSER1 1
+#define COMPOSER2 2
+#define COMPOSER3 3
+
+/* DPU output-format field encoding (dpuctrl out-format register). */
+#define OUTFMT_RGB121212 0
+#define OUTFMT_RGB101010 1
+#define OUTFMT_RGB888 2
+#define OUTFMT_RGB666 12
+#define OUTFMT_RGB565 13
+
+#endif /* _SPACEMIT_DPU_IDS_H_ */
--
2.43.0
WARNING: multiple messages have this Message-ID (diff)
From: Cody Kang via B4 Relay <devnull+codykang.hk.gmail.com@kernel.org>
To: "David Airlie" <airlied@gmail.com>,
"Simona Vetter" <simona@ffwll.ch>,
"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
"Maxime Ripard" <mripard@kernel.org>,
"Thomas Zimmermann" <tzimmermann@suse.de>,
"Rob Herring" <robh@kernel.org>,
"Krzysztof Kozlowski" <krzk+dt@kernel.org>,
"Conor Dooley" <conor+dt@kernel.org>,
"Yixun Lan" <dlan@kernel.org>, "Vinod Koul" <vkoul@kernel.org>,
"Neil Armstrong" <neil.armstrong@linaro.org>,
"Haylen Chu" <heylenay@4d2.org>,
"Michael Turquette" <mturquette@baylibre.com>,
"Stephen Boyd" <sboyd@kernel.org>,
"Brian Masney" <bmasney@redhat.com>,
"Philipp Zabel" <p.zabel@pengutronix.de>,
"Paul Walmsley" <pjw@kernel.org>,
"Palmer Dabbelt" <palmer@dabbelt.com>,
"Albert Ou" <aou@eecs.berkeley.edu>,
"Alexandre Ghiti" <alex@ghiti.fr>, "Yao Zi" <me@ziyao.cc>,
"Uwe Kleine-König" <u.kleine-koenig@baylibre.com>,
"Guodong Xu" <docular.xu@gmail.com>
Cc: dri-devel@lists.freedesktop.org, linux-riscv@lists.infradead.org,
devicetree@vger.kernel.org, spacemit@lists.linux.dev,
linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org,
linux-clk@vger.kernel.org, Cody Kang <codykang.hk@gmail.com>
Subject: [PATCH v2 07/17] drm/spacemit: add Saturn DPU register model
Date: Sun, 09 Aug 2026 21:14:16 +0800 [thread overview]
Message-ID: <20260809-k3-display-v2-7-327d7910bf71@gmail.com> (raw)
In-Reply-To: <20260809-k3-display-v2-0-327d7910bf71@gmail.com>
From: Cody Kang <codykang.hk@gmail.com>
The Saturn display processing unit is programmed through a set of
register blocks (composer, RDMA, timing generator, cmdlist engine,
display MMU) laid out identically in both SoC instances. Add the block
address map, the per-field word offset and mask tables consumed by the
field accessors, the interrupt bit layout and the compositor and
output-format ID encodings. The address map describes the whole
IP block on purpose, including blocks the driver does not touch; the
field tables carry the fields the driver programs, with each block's
full word count kept as its NWORDS extent.
Consumers arrive with the following patches; the driver only becomes
buildable once the final patch adds the Kconfig and Makefile glue.
Signed-off-by: Cody Kang <codykang.hk@gmail.com>
---
v2:
- no change
---
drivers/gpu/drm/spacemit/dpu/saturn_regs/dpu_int.h | 25 ++
.../gpu/drm/spacemit/dpu/saturn_regs/reg_map_hee.h | 64 +++++
.../drm/spacemit/dpu/saturn_regs/saturn_fields.h | 298 +++++++++++++++++++++
drivers/gpu/drm/spacemit/spacemit_dpu_ids.h | 22 ++
4 files changed, 409 insertions(+)
diff --git a/drivers/gpu/drm/spacemit/dpu/saturn_regs/dpu_int.h b/drivers/gpu/drm/spacemit/dpu/saturn_regs/dpu_int.h
new file mode 100644
index 0000000000000..2c7fa00ba31e9
--- /dev/null
+++ b/drivers/gpu/drm/spacemit/dpu/saturn_regs/dpu_int.h
@@ -0,0 +1,25 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2025-2026 SpacemiT Co., Ltd.
+ *
+ */
+
+#ifndef DPU_INT_REG_H
+#define DPU_INT_REG_H
+
+#include <linux/bits.h>
+
+#define DPU_INT_CMDLIST_CH_FRM_CFG_DONE_MASK (0xff)
+#define DPU_INT_CMDLIST_CH_FRM_CFG_DONE (DPU_INT_CMDLIST_CH_FRM_CFG_DONE_MASK << 11)
+#define DPU_INT_FRM_TIMING_UNFLOW BIT(8)
+#define DPU_INT_CFG_RDY_CLR BIT(5)
+#define DPU_INT_FRM_TIMING_CFG_LINE BIT(4)
+#define DPU_INT_FRM_TIMING_CFG_EOF (BIT(2) | BIT(3))
+#define DPU_INT_FRM_TIMING_EOF BIT(1)
+#define DPU_INT_FRM_TIMING_VSYNC BIT(0)
+#define DPU_REST_INT_BITS (DPU_INT_FRM_TIMING_CFG_EOF | \
+ DPU_INT_FRM_TIMING_CFG_LINE | \
+ DPU_INT_FRM_TIMING_EOF | \
+ DPU_INT_CMDLIST_CH_FRM_CFG_DONE)
+
+#endif
diff --git a/drivers/gpu/drm/spacemit/dpu/saturn_regs/reg_map_hee.h b/drivers/gpu/drm/spacemit/dpu/saturn_regs/reg_map_hee.h
new file mode 100644
index 0000000000000..9490021cdb918
--- /dev/null
+++ b/drivers/gpu/drm/spacemit/dpu/saturn_regs/reg_map_hee.h
@@ -0,0 +1,64 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2025-2026 SpacemiT Co., Ltd.
+ *
+ */
+
+#ifndef _SATURN_REG_MAP_hee_H_
+#define _SATURN_REG_MAP_hee_H_
+
+#include "dpu_int.h"
+
+/* Base address, then bit definitions */
+
+#define DPU_TOP_BASE_ADDR 0x0
+#define DPU_CTRL_BASE_ADDR 0x3c0 /* dpu_ctl_top start address */
+#define CMDLIST_BASE_ADDR 0x500
+#define DPU_INT_BASE_ADDR 0x700
+
+#define DPU_ONLINE_IRQ_MSK (3 * 4)
+#define DPU_ONLINE_IRQ_STS (12 * 4)
+
+#define DMA_TOP_BASE_ADDR (RDMA0_BASE_ADDR + 0x280)
+
+#define RDMA0_BASE_ADDR (0x00001000)
+#define RDMA1_BASE_ADDR (RDMA0_BASE_ADDR + 0x1000)
+#define RDMA2_BASE_ADDR (RDMA0_BASE_ADDR + 0xa000)
+#define RDMA3_BASE_ADDR (RDMA0_BASE_ADDR + 0xb000)
+
+#define MMU_BASE_ADDR (0x1100)
+#define MMU_TOP_BASE_ADDR (MMU_BASE_ADDR + 0x100)
+
+#define TBU0_ADDR 0x1100
+#define TBU1_ADDR 0x1180
+#define TBU2_ADDR 0x2100
+#define TBU3_ADDR 0x2180
+#define TBU4_ADDR 0xb100
+#define TBU5_ADDR 0xb180
+#define TBU6_ADDR 0xc100
+#define TBU7_ADDR 0xc180
+
+#define CMP0_BASE_ADDR 0x00018000
+#define CMP1_BASE_ADDR (CMP0_BASE_ADDR + 0x18000)
+#define CMP2_BASE_ADDR (CMP0_BASE_ADDR + 0x30000)
+
+#define PREPIPE_SCAL0_BASE_ADDR 0x14000
+#define PREPIPE_SCAL1_BASE_ADDR 0x14400
+#define PREPIPE_SCAL2_BASE_ADDR 0x14800
+#define PREPIPE_SCAL3_BASE_ADDR 0x14c00
+
+#define POST_PIPE_ADDR (CMP1_BASE_ADDR + 0x300)
+
+#define EE_ADDR (CMP1_BASE_ADDR + 0xd00)
+
+#define DPU_SCENE_CTL_BASE_ADDR (0x300)
+#define DPU_SCENE_CTL_SIZE 0x40
+#define DPU_SCENE_CTL_ADDR(i) (DPU_SCENE_CTL_BASE_ADDR + (i) * DPU_SCENE_CTL_SIZE)
+
+#define TMG0_BASE_ADDR (0x00051000 + 0x200)
+
+#define CMDLIST_CH_Y 0x188
+#define CMDLIST_CH_START_CMPS_Y 0x90
+#define CMDLIST_CFG_READY 0x34
+
+#endif
diff --git a/drivers/gpu/drm/spacemit/dpu/saturn_regs/saturn_fields.h b/drivers/gpu/drm/spacemit/dpu/saturn_regs/saturn_fields.h
new file mode 100644
index 0000000000000..f745dfdaa83de
--- /dev/null
+++ b/drivers/gpu/drm/spacemit/dpu/saturn_regs/saturn_fields.h
@@ -0,0 +1,298 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2025-2026 SpacemiT Co., Ltd.
+ *
+ * Saturn DPU register field map: word offset and mask per field, consumed by
+ * the dpu_write()/dpu_read() accessors.
+ */
+
+#ifndef SATURN_FIELDS_H
+#define SATURN_FIELDS_H
+
+#include <linux/bits.h>
+
+/* CMDLIST_REG: 128 x 32-bit registers */
+#define CMDLIST_REG__NWORDS 128
+#define CMDLIST_REG__cmdlist_reg_0__cmdlist_ch_start_addrl_WORD(i) (0 + (i))
+#define CMDLIST_REG__cmdlist_reg_0__cmdlist_ch_start_addrl_MASK GENMASK(31, 4)
+#define CMDLIST_REG__cmdlist_reg_16__cmdlist_ch_start_addrh_WORD(i) (16 + (i))
+#define CMDLIST_REG__cmdlist_reg_16__cmdlist_ch_start_addrh_MASK GENMASK(5, 0)
+#define CMDLIST_REG__cmdlist_reg_48__cmdlist_ch_y_first_WORD(i) (48 + (i))
+#define CMDLIST_REG__cmdlist_reg_48__cmdlist_ch_y_first_MASK GENMASK(24, 12)
+
+/* CMPS_X_REG: 146 x 32-bit registers */
+#define CMPS_X_REG__NWORDS 146
+#define CMPS_X_REG__module_enable_WORD 0
+#define CMPS_X_REG__module_enable_MASK GENMASK(0, 0)
+#define CMPS_X_REG__dst_w_WORD 1
+#define CMPS_X_REG__dst_w_MASK GENMASK(15, 0)
+#define CMPS_X_REG__dst_h_WORD 1
+#define CMPS_X_REG__dst_h_MASK GENMASK(31, 16)
+#define CMPS_X_REG__bg_color_r_WORD 2
+#define CMPS_X_REG__bg_color_r_MASK GENMASK(9, 0)
+#define CMPS_X_REG__bg_color_g_WORD 3
+#define CMPS_X_REG__bg_color_g_MASK GENMASK(9, 0)
+#define CMPS_X_REG__bg_color_b_WORD 4
+#define CMPS_X_REG__bg_color_b_MASK GENMASK(9, 0)
+#define CMPS_X_REG__bg_color_a_WORD 5
+#define CMPS_X_REG__bg_color_a_MASK GENMASK(7, 0)
+#define CMPS_X_REG__layer00_area_left_WORD 8
+#define CMPS_X_REG__layer00_area_left_MASK GENMASK(15, 0)
+#define CMPS_X_REG__layer00_area_right_WORD 8
+#define CMPS_X_REG__layer00_area_right_MASK GENMASK(31, 16)
+#define CMPS_X_REG__layer00_area_top_WORD 9
+#define CMPS_X_REG__layer00_area_top_MASK GENMASK(15, 0)
+#define CMPS_X_REG__layer00_area_bottom_WORD 9
+#define CMPS_X_REG__layer00_area_bottom_MASK GENMASK(31, 16)
+#define CMPS_X_REG__layer00_solid_color_r_WORD 10
+#define CMPS_X_REG__layer00_solid_color_r_MASK GENMASK(9, 0)
+#define CMPS_X_REG__layer00_solid_color_g_WORD 11
+#define CMPS_X_REG__layer00_solid_color_g_MASK GENMASK(9, 0)
+#define CMPS_X_REG__layer00_solid_color_b_WORD 12
+#define CMPS_X_REG__layer00_solid_color_b_MASK GENMASK(9, 0)
+#define CMPS_X_REG__layer00_solid_color_a_WORD 13
+#define CMPS_X_REG__layer00_solid_color_a_MASK GENMASK(7, 0)
+#define CMPS_X_REG__layer00_blend_mode_WORD 13
+#define CMPS_X_REG__layer00_blend_mode_MASK GENMASK(15, 14)
+#define CMPS_X_REG__layer00_colorkey_en_WORD 13
+#define CMPS_X_REG__layer00_colorkey_en_MASK GENMASK(18, 18)
+#define CMPS_X_REG__layer00_en_WORD 14
+#define CMPS_X_REG__layer00_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer00_blend_sel_WORD 14
+#define CMPS_X_REG__layer00_blend_sel_MASK GENMASK(2, 1)
+#define CMPS_X_REG__layer00_solid_en_WORD 14
+#define CMPS_X_REG__layer00_solid_en_MASK GENMASK(3, 3)
+#define CMPS_X_REG__layer00_dma_id_WORD 14
+#define CMPS_X_REG__layer00_dma_id_MASK GENMASK(7, 4)
+#define CMPS_X_REG__layer00_layer_alpha_WORD 14
+#define CMPS_X_REG__layer00_layer_alpha_MASK GENMASK(15, 8)
+#define CMPS_X_REG__layer00_alpha_ratio_WORD 14
+#define CMPS_X_REG__layer00_alpha_ratio_MASK GENMASK(23, 16)
+#define CMPS_X_REG__layer01_en_WORD 21
+#define CMPS_X_REG__layer01_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer02_en_WORD 28
+#define CMPS_X_REG__layer02_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer03_en_WORD 35
+#define CMPS_X_REG__layer03_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer04_en_WORD 42
+#define CMPS_X_REG__layer04_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer05_en_WORD 49
+#define CMPS_X_REG__layer05_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer06_en_WORD 56
+#define CMPS_X_REG__layer06_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer07_en_WORD 63
+#define CMPS_X_REG__layer07_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer08_en_WORD 70
+#define CMPS_X_REG__layer08_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer09_en_WORD 77
+#define CMPS_X_REG__layer09_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer10_en_WORD 84
+#define CMPS_X_REG__layer10_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer11_en_WORD 91
+#define CMPS_X_REG__layer11_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer12_en_WORD 98
+#define CMPS_X_REG__layer12_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer13_en_WORD 105
+#define CMPS_X_REG__layer13_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer14_en_WORD 112
+#define CMPS_X_REG__layer14_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer15_en_WORD 119
+#define CMPS_X_REG__layer15_en_MASK GENMASK(0, 0)
+
+/* DMA_TOP_REG: 25 x 32-bit registers */
+#define DMA_TOP_REG__NWORDS 25
+#define DMA_TOP_REG__image_rr_ratio_WORD 1
+#define DMA_TOP_REG__image_rr_ratio_MASK GENMASK(7, 0)
+#define DMA_TOP_REG__pixel_num_th_WORD 1
+#define DMA_TOP_REG__pixel_num_th_MASK GENMASK(14, 9)
+#define DMA_TOP_REG__rdma_timeout_limit_WORD 2
+#define DMA_TOP_REG__rdma_timeout_limit_MASK GENMASK(15, 0)
+#define DMA_TOP_REG__wdma_timeout_limit_WORD 2
+#define DMA_TOP_REG__wdma_timeout_limit_MASK GENMASK(31, 16)
+
+/* DPU_CTL_REG: 15 x 32-bit registers */
+#define DPU_CTL_REG__NWORDS 15
+#define DPU_CTL_REG__nml_rch_en_WORD 0
+#define DPU_CTL_REG__nml_rch_en_MASK GENMASK(9, 0)
+#define DPU_CTL_REG__nml_scl_en_WORD 0
+#define DPU_CTL_REG__nml_scl_en_MASK GENMASK(13, 10)
+#define DPU_CTL_REG__nml_outctl_en_WORD 0
+#define DPU_CTL_REG__nml_outctl_en_MASK GENMASK(18, 18)
+#define DPU_CTL_REG__nml_frm_timing_en_WORD 0
+#define DPU_CTL_REG__nml_frm_timing_en_MASK GENMASK(25, 23)
+#define DPU_CTL_REG__both_cfg_rdy_WORD 2
+#define DPU_CTL_REG__both_cfg_rdy_MASK GENMASK(0, 0)
+#define DPU_CTL_REG__video_mod_WORD 3
+#define DPU_CTL_REG__video_mod_MASK GENMASK(0, 0)
+#define DPU_CTL_REG__dbg_mod_WORD 3
+#define DPU_CTL_REG__dbg_mod_MASK GENMASK(1, 1)
+#define DPU_CTL_REG__timing_inter0_WORD 3
+#define DPU_CTL_REG__timing_inter0_MASK GENMASK(7, 2)
+#define DPU_CTL_REG__timing_inter1_WORD 3
+#define DPU_CTL_REG__timing_inter1_MASK GENMASK(13, 8)
+#define DPU_CTL_REG__sw_start_WORD 4
+#define DPU_CTL_REG__sw_start_MASK GENMASK(0, 0)
+#define DPU_CTL_REG__nml_rch_vrt_reuse_WORD 7
+#define DPU_CTL_REG__nml_rch_vrt_reuse_MASK GENMASK(9, 0)
+
+/* DPU_CTL_TOP_REG: 53 x 32-bit registers */
+#define DPU_CTL_TOP_REG__NWORDS 53
+#define DPU_CTL_TOP_REG__dpu_ctl_top_reg_0__cmdlist_rch_en_WORD(i) (0 + (i))
+#define DPU_CTL_TOP_REG__dpu_ctl_top_reg_0__cmdlist_rch_en_MASK GENMASK(0, 0)
+#define DPU_CTL_TOP_REG__dpu_ctl_top_reg_10__cmdlist_cmps_other_en_WORD(i) (10 + (i))
+#define DPU_CTL_TOP_REG__dpu_ctl_top_reg_10__cmdlist_cmps_other_en_MASK GENMASK(0, 0)
+#define DPU_CTL_TOP_REG__dpu_ctl_top_reg_10__cmdlist_cmps_top_en_WORD(i) (10 + (i))
+#define DPU_CTL_TOP_REG__dpu_ctl_top_reg_10__cmdlist_cmps_top_en_MASK GENMASK(1, 1)
+
+/* DPU_INTP_REG: 50 x 32-bit registers */
+#define DPU_INTP_REG__NWORDS 50
+
+/* EE_REG: 51 x 32-bit registers */
+#define EE_REG__NWORDS 51
+#define EE_REG__m_benable_WORD 0
+#define EE_REG__m_benable_MASK GENMASK(0, 0)
+
+/* MMU_TBU_REG: 21 x 32-bit registers */
+#define MMU_TBU_REG__NWORDS 21
+#define MMU_TBU_REG__tbu_base_addr0_low_WORD 1
+#define MMU_TBU_REG__tbu_base_addr0_low_MASK GENMASK(31, 0)
+#define MMU_TBU_REG__tbu_base_addr0_high_WORD 2
+#define MMU_TBU_REG__tbu_base_addr0_high_MASK GENMASK(11, 0)
+#define MMU_TBU_REG__tbu_base_addr1_low_WORD 3
+#define MMU_TBU_REG__tbu_base_addr1_low_MASK GENMASK(31, 0)
+#define MMU_TBU_REG__tbu_base_addr1_high_WORD 4
+#define MMU_TBU_REG__tbu_base_addr1_high_MASK GENMASK(11, 0)
+#define MMU_TBU_REG__tbu_base_addr2_low_WORD 5
+#define MMU_TBU_REG__tbu_base_addr2_low_MASK GENMASK(31, 0)
+#define MMU_TBU_REG__tbu_base_addr2_high_WORD 6
+#define MMU_TBU_REG__tbu_base_addr2_high_MASK GENMASK(11, 0)
+#define MMU_TBU_REG__tbu_va0_WORD 7
+#define MMU_TBU_REG__tbu_va0_MASK GENMASK(31, 0)
+#define MMU_TBU_REG__tbu_va1_WORD 8
+#define MMU_TBU_REG__tbu_va1_MASK GENMASK(31, 0)
+#define MMU_TBU_REG__tbu_va2_WORD 9
+#define MMU_TBU_REG__tbu_va2_MASK GENMASK(31, 0)
+#define MMU_TBU_REG__tbu_size0_WORD 10
+#define MMU_TBU_REG__tbu_size0_MASK GENMASK(15, 0)
+#define MMU_TBU_REG__tbu_size1_WORD 11
+#define MMU_TBU_REG__tbu_size1_MASK GENMASK(15, 0)
+#define MMU_TBU_REG__tbu_size2_WORD 12
+#define MMU_TBU_REG__tbu_size2_MASK GENMASK(15, 0)
+#define MMU_TBU_REG__vsync_update_en_WORD 13
+#define MMU_TBU_REG__vsync_update_en_MASK GENMASK(1, 1)
+
+/* MMU_TOP_REG: 23 x 32-bit registers */
+#define MMU_TOP_REG__NWORDS 23
+#define MMU_TOP_REG__rdma_timelimit_WORD 0
+#define MMU_TOP_REG__rdma_timelimit_MASK GENMASK(31, 16)
+#define MMU_TOP_REG__sram0_tlb_axi_port_sel_WORD 1
+#define MMU_TOP_REG__sram0_tlb_axi_port_sel_MASK GENMASK(1, 0)
+#define MMU_TOP_REG__sram1_tlb_axi_port_sel_WORD 1
+#define MMU_TOP_REG__sram1_tlb_axi_port_sel_MASK GENMASK(3, 2)
+#define MMU_TOP_REG__dmac0_rd_outs_num_WORD 2
+#define MMU_TOP_REG__dmac0_rd_outs_num_MASK GENMASK(7, 0)
+#define MMU_TOP_REG__dmac1_rd_outs_num_WORD 3
+#define MMU_TOP_REG__dmac1_rd_outs_num_MASK GENMASK(7, 0)
+
+/* POSTPIPE_REG: 50 x 32-bit registers */
+#define POSTPIPE_REG__NWORDS 50
+#define POSTPIPE_REG__m_inwidth_WORD 13
+#define POSTPIPE_REG__m_inwidth_MASK GENMASK(15, 0)
+#define POSTPIPE_REG__m_inheight_WORD 13
+#define POSTPIPE_REG__m_inheight_MASK GENMASK(31, 16)
+
+/* RDMA_PATH_X_REG: 60 x 32-bit registers */
+#define RDMA_PATH_X_REG__NWORDS 60
+#define RDMA_PATH_X_REG__layer_mode_WORD 0
+#define RDMA_PATH_X_REG__layer_mode_MASK GENMASK(1, 0)
+#define RDMA_PATH_X_REG__layer_cmpsr_id_WORD 0
+#define RDMA_PATH_X_REG__layer_cmpsr_id_MASK GENMASK(15, 13)
+#define RDMA_PATH_X_REG__is_two_layers_WORD 1
+#define RDMA_PATH_X_REG__is_two_layers_MASK GENMASK(0, 0)
+#define RDMA_PATH_X_REG__is_offline_WORD 1
+#define RDMA_PATH_X_REG__is_offline_MASK GENMASK(1, 1)
+#define RDMA_PATH_X_REG__base_addr0_low_ly0_WORD 9
+#define RDMA_PATH_X_REG__base_addr0_low_ly0_MASK GENMASK(31, 0)
+#define RDMA_PATH_X_REG__base_addr0_high_ly0_WORD 10
+#define RDMA_PATH_X_REG__base_addr0_high_ly0_MASK GENMASK(1, 0)
+#define RDMA_PATH_X_REG__base_addr1_low_ly0_WORD 11
+#define RDMA_PATH_X_REG__base_addr1_low_ly0_MASK GENMASK(31, 0)
+#define RDMA_PATH_X_REG__base_addr1_high_ly0_WORD 12
+#define RDMA_PATH_X_REG__base_addr1_high_ly0_MASK GENMASK(1, 0)
+#define RDMA_PATH_X_REG__base_addr2_low_ly0_WORD 13
+#define RDMA_PATH_X_REG__base_addr2_low_ly0_MASK GENMASK(31, 0)
+#define RDMA_PATH_X_REG__base_addr2_high_ly0_WORD 14
+#define RDMA_PATH_X_REG__base_addr2_high_ly0_MASK GENMASK(1, 0)
+#define RDMA_PATH_X_REG__rdma_stride0_layer0_WORD 15
+#define RDMA_PATH_X_REG__rdma_stride0_layer0_MASK GENMASK(15, 0)
+#define RDMA_PATH_X_REG__rdma_stride1_layer0_WORD 15
+#define RDMA_PATH_X_REG__rdma_stride1_layer0_MASK GENMASK(31, 16)
+#define RDMA_PATH_X_REG__img_width_ly0_WORD 16
+#define RDMA_PATH_X_REG__img_width_ly0_MASK GENMASK(15, 0)
+#define RDMA_PATH_X_REG__img_height_ly0_WORD 16
+#define RDMA_PATH_X_REG__img_height_ly0_MASK GENMASK(31, 16)
+#define RDMA_PATH_X_REG__bbox_start_x_ly0_WORD 17
+#define RDMA_PATH_X_REG__bbox_start_x_ly0_MASK GENMASK(15, 0)
+#define RDMA_PATH_X_REG__bbox_start_y_ly0_WORD 17
+#define RDMA_PATH_X_REG__bbox_start_y_ly0_MASK GENMASK(31, 16)
+#define RDMA_PATH_X_REG__bbox_end_x_ly0_WORD 18
+#define RDMA_PATH_X_REG__bbox_end_x_ly0_MASK GENMASK(15, 0)
+#define RDMA_PATH_X_REG__bbox_end_y_ly0_WORD 18
+#define RDMA_PATH_X_REG__bbox_end_y_ly0_MASK GENMASK(31, 16)
+#define RDMA_PATH_X_REG__pixel_format_WORD 29
+#define RDMA_PATH_X_REG__pixel_format_MASK GENMASK(5, 0)
+#define RDMA_PATH_X_REG__uv_swap_WORD 29
+#define RDMA_PATH_X_REG__uv_swap_MASK GENMASK(6, 6)
+#define RDMA_PATH_X_REG__rot_mode_ly0_WORD 29
+#define RDMA_PATH_X_REG__rot_mode_ly0_MASK GENMASK(10, 8)
+
+/* TMG_REG: 30 x 32-bit registers */
+#define TMG_REG__NWORDS 30
+#define TMG_REG__split_en_WORD 0
+#define TMG_REG__split_en_MASK GENMASK(0, 0)
+#define TMG_REG__cmd_screen_WORD 0
+#define TMG_REG__cmd_screen_MASK GENMASK(1, 1)
+#define TMG_REG__fm_timing_en_WORD 0
+#define TMG_REG__fm_timing_en_MASK GENMASK(2, 2)
+#define TMG_REG__cmd_wait_en_WORD 0
+#define TMG_REG__cmd_wait_en_MASK GENMASK(3, 3)
+#define TMG_REG__cmd_wait_te_WORD 0
+#define TMG_REG__cmd_wait_te_MASK GENMASK(4, 4)
+#define TMG_REG__disp_ready_man_en_WORD 0
+#define TMG_REG__disp_ready_man_en_MASK GENMASK(5, 5)
+#define TMG_REG__hsp_WORD 0
+#define TMG_REG__hsp_MASK GENMASK(7, 7)
+#define TMG_REG__vsp_WORD 0
+#define TMG_REG__vsp_MASK GENMASK(8, 8)
+#define TMG_REG__user_WORD 2
+#define TMG_REG__user_MASK GENMASK(15, 12)
+#define TMG_REG__hfp_WORD 3
+#define TMG_REG__hfp_MASK GENMASK(27, 16)
+#define TMG_REG__hsync_width_WORD 4
+#define TMG_REG__hsync_width_MASK GENMASK(9, 0)
+#define TMG_REG__hbp_WORD 4
+#define TMG_REG__hbp_MASK GENMASK(27, 16)
+#define TMG_REG__vfp_WORD 5
+#define TMG_REG__vfp_MASK GENMASK(15, 0)
+#define TMG_REG__vsync_width_WORD 5
+#define TMG_REG__vsync_width_MASK GENMASK(25, 16)
+#define TMG_REG__vbp_WORD 6
+#define TMG_REG__vbp_MASK GENMASK(11, 0)
+#define TMG_REG__h_active_WORD 6
+#define TMG_REG__h_active_MASK GENMASK(29, 16)
+#define TMG_REG__v_active_WORD 7
+#define TMG_REG__v_active_MASK GENMASK(13, 0)
+#define TMG_REG__background_r_WORD 9
+#define TMG_REG__background_r_MASK GENMASK(11, 0)
+#define TMG_REG__background_g_WORD 9
+#define TMG_REG__background_g_MASK GENMASK(27, 16)
+#define TMG_REG__background_b_WORD 10
+#define TMG_REG__background_b_MASK GENMASK(11, 0)
+#define TMG_REG__eof_1st_ln_dly_num_WORD 11
+#define TMG_REG__eof_1st_ln_dly_num_MASK GENMASK(15, 0)
+#define TMG_REG__eof_2nd_ln_dly_num_WORD 11
+#define TMG_REG__eof_2nd_ln_dly_num_MASK GENMASK(31, 16)
+#define TMG_REG__sof_pre_ln_num_WORD 14
+#define TMG_REG__sof_pre_ln_num_MASK GENMASK(16, 0)
+
+#endif /* SATURN_FIELDS_H */
diff --git a/drivers/gpu/drm/spacemit/spacemit_dpu_ids.h b/drivers/gpu/drm/spacemit/spacemit_dpu_ids.h
new file mode 100644
index 0000000000000..41014dda927b9
--- /dev/null
+++ b/drivers/gpu/drm/spacemit/spacemit_dpu_ids.h
@@ -0,0 +1,22 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2025-2026 SpacemiT Co., Ltd.
+ */
+
+#ifndef _SPACEMIT_DPU_IDS_H_
+#define _SPACEMIT_DPU_IDS_H_
+
+/* Saturn online compositor instance ids (hardware IRQ-table indices). */
+#define COMPOSER0 0
+#define COMPOSER1 1
+#define COMPOSER2 2
+#define COMPOSER3 3
+
+/* DPU output-format field encoding (dpuctrl out-format register). */
+#define OUTFMT_RGB121212 0
+#define OUTFMT_RGB101010 1
+#define OUTFMT_RGB888 2
+#define OUTFMT_RGB666 12
+#define OUTFMT_RGB565 13
+
+#endif /* _SPACEMIT_DPU_IDS_H_ */
--
2.43.0
--
linux-phy mailing list
linux-phy@lists.infradead.org
https://lists.infradead.org/mailman/listinfo/linux-phy
WARNING: multiple messages have this Message-ID (diff)
From: Cody Kang via B4 Relay <devnull+codykang.hk.gmail.com@kernel.org>
To: "David Airlie" <airlied@gmail.com>,
"Simona Vetter" <simona@ffwll.ch>,
"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
"Maxime Ripard" <mripard@kernel.org>,
"Thomas Zimmermann" <tzimmermann@suse.de>,
"Rob Herring" <robh@kernel.org>,
"Krzysztof Kozlowski" <krzk+dt@kernel.org>,
"Conor Dooley" <conor+dt@kernel.org>,
"Yixun Lan" <dlan@kernel.org>, "Vinod Koul" <vkoul@kernel.org>,
"Neil Armstrong" <neil.armstrong@linaro.org>,
"Haylen Chu" <heylenay@4d2.org>,
"Michael Turquette" <mturquette@baylibre.com>,
"Stephen Boyd" <sboyd@kernel.org>,
"Brian Masney" <bmasney@redhat.com>,
"Philipp Zabel" <p.zabel@pengutronix.de>,
"Paul Walmsley" <pjw@kernel.org>,
"Palmer Dabbelt" <palmer@dabbelt.com>,
"Albert Ou" <aou@eecs.berkeley.edu>,
"Alexandre Ghiti" <alex@ghiti.fr>, "Yao Zi" <me@ziyao.cc>,
"Uwe Kleine-König" <u.kleine-koenig@baylibre.com>,
"Guodong Xu" <docular.xu@gmail.com>
Cc: dri-devel@lists.freedesktop.org, linux-riscv@lists.infradead.org,
devicetree@vger.kernel.org, spacemit@lists.linux.dev,
linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org,
linux-clk@vger.kernel.org, Cody Kang <codykang.hk@gmail.com>
Subject: [PATCH v2 07/17] drm/spacemit: add Saturn DPU register model
Date: Sun, 09 Aug 2026 21:14:16 +0800 [thread overview]
Message-ID: <20260809-k3-display-v2-7-327d7910bf71@gmail.com> (raw)
In-Reply-To: <20260809-k3-display-v2-0-327d7910bf71@gmail.com>
From: Cody Kang <codykang.hk@gmail.com>
The Saturn display processing unit is programmed through a set of
register blocks (composer, RDMA, timing generator, cmdlist engine,
display MMU) laid out identically in both SoC instances. Add the block
address map, the per-field word offset and mask tables consumed by the
field accessors, the interrupt bit layout and the compositor and
output-format ID encodings. The address map describes the whole
IP block on purpose, including blocks the driver does not touch; the
field tables carry the fields the driver programs, with each block's
full word count kept as its NWORDS extent.
Consumers arrive with the following patches; the driver only becomes
buildable once the final patch adds the Kconfig and Makefile glue.
Signed-off-by: Cody Kang <codykang.hk@gmail.com>
---
v2:
- no change
---
drivers/gpu/drm/spacemit/dpu/saturn_regs/dpu_int.h | 25 ++
.../gpu/drm/spacemit/dpu/saturn_regs/reg_map_hee.h | 64 +++++
.../drm/spacemit/dpu/saturn_regs/saturn_fields.h | 298 +++++++++++++++++++++
drivers/gpu/drm/spacemit/spacemit_dpu_ids.h | 22 ++
4 files changed, 409 insertions(+)
diff --git a/drivers/gpu/drm/spacemit/dpu/saturn_regs/dpu_int.h b/drivers/gpu/drm/spacemit/dpu/saturn_regs/dpu_int.h
new file mode 100644
index 0000000000000..2c7fa00ba31e9
--- /dev/null
+++ b/drivers/gpu/drm/spacemit/dpu/saturn_regs/dpu_int.h
@@ -0,0 +1,25 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2025-2026 SpacemiT Co., Ltd.
+ *
+ */
+
+#ifndef DPU_INT_REG_H
+#define DPU_INT_REG_H
+
+#include <linux/bits.h>
+
+#define DPU_INT_CMDLIST_CH_FRM_CFG_DONE_MASK (0xff)
+#define DPU_INT_CMDLIST_CH_FRM_CFG_DONE (DPU_INT_CMDLIST_CH_FRM_CFG_DONE_MASK << 11)
+#define DPU_INT_FRM_TIMING_UNFLOW BIT(8)
+#define DPU_INT_CFG_RDY_CLR BIT(5)
+#define DPU_INT_FRM_TIMING_CFG_LINE BIT(4)
+#define DPU_INT_FRM_TIMING_CFG_EOF (BIT(2) | BIT(3))
+#define DPU_INT_FRM_TIMING_EOF BIT(1)
+#define DPU_INT_FRM_TIMING_VSYNC BIT(0)
+#define DPU_REST_INT_BITS (DPU_INT_FRM_TIMING_CFG_EOF | \
+ DPU_INT_FRM_TIMING_CFG_LINE | \
+ DPU_INT_FRM_TIMING_EOF | \
+ DPU_INT_CMDLIST_CH_FRM_CFG_DONE)
+
+#endif
diff --git a/drivers/gpu/drm/spacemit/dpu/saturn_regs/reg_map_hee.h b/drivers/gpu/drm/spacemit/dpu/saturn_regs/reg_map_hee.h
new file mode 100644
index 0000000000000..9490021cdb918
--- /dev/null
+++ b/drivers/gpu/drm/spacemit/dpu/saturn_regs/reg_map_hee.h
@@ -0,0 +1,64 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2025-2026 SpacemiT Co., Ltd.
+ *
+ */
+
+#ifndef _SATURN_REG_MAP_hee_H_
+#define _SATURN_REG_MAP_hee_H_
+
+#include "dpu_int.h"
+
+/* Base address, then bit definitions */
+
+#define DPU_TOP_BASE_ADDR 0x0
+#define DPU_CTRL_BASE_ADDR 0x3c0 /* dpu_ctl_top start address */
+#define CMDLIST_BASE_ADDR 0x500
+#define DPU_INT_BASE_ADDR 0x700
+
+#define DPU_ONLINE_IRQ_MSK (3 * 4)
+#define DPU_ONLINE_IRQ_STS (12 * 4)
+
+#define DMA_TOP_BASE_ADDR (RDMA0_BASE_ADDR + 0x280)
+
+#define RDMA0_BASE_ADDR (0x00001000)
+#define RDMA1_BASE_ADDR (RDMA0_BASE_ADDR + 0x1000)
+#define RDMA2_BASE_ADDR (RDMA0_BASE_ADDR + 0xa000)
+#define RDMA3_BASE_ADDR (RDMA0_BASE_ADDR + 0xb000)
+
+#define MMU_BASE_ADDR (0x1100)
+#define MMU_TOP_BASE_ADDR (MMU_BASE_ADDR + 0x100)
+
+#define TBU0_ADDR 0x1100
+#define TBU1_ADDR 0x1180
+#define TBU2_ADDR 0x2100
+#define TBU3_ADDR 0x2180
+#define TBU4_ADDR 0xb100
+#define TBU5_ADDR 0xb180
+#define TBU6_ADDR 0xc100
+#define TBU7_ADDR 0xc180
+
+#define CMP0_BASE_ADDR 0x00018000
+#define CMP1_BASE_ADDR (CMP0_BASE_ADDR + 0x18000)
+#define CMP2_BASE_ADDR (CMP0_BASE_ADDR + 0x30000)
+
+#define PREPIPE_SCAL0_BASE_ADDR 0x14000
+#define PREPIPE_SCAL1_BASE_ADDR 0x14400
+#define PREPIPE_SCAL2_BASE_ADDR 0x14800
+#define PREPIPE_SCAL3_BASE_ADDR 0x14c00
+
+#define POST_PIPE_ADDR (CMP1_BASE_ADDR + 0x300)
+
+#define EE_ADDR (CMP1_BASE_ADDR + 0xd00)
+
+#define DPU_SCENE_CTL_BASE_ADDR (0x300)
+#define DPU_SCENE_CTL_SIZE 0x40
+#define DPU_SCENE_CTL_ADDR(i) (DPU_SCENE_CTL_BASE_ADDR + (i) * DPU_SCENE_CTL_SIZE)
+
+#define TMG0_BASE_ADDR (0x00051000 + 0x200)
+
+#define CMDLIST_CH_Y 0x188
+#define CMDLIST_CH_START_CMPS_Y 0x90
+#define CMDLIST_CFG_READY 0x34
+
+#endif
diff --git a/drivers/gpu/drm/spacemit/dpu/saturn_regs/saturn_fields.h b/drivers/gpu/drm/spacemit/dpu/saturn_regs/saturn_fields.h
new file mode 100644
index 0000000000000..f745dfdaa83de
--- /dev/null
+++ b/drivers/gpu/drm/spacemit/dpu/saturn_regs/saturn_fields.h
@@ -0,0 +1,298 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2025-2026 SpacemiT Co., Ltd.
+ *
+ * Saturn DPU register field map: word offset and mask per field, consumed by
+ * the dpu_write()/dpu_read() accessors.
+ */
+
+#ifndef SATURN_FIELDS_H
+#define SATURN_FIELDS_H
+
+#include <linux/bits.h>
+
+/* CMDLIST_REG: 128 x 32-bit registers */
+#define CMDLIST_REG__NWORDS 128
+#define CMDLIST_REG__cmdlist_reg_0__cmdlist_ch_start_addrl_WORD(i) (0 + (i))
+#define CMDLIST_REG__cmdlist_reg_0__cmdlist_ch_start_addrl_MASK GENMASK(31, 4)
+#define CMDLIST_REG__cmdlist_reg_16__cmdlist_ch_start_addrh_WORD(i) (16 + (i))
+#define CMDLIST_REG__cmdlist_reg_16__cmdlist_ch_start_addrh_MASK GENMASK(5, 0)
+#define CMDLIST_REG__cmdlist_reg_48__cmdlist_ch_y_first_WORD(i) (48 + (i))
+#define CMDLIST_REG__cmdlist_reg_48__cmdlist_ch_y_first_MASK GENMASK(24, 12)
+
+/* CMPS_X_REG: 146 x 32-bit registers */
+#define CMPS_X_REG__NWORDS 146
+#define CMPS_X_REG__module_enable_WORD 0
+#define CMPS_X_REG__module_enable_MASK GENMASK(0, 0)
+#define CMPS_X_REG__dst_w_WORD 1
+#define CMPS_X_REG__dst_w_MASK GENMASK(15, 0)
+#define CMPS_X_REG__dst_h_WORD 1
+#define CMPS_X_REG__dst_h_MASK GENMASK(31, 16)
+#define CMPS_X_REG__bg_color_r_WORD 2
+#define CMPS_X_REG__bg_color_r_MASK GENMASK(9, 0)
+#define CMPS_X_REG__bg_color_g_WORD 3
+#define CMPS_X_REG__bg_color_g_MASK GENMASK(9, 0)
+#define CMPS_X_REG__bg_color_b_WORD 4
+#define CMPS_X_REG__bg_color_b_MASK GENMASK(9, 0)
+#define CMPS_X_REG__bg_color_a_WORD 5
+#define CMPS_X_REG__bg_color_a_MASK GENMASK(7, 0)
+#define CMPS_X_REG__layer00_area_left_WORD 8
+#define CMPS_X_REG__layer00_area_left_MASK GENMASK(15, 0)
+#define CMPS_X_REG__layer00_area_right_WORD 8
+#define CMPS_X_REG__layer00_area_right_MASK GENMASK(31, 16)
+#define CMPS_X_REG__layer00_area_top_WORD 9
+#define CMPS_X_REG__layer00_area_top_MASK GENMASK(15, 0)
+#define CMPS_X_REG__layer00_area_bottom_WORD 9
+#define CMPS_X_REG__layer00_area_bottom_MASK GENMASK(31, 16)
+#define CMPS_X_REG__layer00_solid_color_r_WORD 10
+#define CMPS_X_REG__layer00_solid_color_r_MASK GENMASK(9, 0)
+#define CMPS_X_REG__layer00_solid_color_g_WORD 11
+#define CMPS_X_REG__layer00_solid_color_g_MASK GENMASK(9, 0)
+#define CMPS_X_REG__layer00_solid_color_b_WORD 12
+#define CMPS_X_REG__layer00_solid_color_b_MASK GENMASK(9, 0)
+#define CMPS_X_REG__layer00_solid_color_a_WORD 13
+#define CMPS_X_REG__layer00_solid_color_a_MASK GENMASK(7, 0)
+#define CMPS_X_REG__layer00_blend_mode_WORD 13
+#define CMPS_X_REG__layer00_blend_mode_MASK GENMASK(15, 14)
+#define CMPS_X_REG__layer00_colorkey_en_WORD 13
+#define CMPS_X_REG__layer00_colorkey_en_MASK GENMASK(18, 18)
+#define CMPS_X_REG__layer00_en_WORD 14
+#define CMPS_X_REG__layer00_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer00_blend_sel_WORD 14
+#define CMPS_X_REG__layer00_blend_sel_MASK GENMASK(2, 1)
+#define CMPS_X_REG__layer00_solid_en_WORD 14
+#define CMPS_X_REG__layer00_solid_en_MASK GENMASK(3, 3)
+#define CMPS_X_REG__layer00_dma_id_WORD 14
+#define CMPS_X_REG__layer00_dma_id_MASK GENMASK(7, 4)
+#define CMPS_X_REG__layer00_layer_alpha_WORD 14
+#define CMPS_X_REG__layer00_layer_alpha_MASK GENMASK(15, 8)
+#define CMPS_X_REG__layer00_alpha_ratio_WORD 14
+#define CMPS_X_REG__layer00_alpha_ratio_MASK GENMASK(23, 16)
+#define CMPS_X_REG__layer01_en_WORD 21
+#define CMPS_X_REG__layer01_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer02_en_WORD 28
+#define CMPS_X_REG__layer02_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer03_en_WORD 35
+#define CMPS_X_REG__layer03_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer04_en_WORD 42
+#define CMPS_X_REG__layer04_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer05_en_WORD 49
+#define CMPS_X_REG__layer05_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer06_en_WORD 56
+#define CMPS_X_REG__layer06_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer07_en_WORD 63
+#define CMPS_X_REG__layer07_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer08_en_WORD 70
+#define CMPS_X_REG__layer08_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer09_en_WORD 77
+#define CMPS_X_REG__layer09_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer10_en_WORD 84
+#define CMPS_X_REG__layer10_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer11_en_WORD 91
+#define CMPS_X_REG__layer11_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer12_en_WORD 98
+#define CMPS_X_REG__layer12_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer13_en_WORD 105
+#define CMPS_X_REG__layer13_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer14_en_WORD 112
+#define CMPS_X_REG__layer14_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer15_en_WORD 119
+#define CMPS_X_REG__layer15_en_MASK GENMASK(0, 0)
+
+/* DMA_TOP_REG: 25 x 32-bit registers */
+#define DMA_TOP_REG__NWORDS 25
+#define DMA_TOP_REG__image_rr_ratio_WORD 1
+#define DMA_TOP_REG__image_rr_ratio_MASK GENMASK(7, 0)
+#define DMA_TOP_REG__pixel_num_th_WORD 1
+#define DMA_TOP_REG__pixel_num_th_MASK GENMASK(14, 9)
+#define DMA_TOP_REG__rdma_timeout_limit_WORD 2
+#define DMA_TOP_REG__rdma_timeout_limit_MASK GENMASK(15, 0)
+#define DMA_TOP_REG__wdma_timeout_limit_WORD 2
+#define DMA_TOP_REG__wdma_timeout_limit_MASK GENMASK(31, 16)
+
+/* DPU_CTL_REG: 15 x 32-bit registers */
+#define DPU_CTL_REG__NWORDS 15
+#define DPU_CTL_REG__nml_rch_en_WORD 0
+#define DPU_CTL_REG__nml_rch_en_MASK GENMASK(9, 0)
+#define DPU_CTL_REG__nml_scl_en_WORD 0
+#define DPU_CTL_REG__nml_scl_en_MASK GENMASK(13, 10)
+#define DPU_CTL_REG__nml_outctl_en_WORD 0
+#define DPU_CTL_REG__nml_outctl_en_MASK GENMASK(18, 18)
+#define DPU_CTL_REG__nml_frm_timing_en_WORD 0
+#define DPU_CTL_REG__nml_frm_timing_en_MASK GENMASK(25, 23)
+#define DPU_CTL_REG__both_cfg_rdy_WORD 2
+#define DPU_CTL_REG__both_cfg_rdy_MASK GENMASK(0, 0)
+#define DPU_CTL_REG__video_mod_WORD 3
+#define DPU_CTL_REG__video_mod_MASK GENMASK(0, 0)
+#define DPU_CTL_REG__dbg_mod_WORD 3
+#define DPU_CTL_REG__dbg_mod_MASK GENMASK(1, 1)
+#define DPU_CTL_REG__timing_inter0_WORD 3
+#define DPU_CTL_REG__timing_inter0_MASK GENMASK(7, 2)
+#define DPU_CTL_REG__timing_inter1_WORD 3
+#define DPU_CTL_REG__timing_inter1_MASK GENMASK(13, 8)
+#define DPU_CTL_REG__sw_start_WORD 4
+#define DPU_CTL_REG__sw_start_MASK GENMASK(0, 0)
+#define DPU_CTL_REG__nml_rch_vrt_reuse_WORD 7
+#define DPU_CTL_REG__nml_rch_vrt_reuse_MASK GENMASK(9, 0)
+
+/* DPU_CTL_TOP_REG: 53 x 32-bit registers */
+#define DPU_CTL_TOP_REG__NWORDS 53
+#define DPU_CTL_TOP_REG__dpu_ctl_top_reg_0__cmdlist_rch_en_WORD(i) (0 + (i))
+#define DPU_CTL_TOP_REG__dpu_ctl_top_reg_0__cmdlist_rch_en_MASK GENMASK(0, 0)
+#define DPU_CTL_TOP_REG__dpu_ctl_top_reg_10__cmdlist_cmps_other_en_WORD(i) (10 + (i))
+#define DPU_CTL_TOP_REG__dpu_ctl_top_reg_10__cmdlist_cmps_other_en_MASK GENMASK(0, 0)
+#define DPU_CTL_TOP_REG__dpu_ctl_top_reg_10__cmdlist_cmps_top_en_WORD(i) (10 + (i))
+#define DPU_CTL_TOP_REG__dpu_ctl_top_reg_10__cmdlist_cmps_top_en_MASK GENMASK(1, 1)
+
+/* DPU_INTP_REG: 50 x 32-bit registers */
+#define DPU_INTP_REG__NWORDS 50
+
+/* EE_REG: 51 x 32-bit registers */
+#define EE_REG__NWORDS 51
+#define EE_REG__m_benable_WORD 0
+#define EE_REG__m_benable_MASK GENMASK(0, 0)
+
+/* MMU_TBU_REG: 21 x 32-bit registers */
+#define MMU_TBU_REG__NWORDS 21
+#define MMU_TBU_REG__tbu_base_addr0_low_WORD 1
+#define MMU_TBU_REG__tbu_base_addr0_low_MASK GENMASK(31, 0)
+#define MMU_TBU_REG__tbu_base_addr0_high_WORD 2
+#define MMU_TBU_REG__tbu_base_addr0_high_MASK GENMASK(11, 0)
+#define MMU_TBU_REG__tbu_base_addr1_low_WORD 3
+#define MMU_TBU_REG__tbu_base_addr1_low_MASK GENMASK(31, 0)
+#define MMU_TBU_REG__tbu_base_addr1_high_WORD 4
+#define MMU_TBU_REG__tbu_base_addr1_high_MASK GENMASK(11, 0)
+#define MMU_TBU_REG__tbu_base_addr2_low_WORD 5
+#define MMU_TBU_REG__tbu_base_addr2_low_MASK GENMASK(31, 0)
+#define MMU_TBU_REG__tbu_base_addr2_high_WORD 6
+#define MMU_TBU_REG__tbu_base_addr2_high_MASK GENMASK(11, 0)
+#define MMU_TBU_REG__tbu_va0_WORD 7
+#define MMU_TBU_REG__tbu_va0_MASK GENMASK(31, 0)
+#define MMU_TBU_REG__tbu_va1_WORD 8
+#define MMU_TBU_REG__tbu_va1_MASK GENMASK(31, 0)
+#define MMU_TBU_REG__tbu_va2_WORD 9
+#define MMU_TBU_REG__tbu_va2_MASK GENMASK(31, 0)
+#define MMU_TBU_REG__tbu_size0_WORD 10
+#define MMU_TBU_REG__tbu_size0_MASK GENMASK(15, 0)
+#define MMU_TBU_REG__tbu_size1_WORD 11
+#define MMU_TBU_REG__tbu_size1_MASK GENMASK(15, 0)
+#define MMU_TBU_REG__tbu_size2_WORD 12
+#define MMU_TBU_REG__tbu_size2_MASK GENMASK(15, 0)
+#define MMU_TBU_REG__vsync_update_en_WORD 13
+#define MMU_TBU_REG__vsync_update_en_MASK GENMASK(1, 1)
+
+/* MMU_TOP_REG: 23 x 32-bit registers */
+#define MMU_TOP_REG__NWORDS 23
+#define MMU_TOP_REG__rdma_timelimit_WORD 0
+#define MMU_TOP_REG__rdma_timelimit_MASK GENMASK(31, 16)
+#define MMU_TOP_REG__sram0_tlb_axi_port_sel_WORD 1
+#define MMU_TOP_REG__sram0_tlb_axi_port_sel_MASK GENMASK(1, 0)
+#define MMU_TOP_REG__sram1_tlb_axi_port_sel_WORD 1
+#define MMU_TOP_REG__sram1_tlb_axi_port_sel_MASK GENMASK(3, 2)
+#define MMU_TOP_REG__dmac0_rd_outs_num_WORD 2
+#define MMU_TOP_REG__dmac0_rd_outs_num_MASK GENMASK(7, 0)
+#define MMU_TOP_REG__dmac1_rd_outs_num_WORD 3
+#define MMU_TOP_REG__dmac1_rd_outs_num_MASK GENMASK(7, 0)
+
+/* POSTPIPE_REG: 50 x 32-bit registers */
+#define POSTPIPE_REG__NWORDS 50
+#define POSTPIPE_REG__m_inwidth_WORD 13
+#define POSTPIPE_REG__m_inwidth_MASK GENMASK(15, 0)
+#define POSTPIPE_REG__m_inheight_WORD 13
+#define POSTPIPE_REG__m_inheight_MASK GENMASK(31, 16)
+
+/* RDMA_PATH_X_REG: 60 x 32-bit registers */
+#define RDMA_PATH_X_REG__NWORDS 60
+#define RDMA_PATH_X_REG__layer_mode_WORD 0
+#define RDMA_PATH_X_REG__layer_mode_MASK GENMASK(1, 0)
+#define RDMA_PATH_X_REG__layer_cmpsr_id_WORD 0
+#define RDMA_PATH_X_REG__layer_cmpsr_id_MASK GENMASK(15, 13)
+#define RDMA_PATH_X_REG__is_two_layers_WORD 1
+#define RDMA_PATH_X_REG__is_two_layers_MASK GENMASK(0, 0)
+#define RDMA_PATH_X_REG__is_offline_WORD 1
+#define RDMA_PATH_X_REG__is_offline_MASK GENMASK(1, 1)
+#define RDMA_PATH_X_REG__base_addr0_low_ly0_WORD 9
+#define RDMA_PATH_X_REG__base_addr0_low_ly0_MASK GENMASK(31, 0)
+#define RDMA_PATH_X_REG__base_addr0_high_ly0_WORD 10
+#define RDMA_PATH_X_REG__base_addr0_high_ly0_MASK GENMASK(1, 0)
+#define RDMA_PATH_X_REG__base_addr1_low_ly0_WORD 11
+#define RDMA_PATH_X_REG__base_addr1_low_ly0_MASK GENMASK(31, 0)
+#define RDMA_PATH_X_REG__base_addr1_high_ly0_WORD 12
+#define RDMA_PATH_X_REG__base_addr1_high_ly0_MASK GENMASK(1, 0)
+#define RDMA_PATH_X_REG__base_addr2_low_ly0_WORD 13
+#define RDMA_PATH_X_REG__base_addr2_low_ly0_MASK GENMASK(31, 0)
+#define RDMA_PATH_X_REG__base_addr2_high_ly0_WORD 14
+#define RDMA_PATH_X_REG__base_addr2_high_ly0_MASK GENMASK(1, 0)
+#define RDMA_PATH_X_REG__rdma_stride0_layer0_WORD 15
+#define RDMA_PATH_X_REG__rdma_stride0_layer0_MASK GENMASK(15, 0)
+#define RDMA_PATH_X_REG__rdma_stride1_layer0_WORD 15
+#define RDMA_PATH_X_REG__rdma_stride1_layer0_MASK GENMASK(31, 16)
+#define RDMA_PATH_X_REG__img_width_ly0_WORD 16
+#define RDMA_PATH_X_REG__img_width_ly0_MASK GENMASK(15, 0)
+#define RDMA_PATH_X_REG__img_height_ly0_WORD 16
+#define RDMA_PATH_X_REG__img_height_ly0_MASK GENMASK(31, 16)
+#define RDMA_PATH_X_REG__bbox_start_x_ly0_WORD 17
+#define RDMA_PATH_X_REG__bbox_start_x_ly0_MASK GENMASK(15, 0)
+#define RDMA_PATH_X_REG__bbox_start_y_ly0_WORD 17
+#define RDMA_PATH_X_REG__bbox_start_y_ly0_MASK GENMASK(31, 16)
+#define RDMA_PATH_X_REG__bbox_end_x_ly0_WORD 18
+#define RDMA_PATH_X_REG__bbox_end_x_ly0_MASK GENMASK(15, 0)
+#define RDMA_PATH_X_REG__bbox_end_y_ly0_WORD 18
+#define RDMA_PATH_X_REG__bbox_end_y_ly0_MASK GENMASK(31, 16)
+#define RDMA_PATH_X_REG__pixel_format_WORD 29
+#define RDMA_PATH_X_REG__pixel_format_MASK GENMASK(5, 0)
+#define RDMA_PATH_X_REG__uv_swap_WORD 29
+#define RDMA_PATH_X_REG__uv_swap_MASK GENMASK(6, 6)
+#define RDMA_PATH_X_REG__rot_mode_ly0_WORD 29
+#define RDMA_PATH_X_REG__rot_mode_ly0_MASK GENMASK(10, 8)
+
+/* TMG_REG: 30 x 32-bit registers */
+#define TMG_REG__NWORDS 30
+#define TMG_REG__split_en_WORD 0
+#define TMG_REG__split_en_MASK GENMASK(0, 0)
+#define TMG_REG__cmd_screen_WORD 0
+#define TMG_REG__cmd_screen_MASK GENMASK(1, 1)
+#define TMG_REG__fm_timing_en_WORD 0
+#define TMG_REG__fm_timing_en_MASK GENMASK(2, 2)
+#define TMG_REG__cmd_wait_en_WORD 0
+#define TMG_REG__cmd_wait_en_MASK GENMASK(3, 3)
+#define TMG_REG__cmd_wait_te_WORD 0
+#define TMG_REG__cmd_wait_te_MASK GENMASK(4, 4)
+#define TMG_REG__disp_ready_man_en_WORD 0
+#define TMG_REG__disp_ready_man_en_MASK GENMASK(5, 5)
+#define TMG_REG__hsp_WORD 0
+#define TMG_REG__hsp_MASK GENMASK(7, 7)
+#define TMG_REG__vsp_WORD 0
+#define TMG_REG__vsp_MASK GENMASK(8, 8)
+#define TMG_REG__user_WORD 2
+#define TMG_REG__user_MASK GENMASK(15, 12)
+#define TMG_REG__hfp_WORD 3
+#define TMG_REG__hfp_MASK GENMASK(27, 16)
+#define TMG_REG__hsync_width_WORD 4
+#define TMG_REG__hsync_width_MASK GENMASK(9, 0)
+#define TMG_REG__hbp_WORD 4
+#define TMG_REG__hbp_MASK GENMASK(27, 16)
+#define TMG_REG__vfp_WORD 5
+#define TMG_REG__vfp_MASK GENMASK(15, 0)
+#define TMG_REG__vsync_width_WORD 5
+#define TMG_REG__vsync_width_MASK GENMASK(25, 16)
+#define TMG_REG__vbp_WORD 6
+#define TMG_REG__vbp_MASK GENMASK(11, 0)
+#define TMG_REG__h_active_WORD 6
+#define TMG_REG__h_active_MASK GENMASK(29, 16)
+#define TMG_REG__v_active_WORD 7
+#define TMG_REG__v_active_MASK GENMASK(13, 0)
+#define TMG_REG__background_r_WORD 9
+#define TMG_REG__background_r_MASK GENMASK(11, 0)
+#define TMG_REG__background_g_WORD 9
+#define TMG_REG__background_g_MASK GENMASK(27, 16)
+#define TMG_REG__background_b_WORD 10
+#define TMG_REG__background_b_MASK GENMASK(11, 0)
+#define TMG_REG__eof_1st_ln_dly_num_WORD 11
+#define TMG_REG__eof_1st_ln_dly_num_MASK GENMASK(15, 0)
+#define TMG_REG__eof_2nd_ln_dly_num_WORD 11
+#define TMG_REG__eof_2nd_ln_dly_num_MASK GENMASK(31, 16)
+#define TMG_REG__sof_pre_ln_num_WORD 14
+#define TMG_REG__sof_pre_ln_num_MASK GENMASK(16, 0)
+
+#endif /* SATURN_FIELDS_H */
diff --git a/drivers/gpu/drm/spacemit/spacemit_dpu_ids.h b/drivers/gpu/drm/spacemit/spacemit_dpu_ids.h
new file mode 100644
index 0000000000000..41014dda927b9
--- /dev/null
+++ b/drivers/gpu/drm/spacemit/spacemit_dpu_ids.h
@@ -0,0 +1,22 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2025-2026 SpacemiT Co., Ltd.
+ */
+
+#ifndef _SPACEMIT_DPU_IDS_H_
+#define _SPACEMIT_DPU_IDS_H_
+
+/* Saturn online compositor instance ids (hardware IRQ-table indices). */
+#define COMPOSER0 0
+#define COMPOSER1 1
+#define COMPOSER2 2
+#define COMPOSER3 3
+
+/* DPU output-format field encoding (dpuctrl out-format register). */
+#define OUTFMT_RGB121212 0
+#define OUTFMT_RGB101010 1
+#define OUTFMT_RGB888 2
+#define OUTFMT_RGB666 12
+#define OUTFMT_RGB565 13
+
+#endif /* _SPACEMIT_DPU_IDS_H_ */
--
2.43.0
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
WARNING: multiple messages have this Message-ID (diff)
From: Cody Kang <codykang.hk@gmail.com>
To: "David Airlie" <airlied@gmail.com>,
"Simona Vetter" <simona@ffwll.ch>,
"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
"Maxime Ripard" <mripard@kernel.org>,
"Thomas Zimmermann" <tzimmermann@suse.de>,
"Rob Herring" <robh@kernel.org>,
"Krzysztof Kozlowski" <krzk+dt@kernel.org>,
"Conor Dooley" <conor+dt@kernel.org>,
"Yixun Lan" <dlan@kernel.org>, "Vinod Koul" <vkoul@kernel.org>,
"Neil Armstrong" <neil.armstrong@linaro.org>,
"Haylen Chu" <heylenay@4d2.org>,
"Michael Turquette" <mturquette@baylibre.com>,
"Stephen Boyd" <sboyd@kernel.org>,
"Brian Masney" <bmasney@redhat.com>,
"Philipp Zabel" <p.zabel@pengutronix.de>,
"Paul Walmsley" <pjw@kernel.org>,
"Palmer Dabbelt" <palmer@dabbelt.com>,
"Albert Ou" <aou@eecs.berkeley.edu>,
"Alexandre Ghiti" <alex@ghiti.fr>, "Yao Zi" <me@ziyao.cc>,
"Uwe Kleine-König" <u.kleine-koenig@baylibre.com>,
"Guodong Xu" <docular.xu@gmail.com>
Cc: dri-devel@lists.freedesktop.org, linux-riscv@lists.infradead.org,
devicetree@vger.kernel.org, spacemit@lists.linux.dev,
linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org,
linux-clk@vger.kernel.org, Cody Kang <codykang.hk@gmail.com>
Subject: [PATCH v2 07/17] drm/spacemit: add Saturn DPU register model
Date: Sun, 09 Aug 2026 21:14:16 +0800 [thread overview]
Message-ID: <20260809-k3-display-v2-7-327d7910bf71@gmail.com> (raw)
In-Reply-To: <20260809-k3-display-v2-0-327d7910bf71@gmail.com>
The Saturn display processing unit is programmed through a set of
register blocks (composer, RDMA, timing generator, cmdlist engine,
display MMU) laid out identically in both SoC instances. Add the block
address map, the per-field word offset and mask tables consumed by the
field accessors, the interrupt bit layout and the compositor and
output-format ID encodings. The address map describes the whole
IP block on purpose, including blocks the driver does not touch; the
field tables carry the fields the driver programs, with each block's
full word count kept as its NWORDS extent.
Consumers arrive with the following patches; the driver only becomes
buildable once the final patch adds the Kconfig and Makefile glue.
Signed-off-by: Cody Kang <codykang.hk@gmail.com>
---
v2:
- no change
---
drivers/gpu/drm/spacemit/dpu/saturn_regs/dpu_int.h | 25 ++
.../gpu/drm/spacemit/dpu/saturn_regs/reg_map_hee.h | 64 +++++
.../drm/spacemit/dpu/saturn_regs/saturn_fields.h | 298 +++++++++++++++++++++
drivers/gpu/drm/spacemit/spacemit_dpu_ids.h | 22 ++
4 files changed, 409 insertions(+)
diff --git a/drivers/gpu/drm/spacemit/dpu/saturn_regs/dpu_int.h b/drivers/gpu/drm/spacemit/dpu/saturn_regs/dpu_int.h
new file mode 100644
index 0000000000000..2c7fa00ba31e9
--- /dev/null
+++ b/drivers/gpu/drm/spacemit/dpu/saturn_regs/dpu_int.h
@@ -0,0 +1,25 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2025-2026 SpacemiT Co., Ltd.
+ *
+ */
+
+#ifndef DPU_INT_REG_H
+#define DPU_INT_REG_H
+
+#include <linux/bits.h>
+
+#define DPU_INT_CMDLIST_CH_FRM_CFG_DONE_MASK (0xff)
+#define DPU_INT_CMDLIST_CH_FRM_CFG_DONE (DPU_INT_CMDLIST_CH_FRM_CFG_DONE_MASK << 11)
+#define DPU_INT_FRM_TIMING_UNFLOW BIT(8)
+#define DPU_INT_CFG_RDY_CLR BIT(5)
+#define DPU_INT_FRM_TIMING_CFG_LINE BIT(4)
+#define DPU_INT_FRM_TIMING_CFG_EOF (BIT(2) | BIT(3))
+#define DPU_INT_FRM_TIMING_EOF BIT(1)
+#define DPU_INT_FRM_TIMING_VSYNC BIT(0)
+#define DPU_REST_INT_BITS (DPU_INT_FRM_TIMING_CFG_EOF | \
+ DPU_INT_FRM_TIMING_CFG_LINE | \
+ DPU_INT_FRM_TIMING_EOF | \
+ DPU_INT_CMDLIST_CH_FRM_CFG_DONE)
+
+#endif
diff --git a/drivers/gpu/drm/spacemit/dpu/saturn_regs/reg_map_hee.h b/drivers/gpu/drm/spacemit/dpu/saturn_regs/reg_map_hee.h
new file mode 100644
index 0000000000000..9490021cdb918
--- /dev/null
+++ b/drivers/gpu/drm/spacemit/dpu/saturn_regs/reg_map_hee.h
@@ -0,0 +1,64 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2025-2026 SpacemiT Co., Ltd.
+ *
+ */
+
+#ifndef _SATURN_REG_MAP_hee_H_
+#define _SATURN_REG_MAP_hee_H_
+
+#include "dpu_int.h"
+
+/* Base address, then bit definitions */
+
+#define DPU_TOP_BASE_ADDR 0x0
+#define DPU_CTRL_BASE_ADDR 0x3c0 /* dpu_ctl_top start address */
+#define CMDLIST_BASE_ADDR 0x500
+#define DPU_INT_BASE_ADDR 0x700
+
+#define DPU_ONLINE_IRQ_MSK (3 * 4)
+#define DPU_ONLINE_IRQ_STS (12 * 4)
+
+#define DMA_TOP_BASE_ADDR (RDMA0_BASE_ADDR + 0x280)
+
+#define RDMA0_BASE_ADDR (0x00001000)
+#define RDMA1_BASE_ADDR (RDMA0_BASE_ADDR + 0x1000)
+#define RDMA2_BASE_ADDR (RDMA0_BASE_ADDR + 0xa000)
+#define RDMA3_BASE_ADDR (RDMA0_BASE_ADDR + 0xb000)
+
+#define MMU_BASE_ADDR (0x1100)
+#define MMU_TOP_BASE_ADDR (MMU_BASE_ADDR + 0x100)
+
+#define TBU0_ADDR 0x1100
+#define TBU1_ADDR 0x1180
+#define TBU2_ADDR 0x2100
+#define TBU3_ADDR 0x2180
+#define TBU4_ADDR 0xb100
+#define TBU5_ADDR 0xb180
+#define TBU6_ADDR 0xc100
+#define TBU7_ADDR 0xc180
+
+#define CMP0_BASE_ADDR 0x00018000
+#define CMP1_BASE_ADDR (CMP0_BASE_ADDR + 0x18000)
+#define CMP2_BASE_ADDR (CMP0_BASE_ADDR + 0x30000)
+
+#define PREPIPE_SCAL0_BASE_ADDR 0x14000
+#define PREPIPE_SCAL1_BASE_ADDR 0x14400
+#define PREPIPE_SCAL2_BASE_ADDR 0x14800
+#define PREPIPE_SCAL3_BASE_ADDR 0x14c00
+
+#define POST_PIPE_ADDR (CMP1_BASE_ADDR + 0x300)
+
+#define EE_ADDR (CMP1_BASE_ADDR + 0xd00)
+
+#define DPU_SCENE_CTL_BASE_ADDR (0x300)
+#define DPU_SCENE_CTL_SIZE 0x40
+#define DPU_SCENE_CTL_ADDR(i) (DPU_SCENE_CTL_BASE_ADDR + (i) * DPU_SCENE_CTL_SIZE)
+
+#define TMG0_BASE_ADDR (0x00051000 + 0x200)
+
+#define CMDLIST_CH_Y 0x188
+#define CMDLIST_CH_START_CMPS_Y 0x90
+#define CMDLIST_CFG_READY 0x34
+
+#endif
diff --git a/drivers/gpu/drm/spacemit/dpu/saturn_regs/saturn_fields.h b/drivers/gpu/drm/spacemit/dpu/saturn_regs/saturn_fields.h
new file mode 100644
index 0000000000000..f745dfdaa83de
--- /dev/null
+++ b/drivers/gpu/drm/spacemit/dpu/saturn_regs/saturn_fields.h
@@ -0,0 +1,298 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2025-2026 SpacemiT Co., Ltd.
+ *
+ * Saturn DPU register field map: word offset and mask per field, consumed by
+ * the dpu_write()/dpu_read() accessors.
+ */
+
+#ifndef SATURN_FIELDS_H
+#define SATURN_FIELDS_H
+
+#include <linux/bits.h>
+
+/* CMDLIST_REG: 128 x 32-bit registers */
+#define CMDLIST_REG__NWORDS 128
+#define CMDLIST_REG__cmdlist_reg_0__cmdlist_ch_start_addrl_WORD(i) (0 + (i))
+#define CMDLIST_REG__cmdlist_reg_0__cmdlist_ch_start_addrl_MASK GENMASK(31, 4)
+#define CMDLIST_REG__cmdlist_reg_16__cmdlist_ch_start_addrh_WORD(i) (16 + (i))
+#define CMDLIST_REG__cmdlist_reg_16__cmdlist_ch_start_addrh_MASK GENMASK(5, 0)
+#define CMDLIST_REG__cmdlist_reg_48__cmdlist_ch_y_first_WORD(i) (48 + (i))
+#define CMDLIST_REG__cmdlist_reg_48__cmdlist_ch_y_first_MASK GENMASK(24, 12)
+
+/* CMPS_X_REG: 146 x 32-bit registers */
+#define CMPS_X_REG__NWORDS 146
+#define CMPS_X_REG__module_enable_WORD 0
+#define CMPS_X_REG__module_enable_MASK GENMASK(0, 0)
+#define CMPS_X_REG__dst_w_WORD 1
+#define CMPS_X_REG__dst_w_MASK GENMASK(15, 0)
+#define CMPS_X_REG__dst_h_WORD 1
+#define CMPS_X_REG__dst_h_MASK GENMASK(31, 16)
+#define CMPS_X_REG__bg_color_r_WORD 2
+#define CMPS_X_REG__bg_color_r_MASK GENMASK(9, 0)
+#define CMPS_X_REG__bg_color_g_WORD 3
+#define CMPS_X_REG__bg_color_g_MASK GENMASK(9, 0)
+#define CMPS_X_REG__bg_color_b_WORD 4
+#define CMPS_X_REG__bg_color_b_MASK GENMASK(9, 0)
+#define CMPS_X_REG__bg_color_a_WORD 5
+#define CMPS_X_REG__bg_color_a_MASK GENMASK(7, 0)
+#define CMPS_X_REG__layer00_area_left_WORD 8
+#define CMPS_X_REG__layer00_area_left_MASK GENMASK(15, 0)
+#define CMPS_X_REG__layer00_area_right_WORD 8
+#define CMPS_X_REG__layer00_area_right_MASK GENMASK(31, 16)
+#define CMPS_X_REG__layer00_area_top_WORD 9
+#define CMPS_X_REG__layer00_area_top_MASK GENMASK(15, 0)
+#define CMPS_X_REG__layer00_area_bottom_WORD 9
+#define CMPS_X_REG__layer00_area_bottom_MASK GENMASK(31, 16)
+#define CMPS_X_REG__layer00_solid_color_r_WORD 10
+#define CMPS_X_REG__layer00_solid_color_r_MASK GENMASK(9, 0)
+#define CMPS_X_REG__layer00_solid_color_g_WORD 11
+#define CMPS_X_REG__layer00_solid_color_g_MASK GENMASK(9, 0)
+#define CMPS_X_REG__layer00_solid_color_b_WORD 12
+#define CMPS_X_REG__layer00_solid_color_b_MASK GENMASK(9, 0)
+#define CMPS_X_REG__layer00_solid_color_a_WORD 13
+#define CMPS_X_REG__layer00_solid_color_a_MASK GENMASK(7, 0)
+#define CMPS_X_REG__layer00_blend_mode_WORD 13
+#define CMPS_X_REG__layer00_blend_mode_MASK GENMASK(15, 14)
+#define CMPS_X_REG__layer00_colorkey_en_WORD 13
+#define CMPS_X_REG__layer00_colorkey_en_MASK GENMASK(18, 18)
+#define CMPS_X_REG__layer00_en_WORD 14
+#define CMPS_X_REG__layer00_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer00_blend_sel_WORD 14
+#define CMPS_X_REG__layer00_blend_sel_MASK GENMASK(2, 1)
+#define CMPS_X_REG__layer00_solid_en_WORD 14
+#define CMPS_X_REG__layer00_solid_en_MASK GENMASK(3, 3)
+#define CMPS_X_REG__layer00_dma_id_WORD 14
+#define CMPS_X_REG__layer00_dma_id_MASK GENMASK(7, 4)
+#define CMPS_X_REG__layer00_layer_alpha_WORD 14
+#define CMPS_X_REG__layer00_layer_alpha_MASK GENMASK(15, 8)
+#define CMPS_X_REG__layer00_alpha_ratio_WORD 14
+#define CMPS_X_REG__layer00_alpha_ratio_MASK GENMASK(23, 16)
+#define CMPS_X_REG__layer01_en_WORD 21
+#define CMPS_X_REG__layer01_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer02_en_WORD 28
+#define CMPS_X_REG__layer02_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer03_en_WORD 35
+#define CMPS_X_REG__layer03_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer04_en_WORD 42
+#define CMPS_X_REG__layer04_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer05_en_WORD 49
+#define CMPS_X_REG__layer05_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer06_en_WORD 56
+#define CMPS_X_REG__layer06_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer07_en_WORD 63
+#define CMPS_X_REG__layer07_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer08_en_WORD 70
+#define CMPS_X_REG__layer08_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer09_en_WORD 77
+#define CMPS_X_REG__layer09_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer10_en_WORD 84
+#define CMPS_X_REG__layer10_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer11_en_WORD 91
+#define CMPS_X_REG__layer11_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer12_en_WORD 98
+#define CMPS_X_REG__layer12_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer13_en_WORD 105
+#define CMPS_X_REG__layer13_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer14_en_WORD 112
+#define CMPS_X_REG__layer14_en_MASK GENMASK(0, 0)
+#define CMPS_X_REG__layer15_en_WORD 119
+#define CMPS_X_REG__layer15_en_MASK GENMASK(0, 0)
+
+/* DMA_TOP_REG: 25 x 32-bit registers */
+#define DMA_TOP_REG__NWORDS 25
+#define DMA_TOP_REG__image_rr_ratio_WORD 1
+#define DMA_TOP_REG__image_rr_ratio_MASK GENMASK(7, 0)
+#define DMA_TOP_REG__pixel_num_th_WORD 1
+#define DMA_TOP_REG__pixel_num_th_MASK GENMASK(14, 9)
+#define DMA_TOP_REG__rdma_timeout_limit_WORD 2
+#define DMA_TOP_REG__rdma_timeout_limit_MASK GENMASK(15, 0)
+#define DMA_TOP_REG__wdma_timeout_limit_WORD 2
+#define DMA_TOP_REG__wdma_timeout_limit_MASK GENMASK(31, 16)
+
+/* DPU_CTL_REG: 15 x 32-bit registers */
+#define DPU_CTL_REG__NWORDS 15
+#define DPU_CTL_REG__nml_rch_en_WORD 0
+#define DPU_CTL_REG__nml_rch_en_MASK GENMASK(9, 0)
+#define DPU_CTL_REG__nml_scl_en_WORD 0
+#define DPU_CTL_REG__nml_scl_en_MASK GENMASK(13, 10)
+#define DPU_CTL_REG__nml_outctl_en_WORD 0
+#define DPU_CTL_REG__nml_outctl_en_MASK GENMASK(18, 18)
+#define DPU_CTL_REG__nml_frm_timing_en_WORD 0
+#define DPU_CTL_REG__nml_frm_timing_en_MASK GENMASK(25, 23)
+#define DPU_CTL_REG__both_cfg_rdy_WORD 2
+#define DPU_CTL_REG__both_cfg_rdy_MASK GENMASK(0, 0)
+#define DPU_CTL_REG__video_mod_WORD 3
+#define DPU_CTL_REG__video_mod_MASK GENMASK(0, 0)
+#define DPU_CTL_REG__dbg_mod_WORD 3
+#define DPU_CTL_REG__dbg_mod_MASK GENMASK(1, 1)
+#define DPU_CTL_REG__timing_inter0_WORD 3
+#define DPU_CTL_REG__timing_inter0_MASK GENMASK(7, 2)
+#define DPU_CTL_REG__timing_inter1_WORD 3
+#define DPU_CTL_REG__timing_inter1_MASK GENMASK(13, 8)
+#define DPU_CTL_REG__sw_start_WORD 4
+#define DPU_CTL_REG__sw_start_MASK GENMASK(0, 0)
+#define DPU_CTL_REG__nml_rch_vrt_reuse_WORD 7
+#define DPU_CTL_REG__nml_rch_vrt_reuse_MASK GENMASK(9, 0)
+
+/* DPU_CTL_TOP_REG: 53 x 32-bit registers */
+#define DPU_CTL_TOP_REG__NWORDS 53
+#define DPU_CTL_TOP_REG__dpu_ctl_top_reg_0__cmdlist_rch_en_WORD(i) (0 + (i))
+#define DPU_CTL_TOP_REG__dpu_ctl_top_reg_0__cmdlist_rch_en_MASK GENMASK(0, 0)
+#define DPU_CTL_TOP_REG__dpu_ctl_top_reg_10__cmdlist_cmps_other_en_WORD(i) (10 + (i))
+#define DPU_CTL_TOP_REG__dpu_ctl_top_reg_10__cmdlist_cmps_other_en_MASK GENMASK(0, 0)
+#define DPU_CTL_TOP_REG__dpu_ctl_top_reg_10__cmdlist_cmps_top_en_WORD(i) (10 + (i))
+#define DPU_CTL_TOP_REG__dpu_ctl_top_reg_10__cmdlist_cmps_top_en_MASK GENMASK(1, 1)
+
+/* DPU_INTP_REG: 50 x 32-bit registers */
+#define DPU_INTP_REG__NWORDS 50
+
+/* EE_REG: 51 x 32-bit registers */
+#define EE_REG__NWORDS 51
+#define EE_REG__m_benable_WORD 0
+#define EE_REG__m_benable_MASK GENMASK(0, 0)
+
+/* MMU_TBU_REG: 21 x 32-bit registers */
+#define MMU_TBU_REG__NWORDS 21
+#define MMU_TBU_REG__tbu_base_addr0_low_WORD 1
+#define MMU_TBU_REG__tbu_base_addr0_low_MASK GENMASK(31, 0)
+#define MMU_TBU_REG__tbu_base_addr0_high_WORD 2
+#define MMU_TBU_REG__tbu_base_addr0_high_MASK GENMASK(11, 0)
+#define MMU_TBU_REG__tbu_base_addr1_low_WORD 3
+#define MMU_TBU_REG__tbu_base_addr1_low_MASK GENMASK(31, 0)
+#define MMU_TBU_REG__tbu_base_addr1_high_WORD 4
+#define MMU_TBU_REG__tbu_base_addr1_high_MASK GENMASK(11, 0)
+#define MMU_TBU_REG__tbu_base_addr2_low_WORD 5
+#define MMU_TBU_REG__tbu_base_addr2_low_MASK GENMASK(31, 0)
+#define MMU_TBU_REG__tbu_base_addr2_high_WORD 6
+#define MMU_TBU_REG__tbu_base_addr2_high_MASK GENMASK(11, 0)
+#define MMU_TBU_REG__tbu_va0_WORD 7
+#define MMU_TBU_REG__tbu_va0_MASK GENMASK(31, 0)
+#define MMU_TBU_REG__tbu_va1_WORD 8
+#define MMU_TBU_REG__tbu_va1_MASK GENMASK(31, 0)
+#define MMU_TBU_REG__tbu_va2_WORD 9
+#define MMU_TBU_REG__tbu_va2_MASK GENMASK(31, 0)
+#define MMU_TBU_REG__tbu_size0_WORD 10
+#define MMU_TBU_REG__tbu_size0_MASK GENMASK(15, 0)
+#define MMU_TBU_REG__tbu_size1_WORD 11
+#define MMU_TBU_REG__tbu_size1_MASK GENMASK(15, 0)
+#define MMU_TBU_REG__tbu_size2_WORD 12
+#define MMU_TBU_REG__tbu_size2_MASK GENMASK(15, 0)
+#define MMU_TBU_REG__vsync_update_en_WORD 13
+#define MMU_TBU_REG__vsync_update_en_MASK GENMASK(1, 1)
+
+/* MMU_TOP_REG: 23 x 32-bit registers */
+#define MMU_TOP_REG__NWORDS 23
+#define MMU_TOP_REG__rdma_timelimit_WORD 0
+#define MMU_TOP_REG__rdma_timelimit_MASK GENMASK(31, 16)
+#define MMU_TOP_REG__sram0_tlb_axi_port_sel_WORD 1
+#define MMU_TOP_REG__sram0_tlb_axi_port_sel_MASK GENMASK(1, 0)
+#define MMU_TOP_REG__sram1_tlb_axi_port_sel_WORD 1
+#define MMU_TOP_REG__sram1_tlb_axi_port_sel_MASK GENMASK(3, 2)
+#define MMU_TOP_REG__dmac0_rd_outs_num_WORD 2
+#define MMU_TOP_REG__dmac0_rd_outs_num_MASK GENMASK(7, 0)
+#define MMU_TOP_REG__dmac1_rd_outs_num_WORD 3
+#define MMU_TOP_REG__dmac1_rd_outs_num_MASK GENMASK(7, 0)
+
+/* POSTPIPE_REG: 50 x 32-bit registers */
+#define POSTPIPE_REG__NWORDS 50
+#define POSTPIPE_REG__m_inwidth_WORD 13
+#define POSTPIPE_REG__m_inwidth_MASK GENMASK(15, 0)
+#define POSTPIPE_REG__m_inheight_WORD 13
+#define POSTPIPE_REG__m_inheight_MASK GENMASK(31, 16)
+
+/* RDMA_PATH_X_REG: 60 x 32-bit registers */
+#define RDMA_PATH_X_REG__NWORDS 60
+#define RDMA_PATH_X_REG__layer_mode_WORD 0
+#define RDMA_PATH_X_REG__layer_mode_MASK GENMASK(1, 0)
+#define RDMA_PATH_X_REG__layer_cmpsr_id_WORD 0
+#define RDMA_PATH_X_REG__layer_cmpsr_id_MASK GENMASK(15, 13)
+#define RDMA_PATH_X_REG__is_two_layers_WORD 1
+#define RDMA_PATH_X_REG__is_two_layers_MASK GENMASK(0, 0)
+#define RDMA_PATH_X_REG__is_offline_WORD 1
+#define RDMA_PATH_X_REG__is_offline_MASK GENMASK(1, 1)
+#define RDMA_PATH_X_REG__base_addr0_low_ly0_WORD 9
+#define RDMA_PATH_X_REG__base_addr0_low_ly0_MASK GENMASK(31, 0)
+#define RDMA_PATH_X_REG__base_addr0_high_ly0_WORD 10
+#define RDMA_PATH_X_REG__base_addr0_high_ly0_MASK GENMASK(1, 0)
+#define RDMA_PATH_X_REG__base_addr1_low_ly0_WORD 11
+#define RDMA_PATH_X_REG__base_addr1_low_ly0_MASK GENMASK(31, 0)
+#define RDMA_PATH_X_REG__base_addr1_high_ly0_WORD 12
+#define RDMA_PATH_X_REG__base_addr1_high_ly0_MASK GENMASK(1, 0)
+#define RDMA_PATH_X_REG__base_addr2_low_ly0_WORD 13
+#define RDMA_PATH_X_REG__base_addr2_low_ly0_MASK GENMASK(31, 0)
+#define RDMA_PATH_X_REG__base_addr2_high_ly0_WORD 14
+#define RDMA_PATH_X_REG__base_addr2_high_ly0_MASK GENMASK(1, 0)
+#define RDMA_PATH_X_REG__rdma_stride0_layer0_WORD 15
+#define RDMA_PATH_X_REG__rdma_stride0_layer0_MASK GENMASK(15, 0)
+#define RDMA_PATH_X_REG__rdma_stride1_layer0_WORD 15
+#define RDMA_PATH_X_REG__rdma_stride1_layer0_MASK GENMASK(31, 16)
+#define RDMA_PATH_X_REG__img_width_ly0_WORD 16
+#define RDMA_PATH_X_REG__img_width_ly0_MASK GENMASK(15, 0)
+#define RDMA_PATH_X_REG__img_height_ly0_WORD 16
+#define RDMA_PATH_X_REG__img_height_ly0_MASK GENMASK(31, 16)
+#define RDMA_PATH_X_REG__bbox_start_x_ly0_WORD 17
+#define RDMA_PATH_X_REG__bbox_start_x_ly0_MASK GENMASK(15, 0)
+#define RDMA_PATH_X_REG__bbox_start_y_ly0_WORD 17
+#define RDMA_PATH_X_REG__bbox_start_y_ly0_MASK GENMASK(31, 16)
+#define RDMA_PATH_X_REG__bbox_end_x_ly0_WORD 18
+#define RDMA_PATH_X_REG__bbox_end_x_ly0_MASK GENMASK(15, 0)
+#define RDMA_PATH_X_REG__bbox_end_y_ly0_WORD 18
+#define RDMA_PATH_X_REG__bbox_end_y_ly0_MASK GENMASK(31, 16)
+#define RDMA_PATH_X_REG__pixel_format_WORD 29
+#define RDMA_PATH_X_REG__pixel_format_MASK GENMASK(5, 0)
+#define RDMA_PATH_X_REG__uv_swap_WORD 29
+#define RDMA_PATH_X_REG__uv_swap_MASK GENMASK(6, 6)
+#define RDMA_PATH_X_REG__rot_mode_ly0_WORD 29
+#define RDMA_PATH_X_REG__rot_mode_ly0_MASK GENMASK(10, 8)
+
+/* TMG_REG: 30 x 32-bit registers */
+#define TMG_REG__NWORDS 30
+#define TMG_REG__split_en_WORD 0
+#define TMG_REG__split_en_MASK GENMASK(0, 0)
+#define TMG_REG__cmd_screen_WORD 0
+#define TMG_REG__cmd_screen_MASK GENMASK(1, 1)
+#define TMG_REG__fm_timing_en_WORD 0
+#define TMG_REG__fm_timing_en_MASK GENMASK(2, 2)
+#define TMG_REG__cmd_wait_en_WORD 0
+#define TMG_REG__cmd_wait_en_MASK GENMASK(3, 3)
+#define TMG_REG__cmd_wait_te_WORD 0
+#define TMG_REG__cmd_wait_te_MASK GENMASK(4, 4)
+#define TMG_REG__disp_ready_man_en_WORD 0
+#define TMG_REG__disp_ready_man_en_MASK GENMASK(5, 5)
+#define TMG_REG__hsp_WORD 0
+#define TMG_REG__hsp_MASK GENMASK(7, 7)
+#define TMG_REG__vsp_WORD 0
+#define TMG_REG__vsp_MASK GENMASK(8, 8)
+#define TMG_REG__user_WORD 2
+#define TMG_REG__user_MASK GENMASK(15, 12)
+#define TMG_REG__hfp_WORD 3
+#define TMG_REG__hfp_MASK GENMASK(27, 16)
+#define TMG_REG__hsync_width_WORD 4
+#define TMG_REG__hsync_width_MASK GENMASK(9, 0)
+#define TMG_REG__hbp_WORD 4
+#define TMG_REG__hbp_MASK GENMASK(27, 16)
+#define TMG_REG__vfp_WORD 5
+#define TMG_REG__vfp_MASK GENMASK(15, 0)
+#define TMG_REG__vsync_width_WORD 5
+#define TMG_REG__vsync_width_MASK GENMASK(25, 16)
+#define TMG_REG__vbp_WORD 6
+#define TMG_REG__vbp_MASK GENMASK(11, 0)
+#define TMG_REG__h_active_WORD 6
+#define TMG_REG__h_active_MASK GENMASK(29, 16)
+#define TMG_REG__v_active_WORD 7
+#define TMG_REG__v_active_MASK GENMASK(13, 0)
+#define TMG_REG__background_r_WORD 9
+#define TMG_REG__background_r_MASK GENMASK(11, 0)
+#define TMG_REG__background_g_WORD 9
+#define TMG_REG__background_g_MASK GENMASK(27, 16)
+#define TMG_REG__background_b_WORD 10
+#define TMG_REG__background_b_MASK GENMASK(11, 0)
+#define TMG_REG__eof_1st_ln_dly_num_WORD 11
+#define TMG_REG__eof_1st_ln_dly_num_MASK GENMASK(15, 0)
+#define TMG_REG__eof_2nd_ln_dly_num_WORD 11
+#define TMG_REG__eof_2nd_ln_dly_num_MASK GENMASK(31, 16)
+#define TMG_REG__sof_pre_ln_num_WORD 14
+#define TMG_REG__sof_pre_ln_num_MASK GENMASK(16, 0)
+
+#endif /* SATURN_FIELDS_H */
diff --git a/drivers/gpu/drm/spacemit/spacemit_dpu_ids.h b/drivers/gpu/drm/spacemit/spacemit_dpu_ids.h
new file mode 100644
index 0000000000000..41014dda927b9
--- /dev/null
+++ b/drivers/gpu/drm/spacemit/spacemit_dpu_ids.h
@@ -0,0 +1,22 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2025-2026 SpacemiT Co., Ltd.
+ */
+
+#ifndef _SPACEMIT_DPU_IDS_H_
+#define _SPACEMIT_DPU_IDS_H_
+
+/* Saturn online compositor instance ids (hardware IRQ-table indices). */
+#define COMPOSER0 0
+#define COMPOSER1 1
+#define COMPOSER2 2
+#define COMPOSER3 3
+
+/* DPU output-format field encoding (dpuctrl out-format register). */
+#define OUTFMT_RGB121212 0
+#define OUTFMT_RGB101010 1
+#define OUTFMT_RGB888 2
+#define OUTFMT_RGB666 12
+#define OUTFMT_RGB565 13
+
+#endif /* _SPACEMIT_DPU_IDS_H_ */
--
2.43.0
next prev parent reply other threads:[~2026-08-09 13:15 UTC|newest]
Thread overview: 94+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-09 13:14 [PATCH v2 00/17] drm/spacemit: add SpacemiT K3 display support Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang
2026-08-09 13:14 ` Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang via B4 Relay
2026-08-09 13:14 ` [PATCH v2 01/17] dt-bindings: display: spacemit: add K3 Saturn DPU controller Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang
2026-08-09 13:14 ` Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang via B4 Relay
2026-08-09 13:14 ` [PATCH v2 02/17] dt-bindings: phy: add SpacemiT K3 Innosilicon DP PHY Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang
2026-08-09 13:14 ` Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang via B4 Relay
2026-08-09 13:14 ` [PATCH v2 03/17] dt-bindings: display: spacemit: add K3 Innosilicon DP/eDP controller Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang
2026-08-09 13:14 ` Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang via B4 Relay
2026-08-09 13:25 ` sashiko-bot
2026-08-09 13:25 ` sashiko-bot
2026-08-09 13:14 ` [PATCH v2 04/17] dt-bindings: soc: spacemit: allow eDP/DP PHY PLL pixel clocks on K3 APMU Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang
2026-08-09 13:14 ` Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang via B4 Relay
2026-08-09 20:57 ` Rob Herring (Arm)
2026-08-09 20:57 ` Rob Herring (Arm)
2026-08-09 20:57 ` Rob Herring (Arm)
2026-08-10 14:33 ` Rob Herring (Arm)
2026-08-10 14:33 ` Rob Herring (Arm)
2026-08-10 14:33 ` Rob Herring (Arm)
2026-08-09 13:14 ` [PATCH v2 05/17] phy: spacemit: add Innosilicon DP TX PHY driver Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang
2026-08-09 13:14 ` Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang via B4 Relay
2026-08-09 13:26 ` sashiko-bot
2026-08-09 13:26 ` sashiko-bot
2026-08-09 13:14 ` [PATCH v2 06/17] clk: spacemit: k3: parent eDP/DP pixel clock to the PHY PLL Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang
2026-08-09 13:14 ` Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang via B4 Relay [this message]
2026-08-09 13:14 ` [PATCH v2 07/17] drm/spacemit: add Saturn DPU register model Cody Kang
2026-08-09 13:14 ` Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang via B4 Relay
2026-08-09 13:14 ` [PATCH v2 08/17] drm/spacemit: add Saturn DPU core types, cmdlist and display MMU Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang
2026-08-09 13:14 ` Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang via B4 Relay
2026-08-09 13:32 ` sashiko-bot
2026-08-09 13:32 ` sashiko-bot
2026-08-09 13:14 ` [PATCH v2 09/17] drm/spacemit: add Saturn DPU hardware backend Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang
2026-08-09 13:14 ` Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang via B4 Relay
2026-08-09 13:31 ` sashiko-bot
2026-08-09 13:31 ` sashiko-bot
2026-08-09 13:14 ` [PATCH v2 10/17] drm/spacemit: add Saturn DPU KMS pipeline Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang
2026-08-09 13:14 ` Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang via B4 Relay
2026-08-09 13:35 ` sashiko-bot
2026-08-09 13:35 ` sashiko-bot
2026-08-09 13:14 ` [PATCH v2 11/17] drm/spacemit: add Saturn DPU DRM device driver Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang
2026-08-09 13:14 ` Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang via B4 Relay
2026-08-09 13:35 ` sashiko-bot
2026-08-09 13:35 ` sashiko-bot
2026-08-09 13:14 ` [PATCH v2 12/17] drm/spacemit: add Innosilicon DP/eDP controller bridge driver Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang
2026-08-09 13:14 ` Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang via B4 Relay
2026-08-09 13:36 ` sashiko-bot
2026-08-09 13:36 ` sashiko-bot
2026-08-09 13:14 ` [PATCH v2 13/17] MAINTAINERS: add SpacemiT K3 display driver entry Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang
2026-08-09 13:14 ` Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang via B4 Relay
2026-08-09 13:14 ` [PATCH v2 14/17] riscv: dts: spacemit: k3: add display nodes Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang
2026-08-09 13:14 ` Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang via B4 Relay
2026-08-09 13:14 ` [PATCH v2 15/17] riscv: dts: spacemit: k3-pico-itx: enable the DisplayPort output Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang
2026-08-09 13:14 ` Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang via B4 Relay
2026-08-09 13:30 ` sashiko-bot
2026-08-09 13:30 ` sashiko-bot
2026-08-09 13:14 ` [PATCH v2 16/17] riscv: dts: spacemit: k3-com260-ifx: " Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang
2026-08-09 13:14 ` Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang via B4 Relay
2026-08-09 13:14 ` [PATCH v2 17/17] riscv: defconfig: spacemit: k3: enable display driver Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang
2026-08-09 13:14 ` Cody Kang via B4 Relay
2026-08-09 13:14 ` Cody Kang via B4 Relay
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260809-k3-display-v2-7-327d7910bf71@gmail.com \
--to=devnull+codykang.hk.gmail.com@kernel.org \
--cc=airlied@gmail.com \
--cc=alex@ghiti.fr \
--cc=aou@eecs.berkeley.edu \
--cc=bmasney@redhat.com \
--cc=codykang.hk@gmail.com \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=dlan@kernel.org \
--cc=docular.xu@gmail.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=heylenay@4d2.org \
--cc=krzk+dt@kernel.org \
--cc=linux-clk@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-phy@lists.infradead.org \
--cc=linux-riscv@lists.infradead.org \
--cc=maarten.lankhorst@linux.intel.com \
--cc=me@ziyao.cc \
--cc=mripard@kernel.org \
--cc=mturquette@baylibre.com \
--cc=neil.armstrong@linaro.org \
--cc=p.zabel@pengutronix.de \
--cc=palmer@dabbelt.com \
--cc=pjw@kernel.org \
--cc=robh@kernel.org \
--cc=sboyd@kernel.org \
--cc=simona@ffwll.ch \
--cc=spacemit@lists.linux.dev \
--cc=tzimmermann@suse.de \
--cc=u.kleine-koenig@baylibre.com \
--cc=vkoul@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.