Re:[PATCH v8 22/24] drm: rockchip: Add VOP2 driver
黄家钗
hjc at rock-chips.com
Mon Mar 14 12:27:27 UTC 2022
Hi Sascha Hauer
From: Sascha Hauer <s.hauer at pengutronix.de>
Date: 2022-03-11 16:33:21
To: dri-devel at lists.freedesktop.org
Cc: linux-arm-kernel at lists.infradead.org,linux-rockchip at lists.infradead.org,devicetree at vger.kernel.org,kernel at pengutronix.de,Andy Yan <andy.yan at rock-chips.com>,Benjamin Gaignard <benjamin.gaignard at collabora.com>,Michael Riesch <michael.riesch at wolfvision.net>,Sandy Huang <hjc at rock-chips.com>,"Heiko Stübner" <heiko at sntech.de>,Peter Geis <pgwipeout at gmail.com>,Sascha Hauer <s.hauer at pengutronix.de>
Subject: [PATCH v8 22/24] drm: rockchip: Add VOP2 driver>From: Andy Yan <andy.yan at 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 at rock-chips.com>
>Signed-off-by: Sascha Hauer <s.hauer at 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 at 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20220314/3ec00250/attachment-0001.htm>
More information about the dri-devel
mailing list