<div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div  style="position:relative;zoom:1">Hi Sascha Hauer</div><div  style="position:relative;zoom:1"><br /></div><pre>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.
<div>>+</div><div><br /></div><div>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.</div><div>so we can't say: "You should enable it on all newer SoCs beginning from RK3568."</div><div><br /></div><div>thanks, sandy.</div><div><br /></div>> 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);
>+}
>+
<div><br /></div><div>...</div><div><br /></div>>+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
>
</pre></div><br>