Hi Sascha Hauer

From: Sascha Hauer <s.hauer@pengutronix.de>
Date: 2022-03-11 16:33:21
To:  dri-devel@lists.freedesktop.org
Cc:  linux-arm-kernel@lists.infradead.org,linux-rockchip@lists.infradead.org,devicetree@vger.kernel.org,kernel@pengutronix.de,Andy Yan <andy.yan@rock-chips.com>,Benjamin Gaignard <benjamin.gaignard@collabora.com>,Michael Riesch <michael.riesch@wolfvision.net>,Sandy Huang <hjc@rock-chips.com>,"Heiko Stübner" <heiko@sntech.de>,Peter Geis <pgwipeout@gmail.com>,Sascha Hauer <s.hauer@pengutronix.de>
Subject: [PATCH v8 22/24] drm: rockchip: Add VOP2 driver>From: Andy Yan <andy.yan@rock-chips.com>
>
>The VOP2 unit is found on Rockchip SoCs beginning with rk3566/rk3568.
>It replaces the VOP unit found in the older Rockchip SoCs.
>
>This driver has been derived from the downstream Rockchip Kernel and
>heavily modified:
>
>- All nonstandard DRM properties have been removed
>- dropped struct vop2_plane_state and pass around less data between
>  functions
>- Dropped all DRM_FORMAT_* not known on upstream
>- rework register access to get rid of excessively used macros
>- Drop all waiting for framesyncs
>
>The driver is tested with HDMI and MIPI-DSI display on a RK3568-EVB
>board. Overlay support is tested with the modetest utility. AFBC support
>on the cluster windows is tested with weston-simple-dmabuf-egl on
>weston using the (yet to be upstreamed) panfrost driver support.
>
>Signed-off-by: Andy Yan <andy.yan@rock-chips.com>
>Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
>---
>
>Notes:
>    Changes since v6:
>    - Drop device tree parsing during runtime
>    - Fix typo in Kconfig help text
>    
>    Changes since v5:
>    - consistently use u8/u16/u32 rather than uint8_t/uint16_t/uint32_t
>    - Use spin_lock rather than spin_lock_irqsave
>    - replace printk with drm_dbg
>    - break some overlong lines
>    
>    Changes since v4:
>    - Avoid stack frame overflow by not allocating big array on the stack
>    
>    Changes since v3:
>    - Sort includes
>    - fix typos
>    - Drop spinlock
>    - Use regmap_set_bits()/regmap_clear_bits()
>    - simplify vop2_scale_factor()
>    - simplify vop2_afbc_transform_offset()
>    
>    Changes since v4:
>    - Sort nodes alphabetically
>    
>    Changes since v3:
>    - Fix HDMI connector type
>    
>    Changes since v4:
>    - Add Robs Ack
>    
>    Changes since v3:
>    - Bring back gamma_lut regs
>    - Drop redundant _vop suffix from clock names
>    
>    Changes since v5:
>    - Drop unnecessary #size-cells/#address-cells from nodes with only single endpoint
>    
>    Changes since v5:
>    - consistently use u8/u16/u32 rather than uint8_t/uint16_t/uint32_t
>    - Use spin_lock rather than spin_lock_irqsave
>    - replace printk with drm_dbg
>    - break some overlong lines
>    
>    Changes since v4:
>    - Avoid stack frame overflow by not allocating big array on the stack
>    
>    Changes since v3:
>    - Sort includes
>    - fix typos
>    - Drop spinlock
>    - Use regmap_set_bits()/regmap_clear_bits()
>    - simplify vop2_scale_factor()
>    - simplify vop2_afbc_transform_offset()
>    
>    Changes since v4:
>    - Sort nodes alphabetically
>    
>    Changes since v3:
>    - Fix HDMI connector type
>
> drivers/gpu/drm/rockchip/Kconfig             |    6 +
> drivers/gpu/drm/rockchip/Makefile            |    1 +
> drivers/gpu/drm/rockchip/rockchip_drm_drv.c  |    1 +
> drivers/gpu/drm/rockchip/rockchip_drm_drv.h  |    6 +-
> drivers/gpu/drm/rockchip/rockchip_drm_fb.c   |    2 +
> drivers/gpu/drm/rockchip/rockchip_drm_vop.h  |   15 +
> drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 2686 ++++++++++++++++++
> drivers/gpu/drm/rockchip/rockchip_drm_vop2.h |  477 ++++
> drivers/gpu/drm/rockchip/rockchip_vop2_reg.c |  281 ++
> 9 files changed, 3474 insertions(+), 1 deletion(-)
> create mode 100644 drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
> create mode 100644 drivers/gpu/drm/rockchip/rockchip_drm_vop2.h
> create mode 100644 drivers/gpu/drm/rockchip/rockchip_vop2_reg.c
>
>diff --git a/drivers/gpu/drm/rockchip/Kconfig b/drivers/gpu/drm/rockchip/Kconfig
>index b9b156308460a..f033971103610 100644
>--- a/drivers/gpu/drm/rockchip/Kconfig
>+++ b/drivers/gpu/drm/rockchip/Kconfig
>@@ -28,6 +28,12 @@ config ROCKCHIP_VOP
> 	  This selects support for the VOP driver. You should enable it
> 	  on all older SoCs up to RK3399.
> 
>+config ROCKCHIP_VOP2
>+	bool "Rockchip VOP2 driver"
>+	help
>+	  This selects support for the VOP2 driver. You should enable it
>+	  on all newer SoCs beginning from RK3568.
>+

rockchip newer SoCs maybe still use the old vop driver, and we are designing the next VOP, i am not sure if we will use the vop2 driver.
so we can't say: "You should enable it on all newer SoCs beginning from RK3568."

thanks, sandy.

> config ROCKCHIP_ANALOGIX_DP > bool "Rockchip specific extensions for Analogix DP driver" > depends on ROCKCHIP_VOP >diff --git a/drivers/gpu/drm/rockchip/Makefile b/drivers/gpu/drm/rockchip/Makefile >index dfc5512fdb9f1..3ff7b21c04149 100644 >--- a/drivers/gpu/drm/rockchip/Makefile >+++ b/drivers/gpu/drm/rockchip/Makefile >@@ -6,6 +6,7 @@ > rockchipdrm-y := rockchip_drm_drv.o rockchip_drm_fb.o \ > rockchip_drm_gem.o > >+rockchipdrm-$(CONFIG_ROCKCHIP_VOP2) += rockchip_drm_vop2.o rockchip_vop2_reg.o > rockchipdrm-$(CONFIG_ROCKCHIP_VOP) += rockchip_drm_vop.o rockchip_vop_reg.o > rockchipdrm-$(CONFIG_ROCKCHIP_ANALOGIX_DP) += analogix_dp-rockchip.o > rockchipdrm-$(CONFIG_ROCKCHIP_CDN_DP) += cdn-dp-core.o cdn-dp-reg.o >diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c >index cf8dba96a7dee..7bebb293eb555 100644 >--- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c >+++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c >@@ -492,6 +492,7 @@ static int __init rockchip_drm_init(void) > > num_rockchip_sub_drivers = 0; > ADD_ROCKCHIP_SUB_DRIVER(vop_platform_driver, CONFIG_ROCKCHIP_VOP); >+ ADD_ROCKCHIP_SUB_DRIVER(vop2_platform_driver, CONFIG_ROCKCHIP_VOP2); > ADD_ROCKCHIP_SUB_DRIVER(rockchip_lvds_driver, > CONFIG_ROCKCHIP_LVDS); > ADD_ROCKCHIP_SUB_DRIVER(rockchip_dp_driver, >diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h >index 1f66a447acada..370d9e6c8e6d5 100644 >--- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.h >+++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.h >@@ -18,7 +18,7 @@ > > #define ROCKCHIP_MAX_FB_BUFFER 3 > #define ROCKCHIP_MAX_CONNECTOR 2 >-#define ROCKCHIP_MAX_CRTC 2 >+#define ROCKCHIP_MAX_CRTC 4 > > struct drm_device; > struct drm_connector; >@@ -31,6 +31,9 @@ struct rockchip_crtc_state { > int output_bpc; > int output_flags; > bool enable_afbc; >+ u32 bus_format; >+ u32 bus_flags; >+ int color_space; > }; > #define to_rockchip_crtc_state(s) \ > container_of(s, struct rockchip_crtc_state, base) >@@ -69,6 +72,7 @@ extern struct platform_driver rockchip_dp_driver; > extern struct platform_driver rockchip_lvds_driver; > extern struct platform_driver vop_platform_driver; > extern struct platform_driver rk3066_hdmi_driver; >+extern struct platform_driver vop2_platform_driver; > > static inline struct rockchip_encoder *to_rockchip_encoder(struct drm_encoder *encoder) > { >diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c >index 3aa37e177667e..0d2cb4f3922b8 100644 >--- a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c >+++ b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c >@@ -134,4 +134,6 @@ void rockchip_drm_mode_config_init(struct drm_device *dev) > > dev->mode_config.funcs = &rockchip_drm_mode_config_funcs; > dev->mode_config.helper_private = &rockchip_mode_config_helpers; >+ >+ dev->mode_config.normalize_zpos = true; > } >diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h >index 857d97cdc67c6..1e364d7b50e69 100644 >--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h >+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h >@@ -54,9 +54,23 @@ struct vop_afbc { > struct vop_reg enable; > struct vop_reg win_sel; > struct vop_reg format; >+ struct vop_reg rb_swap; >+ struct vop_reg uv_swap; >+ struct vop_reg auto_gating_en; >+ struct vop_reg block_split_en; >+ struct vop_reg pic_vir_width; >+ struct vop_reg tile_num; > struct vop_reg hreg_block_split; >+ struct vop_reg pic_offset; > struct vop_reg pic_size; >+ struct vop_reg dsp_offset; >+ struct vop_reg transform_offset; > struct vop_reg hdr_ptr; >+ struct vop_reg half_block_en; >+ struct vop_reg xmirror; >+ struct vop_reg ymirror; >+ struct vop_reg rotate_270; >+ struct vop_reg rotate_90; > struct vop_reg rstn; > }; > >@@ -410,4 +424,5 @@ static inline int scl_vop_cal_lb_mode(int width, bool is_yuv) > } > > extern const struct component_ops vop_component_ops; >+ > #endif /* _ROCKCHIP_DRM_VOP_H */ >diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c >new file mode 100644 >index 0000000000000..81ff79eddb8a0 >--- /dev/null >+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c >@@ -0,0 +1,2686 @@ >+// SPDX-License-Identifier: (GPL-2.0+ OR MIT) >+/* >+ * Copyright (c) 2020 Rockchip Electronics Co., Ltd. >+ * Author: Andy Yan <andy.yan@rock-chips.com> >+ */ >+#include <linux/bitfield.h> >+#include <linux/clk.h> >+#include <linux/component.h> >+#include <linux/delay.h> >+#include <linux/iopoll.h> >+#include <linux/kernel.h> >+#include <linux/mfd/syscon.h> >+#include <linux/module.h> >+#include <linux/of.h> >+#include <linux/of_device.h> >+#include <linux/of_graph.h> >+#include <linux/platform_device.h> >+#include <linux/pm_runtime.h> >+#include <linux/regmap.h> >+#include <linux/swab.h> >+ >+#include <drm/drm.h> >+#include <drm/drm_atomic.h> >+#include <drm/drm_atomic_uapi.h> >+#include <drm/drm_crtc.h> >+#include <drm/drm_crtc_helper.h> >+#include <drm/drm_debugfs.h> >+#include <drm/drm_flip_work.h> >+#include <drm/drm_plane_helper.h> >+#include <drm/drm_probe_helper.h> >+#include <drm/drm_vblank.h> >+ >+#include <uapi/linux/videodev2.h> >+#include <dt-bindings/soc/rockchip,vop2.h> >+ >+#include "rockchip_drm_drv.h" >+#include "rockchip_drm_gem.h" >+#include "rockchip_drm_fb.h" >+#include "rockchip_drm_vop2.h" >+ >+/* >+ * VOP2 architecture >+ * >+ +----------+ +-------------+ +-----------+ >+ | Cluster | | Sel 1 from 6| | 1 from 3 | >+ | window0 | | Layer0 | | RGB | >+ +----------+ +-------------+ +---------------+ +-------------+ +-----------+ >+ +----------+ +-------------+ |N from 6 layers| | | >+ | Cluster | | Sel 1 from 6| | Overlay0 +--->| Video Port0 | +-----------+ >+ | window1 | | Layer1 | | | | | | 1 from 3 | >+ +----------+ +-------------+ +---------------+ +-------------+ | LVDS | >+ +----------+ +-------------+ +-----------+ >+ | Esmart | | Sel 1 from 6| >+ | window0 | | Layer2 | +---------------+ +-------------+ +-----------+ >+ +----------+ +-------------+ |N from 6 Layers| | | +--> | 1 from 3 | >+ +----------+ +-------------+ --------> | Overlay1 +--->| Video Port1 | | MIPI | >+ | Esmart | | Sel 1 from 6| --------> | | | | +-----------+ >+MODULE_DEVICE_TABLE(of, vop2_dt_match); >+ >+static int vop2_probe(struct platform_device *pdev) >+{ >+ struct device *dev = &pdev->dev; >+ >+ return component_add(dev, &vop2_component_ops); >+} >+

...

>+struct platform_driver vop2_platform_driver = { >+ .probe = vop2_probe, >+ .remove = vop2_remove, >+ .driver = { >+ .name = "rockchip-vop2", >+ .of_match_table = of_match_ptr(vop2_dt_match), >+ }, >+}; >-- >2.30.2 >